「GRUB/ヒントとテクニック」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(テンプレート:Expansion を削除)
(同期)
 
114行目: 114行目:
   
 
この方法がうまく行かない場合、非推奨の {{ic|1=vga=}} の方法はまだ使えます。{{ic|/etc/default/grub}} の {{ic|1="GRUB_CMDLINE_LINUX_DEFAULT="}} という行に追加するだけです。例えば、{{ic|1="GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792"}} は解像度が {{ic|1024x768}} になります。
 
この方法がうまく行かない場合、非推奨の {{ic|1=vga=}} の方法はまだ使えます。{{ic|/etc/default/grub}} の {{ic|1="GRUB_CMDLINE_LINUX_DEFAULT="}} という行に追加するだけです。例えば、{{ic|1="GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792"}} は解像度が {{ic|1024x768}} になります。
 
=== 915resolution ハック ===
 
 
Intel のグラフィックアダプタで {{ic|1=# hwinfo --framebuffer}} と {{ic|1=videoinfo}} のどちらも、希望する解像度を表示しないことがあります。この場合、{{ic|915resolution}} ハックを使うことができます。このハックは一時的にビデオ BIOS を修正して必要な解像度を追加します。[https://web.archive.org/web/20091113101645/http://915resolution.mango-lang.org:80/ 915resolution のホームページのアーカイブ] を見て下さい。AUR には {{AUR|915resolution}} パッケージが存在します。
 
 
まず後で修正されるビデオモードを見つける必要があります。そのために GRUB のコマンドシェルが必要です:
 
 
{{hc|sh:grub> 915resolution -l|
 
Intel 800/900 Series VBIOS Hack : version 0.5.3
 
[...]
 
'''Mode 30''' : 640x480, 8 bits/pixel
 
[...]
 
}}
 
 
次に、{{ic|Mode 30}} を解像度 {{ic|1440x900}} で上書きします:
 
 
{{hc|/etc/grub.d/00_header|2=
 
[...]
 
'''915resolution 30 1440 900'''
 
set gfxmode=${GRUB_GFXMODE}
 
[...]
 
}}
 
 
最後に、先に説明したように {{ic|GRUB_GFXMODE}} を設定して、GRUB の設定ファイルを再生成し、再起動して変更を確認しましょう。
 
   
 
=== 背景画像とビットマップフォント ===
 
=== 背景画像とビットマップフォント ===
331行目: 307行目:
   
 
GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'
 
GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'
  +
  +
{{Note|英語以外のロケールを使用している場合、生成されたメニューのタイトルは上記のものとは異なっている場合があります。{{ic|GRUB_DEFAULT}} の前に {{ic|1=LANG=C}} を追加するか、ロケールに合った適切なタイトルを {{ic|GRUB_DEFAULT}} に設定すると良いかもしれません。}}
   
 
数字を使う:
 
数字を使う:
398行目: 376行目:
 
# 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
 
# 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 コアイメージは {{ic|grub-install}} で自動的に生成されるイメージと同じように使うことができます。EFI パーティションに配置して {{ic|efibootmgr}} で有効化するか、システムファームウェアで適切に設定してください。
+
生成した EFI コアイメージは {{ic|grub-install}} で自動的に生成されるイメージと同じように使うことができます。[[EFI システムパーティション]]に配置して {{ic|efibootmgr}} で有効化するか、システムファームウェアで適切に設定してください。
   
 
[https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html#using-a-custom-keyboard-layout Debian cryptsetup docs] も参照してください。
 
[https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html#using-a-custom-keyboard-layout Debian cryptsetup docs] も参照してください。
450行目: 428行目:
   
 
こうすることで、スタンドアロンの GRUB EFI ファイルと実際の {{ic|grub.cfg}} は EFI システムパーティション内の任意のディレクトリに格納でき(同じディレクトリであれば)、移植が可能になります。
 
こうすることで、スタンドアロンの GRUB EFI ファイルと実際の {{ic|grub.cfg}} は EFI システムパーティション内の任意のディレクトリに格納でき(同じディレクトリであれば)、移植が可能になります。
  +
  +
=== UEFI と BIOS 両方用のインストール ===
  +
  +
Arch インストールを UEFI システムと BIOS システムの両方でブート可能にするためには、両方の方法を使って [[GRUB]] をインストールする必要があります。ディスクのパーティションテーブルを GPT にし、[[EFI システムパーティション]]と BIOS ブートパーティションを両方作成してください。そして、{{ic|/efi}} に ESP をマウントし、GRUB を BIOS の方法と UEFI の方法の両方でインストールしてください。
  +
  +
# grub-install --target=i386-pc --recheck /dev/sdx
  +
# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck
  +
  +
BIOS システムでは EFI 変数が存在しないため、UEFI NVRAM ブートエントリを設定することができず、以下の 2 つめのコマンドはエラーを吐きます。オプション {{ic|--no-nvram}} と {{ic|--removable}} を使うことで、UEFI モードでもブート可能になる可能性が高くなります:
  +
  +
# grub-install --target=i386-pc --recheck /dev/sdx
  +
# grub-install --target=x86_64-efi --efi-directory=/efi --recheck --removable --no-nvram
  +
  +
一部の BIOS 実装では、PMBR のブートフラグを設定する必要があるかもしれません。例えば、parted を使用する場合では:
  +
  +
(parted) disk_set pmbr_boot on
   
 
== GRUB で LUKS の復号を高速化する方法 ==
 
== GRUB で LUKS の復号を高速化する方法 ==
   
{{Warning|このセクションに進む前に、高エントロピーのパスワードの重要性を理解しておいてください。安全なパスワードを生成する方法についての情報は [[Wikipedia:Password strength]] で見ることができます。}}
+
{{Warning|このセクションに進む前に、高エントロピーのパスワードの重要性を理解しておいてください。安全なパスワードを生成する方法についての情報は [[Wikipedia:Password strength]] で見ることができます。また、使用している暗号の基礎についても理解しておく必要があります。使用中の機能で利用できないパラメータを使用すると、システムが利用不能になってしまう危険性があります。}}
   
起動時に [[GRUB]] はパスワードの確認に長い時間を要することがあります。これは [[Wikipedia:PBKDF2|PBKDF]] の反復回数が多ことが原因である可能性があり以下のように確認することができます
+
起動時に [[GRUB]] はパスワードの確認に長い時間を要することがあります。これは[[Wikipedia:ja:鍵導出関数|鍵導出関数]]でコストパラメータに高値を使用しているからである可能性があります。以下のコマンドで確認することができます:
   
 
# cryptsetup luksDump /dev/sda3
 
# cryptsetup luksDump /dev/sda3
   
問題は、特定のキースロットの反復カウントがキーが追加されたときに生成されるため、ブルートフォース攻撃から保護するのに十分な高さと、コンピュータの機能を推定してキーを高速に派生させるのに十分な低さのバランスが保たれることです。しかし、[[GRUB]] の起動時には、同じ計算資源が手元にないため、圧倒的に遅くなる可能性があります。
+
問題は、特定のキースロットのコスパラメータがキーが追加されたときに生成されるため、ブルートフォース攻撃から保護するのに十分な高さと、コンピュータの機能を推定してキーを高速に派生させるのに十分な低さのバランスが保たれることです。しかし、[[GRUB]] の起動時には、同じ計算資源が手元にないため、圧倒的に遅くなる可能性があります。
   
パスワードがそれ自体で一般的な攻撃に対抗するのに十分なエントロピーを提供する場合は、この数値を低くすることができます。
+
パスワードがそれ自体で一般的な攻撃に対抗するのに十分なエントロピーを提供する場合は、このパラメータを低くすることができます。例えば、[[Wikipedia:PBKDF2|PBKDF2]] の反復回数を低くするには:
   
 
# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3
 
# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3
   
 
[[RFC:2898|RFC 2898]] によると、最低1000回の反復が推奨されていますが、可能であればより高い値を目指すべきです (攻撃者のコストと鍵の導出にかかる時間は比例して増加します)。
 
[[RFC:2898|RFC 2898]] によると、最低1000回の反復が推奨されていますが、可能であればより高い値を目指すべきです (攻撃者のコストと鍵の導出にかかる時間は比例して増加します)。
  +
  +
[[Wikipedia:Argon2|Argon2]] における推奨されるパラメータは [[RFC:9106|RFC 9106]] で議論されています。
   
 
{{Tip|[[GRUB]] は有効なキースロットを順次試行します。キーを追加するときは、{{ic|--key-slot}} オプションを使ってキースロットを明示的に指定することができます。}}
 
{{Tip|[[GRUB]] は有効なキースロットを順次試行します。キーを追加するときは、{{ic|--key-slot}} オプションを使ってキースロットを明示的に指定することができます。}}
473行目: 469行目:
 
* [http://wiki.rosalab.ru/en/index.php/Grub2_theme_tutorial GRUB 2 テーマ チュートリアル]
 
* [http://wiki.rosalab.ru/en/index.php/Grub2_theme_tutorial GRUB 2 テーマ チュートリアル]
   
{{TranslationStatus|GRUB/Tips and tricks|2022-12-23|761971}}
+
{{TranslationStatus|GRUB/Tips and tricks|2024-01-11|796355}}

2024年1月11日 (木) 18:00時点における最新版

メインの記事は GRUB を見て下さい。

代替インストール方法

USB スティックにインストール

BIOS

USB の1番目のパーティションが FAT32 であり、そのパーティションが /dev/sdy1 であるとすると

# mount --mkdir /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

EFI

GRUB で EFI イメージを esp/EFI/BOOT/BOOTX64.efi に書き込むには、grub-install を使うときに --removable フラグを使用してください (このパスは、UEFI ブートエントリが無くとも、ファームウェアが見つけることができます)。

パーティションやパーティションレスディスクにインストールする

警告: GRUB では、GRUB Legacy や Syslinux と同じように、パーティションのブートセクタやパーティションレスディスクへのインストールを推奨していません。この種のセットアップは破損しやすく (特にアップデート中)、Arch の開発陣によるサポートはされていません

パーティションブートセクタやパーティションレスディスク (別名 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
ノート:
  • /dev/sdaX はインストール先に置き換えて下さい。
  • --target=i386-pc を使うと、grub-install は BIOS システム専用にインストールします。grub-install があいまいな動作をしないように常時使用することが推奨されています。

--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=728742https://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        #ルートパーティション
# mount /dev/sdxZ /mnt/boot   #ブートパーティション(もしあれば)
# arch-chroot /mnt

そして、linux をインストールして、以下を実行してください:

# grub-mkconfig -o /boot/grub/grub.cfg

core.img だけを生成する

MBR や post-MBR 領域、パーティションブートセクタに GRUB のブートセクタコードを 埋め込まずに/boot/grub ディレクトリを作成して /boot/grub/i386-pc/core.img ファイルを生成するには、--grub-setup=/bin/true オプションを grub-install に追加して実行してください:

# grub-install --target=i386-pc --grub-setup=/bin/true --debug /dev/sda
ノート:
  • /dev/sda はインストール先に置き換えて下さい。
  • --target=i386-pc を使うと、grub-install は BIOS システム専用にインストールします。grub-install があいまいな動作をしないように常時使用することが推奨されています。

これで Linux カーネルやマルチブートカーネルとして GRUB Legacy や syslinux から GRUB の core.img をチェインロードできます。(Syslinux#チェインロード も参照)

GUI 設定ツール

  • grub-customizer — GRUB や BURG のカスタマイザ
https://launchpad.net/grub-customizer || grub-customizer

外観の設定

GRUB ではデフォルトで、メニューの見た目を変更できます。GRUB のグラフィカルターミナルである gfxterm を /etc/default/grub で初期化しておくことを忘れないでください:

GRUB_TERMINAL_OUTPUT="gfxterm"

フレームバッファの解像度を設定する

GRUB は GRUB 自身 (GFXMODE) とカーネル (GFXPAYLOAD) の両方に対してフレームバッファを設定することができます。古い vga= は非推奨になりました。以下のように /etc/default/grub を編集して、幅(ピクセル) x 高さ(ピクセル) x 色深度 を設定する方法が推奨されています:

GRUB_GFXMODE=1024x768x32
GRUB_GFXPAYLOAD_LINUX=keep

(デフォルトの auto を含む)複数の解像度を指定できます。なので、次のように行を編集することを推奨します: GRUB_GFXMODE=望みの解像度,1024x768 などのフォールバック解像度,auto。詳細は、the GRUB gfxmode documentation を参照してください。gfxpayload プロパティはカーネルが解像度を保持することを保証します。

ノート:
  • VESA BIOS Extensions を通してグラフィックカードによりサポートされているモードのみを使用できます。サポートされているモードのリストを見るには、hwinfoインストールして、hwinfo --framebuffer を root として実行してください。あるいは、GRUB コマンドラインに入り、videoinfo というコマンドを実行してください。
  • NVIDIA プロプライエタリドライバの初期バージョンでは <width>x<height>-<depth> という形式で GRUB_GFXMODE が使えます(GeForce GTX 970 と nvidia 370 で検証済み) (例: 1920x1200x24 ではなく 1920x1200-24)。これは新しいカードとドライバでは使えないようです。最近のドライバと Pascal カードでは先の形式は機能せず、システムのクラッシュやハードロックなどの深刻な問題が発生します(GeForce GTX 1060 と nvidia 381.22 で検証済み)。現在のドライバとカードでは、標準的な widthxheightxdepth 形式で GRUB_GFXMODE を設定することが最良の方法です。
  • 変更を加えた後に grub-mkconfig -o /boot/grub/grub.cfg を実行することを忘れないでください。

この方法がうまく行かない場合、非推奨の vga= の方法はまだ使えます。/etc/default/grub"GRUB_CMDLINE_LINUX_DEFAULT=" という行に追加するだけです。例えば、"GRUB_CMDLINE_LINUX_DEFAULT="quiet splash vga=792" は解像度が 1024x768 になります。

背景画像とビットマップフォント

GRUB は背景画像と pf2 フォーマットのビットマップフォントをサポートしています。grub パッケージに含まれている unifont フォントは unicode.pf2 というファイル名で置いてあり、同じく ASCII 文字は ascii.pf2 という名前です。ファイルのパスは pacman -Ql grub | grep pf2 を実行して得られます。

サポートされている画像フォーマットは tga, png, jpeg で適切なモジュールがロードされます。利用できる最大解像度はあなたのハードウェアによります。

正しいフレームバッファの解像度を設定するようにしてください。

/etc/default/grub を以下のように編集してください:

GRUB_BACKGROUND="/boot/grub/myimage"
#GRUB_THEME="/path/to/gfxtheme"
GRUB_FONT="/path/to/font.pf2"
ノート: GRUB を分割して別のパーティションにインストールしている場合、grub.cfg/boot/grub/myimage は自動的に /grub/myimage になります。

変更を適用するには 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=5
GRUB_TIMEOUT_STYLE='countdown'

GRUB_TIMEOUT がメニューの表示まで待機する秒数です。

フレームバッファの無効化

バイナリドライバーで問題が発生するので、NVIDIA のプロプライエタリドライバーを使っているユーザーは、GRUB のフレームバッファを無効化するべきかもしれません。

フレームバッファを無効にするには、/etc/default/grub を編集して次の行をアンコメントしてください:

GRUB_TERMINAL_OUTPUT=console

他にも、GRUB でフレームバッファを使いつつカーネルを起動する直前にテキストモードに戻すこともできます。これをするには、/etc/default/grub 内の次の変数を変更してください:

GRUB_GFXPAYLOAD_LINUX=text

GRUB で ISO9660 イメージファイルを直接起動

GRUB はループバックデバイスによる ISO イメージの直接起動をサポートしています。詳しくは マルチブート USB ドライブ#GRUB とループバックデバイスを使う を参照。

GRUB メニューのパスワード保護

警告: 誰かがあなたのマシンに物理的にアクセスしてライブ USB やライブディスクを起動できる場合 (BIOS が外部ディスクからの起動を許可している場合)、/boot が存在するパーティションが暗号化されてなければ GRUB の設定ファイルを編集してパスワード認証を迂回するのは至極簡単なことです。GRUB#暗号化セキュリティ#ディスク暗号化 を見てください。

ブートパラメータを変えたりコマンドラインを使えないようにして GRUB をセキュアにしたい場合、GRUB の設定ファイルにユーザー名とパスワードを追加することができます。そうするには、grub-mkpasswd-pbkdf2 コマンドを実行し、パスワードを入力し、確認してください:

$ grub-mkpasswd-pbkdf2
[...]
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.C8ABD3E93C4DFC83138B0C7A3D719BC650E6234310DA069E6FDB0DD4156313DA3D0D9BFFC2846C21D5A2DDA515114CF6378F8A064C94198D0618E70D23717E82.509BFA8A4217EAD0B33C87432524C0B6B64B34FBAD22D3E6E6874D9B101996C5F98AB1746FE7C7199147ECF4ABD8661C222EEEDB7D14A843261FFF2C07B1269A

次に、chmod o-r /etc/grub.d/40_custom を実行して、root 以外が読み出せないように /etc/grub.d/40_custom のパーミッションを変更してください。そして、そのファイルを以下のように変更してください:

/etc/grub.d/40_custom
set superusers="ユーザ名"
password_pbkdf2 ユーザ名 パスワードのハッシュ値

パスワードのハッシュ値 の部分は、grub-mkpasswd_pbkdf2 によって生成された、grub.pbkdf2 で始まる文字列に置き換えてください。

grub-mkconfig で設定ファイルを再生成してください。GRUB コマンドラインや boot parameters にアクセスしようとしたり、エントリを起動しようとしたりすると、先の指定したユーザ名とパスワードを要求するようになります。後者は次のトピックに従うことで回避できることに注意してください。

この制限は GRUB manual の "Security" パートに書かれている方法によって緩めたりカスタマイズすることができます。

GRUB の編集とコンソールオプションだけをパスワードで保護

--unrestricted をメニューエントリに追加することでエントリの編集や GRUB のコマンドコンソールへのアクセスを制限しつつ誰でも OS を起動できるようになります。 スーパーユーザーや --user スイッチで指定したユーザーだけがメニューエントリを編集することが可能です。

/boot/grub/grub.cfg
menuentry 'Arch Linux' --unrestricted --class arch --class gnu-linux --class os ...
この記事またはセクションの正確性には問題があります。
理由: /etc/grub.d/10_linux を編集するべきではありません。grub がアップデートされた際に上書きされてしまいます。 (議論: トーク:GRUB/ヒントとテクニック#)

Linux エントリを --unrestricted にするには、/etc/grub.d/10_linux の先頭の CLASS 変数を変更することにより可能です。

/etc/grub.d/10_linux
CLASS="--class gnu-linux --class gnu --class os --unrestricted"

Shift キーが押されていない時は GRUB を隠す

ノート: これは UEFI システム上では動作しません。修飾キーの状態を検出する方法をファームウェアが提供していないためです。

起動を高速化するために、GRUB にタイムアウトを待たせる代わりに、GRUB の起動時に Shift キーが押されていない限り、GRUB にメニューを隠させるということが可能です。

これをするためには、次の行を /etc/default/grub に追加する必要があります:

 GRUB_FORCE_HIDDEN_MENU="true"

そして [1] の内容を含むファイル /etc/grub.d/31_hold_shift を作成して、実行可能属性を付与して grub の設定を再生成してください:

# grub-mkconfig -o /boot/grub/grub.cfg
ノート: keystatus を使ってキーの押下を検出するのでマシンによっては動作しないことがあります。

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 カーネルと、フォールバックとしての 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/grub.d/40_custom/boot/grub/custom.cfg の Windows) には savedefault の追加が必要です。

デフォルトのメニューエントリを変更する

デフォルトで選択されるエントリを変更するには、/etc/default/grub を編集して GRUB_DEFAULT の値を変更してください:

メニューのタイトルを使う:

GRUB_DEFAULT='Advanced options for Arch Linux>Arch Linux, with Linux linux'
ノート: 英語以外のロケールを使用している場合、生成されたメニューのタイトルは上記のものとは異なっている場合があります。GRUB_DEFAULT の前に LANG=C を追加するか、ロケールに合った適切なタイトルを GRUB_DEFAULT に設定すると良いかもしれません。

数字を使う:

GRUB_DEFAULT="1>2"

Grub は生成されたメニュー (例: /boot/grub/grub.cfg)を0からカウントします。つまり最初のエントリは 0 で (デフォルト値)、次のエントリは 1 と続きます。メインのエントリとサブメニュエントリは > により区切られています。

上記の例はメインメニュー 'Advanced options for Arch Linux' の3つめのエントリを起動します。

デフォルトでないエントリを一度だけ起動する

デフォルトエントリ以外のエントリを一度だけ起動するのに grub-reboot はとても便利です。次にシステムが再起動した時に、GRUB は最初のコマンドライン引数で指定されたエントリをロードします。そして、その後のブートでは GRUB はデフォルトエントリをロードするように戻ります。設定ファイルの変更や GRUB メニューでのエントリの選択は必要ありません。

ノート: これをするには /etc/default/grubGRUB_DEFAULT=saved を設定 (して grub.cfg を再生成) する必要があります、grub.cfg を手動で編集する場合は set default="${saved_entry}" という行を設定します。

曲の再生

GRUB_INIT_TUNE 変数を変更することで起動中 (メニューが表示される直前) に PC スピーカーを使って曲を流すことができます:

GRUB_INIT_TUNE="テンポ [音の高さ 音の長さ] [2つ目の音の高さ 2つ目の音の長さ] ..."
ノート: 音楽が終わるまで、ブートメニューは 表示されません

一般的な GRUB_INIT_TUNE のサンプルを再生するメニューエントリを追加してみることもできます。このリンク先の /etc/grub.d/91_tune_demo を作成し、grub-mkconfig をもう一度実行してください。

これに関する詳細は、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 としてコアイメージに同梱させます:

# grub-kbdcomp -o dvorak.gkb dvorak
# tar cf memdisk.tar dvorak.gkb

そして GRUB コアイメージで使用する設定ファイルを作成してください。通常の GRUB の設定と同じフォーマットですが、/boot パーティションのメインの設定ファイルを探してロードすることだけ記述します:

early-grub.cfg
set root=(memdisk)
set 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 で有効化するか、システムファームウェアで適切に設定してください。

Debian cryptsetup docs も参照してください。

UEFI の詳細情報

この記事あるいはセクションで使われている用語や表現には問題が存在します。
議論: This could be made more concise, better organized. (議論: トーク:GRUB/ヒントとテクニック#)

以下は、UEFI を使って Arch をインストールすることに関する他の関連情報です。

代替インストール方法

通常、GRUB は EFI システムパーティションがどこにマウントされていても、設定ファイルを含むすべてのファイルを /boot に保持します。

これらのファイルを EFI System Partition 自体の中に保持したい場合は、grub-install コマンドに --boot-directory=esp を追加してください。

# grub-install --target=x86_64-efi --efi-directory=esp --bootloader-id=grub --boot-directory=esp --debug

これにより、すべての GRUB ファイルが esp/grub に置かれ、代わりに /boot/grub に置かれることになります。この方法を使うときは、grub-mkconfigが同じ場所に設定ファイルを置くことを確認してください。

# grub-mkconfig -o esp/grub/grub.cfg

それ以外の構成は同じです。

UEFIファームウェアのワークアラウンド

こちらを参照 GRUB#デフォルト/フォールバックのブートパス

GRUBスタンドアロン

このセクションでは、x86_64 システム用のスタンドアロン GRUB(x86_64-efi)を作成することを想定しています。32 ビット (IA32) EFI システムでは、必要に応じて x86_64-efii386-efi に置き換えてください。

UEFI アプリケーションの中に全てのモジュールを tar アーカイブで埋め込んだ grubx64_standalone.efi アプリケーションを作ることができます、これにより GRUB UEFI モジュールやその他の関連ファイルを集めた別のディレクトリを用意する必要はありません。これは grub-mkstandalone コマンド (grub に含まれています) を使って以下のように行います。

# 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

それから GRUB 設定ファイルを esp/EFI/grub/grub.cfg にコピーして、UEFI Boot Manager のエントリを efibootmgr を使って esp/EFI/grub/grubx64_standalone.efi に作成します。

ノート: オプション --modules="part_gpt part_msdos" は必須です。(は、${cmdpathを使用するために必要です(引用符で囲んでください)

機能が正常に動作するようになります。}}

警告: ${cmdpath} にスラッシュがないため、grub.cfg ファイルがロードされない場合があります(つまり、(hd1,msdos2)/EFI/Boot ではなく (hd1,msdos2)EFI/Boot) を実行すると、GRUB シェルにドロップされます。これが発生した場合は、${cmdpath} が設定されているもの(echo ${cmdpath})を特定し、設定ファイルを手動でロードします(例:configfile (hd1,msdos2)/EFI/Boot/grub.cfg)

技術情報

GRUB EFI ファイルは、常にその設定ファイルが ${prefix}/grub.cfg にあることを期待します。しかし、スタンドアロンの GRUB EFI ファイルでは、${prefix にあります}}は tar アーカイブの中にあり、スタンドアロン GRUB EFI ファイル自体の中に組み込まれています(GRUB 環境内では、引用符なしで"(memdisk)" で表記されます)この tar アーカイブには、通常の GRUB EFI インストールの場合に /boot/grub に格納されるすべてのファイルが含まれています。

このように /boot/grub の内容をスタンドアロンイメージ自体に埋め込んでいるため、実際の(外部の) /boot/grub には何も依存していません。従って、スタンドアロン GRUB EFI ファイル ${prefix}==(memdisk)/boot/grub の場合、スタンドアロン GRUB EFI ファイルは ${prefix}/grub.cfg==(memdisk)/boot/grub/grub.cfg に設定ファイルがあることを期待して読み込んでいるのですが、その設定ファイルは、スタンドアロン GRUB EFI ファイルと同じ場所にあるため、スタンドアロン GRUB の設定ファイルを読み込むことができません。

したがって、スタンドアロンの GRUB EFI ファイルが EFI ファイルと同じディレクトリにある外部 grub.cfg を確実に読み取るように (GRUB 環境内では、${cmdpath} で示されます。) 単純な /tmp/grub.cfg を作成して、その config として ${cmdpath}/grub.cfg を使用するように GRUB に指示します (configfile ${cmdpath}/grub.cfg コマンド そして、この /tmp/grub.cfg ファイルを ${prefix}/grub.cfg にコピーするように grub-mkstandalone に指示を出します。(実際には (memdisk)/boot/grub/grub.cfg である) オプション "boot/grub/grub.cfg=/tmp/grub.cfg" を使用しています。

こうすることで、スタンドアロンの GRUB EFI ファイルと実際の grub.cfg は EFI システムパーティション内の任意のディレクトリに格納でき(同じディレクトリであれば)、移植が可能になります。

UEFI と BIOS 両方用のインストール

Arch インストールを UEFI システムと BIOS システムの両方でブート可能にするためには、両方の方法を使って GRUB をインストールする必要があります。ディスクのパーティションテーブルを GPT にし、EFI システムパーティションと BIOS ブートパーティションを両方作成してください。そして、/efi に ESP をマウントし、GRUB を BIOS の方法と UEFI の方法の両方でインストールしてください。

# grub-install --target=i386-pc --recheck /dev/sdx
# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck

BIOS システムでは EFI 変数が存在しないため、UEFI NVRAM ブートエントリを設定することができず、以下の 2 つめのコマンドはエラーを吐きます。オプション --no-nvram--removable を使うことで、UEFI モードでもブート可能になる可能性が高くなります:

# grub-install --target=i386-pc --recheck /dev/sdx
# grub-install --target=x86_64-efi --efi-directory=/efi --recheck --removable --no-nvram

一部の BIOS 実装では、PMBR のブートフラグを設定する必要があるかもしれません。例えば、parted を使用する場合では:

(parted) disk_set pmbr_boot on

GRUB で LUKS の復号を高速化する方法

警告: このセクションに進む前に、高エントロピーのパスワードの重要性を理解しておいてください。安全なパスワードを生成する方法についての情報は Wikipedia:Password strength で見ることができます。また、使用している暗号の基礎についても理解しておく必要があります。使用中の機能で利用できないパラメータを使用すると、システムが利用不能になってしまう危険性があります。

起動時に GRUB はパスワードの確認に長い時間を要することがあります。これは、鍵導出関数でコストパラメータに高い値を使用しているからである可能性があります。以下のコマンドで確認することができます:

# cryptsetup luksDump /dev/sda3

問題は、特定のキースロットのコストパラメータがキーが追加されたときに生成されるため、ブルートフォース攻撃から保護するのに十分な高さと、コンピュータの機能を推定してキーを高速に派生させるのに十分な低さのバランスが保たれることです。しかし、GRUB の起動時には、同じ計算資源が手元にないため、圧倒的に遅くなる可能性があります。

パスワードがそれ自体で一般的な攻撃に対抗するのに十分なエントロピーを提供する場合は、このパラメータを低くすることができます。例えば、PBKDF2 の反復回数を低くするには:

# cryptsetup luksChangeKey --pbkdf-force-iterations 1000 /dev/sda3

RFC 2898 によると、最低1000回の反復が推奨されていますが、可能であればより高い値を目指すべきです (攻撃者のコストと鍵の導出にかかる時間は比例して増加します)。

Argon2 における推奨されるパラメータは RFC 9106 で議論されています。

ヒント: GRUB は有効なキースロットを順次試行します。キーを追加するときは、--key-slot オプションを使ってキースロットを明示的に指定することができます。

参照

翻訳ステータス: このページは en:GRUB/Tips and tricks の翻訳バージョンです。最後の翻訳日は 2024-01-11 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。