当前位置: 首页>>技术问答>>正文


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

, , , , ,

问题描述

我用我的整个磁盘的形象

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下的loop0p1loop0p2。从输出中你可以看到有助于识别它们的分区大小。你可以挂载你想要的:

$ sudo mount /dev/mapper/loop0p2 /mnt

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

mount,backup,disk,images,dd,ubuntu

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

$ 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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/724.html,未经允许,请勿转载。