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


14

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

そのダブルブートメニューの読み込み手順をスキップし、UEFIからカーネルに直接、より速く起動したいと思います。12.10以降Ubuntuカーネルには、「カーネル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'

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

長さ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なし-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_idcrashkernel=384M-:128MInitrd存在する必要があります。存在しない場合、ルートデバイスsda1を開けないため、「switched to clocksource tsc。」でブートがハングします。


どうやってこれを理解したかわかりませんが、あなたはすごいです。このきちんとした機能の周りには驚くほど小さなドキュメントがあります。
user3549648

が機能しない場合は-l、引数を-u二重引用符で囲みます(またはバックスラッシュを手動でエスケープします)。efibootmgr -vEFIブートメニューに新しいエントリを追加した後に実行することで、これが問題かどうかをテストできます。また、マシンに複数のディスク(SSDとHDDなど)が-dある場合は、デフォルトのディスクを指定する必要があります/dev/sda(参照man efibootmgr
Peeyush Kushwaha

5

Debian wikiによると、これはいくつかの簡単な手順で実行でき、カーネルの更新後も存続します

注:これは、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ドーガ

最初にcryptbootといくつかのツールを使用してカーネルに署名する必要があるようです。特にArchを使用していない場合(すぐに使用できるツールがないため)、少し面倒なので、セキュアブートを無効にします。
レオ・ラム

.signedカーネルのコピーはどうですか?
Suiciドーガ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.