Передать корневую файловую систему по метке ядру Linux

Передать корневую файловую систему по метке ядру Linux

Как загрузить rootfs Linux из u-boot, передав раздел rootfs по метке?

Я использую u-boot в качестве загрузчика, а карта — RedPitaya. Linux — это кастомизированный Linux на основе стабильного образа ubuntu, доступного для карты.

U-boot прошит в первом разделе SD-карты с ядром Linux и деревом устройств. Я пытаюсь загрузить корневую файловую систему на внешний USB-HDD

Я уточняю, что могу загрузить жесткий диск, если использую «классическое» соглашение об именовании /dev/sdxn.


Я уже пробовал со следующими параметрами, но оба они не дали результата:

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, поэтому он недоступен в u-boot при передаче аргументов загрузки ядру Linux.

Также я обнаружил, что функционал загрузки с метки не интегрирован в ядро ​​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-карты, чтобы определить имя устройства по его метке и перезапустить загрузку ядра с измененным именем устройства.

Что вы об этом думаете? Какой из них будет «самым простым» для реализации?

Может быть, я забыл что-то важное или кому-то уже удалось сделать то же самое.

В любом случае, я был бы рад получить помощь в достижении этой цели.

решение1

Проблема в том, что обработка LABEL и UUID не выполняется ядром Linux, а выполняется через initramfs, который вам также нужно будет предоставить. Если вы хотите обойти это, вам нужно использовать PARTUUID, который является чем-то, что через команду part U-Boot может определить для вас и передать.

Связанный контент