u-boot에서 Linux rootfs를 부팅하고 레이블별로 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.cdev_t name_to_dev_t(const char *name)
함수 정의 직전 .
ROOTFS
그래서 지금부터 로 표시된 파티션을 부팅하는 방법을 찾아보고자 합니다 .
거기에는 두 가지 다른 솔루션이 있습니다.
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를 통해 수행된다는 것입니다. 이를 우회하려면 U-Boot가 부분 명령을 통해 결정하고 전달할 수 있는 PARTUUID를 사용해야 합니다.