问题描述
我用我的整个磁盘的形象
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上。你可以装上它,装上它等等
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版本时,只有版本
从男人起家:
-P, --partscan
force kernel to scan partition table on newly created loop device
所以就跑吧
$ sudo losetup -f --show -P /path/to/image.img
为第一个未使用的循环设备上的磁盘映像的每个分区创建设备节点并将其打印到标准输出。如果使用/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
是在https://askubuntu.com/a/496576/52975中提到的从Ubuntu 16.04开始的最好的方法,这里有进一步自动化的功能。用法:
$ 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
,这就是没有auto-splitting发生的原因。
要改变它,我们可以添加:
options loop max_part=31
到/etc/modprobe
中的文件,或者:
GRUB_CMDLINE_LINUX="loop.max_part=31"
到/etc/default/grub
,然后是sudo update-grub
。
How to add kernel module parameters?包含如何设置模块参数
重新启动后,当您执行以下操作时:
sudo losetup -f --show my.img
它将映像挂载到/dev/loopX
设备,并自动将分区挂载到/dev/loopXpY
设备。
所以如果你愿意重新启动,这是最方便的方法。
也可以看看
第六种方案
使用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
参考资料