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 는 on입니다 .UUIDPARTUUID
/boot/dev/sda1뿌리4. /dev/sda3
또한 /bootESP

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

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

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):

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

UEFI 응용 프로그램의 한 가지 유형은 GRUB, rEFInd, Gummiboot 및 Windows 부팅 관리자와 같은 운영 체제 로더입니다. 이는 운영 체제 파일을 메모리에 로드하고 실행합니다. 또한 운영 체제 로더는 실행할 다른 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 노트북에서는 커널 명령줄 인수가 무시됩니다.

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

관련 정보