qemuで使っていた.qcow2形式のファイルシステムイメージをx64 debian上でマウントしてファイルを修復したりfsckしたりした話
あらすじ
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
を正しいものに置き換えたところ、無事ログイン出来るようになりました。
参考サイト
大変参考にさせていただきました。ありがとうございます。