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

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

我制作了整个磁盘的映像

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

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

答案2

Ubuntu 16.04 更新:有了新的功能losetup,现在变得更容易了:

sudo losetup -Pf disk_image.raw

请参阅针对旧版本 Ubuntu 的其余答案。


一个简单的解决方案是使用陣容:它将确定分区布局并将每个分区映射到块设备。之后,您要做的就是挂载所需的分区。

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

$ 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

这会在 下创建loop0p1和。从输出中,您可以看到分区的大小,这有助于您识别它们。您可以使用以下命令挂载所需的分区:loop0p2/dev/mapper

$ sudo mount /dev/mapper/loop0p2 /mnt

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

在此处输入图片描述

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

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

答案3

编辑:适用于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您可以照常挂载的设备节点。

答案4

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 配置

这是 16.04 之前的一个不错的方法。

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

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

cat /sys/module/loop/parameters/max_part

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

这是0Ubuntu 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设备。

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

也可以看看

相关内容