次のコマンドを実行しました。
VBoxManage clonehd d6b9f0a5-98df-48ca-83c8-91a0809ec349 --format RAW Debian.raw
sudo dd if=~/.VirtualBox/HardDisks/Debian.raw of=/dev/sda5
パーティションをマウントしようとすると、次の苦情が表示されます。
EXT4-fs (sda5): VFS: Can't find ext4 filesystem
これで、仮想マシンにext4パーティションがあることがわかりました。私は何が間違っていましたか?
答え1
イメージはファイルシステムイメージではなくディスクイメージです。ファイルシステムはそのイメージ内のパーティションにあります(非常に珍しいことをしない限り)。file Debian.raw
とを実行してこれを確認できますfdisk -l Debian.raw
。
このパーティションにアクセスする最も簡単な方法は、ループデバイスに接続することです。可能であれば、ドライバがこのオプションをサポートしてロードしていることをloop
確認してください。その後、ディスクイメージをループデバイスに関連付けると、次のようになります。max_parts
rmmod loop; modprobe loop max_part=63
losetup -fs Debian.raw # prints /dev/loop0 (or some other number)
mount /dev/loop0p1 /mnt # 0 as above, 1 is the partition number
ループドライバにパーティションを使用させることができない場合は、ディスクイメージ内のパーティションのオフセットを見つける必要があります。実行してfdisk -lu Debian.raw
パーティションをリストし、開始セクターS(セクターは512バイト)を見つけます。その後、losetup
屋根ふき装置がこのオフセットで開始されることを望んでいることを伝えます。
fdisk -lu Debian.raw # note starting sector $S
losetup -fs -o $(($S * 512)) Debian.raw
mount /dev/loop0 /mnt # /dev/loop0 or whatever losetup prints
VMイメージからシステムにパーティションをコピーする場合は、上記のように開始($S
)および終了()オフセットを決定します。その後、パーティションをコピーします。$E
fdisk -lu
<Debian.raw tail -c +$((512*$S)) | dd of=/dev/sda5 bs=4M
(ソースとターゲットが同じディスクにない場合は面倒ではなく、出力にリダイレクトするだけです。dd
同じディスクにある場合は、より大きなパラメータを使用する方がはるかに高速です。)tail
/dev/sda5
dd
bs
答え2
Lostup 2.21 -P オプション
losetup -P -f --show my.img
/dev/loopXpY
パーティションごとに1つずつ作成します。
利点:実行可能ファイル(util-linuxパッケージ)は、多くのディストリビューションにプリインストールされています。
短所:これは最近のオプションであり、Ubuntu 14.04には存在しません。
losetup -P
オートメーション
使用法:
$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2
$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there
$ sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
/dev/loop1 0 0 0 0 /full/path/to/my.img
$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0
源泉:
los() (
img="$1"
dev="$(sudo losetup --show -f -P "$img")"
echo "$dev"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
echo "$dst"
sudo mkdir -p "$dst"
sudo mount "$part" "$dst"
done
)
losd() (
dev="/dev/loop$1"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
sudo umount "$dst"
done
sudo losetup -d "$dev"
)
パテックス
sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper
出力:
/dev/mapper/loop0
/dev/mapper/loop0p1
loop0p1
最初のパーティションはどこにあるので、次のようにできます。
mkdir -p d
sudo mount /dev/mapper/loop0p1 d
この方法の利点:Ubuntu 14.04で動作し、再起動は不要です。