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

Nic*_*rin 145 backup mount disk dd disk-image

我制作了整个磁盘的图像

dd if=/dev/sda of=/media/external_media/sda.img
Run Code Online (Sandbox Code Playgroud)

现在的问题是我想挂载该磁盘上的 ext4 文件系统,但是

mount -t ext4 -o loop /media/external_media/sda.img /media/sda_image
Run Code Online (Sandbox Code Playgroud)

显然会出现超级块错误,因为映像包含整个磁盘(MBR、其他分区),而不仅仅是我需要的分区。所以我想我应该找到一种方法让磁盘映像显示在/dev/文件夹中...

有谁知道这是怎么做到的吗?

PS:我可以随时dd将图像备份到原始磁盘,但这会非常不方便(我更新了操作系统,我想保持原样)

arr*_*nge 167

获取镜像的分区布局

$ 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)
Run Code Online (Sandbox Code Playgroud)

计算从镜像开始到分区开始的偏移量

扇区大小*开始=(在这种情况下)512 * 56 = 28672

使用偏移量将其挂载到 /dev/loop0

sudo losetup -o 28672 /dev/loop0 sda.img
Run Code Online (Sandbox Code Playgroud)

现在分区位于/dev/loop0 上。你可以fsck它,挂载它等

sudo fsck -fv /dev/loop0
sudo mount /dev/loop0 /mnt
Run Code Online (Sandbox Code Playgroud)

卸载

sudo umount /mnt
sudo losetup -d /dev/loop0
Run Code Online (Sandbox Code Playgroud)

  • 至少在 bash 上,shell 甚至可以为您计算:`sudo lossup -o $((56*512)) /dev/loop0 sda.img` (13认同)
  • 更简单:`mount -o loop,offset=$((56 * 512)) sda.img /mnt`。来源:http://madduck.net/blog/2006.10.20:loop-mounting-partitions-from-a-disk-image/ (13认同)
  • 这不仅有帮助,而且绝对很棒。 (2认同)

Jon*_*oni 131

Ubuntu 16.04 的更新:有了新的,losetup这现在更容易了:

sudo losetup -Pf disk_image.raw
Run Code Online (Sandbox Code Playgroud)

请参阅旧版本 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
Run Code Online (Sandbox Code Playgroud)

这创建loop0p1loop0p2/dev/mapper. 从输出中您可以看到分区的大小,这有助于您识别它们。你可以安装你想要的:

$ sudo mount /dev/mapper/loop0p2 /mnt
Run Code Online (Sandbox Code Playgroud)

或者,Nautilus 检测到块设备,您可以从侧栏安装它:

在此处输入图片说明

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

$ sudo umount /mnt
$ sudo kpartx -d disk_image.raw
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,`losetup -Pf ..` 命令将创建像 `/dev/loopXpY` 这样的设备,你仍然需要挂载。您可以通过查看 `losetup` 命令的输出来找到 `X`。“Y”是分区号。 (2认同)
  • 还要将 `--show` 添加到 `losetup` 命令中,如@Ludovic Ronsin 此处所说(https://askubuntu.com/a/496576/327339),这样您就可以看到正在创建哪个循环设备编号。 (2认同)

Lud*_*sin 34

编辑:适用于util-linux >=2.21。在撰写本文时,ubuntu仅附带2.20

来自man lossup

       -P, --partscan
          force kernel to scan partition table on newly created loop device
Run Code Online (Sandbox Code Playgroud)

所以就跑

$ sudo losetup -f --show -P /path/to/image.img
Run Code Online (Sandbox Code Playgroud)

在第一个未使用的循环设备上为磁盘映像的每个分区创建设备节点并将其打印到标准输出。如果使用/dev/loop0设备,它至少会创建/dev/loop0p1您可以像往常一样安装。

  • 我在哪里可以找到这个版本的 `losetup` ?我在 Ubuntu 14.04 中拥有的联机帮助页来自 2003 年 7 月 (util-linux),并且没有用于扫描分区的 `-P` 选项(或其他任何选项)。 (2认同)
  • 这应该是公认的答案...... (2认同)

Mih*_*otă 11

尝试gnome-disk-image-mounter

gnome-disk-image-mounter sda.img
Run Code Online (Sandbox Code Playgroud)

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


Cir*_*郝海东 8

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
Run Code Online (Sandbox Code Playgroud)

来源:

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"
)
Run Code Online (Sandbox Code Playgroud)

循环模块 max_part 配置

这是 16.04 之前的好方法。

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

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

cat /sys/module/loop/parameters/max_part
Run Code Online (Sandbox Code Playgroud)

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

0在 Ubuntu 14.04 上是默认的,这就是为什么没有自动拆分发生的原因。

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

options loop max_part=31
Run Code Online (Sandbox Code Playgroud)

到 中的文件/etc/modprobe,或:

GRUB_CMDLINE_LINUX="loop.max_part=31"
Run Code Online (Sandbox Code Playgroud)

/etc/default/grub然后sudo update-grub

如何设置模块参数也包括在:如何添加内核模块参数?

重新启动后,当您执行以下操作时:

sudo losetup -f --show my.img
Run Code Online (Sandbox Code Playgroud)

它将映像挂载到/dev/loopX设备,并自动将分区挂载到/dev/loopXpY设备。

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

也可以看看


小智 7

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

# sudo losetup /dev/loop2 sda.img
Run Code Online (Sandbox Code Playgroud)

然后使用 mdadm 创建一个 md 设备,将为所有分区创建块设备。

# sudo mdadm --build --level=0 --force --raid-devices=1 /dev/md2 /dev/loop2
mdadm: array /dev/md2 built and started.
Run Code Online (Sandbox Code Playgroud)

现在您应该看到分区设备。

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
Run Code Online (Sandbox Code Playgroud)


小智 6

在我看来,最简单的方法是使用StackOverflow 上的这个答案中mount -o loop,offset=...提到的。思路如下:

fdisk -l $IMAGE
# calculate the offset in bytes
mount -o loop,offset=$OFFSET $IMAGE $MOUNTPOINT
Run Code Online (Sandbox Code Playgroud)

该方法是最好的,因为它不需要在卸载挂载分区后删除循环设备。

为了进一步简化任务(如果您经常这样做,则需要这样做),您可以使用我的脚本mountimg为您完成所有工作。只需从https://github.com/AlexanderAmelkin/mountimg获取它 并像这样使用:

mountimg /media/external_media/sda.img 2 /media/sda_image
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您也可以指定文件系统类型和任何其他附加挂载选项:

mountimg /media/external_media/sda.img 2 /media/sda_image -t vfat -o codepage=866,iocharset=utf-8
Run Code Online (Sandbox Code Playgroud)

完成分区后,只需umount

umount /media/sda_image
Run Code Online (Sandbox Code Playgroud)