「GRUB/ヒントとテクニック」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) (→grub.cfg を手動で作成する: 削除) |
Kusanaginoturugi (トーク | 投稿記録) (→初期ブートにおけるコアイメージの手動設定: 記事を追加) |
||
391行目: | 391行目: | ||
生成した EFI コアイメージは {{ic|grub-install}} で自動的に生成されるイメージと同じように使うことができます。EFI パーティションに配置して {{ic|efibootmgr}} で有効化するか、システムファームウェアで適切に設定してください。 |
生成した EFI コアイメージは {{ic|grub-install}} で自動的に生成されるイメージと同じように使うことができます。EFI パーティションに配置して {{ic|efibootmgr}} で有効化するか、システムファームウェアで適切に設定してください。 |
||
+ | |||
+ | == UEFI further reading == |
||
+ | |||
+ | {{Style|This could be made more concise, better organized.}} |
||
+ | |||
+ | Below is other relevant information regarding installing Arch via UEFI. |
||
+ | |||
+ | === Alternative install method === |
||
+ | |||
+ | {{Expansion|What would be the reason to place all of GRUB's files in the ESP?|section=UEFI further reading/Alternative install method}} |
||
+ | |||
+ | Usually, GRUB keeps all files, including configuration files, in {{ic|/boot}}, regardless of where the EFI System Partition is mounted. |
||
+ | |||
+ | If you want to keep these files inside the EFI System Partition itself, add {{ic|1=--boot-directory=''esp''}} to the grub-install command: |
||
+ | |||
+ | # grub-install --target=x86_64-efi --efi-directory=''esp'' --bootloader-id=grub --boot-directory=''esp'' --debug |
||
+ | |||
+ | This puts all GRUB files in {{ic|''esp''/grub}}, instead of in {{ic|/boot/grub}}. When using this method, make sure you have ''grub-mkconfig'' put the configuration file in the same place: |
||
+ | |||
+ | # grub-mkconfig -o ''esp''/grub/grub.cfg |
||
+ | |||
+ | Configuration is otherwise the same. |
||
+ | |||
+ | === UEFI firmware workaround === |
||
+ | |||
+ | See [[GRUB#Default/fallback boot path]]. |
||
+ | |||
+ | === GRUB standalone === |
||
+ | |||
+ | This section assumes you are creating a standalone GRUB for x86_64 systems (x86_64-efi). For 32-bit (IA32) EFI systems, replace {{ic|x86_64-efi}} with {{ic|i386-efi}} where appropriate. |
||
+ | |||
+ | It is possible to create a {{ic|grubx64_standalone.efi}} application which has all the modules embedded in a tar archive within the UEFI application, thus removing the need to have a separate directory populated with all of the GRUB UEFI modules and other related files. This is done using the {{ic|grub-mkstandalone}} command (included in {{Pkg|grub}}) as follows: |
||
+ | |||
+ | # echo 'configfile ${cmdpath}/grub.cfg' > /tmp/grub.cfg |
||
+ | # grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --locales="en@quot" --themes="" -o "''esp''/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg=/tmp/grub.cfg" -v |
||
+ | |||
+ | Then copy the GRUB config file to {{ic|''esp''/EFI/grub/grub.cfg}} and create a UEFI Boot Manager entry for {{ic|''esp''/EFI/grub/grubx64_standalone.efi}} using [[UEFI#efibootmgr|efibootmgr]]. |
||
+ | |||
+ | {{Note|The option {{ic|1=--modules="part_gpt part_msdos"}} (with the quotes) is necessary for the {{ic|${cmdpath} }} feature to work properly.}} |
||
+ | |||
+ | {{Warning|You may find that the {{ic|grub.cfg}} file is not loaded due to {{ic|${cmdpath} }} missing a slash (i.e. {{ic|(hd1,msdos2)EFI/Boot}} instead of {{ic|(hd1,msdos2)/EFI/Boot}}) and so you are dropped into a GRUB shell. If this happens determine what {{ic|${cmdpath} }} is set to ({{ic|echo ${cmdpath} }}) and then load the config file manually (e.g. {{ic|configfile (hd1,msdos2)/EFI/Boot/grub.cfg}}).}} |
||
+ | |||
+ | ==== Technical information ==== |
||
+ | |||
+ | The GRUB EFI file always expects its config file to be at {{ic|${prefix}/grub.cfg}}. However in the standalone GRUB EFI file, the {{ic|${prefix} }} is located inside a tar archive and embedded inside the standalone GRUB EFI file itself (inside the GRUB environment, it is denoted by {{ic|"(memdisk)"}}, without quotes). This tar archive contains all the files that would be stored normally at {{ic|/boot/grub}} in case of a normal GRUB EFI install. |
||
+ | |||
+ | Due to this embedding of {{ic|/boot/grub}} contents inside the standalone image itself, it does not rely on actual (external) {{ic|/boot/grub}} for anything. Thus in case of standalone GRUB EFI file {{ic|1=${prefix}==(memdisk)/boot/grub}} and the standalone GRUB EFI file reads expects the config file to be at {{ic|1=${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg}}. |
||
+ | |||
+ | Hence to make sure the standalone GRUB EFI file reads the external {{ic|grub.cfg}} located in the same directory as the EFI file (inside the GRUB environment, it is denoted by {{ic|${cmdpath} }}), we create a simple {{ic|/tmp/grub.cfg}} which instructs GRUB to use {{ic|${cmdpath}/grub.cfg}} as its config ({{ic|configfile ${cmdpath}/grub.cfg}} command in {{ic|(memdisk)/boot/grub/grub.cfg}}). We then instruct grub-mkstandalone to copy this {{ic|/tmp/grub.cfg}} file to {{ic|${prefix}/grub.cfg}} (which is actually {{ic|(memdisk)/boot/grub/grub.cfg}}) using the option {{ic|1="boot/grub/grub.cfg=/tmp/grub.cfg"}}. |
||
+ | |||
+ | This way, the standalone GRUB EFI file and actual {{ic|grub.cfg}} can be stored in any directory inside the EFI System Partition (as long as they are in the same directory), thus making them portable. |
||
+ | |||
+ | == Speeding up LUKS decryption in GRUB == |
||
+ | |||
+ | {{Warning|Before following this section, make sure you understand the importance of high entropy passwords. Information on how to generate secure passwords can be found at [[Wikipedia:Password strength]].}} |
||
+ | |||
+ | Upon boot [[GRUB]] may in some cases take a long time to verify the password. This can be due to a high [[Wikipedia:PBKDF2|PBKDF]] iteration count, which you can check as follows: |
||
+ | |||
+ | # cryptsetup luksDump /dev/sda3 |
||
+ | |||
+ | The problem is that the iteration count for a given keyslot is generated when the key is added to ensure a balance between being high enough to protect against brute force attacks and low enough to allow for fast key derivation by estimating the capabilities of your computer. However, when [[GRUB]] is started, it might not have the same computational resources at hand, thus being vastly slower. |
||
+ | |||
+ | If your password provides enough entropy to counter common attacks by itself, you can lower this number: |
||
+ | |||
+ | # cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3 |
||
+ | |||
+ | A minimum of 1000 iterations is recommended as per [[RFC:2898|RFC 2898]], but you should aim for higher values if you can (The cost for an attacker as well as the time for key derivation scale linearly). |
||
+ | |||
+ | {{Tip|[[GRUB]] tries enabled key slots sequentially. When adding keys, the {{ic|--key-slot}} option can be used to specify a key slot explicitly.}} |
2022年1月21日 (金) 11:13時点における版
メインの記事は GRUB を見て下さい。
目次
代替インストール方法
ブートファイルをインストール
BIOS ブートで GRUB ブートファイルをインストールする方法は4つあります:
- #ディスクにインストールする (推奨)
- #USB スティックにインストール (リカバリ用)
- #パーティションやパーティションレスディスクにインストールする (非推奨)
- #core.img だけを生成する (一番安全な方法ですが、
/boot/grub/i386-pc/core.img
をチェインロードするために GRUB Legacy や Syslinux など他の BIOS ブートローダーが必要になります)
ディスクにインストールする
440バイトの Master Boot Record ブートコード領域に GRUB をセットアップするには、/boot/grub
ディレクトリを作り、/boot/grub/i386-pc/core.img
ファイルを生成して、それを 31 KiB の (最低限の容量 - パーティションのアライメントによって変化します) MBR の後の領域 (もしくは GPT でパーティションされたディスクの場合 BIOS Boot Partition、parted では bios_grub
フラグ、gdisk では EF02 タイプコードで示される) に埋め込み、設定ファイルを生成します。次を実行してください:
# grub-install --target=i386-pc /dev/sdx # grub-mkconfig -o /boot/grub/grub.cfg
/boot
に LVM を使っている場合は、複数の物理ディスクに GRUB をインストールすることができます。
USB スティックにインストール
USB スティックの一番目のパーティションが /dev/sdy1
で FAT32 である場合:
# mkdir -p /mnt/usb # mount /dev/sdy1 /mnt/usb # grub-install --target=i386-pc --debug --boot-directory=/mnt/usb/boot /dev/sdy # grub-mkconfig -o /mnt/usb/boot/grub/grub.cfg
grub.cfg
の設定のバックアップを作成 (任意):
# mkdir -p /mnt/usb/etc/default # cp /etc/default/grub /mnt/usb/etc/default # cp -a /etc/grub.d /mnt/usb/etc
アンマウント:
# sync ; umount /mnt/usb
パーティションやパーティションレスディスクにインストールする
パーティションブートセクタや、パーティションレスディスク (別名 superfloppy) やフロッピーディスクに grub をセットアップするには、以下を実行してください (/boot
パーティションを /dev/sdaX
として例にしています):
# chattr -i /boot/grub/i386-pc/core.img # grub-install --target=i386-pc --debug --force /dev/sdaX # chattr +i /boot/grub/i386-pc/core.img
--force
オプションを使ってブロックリストを利用する必要があります --grub-setup=/bin/true
は使えません (core.img
を生成するだけと同じです)。
grub-install
は以下のような警告を表示し、この方法で失敗するようなことについてヒントを与えます:
/sbin/grub-setup: warn: Attempting to install GRUB to a partitionless disk or to a partition. This is a BAD idea. /sbin/grub-setup: warn: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged.
--force
がないと下のエラーが表示され grub-setup
はパーティションブートセクタにブートコードを設定しません:
/sbin/grub-setup: error: will not proceed with blocklists
--force
をつければ次のように表示されるはずです:
Installation finished. No error reported.
デフォルトで grub-setup
がパーティションやパーティションレスディスクへのインストールをしないようになっている理由は、この場合に限って GRUB がパーティションのブートセクタにある埋め込みブロックリストを使って /boot/grub/i386-pc/core.img
ファイルと prefix ディレクトリ /boot/grub
を見つける必要があるからです。core.img
のセクタ位置はパーティション上の (ファイルのコピーや削除など) ファイルシステムに変更が加えられた時に変化してしまうことがあります。詳細は https://bugzilla.redhat.com/show_bug.cgi?id=728742 や https://bugzilla.redhat.com/show_bug.cgi?id=730915 を見て下さい。
これを回避する方法は /boot/grub/i386-pc/core.img
に (上で説明しているように chattr
コマンドを使って) immutable フラグを設定することで、これによってディスク上の core.img
ファイルのセクタ位置が変化しなくなります。/boot/grub/i386-pc/core.img
に immutable フラグを設定するのは、GRUB をパーティションブートセクタやパーティションレスディスクにインストールするときだけ必要になることで、ブートセクタに埋め込まず MBR にインストールしたり core.img
だけを生成する時は必要ありません (上述)。
残念ながら、エラーが表示されなかったとしても、作成される grub.cfg
ファイルには起動するための正しい UUID が含まれません。https://bbs.archlinux.org/viewtopic.php?pid=1294604#p1294604 を参照してください。この問題を修正するには以下のコマンドを実行してください:
# mount /dev/sdxY /mnt #Your root partition. # mount /dev/sdxZ /mnt/boot #Your boot partiton (if you have one). # arch-chroot /mnt # pacman -S linux # grub-mkconfig -o /boot/grub/grub.cfg
core.img だけを生成する
GRUB のブートセクタコードを MBR, MBR の後の隙間またはパーティションのブートセクタに埋め込まずに /boot/grub
ディレクトリを作成して /boot/grub/i386-pc/core.img
ファイルを生成するには、grub-install
に --grub-setup=/bin/true
を加えて下さい:
# grub-install --target=i386-pc --grub-setup=/bin/true --debug /dev/sda
これで Linux カーネルやマルチブートカーネルとして GRUB Legacy や syslinux から GRUB の core.img
をチェインロードできます。
GUI 設定ツール
以下のパッケージがインストール可能です:
- grub-customizer — ブートローダー (GRUB や BURG) のカスタマイズ
- grub2-editor — GRUB ブートローダー設定の KDE4 コントロールモジュール
- grub2-editor-frameworks — grub2-editor の非公式 KF5 ポート
- https://github.com/maz-1/grub2-editor || grub2-editor-frameworksAUR[リンク切れ: パッケージが存在しません]
- startupmanager — GRUB Legacy, GRUB, Usplash, Splashy の設定を変更できる GUI アプリ (開発停止)
- https://sourceforge.net/projects/startup-manager/ || startupmanagerAUR[リンク切れ: パッケージが存在しません]
外観の設定
GRUB には初めからメニューの見た目を変更する機能が備わっています。GRUB で GRUB graphical terminal, gfxterm を適切なビデオモードで初期化できているか確認してください。これについては GRUB#"No suitable mode found" エラー のセクションで説明されています。GRUB から linux カーネルへは 'gfxpayload' を通してビデオモードが渡されるので、外観の変更を適用するにはこのモードが必要になります。
フレームバッファの解像度を設定する
GRUB は GRUB 自身とカーネル両方のフレームバッファを設定することができます。古い vga=
は deprecated になりました。以下のように /etc/default/grub
を編集する方法が推奨されています:
GRUB_GFXMODE=1024x768x32 GRUB_GFXPAYLOAD_LINUX=keep
変更を適用するには、次を実行してください:
# grub-mkconfig -o /boot/grub/grub.cfg
gfxpayload
プロパティによってカーネルに解像度を維持させます。
この方法が使えない時は、昔の vga=
を使って下さい。/etc/default/grub
の "GRUB_CMDLINE_LINUX_DEFAULT="
という行に追加するだけです、例えば: "GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792"
は解像度が 1024x768
になります。
以下の解像度のどれかを選ぶことができます: 640×480
, 800×600
, 1024×768
, 1280×1024
, 1600×1200
, 1920×1200
915resolution hack
たまに Intel のグラフィックドライバーで # hwinfo --framebuffer
と videoinfo
のどちらも希望する解像度を表示しないことがあります。この場合、915resolution
を使うことができます。この hack は一時的にビデオ BIOS を修正して必要な解像度を追加します。915resolution のホームページ を見て下さい。AUR には 915resolutionAUR パッケージが存在します。
まず後で修正されるビデオモードを見つける必要があります。そのために GRUB のコマンドシェルが必要です:
sh:grub> 915resolution -l
Intel 800/900 Series VBIOS Hack : version 0.5.3 [...] Mode 30 : 640x480, 8 bits/pixel [...]
次に、Mode 30
を 1440x900
解像度で上書きします:
/etc/grub.d/00_header
[...] 915resolution 30 1440 900 # Inserted line set gfxmode=${GRUB_GFXMODE} [...]
最後に、先に説明したように GRUB_GFXMODE
を設定して、GRUB の設定ファイルを再生成し、再起動して変更を確認しましょう。
背景画像とビットマップフォント
GRUB は背景画像と pf2
フォーマットのビットマップフォントをサポートしています。grub パッケージに含まれている unifont フォントは unicode.pf2
というファイル名で置いてあり、同じく ASCII 文字は ascii.pf2
という名前です。
サポートされている画像フォーマットは tga, png, jpeg で適切なモジュールがロードされます。利用できる最大解像度はあなたのハードウェアによります。
正しいフレームバッファの解像度を設定するようにしてください。
/etc/default/grub
を以下のように編集してください:
GRUB_BACKGROUND="/boot/grub/myimage" #GRUB_THEME="/path/to/gfxtheme" GRUB_FONT="/path/to/font.pf2"
変更を適用するには grub.cfg
を再生成してください。スプラッシュイメージの追加が成功したのならば、上のコマンドを実行したときに "Found background image..."
と表示されるはずです。
この文句が表示されない場合、画像情報はおそらく grub.cfg
ファイルに組み入れられていません。
画像が表示されないときは、以下をチェックしてください:
/etc/default/grub
に記述したパスとファイル名が正しいか- 画像のサイズとフォーマットは問題ないか (tga, png, 8-bit jpg)
- 画像が RGB モードで保存されていて、インデックスは付いていないか
- コンソールモードが
/etc/default/grub
で無効になっているか - 背景画像を
/boot/grub/grub.cfg
ファイルに入れるためにgrub-mkconfig
コマンドをちゃんと実行したか grub-mkconfig
スクリプトはgrub.cfg
の中のファイル名をクォートで囲まないためファイル名に空白は含めないこと
テーマ
以下は GRUB パッケージに含まれている Starfield テーマを設定する例です。
/etc/default/grub
を編集してください:
GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"
変更を適用するには grub.cfg
を再生成してください。テーマの設定が成功すると、ターミナルに Found theme: /usr/share/grub/themes/starfield/theme.txt
と表示されます。
テーマを使っている時は基本的にスプラッシュイメージは表示されません。
メニューの色
GRUB のメニューの色を設定することができます。GRUB で利用できる色は GRUB のマニュアルに書かれています。 以下サンプルです:
/etc/default/grub
を編集してください:
GRUB_COLOR_NORMAL="light-blue/black" GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
メニューを隠す
GRUB のユニークな機能のひとつとして、メニューを隠して必要な時に Esc
を押して表示することができます。また、タイムアウトカウンターを表示するかどうか設定することもできます。
/etc/default/grub
を好きなように編集してください。以下は2つの行の最初のコメントを削除して機能を有効にする例で、タイムアウトを5秒に、そして表示するように設定しています:
GRUB_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT=5 GRUB_HIDDEN_TIMEOUT_QUIET=false
GRUB_HIDDEN_TIMEOUT がメニューの表示まで待機する秒数です。メニューを隠すには GRUB_TIMEOUT=0 も設定する必要があります。
フレームバッファの無効化
バイナリドライバーに問題が発生するので NVIDIA のプロプライエタリドライバーを使っているユーザーは GRUB のフレームバッファを無効化するべきです。
フレームバッファを無効にするには、/etc/default/grub
を編集して次の行をアンコメントしてください:
GRUB_TERMINAL_OUTPUT=console
他にも、GRUB でフレームバッファを使いつつカーネルを起動する直前にテキストモードに戻すこともできます。これをするには、/etc/default/grub
内の次の変数を変更してください:
GRUB_GFXPAYLOAD_LINUX=text
GRUB で ISO9660 イメージファイルを直接起動
GRUB はループバックデバイスによる ISO イメージの直接起動をサポートしています。詳しくはマルチブート USB ドライブ#GRUB とループバックデバイスを使うを参照。
GRUB メニューのパスワード保護
ブートパラメータを変えたりコマンドラインを使えないようにして GRUB をセキュアにしたい場合、GRUB の設定ファイルにユーザー名・パスワードの組み合わせを追加することができます。これをするには、grub-mkpasswd-pbkdf2
コマンドを実行してください。パスワードを入力して確認してください:
grub-mkpasswd-pbkdf2
[...] Your PBKDF2 is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A
次に、以下を /etc/grub.d/40_custom
に追加して下さい:
/etc/grub.d/40_custom
set superusers="username" password_pbkdf2 username <password>
<password>
は grub-mkpasswd_pbkdf2
によって生成された文字列に置き換えてください。
設定ファイルを再生成すれば、GRUB コマンドライン、ブートパラメータ、そしてブートエントリには全てプロテクトがかけられます。
この制限は GRUB manual の "Security" パートに書かれている方法によって緩めたりカスタマイズすることができます。
GRUB の編集とコンソールオプションだけをパスワードで保護
--unrestricted
をメニューエントリに追加することでエントリの編集や GRUB のコマンドコンソールへのアクセスを制限しつつ誰でも OS を起動できるようになります。スーパーユーザーや --user
スイッチで指定したユーザーだけがメニューエントリを編集することが可能です。
/boot/grub/grub.cfg
menuentry 'Arch Linux' --unrestricted --class arch --class gnu-linux --class os ...
Shift キーが押されていない時は GRUB を隠す
起動を高速化するために、GRUB にタイムアウトを待たせる代わりに、GRUB の起動時に Shift
キーが押されていない限り、GRUB にメニューを隠させるということが可能です。
これをするためには、次の行を /etc/default/grub
に追加する必要があります:
GRUB_FORCE_HIDDEN_MENU="true"
そして [1] のファイルを作成して、実行可能属性を付与して grub の設定を再生成してください:
# chmod a+x /etc/grub.d/31_hold_shift # grub-mkconfig -o /boot/grub/grub.cfg
UUID の使用と基本的なスクリプトの混合
信頼できない BIOS マッピングをやめて UUID を使いたい場合や GRUB の構文に混乱している場合、以下が UUID を使って GRUB にシステムの正しいディスクパーティションを教える小さなスクリプトのブートメニューアイテムのサンプルです。サンプルの中の UUID をあなたのシステムの正しい UUID に置き換えるだけで使うことができます。この例ではシステムに boot と root パーティションを適用しています。他にもパーティションがある場合は GRUB の設定を修正する必要があります:
menuentry "Arch Linux 64" { # Set the UUIDs for your boot and root partition respectively set the_boot_uuid=ece0448f-bb08-486d-9864-ac3271bd8d07 set the_root_uuid=c55da16f-e2af-4603-9e0b-03f5f565ec4a # (Note: This may be the same as your boot partition) # Get the boot/root devices and set them in the root and grub_boot variables search --fs-uuid $the_root_uuid --set=root search --fs-uuid $the_boot_uuid --set=grub_boot # Check to see if boot and root are equal. # If they are, then append /boot to $grub_boot (Since $grub_boot is actually the root partition) if [ $the_boot_uuid == $the_root_uuid ] ; then set grub_boot=($grub_boot)/boot else set grub_boot=($grub_boot) fi # $grub_boot now points to the correct location, so the following will properly find the kernel and initrd linux $grub_boot/vmlinuz-linux root=/dev/disk/by-uuid/$the_root_uuid ro initrd $grub_boot/initramfs-linux.img }
エントリ
サブメニューの無効化
複数のカーネルをインストールしている場合 (例えば linux と linux-lts)、デフォルトで grub-mkconfig
はカーネルをサブメニューにグループ化します。サブメニューにまとめて欲しくない場合、以下の行を /etc/default/grub
に追加することでシングルメニューに戻すことができます:
GRUB_DISABLE_SUBMENU=y
以前のエントリを思い出させる
GRUB はあなたが最後に起動したエントリを記憶することができ、次の起動時にはそれをデフォルトエントリにすることができます。この機能は複数のカーネル (つまり、新しい Arch カーネルと fallback としての LTS カーネル) やオペレーティングシステムを使っている時に便利です。この機能を使うには /etc/default/grub
を編集して GRUB_DEFAULT
の値を変更してください:
GRUB_DEFAULT=saved
これで GRUB は保存されたエントリをデフォルトにします。選択したエントリの保存を有効にするには、次の行を /etc/default/grub
に追加してください:
GRUB_SAVEDEFAULT=true
grub は btrfs に書き込めないため、これは/ boot が btrfs でない場合にのみ機能します。ただし、"sparse file not allowed. Press any key to continue." という誤解を招くエラーメッセージが生成されます。
デフォルトのメニューエントリを変更する
デフォルトで選択されるエントリを変更するには、/etc/default/grub
を編集して GRUB_DEFAULT
の値を変更してください:
数字を使う:
GRUB_DEFAULT=0
Grub は生成されたメニューを0からカウントします。つまり最初のエントリは0で (デフォルト値)、次のエントリは1と続きます。
メニューのタイトルを使う:
GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'
デフォルトでないエントリを一度だけ起動する
デフォルトエントリ以外のエントリを一度だけ起動するのに grub-reboot
はとても便利です。次にシステムが再起動した時に、GRUB は最初のコマンドライン引数で指定されたエントリをロードします。そして、その後のブートでは GRUB はデフォルトエントリをロードするように戻ります。設定ファイルの変更や GRUB メニューでのエントリの選択は必要ありません。
曲の再生
GRUB_INIT_TUNE
変数を変更することで起動時に PC スピーカーを使って曲を流すことができます。例えば、ベルリオーズの幻想交響曲 (ファゴットパート) を演奏するには以下のように設定します:
GRUB_INIT_TUNE="312 262 3 247 3 262 3 220 3 247 3 196 3 220 3 220 3 262 3 262 3 294 3 262 3 247 3 220 3 196 3 247 3 262 3 247 5 220 1 220 5"
詳しくは info grub -n play
を見てください。
初期ブートにおけるコアイメージの手動設定
GRUB 環境から /boot
にアクセスできるようにするために GRUB で自動的に設定することができない特殊なキーマップなどの複雑な設定が必要な場合、コアイメージを自分で生成することができます。UEFI 環境では、コアイメージはファームウェアによって起動時にロードされる grubx64.efi
ファイルです。自分でコアイメージを作成することで起動に必要なあらゆるモジュールや GRUB をブートストラップする設定スクリプトを埋め込むことができます。
例として UEFI 環境で暗号化された /boot
のパスワードを入力するために初期ブート空間で dvorak
キーマップを埋め込む必要があるとします:
生成された /boot/grub/grub.cfg
ファイルから暗号化された /boot
をマウントするのに必要なモジュールを確認します。例えば menuentry
の下に以下のような行が存在するはずです:
insmod diskfilter cryptodisk luks gcry_rijndael gcry_rijndael gcry_sha256 insmod ext2 cryptomount -u 1234abcdef1234abcdef1234abcdef set root='cryptouuid/1234abcdef1234abcdef1234abcdef'
上記のモジュールを全てメモしてください。コアイメージに含める必要があります。それから、キーマップを含んだ tarball を作成してください。memdisk としてコアイメージに同梱させます:
# ckbcomp dvorak | grub-mklayout > dvorak.gkb # tar cf memdisk.tar dvorak.gkb
そして GRUB コアイメージで使用する設定ファイルを作成してください。通常の GRUB の設定と同じフォーマットですが、/boot
パーティションのメインの設定ファイルを探してロードすることだけ記述します:
early-grub.cfg
root=(memdisk) prefix=($root)/ terminal_input at_keyboard keymap /dvorak.gkb cryptomount -u 1234abcdef1234abcdef1234abcdef set root='cryptouuid/1234abcdef1234abcdef1234abcdef' set prefix=($root)/grub configfile grub.cfg
最後に、コアイメージを生成します。生成された grub.cfg
からメモしたモジュールと、early-grub.cfg
スクリプトで使用するモジュールを全て列記してください。上記の例では memdisk
, tar
, at_keyboard
, keylayouts
, configfile
が必要となります:
# grub-mkimage -c early-grub.cfg -o grubx64.efi -O x86_64-efi -m memdisk.tar diskfilter cryptodisk luks gcry_rijndael gcry_sha256 ext2 memdisk tar at_keyboard keylayouts configfile
生成した EFI コアイメージは grub-install
で自動的に生成されるイメージと同じように使うことができます。EFI パーティションに配置して efibootmgr
で有効化するか、システムファームウェアで適切に設定してください。
UEFI further reading
Below is other relevant information regarding installing Arch via UEFI.
Alternative install method
Usually, GRUB keeps all files, including configuration files, in /boot
, regardless of where the EFI System Partition is mounted.
If you want to keep these files inside the EFI System Partition itself, add --boot-directory=esp
to the grub-install command:
# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=grub --boot-directory=esp --debug
This puts all GRUB files in esp/grub
, instead of in /boot/grub
. When using this method, make sure you have grub-mkconfig put the configuration file in the same place:
# grub-mkconfig -o esp/grub/grub.cfg
Configuration is otherwise the same.
UEFI firmware workaround
See GRUB#Default/fallback boot path.
GRUB standalone
This section assumes you are creating a standalone GRUB for x86_64 systems (x86_64-efi). For 32-bit (IA32) EFI systems, replace x86_64-efi
with i386-efi
where appropriate.
It is possible to create a grubx64_standalone.efi
application which has all the modules embedded in a tar archive within the UEFI application, thus removing the need to have a separate directory populated with all of the GRUB UEFI modules and other related files. This is done using the grub-mkstandalone
command (included in grub) as follows:
# echo 'configfile ${cmdpath}/grub.cfg' > /tmp/grub.cfg # grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --locales="en@quot" --themes="" -o "esp/EFI/grub/grubx64_standalone.efi" "boot/grub/grub.cfg=/tmp/grub.cfg" -v
Then copy the GRUB config file to esp/EFI/grub/grub.cfg
and create a UEFI Boot Manager entry for esp/EFI/grub/grubx64_standalone.efi
using efibootmgr.
Technical information
The GRUB EFI file always expects its config file to be at ${prefix}/grub.cfg
. However in the standalone GRUB EFI file, the ${prefix}
is located inside a tar archive and embedded inside the standalone GRUB EFI file itself (inside the GRUB environment, it is denoted by "(memdisk)"
, without quotes). This tar archive contains all the files that would be stored normally at /boot/grub
in case of a normal GRUB EFI install.
Due to this embedding of /boot/grub
contents inside the standalone image itself, it does not rely on actual (external) /boot/grub
for anything. Thus in case of standalone GRUB EFI file ${prefix}==(memdisk)/boot/grub
and the standalone GRUB EFI file reads expects the config file to be at ${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg
.
Hence to make sure the standalone GRUB EFI file reads the external grub.cfg
located in the same directory as the EFI file (inside the GRUB environment, it is denoted by ${cmdpath}
), we create a simple /tmp/grub.cfg
which instructs GRUB to use ${cmdpath}/grub.cfg
as its config (configfile ${cmdpath}/grub.cfg
command in (memdisk)/boot/grub/grub.cfg
). We then instruct grub-mkstandalone to copy this /tmp/grub.cfg
file to ${prefix}/grub.cfg
(which is actually (memdisk)/boot/grub/grub.cfg
) using the option "boot/grub/grub.cfg=/tmp/grub.cfg"
.
This way, the standalone GRUB EFI file and actual grub.cfg
can be stored in any directory inside the EFI System Partition (as long as they are in the same directory), thus making them portable.
Speeding up LUKS decryption in GRUB
Upon boot GRUB may in some cases take a long time to verify the password. This can be due to a high PBKDF iteration count, which you can check as follows:
# cryptsetup luksDump /dev/sda3
The problem is that the iteration count for a given keyslot is generated when the key is added to ensure a balance between being high enough to protect against brute force attacks and low enough to allow for fast key derivation by estimating the capabilities of your computer. However, when GRUB is started, it might not have the same computational resources at hand, thus being vastly slower.
If your password provides enough entropy to counter common attacks by itself, you can lower this number:
# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3
A minimum of 1000 iterations is recommended as per RFC 2898, but you should aim for higher values if you can (The cost for an attacker as well as the time for key derivation scale linearly).