2018年4月16日月曜日

libvirt の仮想マシン(qcow2)で root パスワードがわからなくて苦しんでる人へ

libvirt (KVM 利用)上で複数台の CentOS7 仮想マシンのインストールをスクリプトで自動化したのはいいのだが、動的にキックスタート定義ファイルの ks.cfg を作るところで root のパスワードがグチャグチャになって virsh console からもログインできない状態に...
virt-viewer を使えない環境なのがさらに致命的。

まぁスクリプトだから最初からまるごと仮想マシンを作り直せば良いんだけど、せっかく作ってあるのでそれを直すことにした。

single user mode でパスワードをリセットしちゃえばいいやと簡単に考えてたら、virsh console から Grub に入るのが結構面倒。時間もあまり無く、virt-viewer も使えない環境ということで、仕方ないので qcow2 のイメージをホストでマウントして /etc/shadow を直すという荒業?を行うことにした。とりあえず仮想マシンは virsh destroy でも何でもいいので停止しておく。

 http://blogger.fastriver.net/2014/06/qcow2.html に書いたがおさらいしておく。 guestmount というコマンドで qcow2 がローカルマウントできる。これを使うためにホストに libguestfs-tools を yum でインストール。
# yum install libguestfs-tools
したらホストで以下コマンドで、qcow2 ファイルをマウント。今回仮想マシンのホスト名が「client2」というやつの復旧をしたかったので以下のようなコマンドになってるけど、まぁ環境に合わせて適宜修正を。あ、あと以下ではマウントポイントが /mnt/tmp ってことで。


guestmount -a /var/lib/libvirt/images/client2.qcow2 -m /dev/centos_client2/root /mnt/tmp

マウントしたら /mnt/tmp/etc/shadow を修正する。具体的には root の 2 フィールド目を $6$ (crypt-sha512)のハッシュに変換。このハッシュは別のマシンのパスワードがわかってるユーザのやつそのまま持ってきてもいいし、以下の python ワンライナーでも作れる。
python -c 'import crypt; print crypt.crypt("適当なパスワード", "$6$適当なsalt")'
あとは、/mnt/tmp/etc/selinux/config も修正して SELinux を一時的に無効にする(これやらないと初回ログインできない)。終わったらアンマウント umount /mnt/tmp/ 。

最後に仮想マシンを起動して、virsh console からアクセスして root の ID/パスワードを入力すると正常にログインできるはず。/etc/selinux/config で「SELINUX=enforcing」に戻すのを忘れずに。




2018年3月22日木曜日

389 Directory Server Admin コンソールからの Start/Stop Directory Server

個人的には全く無問題なのだが、ちょっとワケありで標題の件についてうまく行かない場合があることに気付いた。

389 Directory Server Admin コンソールから「Start Directory Server」または「Stop Directory Server」のボタンをクリックして dirsrv のデーモンをコントロールしようとすると、SELinux Enforcing な環境で以下のエラーが /var/log/dirsrv/admin-serv/error に記録される。

Failed to get load state of dirsrv@xxxxx.service: Access denied
Failed to stop dirsrv@xxxxx.service: Access denied
See system logs and 'systemctl status dirsrv@xxxxx.service' for details.
Failed to get load state of dirsrv@xxxxxx.service: Access denied

以下の URL によれば、どうも既知の問題らしい。SELinux をチョチョイといじれば治るってものでも無いらしい。



The issue is that to do this, we need to give apache (httpd_t, dirsrv_admin_t) control of the initrc_t, which is basically root on the system. We can't do that just to allow communication to systemd, especially when this is an old java based console.
The alternate is to allow dbus_t and policykit access, but this is extremely complex and time consuming to integrate. We feel our energy is better spent elsewhere, as server restarts can be conducted in other ways.
We have previously decided not to fix this issue, advising either the use of specific permissive contexts (semanage permissive -a dirsrvadmin_script_t), or through out-of-band restart.
Red Hat Directory Server 10.1 の Release Note には、known issue として Admin Server の起動だけ失敗するとあるが、上記 URL によれば Directory Server の方もだよと。まぁ複雑だってことで勘弁してもらおう。



2018年3月3日土曜日

TLP on Thinkpad

TLP 入れたって日記を書いたばかりだけど、Thinkpad の場合は追加のパッケージを入れるべきっぽい。tlp stat したら以下の出力に気付いた。

 +++ ThinkPad Battery Features
tp-smapi   = inactive (unsupported hardware)
tpacpi-bat = inactive (kernel module 'acpi_call' not installed)
     : (snip)
 +++ Suggestions
