8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

qemuで使っていた.qcow2形式のファイルシステムイメージをx64 debian上でマウントしてファイルを修復したりfsckしたりした話

Last updated at Posted at 2015-03-20

あらすじ

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

参考サイト

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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?