通过标签将根文件系统传递给linux内核

通过标签将根文件系统传递给linux内核

如何从 u-boot 引导 linux rootfs,并按标签传递 rootfs 分区?

我使用 u-boot 作为引导加载程序,该卡是 RedPitaya。 linux是基于该卡可用的稳定ubuntu镜像的定制Linux。

U-boot 与 linux 内核和设备树一起闪存在 sd 卡的第一个分区中。我正在尝试在外部 USB HDD 上启动根文件系统

我精确地说,如果我使用“经典”/dev/sdxn 命名约定,我可以启动 HDD。


我已经尝试使用以下参数,但它们都失败了:

console=ttyPS0,115200 root=/dev/disk/by-label/ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1

console=ttyPS0,115200 root=LABEL=ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1

根据我的研究了解,/dev/disk/by-label 由 udev 填充,因此在将引导参数传递给 Linux 内核时,它在 u-boot 中不可用。

我还发现从标签启动的功能没有集成到 Linux 内核中,正如您在这个文件中看到的那样do_mounts.c就在dev_t name_to_dev_t(const char *name)函数定义之前。

所以从现在开始我想找到一种方法来启动ROOTFS外部USB硬盘上标记为的分区。


我在那里看到两种不同的解决方案:

1 - 通过添加类似内容将按标签引导功能集成到 Linux 内核中

if (strncmp(name, "LABEL=", 6) == 0) {
        name += 6;
        res = devt_from_label(name);
        if (!res)
            goto fail;
        goto done;
}

进入do_mounts.c并实现该功能devt_from_label

2 - 在 sd 卡的第二个分区上使用一个小 rootfs 从其标签中解析设备名称,并使用替换的设备名称重新启动内核启动。

你怎么看待这件事 ?哪一个是实施起来“最简单”的?

也许我忘记了一些重要的事情或者有人已经成功地做了同样的事情。

不管怎样,我很高兴能得到一些帮助来实现它

答案1

问题是 LABEL 和 UUID 处理不是由 Linux 内核完成的,而是通过 initramfs 完成的,您也需要提供它。如果你想绕过它,你需要使用 PARTUUID,这是通过部分命令,U-Boot 可以为你确定并传递。

相关内容