こういうときだいたいみなさん
これは次のようにして解決できます。
従って,
ここまで書いて気がついたが
例えば 3 番目のパーティションの offset byte を知りたい場合,
ちなみに,/dev/nbd0 からイメージを取り外す時は,
losetup
コマンドで loopback device にして mount すると思います。raw ディスクだとそれでも良かったりしますが,qcow2 の 3 番目のパーティションをマウント,とかやろうとすると少し厄介。これは次のようにして解決できます。
# modprobe nbdまずこれで /dev/nbd0 がブロックデバイスとして使えるようになります。ここで,
# qemu-nbd --connect=/dev/nbd0 ./target.qcow2
# fdisk -l /dev/nbd0これで 3 番目のパーティションは 1202176 セクタ目から開始していて,セクタサイズが 512 bytes であることが読み取れるので,3 番目のパーティションは 1202176 * 512 = 615514112 byte 目から始まることがわかります。
Disk /dev/nbd0: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x97d8dd27
Device Boot Start End Sectors Size Id Type
/dev/nbd0p1 * 2048 206847 204800 100M 83 Linux
/dev/nbd0p2 206848 1202175 995328 486M 82 Linux swap / Solaris
/dev/nbd0p3 1202176 16777215 15575040 7.4G 83 Linux
従って,
# mount -o offset=615514112 /dev/nbd0 /mntこれでマウントができます。
ここまで書いて気がついたが
fdisk
を実行してから offset を指定するまではシェルスクリプトで自動化できそうですね。例えば 3 番目のパーティションの offset byte を知りたい場合,
expr \これで求まりますね。
$(fdisk -l /dev/nbd0 | grep -A 10 'Device\s*Boot' \
| sed -n '3p' | awk '{print $2}') \
\* \
$(fdisk -l /dev/nbd0 | grep 'Sector size'
| cut -d' ' -f 4)
ちなみに,/dev/nbd0 からイメージを取り外す時は,
# qemu-nbd --disconnect=/dev/nbd0