如何自动挂载带分区的循环设备

she*_*lbc 3 linux block-device

我正在测试一些文件系统驱动程序代码,并希望在内核之外进行此操作。最简单、最安全的方法是从用户空间执行此操作。所以,我创建了一个一定长度的文件

\n\n

dd if=/dev/zero of=testfs bs=10M count=50

\n\n

然后我使用fdisk安装了MBR分区方案

\n\n

fdisk testfs

\n\n

我可以设置一个循环设备以块模拟模式访问我的文件:

\n\n
$ losetup /dev/loop0 testfs\n
Run Code Online (Sandbox Code Playgroud)\n\n

此时我可以在设备列表中看到这个新的模拟块设备:

\n\n
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT\nsda      8:0    0    50G  0 disk \n\xe2\x94\x9c\xe2\x94\x80sda1   8:1    0    46G  0 part /\n\xe2\x94\x9c\xe2\x94\x80sda2   8:2    0     1K  0 part \n\xe2\x94\x94\xe2\x94\x80sda5   8:5    0     4G  0 part [SWAP]\nsr0     11:0    1  55.2M  0 rom  \nloop0    7:0    0    50M  0 loop \n
Run Code Online (Sandbox Code Playgroud)\n\n

并且该设备具有以下分区表

\n\n
$ fdisk -l /dev/loop0 \n\nDisk /dev/loop0: 52 MB, 52428800 bytes\n96 heads, 25 sectors/track, 42 cylinders, total 102400 sectors\nUnits = sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisk identifier: 0xe7d5af9a\n\n      Device Boot      Start         End      Blocks   Id  System\n/dev/loop0p1   *        2048      102399       50176    7  HPFS/NTFS/exFAT\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,要创建文件系统,我需要安装分区,而不是“磁盘”。循环系统是否不会像其他块设备一样自动挂载设备的分区?我能够通过循环以偏移量安装文件来创建文件系统

\n\n
$ losetup -o $((2048*512)) /dev/loop0 testfs\n
Run Code Online (Sandbox Code Playgroud)\n\n

但该解决方案并不理想,因为其行为与真实的块设备略有不同。通过循环设备时有没有办法“自动挂载”分区?

\n

use*_*686 7

有一个选项:

losetup --partscan /dev/loop0 testfs
Run Code Online (Sandbox Code Playgroud)

这将激活内核中的常规分区支持、创建/dev/loop0p1等。


您还可以使用 util-linux 中的partx:

losetup /dev/loop0 testfs
partx -u /dev/loop0
Run Code Online (Sandbox Code Playgroud)

这将创建基于内核的分区(/dev/loop0p1等),但分区表本身将使用 libblkid 进行解析,而不是询问内核。


最后还有来自 multipath-tools 的 kpartx:

losetup /dev/loop0 testfs
kpartx -u /dev/loop0
Run Code Online (Sandbox Code Playgroud)

虽然乍一看这与上面的相同,但它根本没有使用内核的本机循环分区支持。相反,它使用设备映射器子系统(线性映射)进行创建。/dev/mapper/loop0p1