どらねこへいとくるー

we're doraneko hate crew

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 を正しいものに置き換えたところ、無事ログイン出来るようになりました。

参考サイト

大変参考にさせていただきました。ありがとうございます。