Как загрузить 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 может определить для вас и передать.