UEFI에서 직접 커널 부팅

UEFI에서 직접 커널 부팅

UEFI에서 직접 Arch Linux를 부팅하고 싶습니다.

내 생각은 도구를 사용하여 부팅 항목을 만드는 것입니다 efibootmgr. 나는 다음 명령을 사용했습니다.

efibootmgr --create --label "arch-test" --loader /vmlinuz-linux --unicode 'root=PARTUUID=f2083749-8bbc-570b-ab3b-e79d72fa08ac rw initrd=\initramfs-linux.img' --verbose

나는 팔로우했다EFISTUB의 Arch Wiki 페이지항목을 생성했지만 해당 항목에서 부팅을 시도하면 다음 메시지와 함께 시스템이 매우 초기 단계에서 부팅이 중단되었습니다.

VFS: unable to mount root fs on unknown-block(0,0)

추신: 저는 이것을 비상/구조 도구로 사용하고 싶습니다. 즉, 최신 systemd업그레이드로 인해 부팅 관리자(systemd-boot)가 중단되어 내 컴퓨터를 사용할 수 없게 됩니다. 외부 라이브 USB 덕분에 시스템을 복구할 수 있었습니다. 앞으로는 이런 일을 피하고 싶습니다!


업데이트:
1. 슬래시 또는 백슬래시가 있든 없든, 이전은 initrd중요하지 않습니다 . 2. 및
둘 다로 시도했지만 아무것도 변경되지 않았습니다. 3. my 는 동안에 있습니다.UUIDPARTUUID
/boot/dev/sda1뿌리4. ESP이기도 합니다 /dev/sda3
./boot

    # fdisk -l /dev/sda
    [...]
    Disklabel type: gpt
    [...]

    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048   2099199   2097152     1G EFI System
    /dev/sda2    2099200  18874367  16775168     8G Linux swap
    /dev/sda3   18874368 104857599  85983232    41G Linux filesystem
    [...]
    # minfo -i /dev/sda1 :: | grep 'disk type'
    disk type="FAT32   "
  1. 귀하의 의견에 따라 시도했습니다.UEFI 셸. 내 컴퓨터에 내부 UEFI 셸(가능합니까?). 어쨌든, 나는 가지고 있습니다:

    • 에서 하나를 다운로드했습니다티아노코어
    • Shell.efi에 배치/boot/EFI/Boot/
    • 다음 항목을 추가했습니다.

      efibootmgr --create --label "TIANO-0" --loader /EFI/Boot/Shell.efi --verbose
      
    • 이 쉘로 재부팅 fs0:하고 다음을 입력했습니다.vmlinuz-linux root=/dev/sda3

    • 같은 오류가 발생합니다.

      VFS: unable to mount root fs on unknown-block(0,0)
      
  2. 필수인 것 같습니다 initrd(적어도 아치 리눅스의 경우);
    명령이 vmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3마법을 만든다

  3. 내 시스템은 Dell XPS 9343 노트북인데 버그가 있음을 발견했습니다. EFISTUB를 부팅할 수 없다고 ArchWiki에 보고되었습니다.여기.
    나는 그것이 설명한다고 생각한다.실패(처음 언급한) 올바른 절차!
    ArchWiki 페이지에서도 해결 방법을 제안했지만 지금은 시도해 보았습니다.


답변1

   -l | --loader NAME
              Specify a loader (defaults to \\elilo.efi)

EFI-stub이 있는 커널은 여전히짐을 싣는 사람. BIOS에서 부팅하려면 EFI-애플리케이션. 모든 부트 로더에는 .EFI 접미사가 있습니다. 커널을 직접 부팅 가능한 개체로 바꾸는 것이 가능하다고 생각하지만 일반적으로 시작되는 것은 (선택 제공 여부에 관계없이) 부트 로더 중 하나입니다.

하지만 당신은 사용할 수 있습니다UEFI 셸(최신 시스템에서는) 대화형 부트 로더로 사용됩니다. 이것은 테스트에 적합합니다. BIOS의 부팅 장치처럼 ESP인 cd에 활성화한 다음 다음을 수행할 수 있습니다.fs0:

fs0:> bzImage root=/dev/sda3 

며칠 전에 첫 번째 bzImage를 컴파일했습니다. 먼저 CONFIG_EFI_STUB를 잊어버렸고 UEFI 쉘이 커널을 바이너리가 아닌 것처럼 취급했습니다. 두 번째 버전은 initrd= 없이 부팅되었습니다. EFI_STUB=y 외에도 몇 가지 옵션을 끄고 기본값을 유지했습니다.

