LVM構成のqcow2イメージからデータを救出する

会社でディスクのサルベージをお願いされたのでその時のメモ。
大学時代によくやってたんだけど、ログ残してなかったので
この機会に残しておきます。

環境

VirtualBoxでUbuntu Server 12.04を立てて、その中にサルベージするディスクを置いてます。
CentOS6だとnbdのインストールが上手く行かなかったのと、7では自分でビルドしないといけないようで、
ちょっと面倒だなあと思い、手間の少ないUbuntu12.04を使いました。
UbuntuのOSインストール時、インストーラーの手順にそのまま従うと、LVM構成で作成されますが、
今回は、Standard Partitionで作成しました。

Ubuntu上でCentOSのディスクのサルベージをやるのでLVMでも特に問題ないのですが、
Ubuntuで、Ubuntuのディスクをサルベージする際、LVMのVolGroupの名前空間が被ることがあります。 CentOSでCentOSのディスクをサルベージする際もそうです。
被っちゃうといろいろと面倒なので、できるだけStandard Partitionで構成しましょう。

qemu-nbdのインストールと有効化

$ apt-get install qemu-utils
$ modprobe nbd max_part=8

qemu-utilsをインストールすると、関連パッケージでqemu-nbdも一緒にインストールされます。
qemu-nbd(Network Block Device)は、qemuで用いられる特殊なディスクをループバックマウントするためのツールです。
modprobeはKernel Moduleのロード、あんロードを行うためのコマンドです。

qcow2ディスクに接続

$ qemu-nbd --connect=/dev/nbd0 /root/centos.qcow2
$ lvscan
>>
  inactive          '/dev/VolGroup/lv_root' [37.54 GiB] inherit
  inactive          '/dev/VolGroup/lv_swap' [1.97 GiB] inherit

$ lvchange -an /dev/VolGroup/lv_root /dev/VolGroup/lv_root
$ lvscan
>>
  ACTIVE            '/dev/VolGroup/lv_root' [37.54 GiB] inherit #ACTIVEであればOK
  ACTIVE            '/dev/VolGroup/lv_swap' [1.97 GiB] inherit #ACTIVEであればOK

$ mount /dev/VolGroup/lv_root /mnt

qemu-nbd commandでqcow2ディスクを接続します。
lvscanで、LVMブロックデバイスをスキャンします。
inactiveだと中身が見れないので、lvchangeコマンドでACTIVEにします。
ACTIVEであれば、mountコマンドでマウントできます。
あとは、必要なデータをscpなりrsyncなりtarで固めるなりしてどっかに置いておきましょう。

ディスクの接続解除

$ umount /mnt
$ lvchange -an /dev/VolGroup/lv_root /dev/VolGroup/lv_swap
$ qemu-nbd --disconnect /dev/nbd0

ディスクの接続解除もそこまで難しくは無いです。
unmountしてボリュームグループをinactiveに戻して、disconnectするだけです。

参考