* Install acpi-call kernel module for ThinkPad battery features
* Install smartmontools for disk drive health info

Suggestions とか親切だなと。acpi-call ってのを入れろと。これに関連した情報は以下の TLP 本家にあり。

http://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html#fedora

ThinkPads only

ThinkPad specific components for advanced battery functions are not available from the official Fedora repositories. Instead you need the RPM Fusion and TLP repositories (in a root shell):

ということで書かれている通りに dnf


dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
dnf install http://repo.linrunner.de/fedora/tlp/repos/releases/tlp-release.fc$(rpm -E %fedora).noarch.rpm
dnf install akmod-tp_smapi akmod-acpi_call

ちなみに最新版は  tlp-updates-testing リポジトリにあるとのこと。たまに覗いてみるといいらしい。

この acpi_call を入れたら、tlp stat で以下が出力されるようになった。
tpacpi-bat.BAT0.startThreshold                              =     96 [%]
tpacpi-bat.BAT0.stopThreshold                               =    100 [%]
tpacpi-bat.BAT0.forceDischarge                              =      0


TLP 入れたけど wpa_supplicant が先に起動してないとダメ

5 年経った会社のノート(X1 carbon gen 1)のバッテリーの持ちが悪いので、バッテリーだけ買った(会社の経費)んだけど、新品なのにどうも保ちが悪い感じ。販売店に聞いたら「省電力マネージャを開いて満充電容量が既定値でないなら初期不良」とのこと。

upower で確認すると、「energy-full:  49.06 Wh」ってことで、既定値の「energy-full-design:  47.21 Wh」を超えて満充電されていた模様。超える分には問題無いんだろうなぁ。

しかし、仮にこれが異常だったとして upower の出力を販売店に見せても、サポ外とか言われるよなぁ。あぁあの時 Windows マルチブートにしておけばよかった...

まぁ、新しいバッテリーに換装するまで気にしてなかったのも問題だけど、これを機に TLP 入れることに。

が、私の場合システムが起動してから wpa_supplicant を手動で起動してるんだけど、TLP が先に start してると wpa_supplicant が AP に接続できない。何でか理由は面倒だから調べてない。wpa_supplicant を先に起動してから TLP を start すれば行ける。/usr/lib/systemd/system/tlp.service 見ると「After=multi-user.target bluetooth.service NetworkManager.service」になってて、ネットワークが起動してから tlp init start してる模様。

TLP を手動で起動するのもアレなので、wpa_supplicant との絡みについては今後検討することにする。とりあえずは手動で。

TLP の挙動自体に関してはいい感じで、upower の time to empty の値が以前より増えてる感じ。TLP についてはこのまま様子を見てみることにする。


2018年3月2日金曜日

Suica で東京メトロの回数券買えるじゃん

今日東京メトロの券売機で240円区間の回数券を初めて買ったんだけど、Suicaのチャージ分で買えた@赤羽岩淵自動券売機

まぁ当たり前なのかも知れんが、事前にググってて、現金じゃないとダメみたいな情報もあったので何か得した気分。

VIEW カードのチャージ分ポイントゲッツ&回数券割引ゲッツって感じで。


2018年2月27日火曜日

OpenLDAP でクライアントから Paged Results してるのに制限がかかる

どうも OpenLDAP のデフォルトでは、クライアントから Paged Results でページめくり
して全件持ってこようとしても slizelimit にひっかかり持ってこれない (rootdn でやれば
いいじゃんとかそういう突っ込みはいらない)。

どういうことかというと、ldapsearch で  -E pr=100 とかやって 5 ページ目以降をめく
ろうとしても、結果以下のようにデフォルトの slzelimit 500 にひっかかる。

# search result
search: 5
result: 4 Size limit exceeded

# numResponses: 503
# numEntries: 500

(ちなみに相手が AD なら -E pr=xxx を指定すれば何もしなくても全件取れる)

サーバ側に設定がいることを知らんかった。結論
として olcLimits に size.prtotal を無制限にする設定を入れれば回避できた。
hdb なら以下の LDIF で行ける。

dn: olcDatabase={2}hdb,cn=config
changeType: modify
replace: olcLimits
olcLimits: * size.prtotal=none




2018年1月15日月曜日

OpenSSL で暗号化したファイルが復号できない...

機密が含まれるファイルは openldap enc -aes-128-cbc で暗号化して保存してるんだけど、
Fedora 26 アップデートしたら復号できなくなった。。。

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:569:

↑こんな感じのエラーで復号できない。ググって以下で解決。-md md5 オプションを追加してみた。
openssl enc -d -aes-128-cbc -md md5 -in myfile.enc