我安装系统的时候,创建了分区,生成了fstab。这是它的内容:
# /dev/sda3
UUID=abe3b587-3a5f-47d6-8f66-2df758e70665 / ext4 rw,relatime,data=ordered 0 1
# /dev/sda1
UUID=D2C4-B10A /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2
# /dev/sda2
UUID=23349153-86c4-495a-a78d-1034090f3cb1 none swap defaults 0 0
使用设备映射器,我创建了一个将所有请求转换为真实设备的虚拟设备。例如,设真实设备为/dev/sda3,虚拟设备为/dev/mapper/root_part。
我在 udev 守护进程规则中创建它。以下是规则本身:
KERNEL=="sd*",SUBSYSTEM=="block",ACTION=="add",ENV{ID_FS_UUID}=="abe3b587-3a5f-47d6-8f66-2df758e70665",RUN+="/lib/udev/create_virtual.sh %k"
KERNEL=="sd*",SUBSYSTEM=="block",ACTION=="remove",ENV{ID_FS_UUID}=="abe3b587-3a5f-47d6-8f66-2df758e70665",RUN+="/lib/udev/remove_virtual.sh"
反过来,脚本在那里执行:
创建_virtual.sh
#!/bin/bash
echo 0 32359055360 basic_target /dev/$1 0 | dmsetup create root_part
exit 0
remove_virtual.sh
#!/bin/bash
dmsetup remove root_part
exit 0
basic_target 是从本文复制(并进行了一些修改)的自写内核模块。
我的解决方案是修复 fstab,以便不挂载根分区本身,而是挂载其对应的虚拟分区。为此,我需要 udev 守护进程在处理 fstab 之前创建这个虚拟设备。但这里有问题。将规则的优先级设置得太高是行不通的,因为我后来意识到,设备会在以下规则之一中获取 UUID。逐渐降低优先级,我确保不再发生此错误,但出现了一个新错误 - 我要在其上制作虚拟机的设备进入“忙碌”状态。同时,闪存驱动器的类似技巧并没有给出这个错误:根据 fstab 中添加的行创建并挂载了一个虚拟设备。从中我得出结论 /dev/sda3 已经安装。
由于没有实现我的目标,我决定简单地从 fstab 中删除带有根部分的行,并直接从 create_virtual.sh 脚本挂载设备。但是从 fstab 中删除行没有任何作用。我什至完全清除了 fstab - 系统继续正常启动。
我的问题是如何在挂载分区时强制系统使用其他设备?
另外,如果有更好的方法来解决我的问题,那么我真的很想听听。
您的根分区已明确安装在initrd中。
因此,如果您希望使用您的模块安装它,您必须至少将该模块包含在您的 initrd 中。
好吧,并在同一个地方使用dmsetup执行所有必要的操作。