GRUB/ヒントとテクニック

提供: ArchWiki
2017年5月11日 (木) 08:01時点におけるKusakata.bot (トーク | 投稿記録)による版 (update Pkg/AUR templates)
ナビゲーションに移動 検索に移動

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

GUI 設定ツール

以下のパッケージがインストール可能です:

  • grub-customizer — ブートローダー (GRUB や BURG) のカスタマイズ
https://launchpad.net/grub-customizer || grub-customizerAUR
  • grub2-editor — GRUB ブートローダー設定の KDE4 コントロールモジュール
http://kde-apps.org/content/show.php?content=139643 || grub2-editorAUR[リンク切れ: アーカイブ: aur-mirror]
  • grub2-editor-frameworks — grub2-editor の非公式 KF5 ポート
https://github.com/maz-1/grub2-editor || grub2-editor-frameworksAUR
  • startupmanager — GRUB Legacy, GRUB, Usplash, Splashy の設定を変更できる GUI アプリ (開発停止)
http://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 プロパティによってカーネルに解像度を維持させます。

ノート:
  • 上記のサンプルで上手く行かないときは gfxmode="1024x768x32"vbemode="0x105" に置き換えてみて下さい。解像度も、あなたの画面に合った解像度に置き換えることを忘れないで下さい
  • # hwinfo --framebuffer を使って利用できる全てのモードを表示することができます (hwinfo は [community] から利用可能です)、GRUB のプロンプトでは videoinfo コマンドが使用できます
  • NVIDIA のプロプライエタリドライバーは <width>x<height>-<depth> という形式で GRUB_GFXMODE が使えます (例: 1920x1200-24)。GeForce GTX 970 と nvidia 370 ドライバーでテスト済み。

この方法が使えない時は、昔の 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 --framebuffervideoinfo のどちらも希望する解像度を表示しないことがあります。この場合、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 301440x900 解像度で上書きします:

/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 を分割して別のパーティションにインストールしている場合、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=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 とループバックデバイスを使うを参照。

永続的なブロックデバイスの命名

永続的なブロックデバイスの命名のひとつとして"古い" /dev/sd* の代わりに世界でただひとつの UUID を使ってパーティションを識別する方法があります。利点については上のリンクされている記事で説明しています。

ファイルシステムの UUID の永続的命名はデフォルトで GRUB で使われています。

ノート: 関連するファイルシステムのサイズを変えたり再作成したときはいつでも /etc/default/grub の新しい UUID を使って /boot/grub.cfg ファイルを再生成する必要があります。ライブ CD でパーティションやファイルシステムを修正するときは、このことを覚えておいて下さい。

UUID を使うかどうかは /etc/default/grub 内のオプションによって決めます:

# GRUB_DISABLE_LINUX_UUID=true

どちらにしても、変更を生成することを忘れないで下さい:

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

ラベルを使う

--label オプションを search に使うことで、人間が読めるラベルをファイルシステムに付けることができます。まず最初に、既存のパーティションにラベリングしてください:

# tune2fs -L LABEL PARTITION

次に、ラベルを使ってエントリを追加してください。例:

menuentry "Arch Linux, session texte" {
  search --label --set=root archroot
  linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot ro
  initrd /boot/initramfs-linux.img
}

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

警告: 誰かがあなたのマシンに物理的にアクセスしてライブ USB やライブディスクを起動できる場合 (BIOS が外部ディスクからの起動を許可している場合)、/boot が存在するパーティションが暗号化されてなければ 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
ノート: 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
}

grub.cfg を手動で作成する

基本的な GRUB 設定ファイルは以下のオプションを使っています:

  • (hdX,Y) はディスク X 上のパーティション Y を示します、パーティション番号は1から始まり、ディスク番号は0から始まります
  • set default=N はユーザーアクションのタイムアウト後に選択されるデフォルトブートエントリを指定します
  • set timeout=M はデフォルトのエントリが起動されるまでユーザーが選択するのを待つ時間 M 秒を表します
  • menuentry "title" {entry options}title という名前のブートエントリになります
  • set root=(hdX,Y) はカーネルや GRUB モジュールが保存されている boot パーティションを指定します (boot パーティションを分割する必要はなく、"root" パーティション (/) 下のただのディレクトリでもかまいません)

エントリ

サブメニューの無効化

複数のカーネルをインストールしている場合 (例えば 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
ノート: 手動で追加したメニューアイテム (例: /etc/grub.d/40_custom/boot/grub/custom.cfg の Windows) には savedefault の追加が必要です。設定ファイルを再生成するのを忘れないで下さい。

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

デフォルトで選択されるエントリを変更するには、/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 メニューでのエントリの選択は必要ありません。

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

曲の再生

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 で有効化するか、システムファームウェアで適切に設定してください。