web-dev-qa-db-ja.com

EFIスタブ(efistub)ローダーを使用してカーネルをブートロードする方法

ここでは、デュアルブートではなく、オペレーティングシステムとしてのみUEFIモードで実行されているUbuntu 14.04を使用しています。カーネルバージョンは3.13.0-24-genericです。 EFIパーティションがあります。この場合、EFIパーティションはデフォルトの/dev/sda1ではなく、/dev/sda3にあります。実際に BIOSモードをEFIモードに変換 したためです。 grub-efi-AMD64パッケージを使用しましたが、実際にはUEFIファームウェアブートメニューからGRUBブートメニューをロードします(UEFIブートは\EFI\ubuntu\grubx64.efiをロードします)。

そのダブルブートメニューの読み込み手順をスキップし、UEFIからカーネルに直接、より速く起動したいと思います。 12.10以降のUbuntuカーネルには「カーネルEFIスタブローダー」があります 機能。

UbuntuカーネルをEFIパーティションにコピーし(名前を変更する場合があります)、UEFIブートメニューにエントリを作成する必要があることはわかっています(たとえば、efibootmgrを使用)。これを行うにはどの端末コマンドが必要ですか?

14
Pro Backup

以下のコマンドは、カーネルバージョン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'

2.カーネルファイル名を変更する

9文字の長さのパス制限があるようです および-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-genericはまだ40文字です。

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

この新しいブートメニューエントリは、デフォルトの新しいブート選択になります。

追加のデバッグパラメーターdebugignore_loglevellibata.force=dump_id、およびcrashkernel=384M-:128Mは必要ない場合があります。 Initrdが存在する必要があります。そうでない場合、ルートデバイスsda1を開くことができないため、ブートが「switched to clocksource tsc。」でハングします。

14
Pro Backup

Debian wiki によると、これはいくつかの簡単な手順で行うことができ、はカーネルの更新を生き延びます。

注:これは、/boot/efiに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=値をルートパーティションに変更する必要があります。

    -Lパラメーターを変更することにより、ラベルを任意の名前に変更できます。)

    追加したブートエントリがデフォルトエントリになります。また、フックはvmlinuzおよびinitrd.imgが常に更新されるようにするため、カーネルの更新後も壊れません。

5
Léo Lam