EFI 스텁 (efistub) 로더를 사용하여 커널을 부팅하는 방법은 무엇입니까?


14

UEFI 모드에서 운영 체제로 Ubuntu 14.04를 실행 중이며 이중 부팅은 없습니다. 커널 버전은 3.13.0-24-generic입니다. EFI 파티션이 있습니다. 이 경우 EFI 파티션은 기본값이 /dev/sda1아니지만 /dev/sda3실제로 BIOS 모드를 EFI 모드로 변환 했기 때문 입니다. grub-efi-amd64패키지를 사용 했지만 실제로 UEFI 펌웨어 부팅 메뉴 (UEFI 부팅로드 \EFI\ubuntu\grubx64.efi) 에서 GRUB 부팅 메뉴를로드 합니다.

UEFI에서 커널로 직접 이중 부팅 메뉴 로딩 단계를 건너 뛰고 더 빠르게 부팅하고 싶습니다. 12.10는 "커널 EFI 스텁 로더"이 있기 때문에 우분투는 커넬 기능을.

Ubuntu 커널을 EFI 파티션에 복사하고 (이름을 바꿀 수도 있음) UEFI 부팅 메뉴에서 항목을 만들어야합니다 (예 :) efibootmgr. 이를 위해 어떤 정확한 터미널 명령이 필요합니까?

답변:


14

아래 명령은 커널 버전 3.13.0-35보다 일반적입니다.

1. efi 파티션을 마운트하고 커널 파일을 복사하십시오

$ mount /dev/sda3 /boot/efi

$ mkdir -pv /boot/efi/EFI/ubuntu/

$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'

커널 파일 이름 변경

39 자 길이의 경로 제한이있는 것으로 보이고 커널 파일 이름 바꾸기로 끝나기 -generic때문에 커널 파일 이름을 줄이면 대부분의 시스템과 호환됩니다..efi

$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi'`

위의 이름 커널 파일 이름 단축은 충분하지 않다 dpkg설치 메인 라인 커널 예를 들어 있기 때문에, /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi하지 않고는 -generic40 자 아직도있다.

3. EFI 부팅 메뉴에 새 항목 추가

3.13.0-35이 예에서 특정 커널 버전으로 교체

$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\\EFI\\ubuntu\\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M

이 새 부팅 메뉴 항목이 기본 새 부팅 선택이됩니다.

당신은 추가 디버깅 매개 변수를 필요로하지 않을 수 있습니다 debug, ignore_loglevel, libata.force=dump_idcrashkernel=384M-:128M. 루트 장치 sda1을 열 수 없으므로 " clocksource tsc로 전환되었습니다. " Initrd에서 부팅이 중단됩니다 .


당신이 어떻게 알아 냈는지 모르겠지만 당신은 훌륭합니다. 이 깔끔한 기능에 대한 문서는 놀랍게도 거의 없습니다.
user3549648

당신의 인수를 넣어 시도에 대한 경우는 작동하지 않습니다 -l-u큰 따옴표 (또는 수동으로 백 슬래시 이스케이프). efibootmgr -vEFI 부팅 메뉴에 새 항목을 추가 한 후 실행하여 문제가 있는지 테스트 할 수 있습니다 . 또한 컴퓨터에 둘 이상의 디스크 (예 : SSD 및 HDD)가 -d있는 경우 기본값을 지정할 디스크를 지정해야 합니다 /dev/sda(참조 man efibootmgr)
Peeyush Kushwaha

5

데비안 위키 에 따르면 ,이 작업 은 커널 업데이트 후에도 몇 가지 간단한 단계로 수행 할 수 있습니다 .

참고 :이 경우 EFI 파티션이에 설치되어 있다고 가정합니다 /boot/efi.

  1. /etc/kernel/postinst.d/zz-update-efistub다음 내용으로 작성하십시오 .

    #!/bin/sh
    cp /vmlinuz /initrd.img /boot/efi/EFI/ubuntu/
    

    이것은 최신 커널 이미지와 initrd를 적절한 위치에 복사하기 위해 커널 업데이트에서 실행될 후크입니다. 그런 다음 실행 가능하게 만들고 실행하십시오.

    sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
    sudo /etc/kernel/postinst.d/zz-update-efistub
    
  2. 부팅 항목을 추가하십시오 :

    sudo efibootmgr -c -d /dev/sdb -p 1 -L "Ubuntu (efistub)" -l /EFI/ubuntu/vmlinuz -u "root=/dev/sdb2 rw initrd=/EFI/ubuntu/initrd.img quiet splash"
    

    EFI 시스템 파티션의 위치에 따라 -d-p인수 를 변경하는 것을 잊지 마십시오 . 필자의 경우 / dev / sdb1이지만 이는 다를 수 있습니다. root=커널 cmdline 의 값을 루트 파티션 으로 변경해야 할 수도 있습니다 .

    -L매개 변수 를 변경하여 원하는대로 레이블을 변경할 수 있습니다 .

    방금 추가 한 부팅 항목이 기본 항목이됩니다. 후크가 확인 vmlinuz되고 initrd.img항상 업데이트 되므로 커널 업데이트 후에도 중단되지 않습니다 .


이 작업을 시도 할 때 HP 랩탑에서 보안 부팅으로 작동하도록하는 모든 방법은 보안 부팅 오류를 발생시킵니다 (물론 보안 부팅도 비활성화 할 수 있습니다)
Suici Doga

커널에 먼저 서명하려면 cryptboot와 일부 도구를 사용해야 할 것 같습니다 . Arch를 사용하지 않는 경우 (즉시 사용할 수있는 도구가 없기 때문에) 특히 번거롭기 때문에 보안 부팅을 비활성화합니다.
Léo Lam

.signed 커널을 복사하는 것은 어떻습니까?
Suici Doga
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.