如何在Linux下从dd创建的块设备(例如HDD)映像中挂载分区?


34

我有使用dd创建的整个磁盘的映像。磁盘结构如下:

kent@cow:~$ sudo fdisk -l

Disk /dev/sda: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000b8508

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           5       90872   729929303+  83  Linux
/dev/sda2           90873       91201     2642692+   5  Extended
/dev/sda5           90873       91201     2642661   82  Linux swap / Solaris

该图像是使用以下方法创建的:

dd if=/dev/sda of=image750.img

如果可能,如何从映像中挂载/ dev / sda1以便能够读取内容?

这不是重新克隆HDD的选择,如果我仅自己克隆了单个分区,我知道该怎么做。我希望当前图像仍然可行。



Answers:


48

如今,有一种更好的方法,不再需要使用偏移量或kpartx:

losetup --partscan --find --show disk.img

mount /dev/loop0p1 /mnt

要释放loop0,请在umount之后使用:

losetup -d /dev/loop0

8
在我的Ubuntu 14.04安装中,lostup不提供--partscan选项。
Cutter

1
@Cutter是在util-linux 2.21,Ubuntu 16.04中添加的。:-)
Ciro Santilli新疆改造中心法轮功六四事件

kpartx首先使用过,它会挂载像这样的分区/dev/mapper/loop3p1,我只想指出losetup创建像这样的设备/dev/loop0p1。答案指出了这一点,但我可能读了十遍。:/
Randy Syring

13

我今天遇到了这个问题,想更新答案只是为了提醒自己。您可以使用一种工具来为您提供可从dd映像安装的设备,而不必自己计算偏移量:kpartx

http://robert.penz.name/73/kpartx-a-tool-for-mounting-partitions-within-an-image-file/

http://linux.die.net/man/8/kpartx

在给定的情况下,它将需要类似

sudo kpartx -a image750.img
sudo mount /dev/mapper/loop1p1 /mount/point -o loop,ro

其中loop1p1代表第一个分区,loop1p2代表第二个分区,依此类推。


6

您已经有了第一部分:fdisk -l查找起始偏移量。将该数字乘以512,即可得到offset选项进行安装。因此,对于您所用的sda1,为5 * 512 =2560。然后运行安装:

mount -o loop,offset=2560 -t auto /path/to/image.dd /mount/point

4

循环安装只是答案的一部分。

请访问http://wiki.edseek.com/guide:mount_loopback#accessing_specific_partitions_in_the_image获取有关指定分区的帮助。我认为 mount -o loop,offset = 32256 /path/to/image750.img / mnt将为您工作。但您确实应该阅读提到的教程。


偏移量看起来不对;对应于分区开头为63(<i> 63 * 512 = 32256 </ i>)。在这种情况下,鲍姆加特答案中的偏移看起来更正确。该链接是很好的参考,但是如果您花时间总结此过程所需的步骤或命令,则将是一个更好的答案。谢谢!
奎克吉德

1

losetup -P 自动化

https://superuser.com/a/684707/128124提到的方法(在util-linux v2.21中添加,在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 config

util-linux v2.21之前的体面方法。

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

有关如何设置模块参数的信息,访问:https : //askubuntu.com/questions/51226/how-to-add-kernel-module-parameters

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

sudo losetup -f --show my.img

它将映像安装到/dev/loopX设备,然后自动将分区安装到/dev/loopXpY设备。

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

也可以看看


0

如果您具有诸如保险丝之类的用户模式文件系统,则在诸如Gnome之类的桌面环境中,并已安装诸如gnome-disk-image-mounter之类的工具,则通过右键单击并打开它甚至无需root即可。


0

我相信循环安装是答案-

sudo mkdir /path/to/dir/
mount -o loop example.img /path/to/dir/

上面应该将其安装在该目录下。

这应该卸载它:

umount /path/to/dir
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.