在linux中,如果映像文件(.img)含有分区表的话,那么用mount这个程序直接来挂载就有点力不从心了。因为mount只能挂载单个分区的文件系统映像文件。搜索了一下,可以实现的方法有很多,下面列举我认为比较方便通用性较高的两种方法。
方法1: kpartx
使用 kpartx 进行挂载可以在一些PC或者主线完整linux内核中使用,嵌入式设备使用起来就可能没这么方便了,视具体情况自行选择。具体方法如下,其中X和Y要看你的挂接的情况而看了
挂载
#先创建一个1G大小的映像文件来做实验
dd bs=4096 if=/dev/zero of=~/hd.img count=262144
#将映像文件挂接到loopX中去
losetup /dev/loopX ~/hd.img
#对loopX进行分区
fdisk /dev/loopX
#我这里分了两个区,每个去512M大小
Device Boot Start End Blocks Id System
/dev/loopXpY 2048 1050623 524288 83 Linux
/dev/loopXpY 1050624 2097151 523264 83 Linux
#正戏来了,使用kpartd装载映像
sudo kpartx -av ~/hd.img
#装载之后,就可以在/dev/mapper/目录下看到两个loopXpY的文件了。
#接下来对loopXpY进行格式化了。
mkfs.vfat /dev/mapper/loopXpY
#然后挂载文件系统。
mount /dev/mapper/loop1p1 /media/hd1
卸载
# 卸载刚才挂接的东西
kpartx -dv /dev/loopX
# 卸载映像文件的挂接关系
losetup -d /dev/loopX
方法2:losetup 偏移挂载
这种方法可以在没有kpartx支持的一些嵌入式设备上使用
挂载
# 先使用 fdisk 查看 img 硬盘镜像的分区结构
root@localhost~# fdisk -l /home/synoboot
Disk /home/synoboot: 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: 0xf110ee87
Device Boot Start End Sectors Size Id Type
/home/synoboot1 * 2048 104447 102400 50M b W95 FAT32
/home/synoboot2 104448 206847 102400 50M 83 Linux
/home/synoboott3 206848 2097151 1890304 923M 83 Linux
# 计算一下:
# 分区起始地址 * 扇区大小 = 偏移位置
# 例如挂载 synoboot1 分区,它的起始位置为2048,扇区大小为512
root@localhost~# echo $((2048*512))
1048576
# 结果为 1048576
# 设置 losetup 的偏移位置为 1048576
losetup -o 1048576 /dev/loop0 /home/synoboot
# 挂载
mount /dev/loop0 /mnt/boot
root@localhost:/mnt/boot# ls -l -a
total 12
drwx------ 4 root root 512 Jan 1 1970 .
drwxr-xr-x 5 root root 4096 Feb 16 10:13 ..
-rwx------ 1 root root 12 Jan 18 16:30 ARPL-VERSION
drwx------ 3 root root 512 Dec 13 14:25 EFI
drwx------ 5 root root 512 Dec 13 14:25 grub
-rwx------ 1 root root 55 Jan 18 16:33 grub_cksum.syno
-rwx------ 1 root root 98 Jan 18 16:33 GRUB_VER
-rwx------ 1 root root 4611 Feb 15 10:26 user-config.yml
# 可以看到已经成功挂载出来了
卸载
#卸载目录
umount /mnt/boot
#卸载loop设备
losetup -d /dev/loop0