概要
仮想ゲストをいろいろ操作していて、起動できなくなってしまったというパターンがあるかもしれない。その時に、ゲスト内に残されているファイル群などを仮想ホスト側から最低限リカバリする手順である。
実行環境
- 仮想ホスト:almalinux8.10
- 仮想ゲスト:almalinux9.3
- libvirtd:
libvirtd (libvirt) 8.0.0 - virsh:
8.0.0
実行手順
まず、以下のコマンドを仮想ホストで実行し、仮想ゲストのイメージファイルのパスを確認する。
sudo virsh dumpxml ゲスト名 | grep "source file"
user@kasouhost ~]$ sudo virsh dumpxml testvm | grep "source file"
<source file='/var/lib/libvirt/images/testvm.img' index='1'/>
user@kasouhost ~]$
マウントする用のディレクトリを作成しておく。
mkdir /mnt
loop デバイスに設定する。
losetup は loop デバイス(/dev/loop0, /dev/loop1, …)を操作するためのコマンド。
これを用いて、imgファイルとloopデバイスを紐づけ、紐づけたloopデバイスをディレクトリにマウントさせる、という事を行っていく。
loop デバイスとは:
ファイルをディスクデバイスとして扱いたい時に使う特殊デバイス
例:ISO イメージ、ディスクイメージ(qcow2、raw など)
sudo losetup --find --show /path/to/image.img
-
--find- 空いている loop デバイスを検索する
-
--show- 結びつけた loop デバイス名を表示する
-
/path/to/image.img- ゲストのイメージファイル。上のdumpxmlで出てきた内容を入れる。ここでは
/var/lib/libvirt/images/testvm.img
- ゲストのイメージファイル。上のdumpxmlで出てきた内容を入れる。ここでは
紐づけたら、以下のコマンドで確認が可能。
losetup -a
[user@kasouhost dev]$ losetup -a
/dev/loop0: []: (/var/lib/libvirt/images/testvm.img)
[user@kasouhost dev]$
もし、これを解除したいなら以下のコマンド。
sudo losetup -d /dev/loop0
その後、カーネルにパーティションの変更を通知するpartprobeコマンドを実行する。
sudo partprobe loopデバイスのパス
sudo partprobe /dev/loop0
これができると、以下のコマンドでパーティションを確認できる。
sudo fdisk -l loopデバイスのパス
sudo fdisk -l /dev/loop0
ディスク /dev/loop0: 40 GiB, 42949672960 バイト, 83886080 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 9748BAF4-6278-4E23-85DE-C85F27F86D64
デバイス 開始位置 終了位置 セクタ サイズ タイプ
/dev/loop0p1 2048 1230847 1228800 600M EFI システム
/dev/loop0p3 1230848 83884031 82653184 39.4G Linux ファイルシステム
lsblkでも見る事ができる。
lsblk loopデバイス名
lsblk /dev/loop0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 40G 0 loop
├─loop0p1 259:0 0 600M 0 loop
└─loop0p3 259:1 0 39.4G 0 loop
マウントして確認
今回、/dec/loop0p3の部分が全体のVMの中身/領域として見えそうなので、この部分をマウントしてみる。
sudo mount /dev/loop0p3 /mnt
これで、/mntの中が、仮想ゲストのイメージファイルと紐づいた形になった。
ためしにlsコマンドを打つ。
ls /mnt
ls /mnt
afs bin boot dev etc export home lib lib64 media mnt opt proc root run sbin srv swap_file sys tmp usr var
mountコマンドでも、マウントできている事を確認できる。
mount
略
/dev/loop0p3 on /mnt type xfs (rw,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota)
アンマウント
もろもろ調査内容を確認できたら、アンマウントする。
sudo umount /mnt
すると、lsコマンド等を実行してみても確認できなくなる。マウントが外れたためである。
また、loopデバイスも解除する
sudo losetup -d /dev/loop0
その後、lsblk /dev/loop0やlosetup -aで、何も表示されない事を確認できたら後片付けは完了。