为什么要在循环安装中进行特定偏移?

为什么要在循环安装中进行特定偏移?

我正在研究命令这里在关于的帖子中如何编译和安装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/loop0p2losetup例子)。

编辑:

如果您想自己以繁琐的方式执行此操作(我建议简单地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

相关内容