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」に戻すのを忘れずに。