我使用

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/文件夹中的方法...

有人知道怎么做吗?总是dd将映像返回到原始磁盘,但这会非常不方便(我更新了操作系统,并希望保持原样)

#1 楼

获取图像的分区布局
$ 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上/ dev / loop0。您可以将其固定,安装等

sudo losetup -o 28672 /dev/loop0 sda.img


卸载

sudo fsck -fv /dev/loop0
sudo mount /dev/loop0 /mnt


评论


非常感谢!像魅力一样工作!您成就了我的一天(并挽救了一个纯洁的豹猫,使其免受残酷地删除; P)

–尼古拉·费特林(Nicola Feltrin)
2011年10月21日在17:10

至少在bash上,shell甚至可以为您做数学:sudo losttup -o $(((56 * 512))/ dev / loop0 sda.img

– EnnoGröper
13年1月13日在11:55

这不仅有用,而且绝对很棒。

– andho
13年2月18日在13:38

如果有.img1和.img2怎么办? “ win8.raw1 * 2048 718847 358400 7”和“ win8.raw2 718848 52426751 25853952 7”

– Enkouyami
13-10-4在1:16



甚至更简单:mount -o loop,offset = $(((56 * 512))sda.img / mnt。资料来源:madduck.net/blog/…

– ostrokach
2015年9月10日在19:33



#2 楼

Ubuntu 16.04的更新:使用新的losetup,现在更容易了:


一个简单的解决方案是使用kpartx:它将找出分区布局并将每个映射到块设备。之后,您要做的就是安装所需的磁盘。

打开终端,找到磁盘映像,然后输入以下命令:

sudo losetup -Pf disk_image.raw


这在loop0p1下创建了loop0p2/dev/mapper。从输出中,您可以看到分区的大小,这有助于您识别它们。您可以通过以下方式安装所需的组件: br />

完成后,卸下已安装的内容并删除设备映射:

$ 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


评论


出色的答案,快速又轻松,避免乘法步骤很不错

–古怪的长老
2014年5月13日19:11

sudo apt-get install kpartx-获取对kpartx的访问。我认为帖子开头的kpartx链接是一个“陷阱”。暗示安装软件的链接是禁止的。

– Hannu
2014年7月31日在18:26



@Hannu,与Software Center集成的链接是askubuntu的一种常见做法,尽管在这种特殊情况下,可以添加典型图标并应更新URL。

–乔尼
14年8月8日在8:46

仅供参考,Lostup -Pf ..命令将创建仍需要挂载的设备,例如/ dev / loopXpY。您可以通过查看Lostup命令的输出找到X。 Y是分区号。

–枪类
18/12/21在23:42

还要将--show添加到Lostup命令,如@Ludovic Ronsin在此处所说(askubuntu.com/a/496576/327339),这样您就可以看到正在创建哪个循环设备号。

–加百利·斯台普斯
19年7月29日在6:59

#3 楼

编辑:与util-linux> = 2.21一起使用。在撰写本文时,ubuntu仅附带2.20版本

从man losttup:

       -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能够照常安装。

评论


在哪里可以找到此版本的Lostup?我在Ubuntu 14.04中拥有的那个有一个自2003年7月以来的联机帮助页(util-linux),没有用于扫描分区的-P选项(或其他任何选项)。

– Hannu
2014年7月31日在18:26

抱歉,我犯了一个错误,我在Arch Linux上一直使用此选项,该选项随附了较新版本的util-linux软件包。似乎Ubuntu不幸地停留在2012年1月发布的2.20.1版本上! --partscan选项已在util-linux 2.21中引入

–路多维奇·朗森(Ludovic Ronsin)
2014年8月4日15:09

好吧,gnome-disks可以选择安装磁盘映像及其分区。 (<-用于安装和bash /终端使用,短划线磁盘也找到它)。

– Hannu
2014年8月4日15:35



这应该是公认的答案...

–matthid
15年4月23日在12:54

@matthid甚至可以更改已接受的答案吗?这很好(而且kpartx答案实际上取决于该版本的Lostup),但比接受的答案快了近三年,当时是这样做的方法。

–澳大利亚
15/12/26在23:10

#4 楼

尝试gnome-disk-image-mounter

gnome-disk-image-mounter sda.img


不需要sudo。它将像USB驱动器一样安装在/media/your_user_name/partition_name上。

评论


在16.04上运行良好。我刚刚安装了新的18.04,并且该工具要求输入sudo密码才能访问/ dev / loopXX虚拟设备:(

–洛朗
18年6月28日在23:36

#5 楼

losetup -P自动化

losetup -P是从Ubuntu 16.04开始的最佳方法,如https://askubuntu.com/a/496576/52975所述,以下是实现进一步自动化的功能。用法:

$ 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=""
  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"
  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 config

在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

如何设置模块参数的内容也涉及:如何添加内核模块参数?

重新启动后,当您执行以下操作:
所以我如果您愿意重启,这是最方便的方法。

另请参阅


https://unix.stackexchange.com/questions/9099/reading-来自整个磁盘映像的文件系统
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从包含一个组成部分的文件中


#6 楼

使用Lostup附加整个磁盘映像。

# 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


评论


这是一个有趣的把戏:)

– JohanBoulé
17/12/16在2:10

最简单的方法谢谢

–巴哈·奥德(Bahaa Odeh)
20年6月15日在13:29

#7 楼

我认为,最简单的方法是使用此答案在StackOverflow上提到的mount -o loop,offset=...。这个想法如下:

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