从整个磁盘(设备)的映像挂载单个分区
我用我的整个磁盘制作了一张图片
dd if=/dev/sda of=/media/external_media/sda.img
现在的问题是我想安装一个在该磁盘上的ext4文件系统但是
mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image
显然会出现超级块错误,因为图像包含整个磁盘(MBR,其他分区),而不仅仅是我需要的分区。 所以我想我应该找到一种方法让磁盘映像显示在/dev/
文件夹中…
有谁知道这是怎么做到的吗?
PS:我总是可以将图像恢复到原始磁盘,但这样会非常不方便(我更新了操作系统,我希望保持原样)
获取图像的分区布局
$ sudo fdisk -lu sda.img ... Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes ... Device Boot Start End Blocks Id System sda.img1 * 56 6400000 3199972+ c W95 FAT32 (LBA)
计算从图像开始到分区开始的偏移量
扇区大小 * 开始 =(在这种情况下)512 * 56 = 28672
使用偏移量将其安装在/ dev / loop0上
sudo losetup -o 28672 /dev/loop0 sda.img
现在分区驻留在/ dev / loop0上 。 你可以fsck ,安装它等
sudo fsck -fv /dev/loop0 sudo mount /dev/loop0 /mnt
卸载
sudo umount /mnt sudo losetup -d /dev/loop0
Ubuntu 16.04的更新:使用新的losetup
,现在更容易:
sudo losetup -Pf disk_image.raw
请参阅旧版Ubuntu的其余部分。
一个简单的解决方案是使用kpartx :它将找出分区布局并将每个映射到块设备。 之后,你所要做的就是装上你想要的那个。
打开终端,找到磁盘映像,然后输入以下命令:
$ sudo kpartx -av disk_image.raw add map loop0p1 (252:2): 0 3082240 linear /dev/loop0 2048 add map loop0p2 (252:3): 0 17887232 linear /dev/loop0 3084288
这在/dev/mapper
下创建了loop0p1
和loop0p2
。 从输出中,您可以看到分区的大小,这有助于您识别它们。 你可以装载你想要的:
$ sudo mount /dev/mapper/loop0p2 /mnt
或者,Nautilus会检测到块设备,您可以从侧栏安装它:
完成后,卸载挂载的内容并删除设备映射:
$ sudo umount /mnt $ sudo kpartx -d disk_image.raw
编辑 :适用于util-linux> = 2.21 。 在撰写ubuntu时,仅提供版本2.20
从男人losetup :
-P, --partscan force kernel to scan partition table on newly created loop device
所以跑吧
$ sudo losetup -f --show -P /path/to/image.img
在第一个未使用的循环设备上为磁盘映像的每个分区创建设备节点,并将其打印到stdout。 如果使用/dev/loop0
设备,它将至少创建/dev/loop0p1
,您可以照常安装。
试试gnome-disk-image-mounter
:
gnome-disk-image-mounter sda.img
不需要sudo
。 它将安装在/media/your_user_name/partition_name
,就像USB驱动器一样。
losetup -P
自动化
losetup -P
是在Ubuntu 16.04中开始的最佳方法,如https://askubuntu.com/a/496576/52975所述 ,这里有进一步自动化的function。 用法:
$ 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" )
循环模块max_part配置
这是16.04之前的一个不错的方法。
loop
是一个内核模块,内置于Ubuntu 14.04的内核中。
如果配置正确,Linux会自动为您分配设备。
cat /sys/module/loop/parameters/max_part
说loop
设备可以生成多少个分区。
默认情况下,它在Ubuntu 14.04上为0
,这就是为什么不会发生自动拆分的原因。
要更改它,我们可以添加:
options loop max_part=31
到/etc/modprobe
的文件,或者:
GRUB_CMDLINE_LINUX="loop.max_part=31"
到/etc/default/grub
然后sudo update-grub
。
如何设置模块参数也包括在: 如何添加内核模块参数?
重启后,当你这样做时:
sudo losetup -f --show my.img
它将映像挂载到/dev/loopX
设备,并自动将分区挂载到/dev/loopXpY
设备。
因此,如果您愿意重新启动,这是最方便的方法。
也可以看看
- https://unix.stackexchange.com/questions/9099/reading-a-filesystem-from-a-whole-disk-image
- https://superuser.com/questions/117136/how-can-i-mount-a-partition-from-dd-created-image-of-a-block-device-eg-hdd-u
- 从整个磁盘(设备)的映像挂载单个分区
- https://stackoverflow.com/questions/1419489/loopback-mounting-individual-partitions-from-within-a-file-that-contains-a-parti
使用losetup附加整个磁盘映像。
# sudo losetup /dev/loop2 sda.img
然后使用mdadm创建md设备,并为所有分区创建块设备。
# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2 mdadm: array /dev/md2 built and started.
现在您应该看到分区设备。
nile-172-b0fef38-76:/mnt/sdb1 # ls -l /dev/md2* brw-rw---- 1 root disk 9, 2 Oct 10 12:37 /dev/md2 brw-rw---- 1 root disk 259, 0 Oct 10 12:37 /dev/md2p1
在我看来,最简单的方法是使用mount -o loop,offset=...
如StackOverflow上的答案所述。 想法如下:
fdisk -l $IMAGE # calculate the offset in bytes mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT
该方法最好,因为在卸载已安装的分区后不需要删除循环设备。
为了进一步简化任务(如果经常这样做需要),您可以使用我的脚本mountimg
为您完成所有事情。 只需从https://github.com/AlexanderAmelkin/mountimg获取并使用如下:
mountimg /media/external_media/sda.img 2 /media/sda_image
如果您愿意,也可以指定文件系统类型和任何其他附加挂载选项:
mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8
完成分区后,只需umount
它:
umount /media/sda_image