ここでは、デュアルブートではなく、オペレーティングシステムとしてのみ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
を使用)。これを行うにはどの端末コマンドが必要ですか?
以下のコマンドは、カーネルバージョン3.13.0-35専用です。
$ 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'
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.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
は必要ない場合があります。 Initrd
が存在する必要があります。そうでない場合、ルートデバイスsda1を開くことができないため、ブートが「switched to clocksource tsc。」でハングします。
Debian wiki によると、これはいくつかの簡単な手順で行うことができ、はカーネルの更新を生き延びます。
注:これは、/boot/efi
にEFIパーティションがマウントされていることを前提としています。
次の内容で/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
ブートエントリを追加します。
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
が常に更新されるようにするため、カーネルの更新後も壊れません。