Yocto 이미지가 부팅되지 않습니다

Yocto 이미지가 부팅되지 않습니다

이전에 StackOverflow에서 이 질문을 했는데 여기가 질문하는 것이 올바른 장소라는 말을 들었습니다.

저는 Yocto를 처음 사용하기 때문에 HDD에서 intel-corei7-64 core-image-minimal을 부팅하는 데 몇 가지 문제가 있습니다. dd를 사용하여 하드 드라이브에 넣었지만 부팅 시 커널 패닉으로 인해 중지됩니다.

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block (0,0)

나는 많은 것을 시도하고 해결책을 찾았습니다. 먼저 GRUB에 이미지를 나열하기 위해 grub 설치를 수행하고 부팅 파티션에 grub.cfg 파일을 구성해야 했지만 그 외에는 추가 정보를 얻지 못했습니다. 일부 포럼에서는 이것이 initramfs가 누락되었음을 의미한다고 말합니다. USB 플래시 드라이브에서 작동하기 때문에 이미지 자체가 손상되지는 않은 것 같습니다.

내 grub.cfg는 다음과 같습니다.

set default="0"
set timeout="30"

menuentry 'Yocto' {
        insmod part_msdos
        insmod part_gpt
        insmod ext2
        insmod all_video
        set root='(hd0,gpt2)'
        linux /boot/bzImage-4.19.40-intel-pk-standard root=/dev/sda2
}

시작 오류를 해결하는 데 도움을 주시면 좋을 것 같습니다. 이 시점에서 내가 할 수 있는 일은 거의 없었다.

감사합니다

알렉스

답변1

bzImage-4.19.40-intel-pk-standard root=/dev/sda2

Uefi 쉘에서 직접 실행하는 방법입니다. 하지만 실제로 initrd=는 빠졌어요! 저도 똑같은 문제가 있었습니다. SATA/SCSI 모듈은 커널에 없고 (대부분) initramfs에 있는 모듈입니다. 커널 옆에 initrd/initramfs를 복사하고 initrd=initram-cpio.gz("이미지" 이름 적용!) 옵션을 명령줄에 추가합니다.

VFS 오류는 다음과 같습니다. 귀하가 제공한 루트(/dev/sda2)는 제가 읽을 수 없는 블록 장치에 있습니다.


"yocto"를 검색한 후 다음을 추가하고 싶습니다. 필요한 모듈을 모듈("m") 대신 내장 모듈("y")로 구성해야 합니다. 이렇게 하면 이 "임베디드" 프로젝트의 기본 아이디어인 initrd가 필요하지 않습니다.


yocto에서 더 많은 것을 찾은 후 추가되었습니다 ...

이 욕토(그리고 당신의 Q)는 나를 내버려두지 않았습니다. 나는 2016년 lwn.net의 컨퍼런스/기사에서 이 사실을 발견했습니다.

기본적인 수준에서 […]요크토그리고루트 구축둘 다 동일한 최종 제품인 루트 파일 시스템을 제공합니다.영상임베디드 장치의 경우,핵심,ㅏ부트 로더및 호환 가능한 툴체인.

내가 보기에는 "make"를 사용하여 커널과 모듈, 원하는 경우 initrd를 컴파일하는 것이 더 좋을 것 같습니다.

왜 이 글을 썼는지 말해줄 수 있나요:

나는 dd를 사용하여 [커널 이미지]를 하드 드라이브에 넣습니다.

이제 이것이 나를 혼란스럽게 합니다. 이미 해본 것과 같습니다 dd ... of=/dev/sda. 나는 이렇게 말하고 싶습니다: 커널 이미지를 파티션 x의 디렉토리에 복사했습니다.

이제 Yocto가 빌드하는 모든 것이 끝났습니다.구운 것커널과 initrd, 이제 리눅스 커널을 시작하는 방법을 모르십니까? ! ?


새 미니 PC 키트로 시작하는 중이어서 디스크가 비어 있습니다. GPT와 Uefi를 사용하기로 결정했습니다. MBR을 마지막으로 사용한 지 오래되었습니다. 먼저 USB 플래시 드라이브에서 슬랙웨어 설치 프로그램을 시작했습니다.

"EFI" 또는 "ESP" 유형을 포함하여 fdisk를 사용하여 일부 파티션을 만들었습니다. 저는 현명하게 2GB로 설정했습니다. 일부에서는 100MB만 권장합니다. ESP는 BIOS에서도 읽기 때문에 vfat 형식이 필요합니다.

내가 찾은 유일한 (컴파일된) Linux 커널은 설치 프로그램과 라이브 시스템의 ISO 이미지에 있는 커널입니다. opensuse 라이브 USB 시스템에서 ISO를 마운트한 다음 kernel과 initrd라는 두 파일이 포함된 squashs rootfs를 마운트할 수 있습니다.

이 두 파일(커널 및 초기 RAM 디스크)을 2GB ESP에 복사했습니다. 커널은 3~8MB이고, initrd는 10~30MB입니다.

UEFI 쉘 명령처럼 커널 이름을 입력하여 커널을 부팅할 수 있는 Uefi 쉘로 BIOS를 부팅합니다.