그러나 대부분의 배포판에는 다음을 수행하는 커널이 있는 것이 사실입니다.~ 아니다기본 블록 장치 드라이버가 있어야 합니다. initrd=IMAGE옵션이 필요합니다.


저는 부트로더로 Uefi Shell을 사용합니다. 이것은 매우 우아하지는 않지만 매우 간단하고 유연합니다. 비상 옵션으로는 Uefi Shell이 ​​내장되어 있고 파티션의 부트 로더를 삭제할 수 있기 때문에 완벽하다고 생각합니다.


이것은에서 온 것입니다문서/efi-stub.txt

> Passing kernel parameters from the EFI shell
> --------------------------------------------
> 
> Arguments to the kernel can be passed after bzImage.efi, e.g.::
> 
>     fs0:> bzImage.efi console=ttyS0 root=/dev/sda4

동일한 Uefi Shell 프롬프트가 있지만 fs0:>모든 일반적인 배포판에는 EFI_STUB 커널이 있고 이름은 전혀 중요하지 않다는 것을 알았습니다. 가장 일반적인 것은 "vmlinuz"(= 압축된 vmlinux 주변의 로더)입니다.

".efi" 및 "console=" 옵션을 생략하면 다음과 같이 남습니다.

fs0:> bzImage root=/dev/sda4

다음을 제외하고는 동일한 최소 부팅 명령입니다 sda3. Uefi Shell이 ​​로 bzImage를 시작하고 stub, 커널이 압축 해제되어 시작되고, 내장 모듈이 SATA 디스크를 인식합니다. root=장치가 유효하지 않으면 VFS: unable to mount패닉이 발생합니다.


grub64.EFI처럼 BIOS에서 bzImage(또는 vmlinuz 또는 ...)를 직접 시작할 수 없었습니다.


UEFI - 애플리케이션(wikipedia):

OS 로드 외에도 UEFI는 EFI 시스템 파티션에 파일로 상주하는 UEFI 응용 프로그램을 실행할 수 있습니다. UEFI 명령 셸에서 실행할 수 있습니다.펌웨어의 부팅 관리자에 의해, 또는 다른 UEFI 애플리케이션에 의해. UEFI 애플리케이션은 시스템 제조업체와 독립적으로 개발 및 설치할 수 있습니다.

UEFI 애플리케이션 유형은 GRUB, rEFInd, Gummiboot 및 Windows Boot Manager와 같은 OS 로더입니다. OS 파일을 메모리에 로드하고 실행합니다. 또한 OS 로더는 실행할 다른 UEFI 애플리케이션을 선택할 수 있도록 사용자 인터페이스를 제공할 수 있습니다. UEFI 셸과 같은 유틸리티도 UEFI 애플리케이션입니다..

이는 UEFI 셸이 펌웨어 부트 로더와 커널 사이에 있다는 내 견해를 확인시켜줍니다.


젠투에도 비슷한 예가 있습니다; 그들은 .EFI 접미사를 사용하여 커널 이름을 지정해야 한다고 주장합니다.

어떤 이유로 initramfs가 필요한 경우 커널에 내장하거나 별도의 파일로 사용할 수 있습니다.

...

그러나 일부 UEFI 구현매개변수 전달을 지원하지 않는 것 같습니다.NVRAM에서 EFI 스텁 커널로.

답변2

이전 UEFI 펌웨어를 사용하는 일부 이전 시스템은 EFI 바이너리(예: EFISTUB 지원 Linux 커널)에 명령줄 인수를 전달하지 않는 것 같습니다. 이로 인해 부팅 시 및 커널과 root=같은 중요한 매개변수를 전달하는 것이 불가능해졌습니다 .initrd=

나는 UEFI에서 직접 커널을 부팅하기 위해 똑같은 절차를 사용했습니다(구체적으로는https://wiki.debian.org/EFIStub, 그러나 실제로는 두 개의 다른 컴퓨터에서 Ubuntu에서 수행하고 있었습니다. 3년 된 ASrock 마더보드에서는 완벽하게 작동했습니다. 11년 된 내 Dell 노트북에서는 커널 명령줄 인수가 무시됩니다.

따라서 펌웨어가 명령줄 인수를 지원하지 않으면 운이 좋지 않을 수 있습니다. 계속 노력하고 해결 방법을 찾으면 후속 조치를 게시하겠습니다.

관련 정보