あらすじ
ARM用クロスコンパイル環境として、qemu
を使って仮想ARMマシンを立ち上げ、その上で開発していました。
ある日、仮想マシンにログインできなくなる事件が発生。
結論から言うと /etc/passwd
とかが壊れていました。これを修復する方法を模索した話です。
手順
OS Xからやる方法が見つからなかった(分からなかった)ので、Linux上で作業することにしました。
前準備
今回はvagrantで仮想マシン上にdebianを上げて、その上で作業しました。
これはLinuxマシンなら何でも大差無いと思うので手順は省略。debian系ディストリであれば同じ手順でいけるのではと思います。
ちなみにvagrantでファイルの共有をするには Vagrantfile
に以下のような感じで記述。
config.vm.synced_folder "~/qemudir", "/shared/qemu"
この辺りも手段は問わない感じです(仮想debianから .qcow2
がいじれれば)
vagrantで仮想Linuxを起動しログイン
vagrantならこんな感じ。やっていることは普通にVirtual Box等で仮想Linuxを起動してログインしているだけです。
% vagrant up # 仮想マシン起動
% vagrant ssh # 仮想マシンにログイン
仮想マシン上で修復準備
# root権限がないと出来ないことばかりなのでrootになってしまう
# ここは逐一sudoでコマンドを叩いても良いと思います
$ sudo su
# 仮想Linuxにqemu-utilsをインストール
$ apt-get install qemu-utils
# nbdというカーネルモジュールをロード
$ modprobe nbd max_part=8
# qcow2を/dev配下のブロックデバイスとして見えるようにする
$ qemu-nbd --connect=/dev/nbd0 diskimage.qcow2
# fdiskでパーティションを(一応)調べてみる。今回は/dev/nbd0p1 というのがメインパーティションだった。
$ fdisk /dev/nbd0
仮想マシン上でファイルシステム修復
# ブロックデバイスとして扱える状態なので、fsckができるようです
$ fsck /dev/nbd0p1
# マウント。これで中身が見られるようになります
$ mount /dev/nbd0p1 /mnt
# 終わったらアンマウントして後処理。
$ umount /mnt
$ qemu-nbd --disconect /dev/nbd0
壊れていた /etc/passwd
を正しいものに置き換えたところ、無事ログイン出来るようになりました。
参考サイト
大変参考にさせていただきました。ありがとうございます。