이 모든 것을 알아내는 데 시간이 걸렸기 때문에 커널 패닉이 발생했을 때 큰 성공을 거두었습니다.

fs0: vmlinuz

이것은 파일 이름 "vmlinuz"를 사용하여 uefi 프롬프트 ESP(예: "fs0")에서 커널을 부팅하는 방법입니다.

또한 root=가 없기 때문에 패닉이 발생합니다. 나는 빨리 시도했다:

fs0: vmlinuz root=/dev/sda2

이로 인해 처음에 설명했던 커널 패닉이 발생했습니다.

VFS: rootfs를 마운트할 수 없습니다...

initrd=...cpio.gz여기에서 두 가지 경로를 선택할 수 있습니다. 커널을 KCL 옵션(커널 명령줄)으로 추가하여 커널과 함께 제공되는 initrd를 사용합니다. 아니면 Fedora 29 커널을 사용하세요. 이것은 내 sda 장치를 마운트할 수 있는 유일한 커널입니다. 그 이유는 일부 Kconfig 옵션이 내장되어 있지만 다른 모든 배포판에서는 이를 initrd(sata, scsi, sd-mod)에 모듈로 넣기 때문입니다.

나는 Archlinux의 빠른 설치에 매우 만족하지만 initrd 없이 부팅할 수 있도록 커널을 직접 컴파일해야 한다고 생각합니다. 커널은 자체적으로 루트 파일 시스템을 마운트할 수 있어야 합니다.

보시다시피 컴파일이나 욕토(yocto), 그럽(grub)이 없습니다. 배포판에서 ISO로 이동하면 많은 실험을 할 수 있습니다. 중요한 시작 옵션은 다음과 같습니다.

initrd=...img

1996-2000년의 원본 커널 문서는 일부 위치에서 오해의 소지가 있습니다. 그러나 Almesberger는 그의 initrd가 시작이 두 단계로 "허용"된다는 점을 분명히 했습니다. 그리고: rdinit=램디스크 내의 스크립트는 "실제" 루트와 switch_root를 마운트할 수 있습니다. 어떤 경우에는 2단계 시작이 필요합니다.

커널 소스 코드에서 "VFS:" 커널 패닉을 추적했습니다. "prepare_namespace" 함수가 핵심입니다. initrd=가 주어지면 커널 마운트의 root= 부분을 건너뜁니다. 소스에 "initrd가 있으면 모든 작업을 수행하도록 하십시오"라는 설명이 있습니다.

root=/dev/xxyy

initrd=가 없으면 커널에 "부팅"해야 하는 (블록) 장치를 직접 알려줍니다. initrd를 사용하면 switch_root를 사용할 수 있습니다. A root=/dev/ram0에는 특별한 의미가 있습니다. 즉, 초기 램 디스크를 처음부터 실제 루트로 만듭니다. 나는 이것이 많은 임베디드 시스템에 유용하다고 생각합니다. rootfs는 파티션이 아닌 cpio 파일에 있습니다.

init=/sbin/init

이것이 커널이 시작 시 수행하는 마지막 작업입니다. 즉, 첫 번째 프로세스를 호출합니다. root=와 마찬가지로 initrd=를 제공하면 매개변수를 구문 분석하는 것은 램디스크에 달려 있습니다. 커널은 root=를 마운트한 후에만 "/"를 이해한다는 점에 유의하십시오.

BIOS가 "Uefi 셸"로 전환되고 디스크가 GPT 형식(또는 하이브리드/보호 MBR)이고 작은(너무 작지는 않은) ESP vfat 파티션을 추가하면 커널과 initrd를 부팅할 수 있습니다.

현재 계획은 표준 SSD 파티션을 마운트할 수 있는 커널을 컴파일하는 것이므로 initrd가 필요하지 않습니다. 포르노 "임베딩"을 수행하기 위해 yocto나 grub이 필요하지 않습니다. 한 달에 두 번 최신 커널 소스를 컴파일하고 싶지 않다면... 하지만 나만의 배포판을 만드는 것이 아니라 커널을 컴파일하고 싶습니다!

여기서 멈추겠습니다. 제 기사에서 Linux 부팅 아이디어를 얻을 수 있기를 바랍니다.커널 명령줄 모험.

답변2

드디어 Yocto 이미지를 성공적으로 출시했습니다!

누구든지 시작할 때 같은 문제가 발생하는 경우에는 이렇게 했습니다.

먼저 평소대로 grub 설치를 수행하고 EFI 파티션(저의 경우 /dev/sda1)의 /boot/grub/에 grub.cfg를 추가했습니다. 그 후 grub.cfg 파일에 search --set=root --file /vmlinuz추가했습니다 . 그런 다음 sam68이 grub.cfg에 파일을 추가할 것을 제안함에 따라 Fedora 30의 파일을 루트 파티션(/dev/sda2)에 set root=(blabla)복사했습니다 . 이 지점에 도달하는 데 며칠이 걸렸으므로 누구에게나 도움이 되기를 바랍니다! vmlinuzlinux /vmlinuz /dev/sda2

관련 정보