从整个磁盘(设备)的映像挂载单个分区


117

我用制作了整个磁盘的映像

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:我总是dd可以将映像备份到原始磁盘上,但是这样做非常不方便(我更新了操作系统,并希望保持原样)。

Answers:


142

获取图像的分区布局

$ 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

非常感谢!像魅力一样工作!您
成就

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

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

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

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

105

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

此创建loop0p1loop0p2/dev/mapper。从输出中,您可以看到分区的大小,这有助于您识别它们。您可以使用以下方法安装所需的一个:

$ sudo mount /dev/mapper/loop0p2 /mnt

另外,Nautilus可以检测到块设备,您可以从侧边栏中安装它:

在此处输入图片说明

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

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw

出色的答案,快速又轻松,避免了乘法步骤,很好
Elder Geek

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

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


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

26

编辑:与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

在第一个未使用的循环设备上为磁盘映像的每个分区创建设备节点,并将其打印到stdout。如果使用/dev/loop0设备,它将至少/dev/loop0p1使您能够照常安装。


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

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

1
好吧,gnome-disks可以选择安装磁盘映像及其分区。(<-用于安装和bash / Terminal,也可以Disks在破折号中找到它)。
Hannu 2014年

2
这应该是公认的答案……
matthid 2015年

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

9

尝试gnome-disk-image-mounter

gnome-disk-image-mounter sda.img

没有sudo必需的。它将/media/your_user_name/partition_name像USB驱动器一样安装在上。


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

7

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

在16.04之前,这是一种不错的方法。

loop 是内核模块,内置于Ubuntu 14.04中。

如果配置正确,Linux会自动为您拆分设备。

cat /sys/module/loop/parameters/max_part

表示loop设备可以生成多少个分区。

0在Ubuntu 14.04上默认是默认设置,这就是为什么不会自动拆分的原因。

要更改它,我们可以添加:

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设备。

因此,如果您愿意重启,这是最方便的方法。

也可以看看


5

使用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年

4

我认为,最简单的方法是使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.