うまいぼうぶろぐ

linuxとhttpdとperlのメモ

linuxでVMwareのvmdkイメージをmountする話

ストレージの機能で仮想マシンのイメージをsnapshotでとっていても、
実際にそのvmdkから特定のファイルを復旧する場合は、
そのsnapshotのファイルをコピーしてインベントリに登録、、、などまあまあ面倒。
だったらいっそのことvmdkを直接mountしたらええやんと思って調べた。

結論を書くと、vmwareのツールでは稼働中の仮想マシンのファイルは
snapshotでも参照できなかったのでkvmのguestfs使った。

VMware vSphere Virtual Disk Development Kit をdownload、install。versionはvsphereにあったもの。

fuseを使っているので必要なら入れる

# yum install fuse-libs

VMware-vix-disklibを展開したら出てくるinstall perlを実行

# perl vmware-install.pl -d

使い方

partition一覧を表示: -p

# vmware-mount -p test.vmdk 
Nr      Start       Size Type Id Sytem                   
-- ---------- ---------- ---- -- ------------------------
 1       2048    1024000 BIOS 83 Linux
 2    1026048    4194304 BIOS 82 Linux swap
 3    5220352   57694208 BIOS 83 Linux

どのパーティションを何でmountしていたかは各仮想マシンによるけど、
この例は1が/boot、2がswap、3が/

mountする:

# vmware-mount test.vmdk 3 /mnt

ただし、起動状態だとmountできない(readonlyでも)ようなので、
いくらread-onlyのsnapshotでもVMが起動しているとmountできないみたい。
こりゃアカン。

libguestfs でmountする

結局HDDイメージなんだからkvmで使ってたブツでいけんじゃね?と思ってやったらできた。
http://hogem.hatenablog.com/entry/20120204/1328321337

仮想マシン起動中に書き込むとファイルシステムが壊れるのでreadonlyでmount。
確実にいくなら(netappのようにsnapshotはreadonlyになっている場合は)snapshotのファイルを使う
CentOS6.7の最新のguestfishだと-iは失敗したので手動でmountする。

# cd .snapshot/hourly.0/
# guestfish -r -a test.vmdk
><fs> run
><fs> df
libguestfs: error: df: do_df: you must call 'mount' first to mount the root filesystem
><fs> list-filesystems
/dev/sda1: ext4
/dev/sda2: swap
/dev/sda3: ext4
><fs> mount /dev/sda3 /

後はcopy-outでファイルを取り出す。

><fs> copy-out /etc/hosts /tmp/hosts.old