PVE下挂载一个img磁盘镜像是分为两步的:

  • 使用 fdisk 命令得知这个img磁盘镜像中各个分区的起始位置,就是偏移量;
  • 使用 mount 把磁盘镜像以回环设备的形式挂载到文件系统的某个目录上,需要指定分区的偏移量。

假设 DS918_7.21.img 已经存在于 /var/lib/vz/template/iso/ 目录下,可以查看这个回环设备的分区信息:

1
2
3
4
5
6
7
8
9
10
11
12
➜  / fdisk -lu /var/lib/vz/template/iso/DS918_7.21.img
Disk /var/lib/vz/template/iso/DS918_7.21.img: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x16af7bb3

Device Boot Start End Sectors Size Id Type
/var/lib/vz/template/iso/DS918_7.21.img1 * 2048 104447 102400 50M 83 Linux
/var/lib/vz/template/iso/DS918_7.21.img2 104448 206847 102400 50M 83 Linux
/var/lib/vz/template/iso/DS918_7.21.img3 206848 2097151 1890304 923M 83 Linux

运行结果如下:

可以得知第一个分区的起始位置是在整个磁盘的第 2048 扇区(从0计数),而每一个扇区大小是512字节,所以第一个分区的偏移量是 2048 * 512 = 1048576。其实,如果你预先已经知道了各个分区的偏移量,那么之前的这些操作都可以跳过,直接进行下面的操作。上面的这些操作,就是为了获知分区的偏移量的。

为了挂载第一个分区,使用如下命令:

1
2
mkdir /mnt/img
mount -o loop,offset=1048576 /var/lib/vz/template/iso/DS918_7.21.img /mnt/img

执行之后,img文件中的第一个分区就已经挂载在了 img 目录上了,挂载其它分区也是类似的。

1
2
➜  img ls
ARPL-VERSION boot EFI grub_cksum.syno GRUB_VER logs user-config.yml

取消挂载操作

1
umount /mnt/img