![为什么要在循环安装中进行特定偏移?](https://linux22.com/image/85662/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%9C%A8%E5%BE%AA%E7%8E%AF%E5%AE%89%E8%A3%85%E4%B8%AD%E8%BF%9B%E8%A1%8C%E7%89%B9%E5%AE%9A%E5%81%8F%E7%A7%BB%EF%BC%9F%20.png)
我正在研究命令这里在关于的帖子中如何编译和安装Qt、qwt以及超频RPI
sudo mount -o loop,offset=62914560
<date>-wheezy-raspbian.img /mnt/rasp-pi-rootfs
我做fdisk 2016-02-26-raspbian-jessie.img
并且我得到
Disk: 2016-02-26-raspbian-jessie.img geometry: 976/128/63 [7870464 sectors]
Signature: 0xAA55
Starting Ending
#: id cyl hd sec - cyl hd sec [ start - size]
------------------------------------------------------------------------
1: 0C 0 130 3 - 8 40 32 [ 8192 - 122880] Win95 FAT32L
2: 83 8 40 33 - 489 232 63 [ 131072 - 7739392] Linux files*
3: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
4: 00 0 0 0 - 0 0 0 [ 0 - 0] unused
为什么 mount 中的 offset 是特定的?
答案1
由于 62914560 正好指向文件中的 60MiB,我认为最好的猜测是 Raspian 磁盘映像实际上已分区。偏移量告诉mount
(或实际上losetup
)实际的偏移量根文件系统(我建议这是两个分区中的第二个,第一个很可能是/boot
引导加载程序/固件文件)。
这里的问题是,即使loop
驱动程序实际上支持分区映像,但在加载模块时(或在内核命令行上)必须将每个设备的最大分区数loop
指定为模块参数。由于有许多发行版默认情况下不会执行此操作,因此这是使用默认参数(为 0,因此不支持分区)...,offset=XXX
时处理分区图像的最可靠方法。loop
您可以loop
通过查看 来测试您的驱动程序是否加载了分区支持/sys/module/loop/parameters/max_part
。在我当前的系统(ArchLinux)上,loop
不带参数加载后是:
$ cat /sys/module/loop/parameters/max_part
0
要启用分区支持,您必须卸载loop
并使用所需的选项值再次加载它max_part
,例如
# modprobe -r loop
# modprobe loop max_part=8
之后,您可以尝试通过执行以下操作来手动设置图像的循环设备
# losetup /dev/loop0 /path/to/<date>-wheezy-raspbian.img
现在,您不仅应该看到/dev/loop0
代表整个图像,而且(只要我的理论是正确的;)对于图像中的所有分区也有/dev/loop0p1
、等(参见脚本/dev/loop0p2
losetup
例子)。
编辑:
如果您想自己以繁琐的方式执行此操作(我建议简单地loop
使用正确的max_part
选项重新加载并简单地使用分区),您可以通过fdisk
直接在映像文件上使用来找出需要哪个偏移量(用 ArchLinux ISO 显示) ,因为我手头上有它,但想法是一样的):
$ fdisk -l archlinux-2016.03.01-dual.iso
Disk archlinux-2016.03.01-dual.iso: 268.3 MiB, 281339392 bytes, 549491 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: 0x2237702c
Device Boot Start End Sectors Size Id Type
archlinux-2016.03.01-dual.iso1 * 0 1452031 1452032 709M 0 Empty
archlinux-2016.03.01-dual.iso2 172 63659 63488 31M ef EFI (FAT-12/16/32)
第二个分区从扇区 172 开始,扇区大小为 512 字节。将两个值相乘即可得到以字节为单位的偏移量,因此要安装分区,您将使用:
# mount -o loop,offset=$((172*512)) archlinux-2016.03.01-dual.iso /mnt
# ls -l /mnt
total 4
drwxr-xr-x 4 root root 2048 Mar 1 15:49 EFI
drwxr-xr-x 3 root root 2048 Mar 1 15:49 loader
瞧。
答案2
根据“losetup”手册页。
-o, --offset offset 将数据开始移动offset字节到指定的文件或设备
例如,如果您有设备的“dd”,那么您可以使用以下命令挂载其任何分区抵消选项。
该偏移值是通过将分区的起始值乘以扇区大小来计算的
例如
SHW@SHW:/tmp # fdisk -lu 040614.dd
Disk 040614.dd: 1.9 GiB, 2048385024 bytes, 4000752 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: 0x5324798e
Device Boot Start End Sectors Size Id Type
040614.dd1 * 2048 30719 28672 14M 83 Linux
040614.dd2 30720 1054719 1024000 500M 83 Linux
040614.dd3 1054720 1095679 40960 20M 83 Linux
SHW@SHW:/tmp # mount -o loop,offset=`echo 1054720 \* 512|bc` 040614.dd1 /mnt/loop
更新:
040614.dd通过以下命令创建:
SHW@SHW:/tmp # fdisk -l /dev/sdb
Disk /dev/sdb: 1.9 GiB, 2048385024 bytes, 4000752 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: 0x5324798e
Device Boot Start End Sectors Size Id Type
/dev/sdb1 * 2048 30719 28672 14M 83 Linux
/dev/sdb2 30720 1054719 1024000 500M 83 Linux
/dev/sdb3 1054720 1095679 40960 20M 83 Linux
SHW@SHW:/tmp # dd if=/dev/sdb of=040614.dd