如何从整个磁盘映像文件中读取一个文件系统?

tsh*_*ang 7 linux partition virtual-machine file-transfer

我运行了这些命令:

VBoxManage clonehd d6b9f0a5-98df-48ca-83c8-91a0809ec349 --format RAW Debian.raw
sudo dd if=~/.VirtualBox/HardDisks/Debian.raw of=/dev/sda5
Run Code Online (Sandbox Code Playgroud)

当我尝试挂载分区时,我收到以下投诉:

EXT4-fs (sda5): VFS: Can't find ext4 filesystem
Run Code Online (Sandbox Code Playgroud)

现在我知道 VM 有一个 ext4 分区。我做错了什么?

Gil*_*il' 7

您的映像是磁盘映像,而不是文件系统映像。文件系统位于该映像内的分区上(除非您做了一些非常不寻常的事情)。您可以通过运行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
Run Code Online (Sandbox Code Playgroud)

如果无法让循环驱动使用分区,则需要找出分区在磁盘映像中的偏移量。运行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
Run Code Online (Sandbox Code Playgroud)

如果要将分区从 VM 映像复制到您的系统,请使用上述确定其起始 ( $S) 和结束 ( $E) 偏移量fdisk -lu。然后只复制分区:

<Debian.raw tail -c +$((512*$S)) | dd of=/dev/sda5 bs=4M
Run Code Online (Sandbox Code Playgroud)

(如果源和目标不在同一个磁盘上,不要理会dd,只需将tail的输出重定向到/dev/sda5。如果它们在同一个磁盘上,dd使用大bs参数会快很多。)