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_id와 crashkernel=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.