1. 概要
えらいことになってしまったのです。
2. 状況
「bhyve」上にインストールしている、「FreeBSD 14.3 RELEASE」で。
シェルが壊れてしまったのです。
なんでそうなったかが、ようわからんのですが。
「root」を含め、全ユーザのシェルを「bash」にしておったですな。
ゲストを起動して、ログインしようとすると。
/usr/local/bin/bash: No such file or directory
となって、ログインできないのです。
通常、こういうケースでは、再起動して、再起動時に「boot」画面で、シングルユーザモードで起動して。
「passwd」ファイルをいじるということになるのですが。
「bhyve」上の「FreeBSD」では、「boot」画面が見られない。
ゲスト名が、「vm143」なのですが。
vm start vm143
してから
vm console vm143
しようとすると、もう、起動が途中まで進んでしまっておる。
vm start vm143 && vm console vm143
すると、これは。
Starting vm143
* found guest in /usr/vm/vm143
* booting...
/usr/local/sbin/vm: ERROR: vm143 doesn't appear to be a running virtual machine
てなことで、まだ「boot」画面になっていないようです。
「vm143.conf」に。
loader_delay="10"
やら。
boot_args="-s"
やら、をいれてみるという方法も試してみましたが、だめでした。
「vm143.conf」によって起動しているか 怪しいくらいです。
結局、ゲストのディスクをホストからマウントして、中身をいじることになりました。
3. ゲストのディスクをマウント
ゲストのディスクをマウントします。
(ディレクトリやら、ディスクイメージファイルやらは、実際のものに合わせて)
mdconfig -a -t vnode -f /usr/vm/vm143/disk0.img
この出力が。
md0
となりました。
解析します。
gpart show md0
=> 40 335544240 md0 GPT (160G)
40 1024 1 freebsd-boot (512K)
1064 984 - free - (492K)
2048 50331648 2 freebsd-swap (24G)
50333696 285208576 3 freebsd-zfs (136G)
335542272 2008 - free - (1.0M)
「freebsd-zfs」の出力から、これが、「zfs」のボリュームであることがわかります。
zpool import -d /dev/md0p3
pool: zroot
id: 317115271095479979
state: ONLINE
status: Some supported features are not enabled on the pool.
(Note that they may be intentionally disabled if the
'compatibility' property is set.)
action: The pool can be imported using its name or numeric identifier, though
some features will not be available without an explicit 'zpool upgrade'.
config:
zroot ONLINE
md0p3 ONLINE
この「id」をマウントします。
zpool import -f -R /mnt -d /dev/md0p3 317115271095479979 temp_root
zfs mount temp_root/ROOT/default
4. 編集
これで、ゲストマシンのディスクをマウントすることができました。
「sed」で、「passwd」ファイルを変更して、反映。
sed -i '' 's|/usr/local/bin/bash|/bin/sh|g' /mnt/etc/master.passwd
pwd_mkdb -d /mnt/etc /mnt/etc/master.passwd
これで、シェルを「bash」から「sh」に変更できました。
5. 後始末
マウントしたものをアンマウントします。
cd /
zfs umount temp_root/ROOT/default
zpool export temp_root
mdconfig -d -u 0
もし。
/mnt
配下に、ごみが残っていたら。
mount | grep /mnt
で、「/mnt」をマウントしていないことを確認して。
rmdir /mnt/*
やら。
rm /mnt/*
やら、します。
とりあえず、これで、ゲストを起動して、ログインできるようになったので。
起動して、ゲストを修復することができるようになります。
6. 参考サイト
本ページは、「Gemini」伍長を参考にさせていただきました。