레이블별로 rootfs 파티션을 전달하는 u-boot에서 Linux rootfs를 부팅하려면 어떻게 해야 합니까?
저는 u-boot를 부트로더로 사용하고 있으며 카드는 RedPitaya입니다. Linux는 카드에 사용할 수 있는 안정적인 우분투 이미지를 기반으로 하는 맞춤형 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 HDD에 있는 파티션을 부팅하는 방법을 찾고 싶습니다 .
거기에는 두 가지 다른 솔루션이 있습니다.
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를 통해 수행된다는 것입니다. 이를 우회하려면 part 명령을 통해 U-Boot가 결정하고 전달할 수 있는 PARTUUID를 사용해야 합니다.