続・玩式草子 ―戯れせんとや生まれけん―

第60回grubテーマの遊び方(その1)

前回、インストーラの更新に合わせて起動時のgrubのメニュー画面を一新したことを紹介しました。その際grubのテーマについて調べてみたところ、作成済みのテーマやそれらを適用する方法に関する解説はたくさんあるものの、テーマ設定ファイル(theme.txt)の書き方に関する解説はあまり見つからず、結構苦労しました。

加えて、grubのメニュー画面はシステム起動時にしか表示されないので、変更箇所の確認が面倒です。何かいい方法はないかな…… と考えているうち、USBメモリ上のレスキューシステムの応用で、VirtualBoxの仮想マシンとUSBメモリを使ってメニュー画面を簡単に表示する方法を思いつきました。この方法を使えばテーマの設定ファイルの修正も効率よくなります。そのあたりの経験を元に、今回からgrubのテーマで遊ぶ方法を紹介してみましょう。

grub.cfgとtheme.txt

Plamo Linuxの標準的な起動メニュー画面は図1のようになっています。この画面はテーマ機能を使わずgrub.cfgのみで作成しています。

図1 Plamo Linuxの起動メニュー画面
図1 Plamo Linuxの起動メニュー画面

grubのメニュー画面は「タイトル」「メニューボックス⁠⁠、⁠ラベル」といったさまざまな要素から構成され、テーマ機能を使えばこれら各要素に色、サイズ、フォントの種類、画面上の位置といったさまざまな指定を加えることができます。テーマ設定がどのようにメニュー画面を装飾するのかを試すため、grubにサンプルとして添付されているstarfieldテーマを適用してみます。

Plamo Linuxの場合、⁠starfield⁠テーマは/usr/share/grub/themes/starfield/にインストールしています。

$ ls /usr/share/grub/themes/starfield/
COPYING.CC-BY-SA-3.0  boot_menu_s.png   dejavu_bold_14.pf2  terminal_box_ne.png
README                boot_menu_se.png  slider_c.png        terminal_box_nw.png
...
boot_menu_nw.png      dejavu_16.pf2     terminal_box_n.png

メニュー画面にテーマ設定を適用するにはgrub.cfgでフォントやテーマファイルを指定する必要があります。そのためには/etc/default/grubに設定を追加しgrub.cfgを再生成します。

/etc/defaults/grubはgrub-mkconfigが参照する設定ファイルで、ディストリビューション名や起動時のカーネルパラメータ等を設定します。メニュー画面にテーマを適用するには、このファイルにGRUB_THEME="..."の行を追加します。

$ cat -n /etc/default/grub 
   1  # Default menu entry
   2  GRUB_DEFAULT=0
...
  15  # Distributor
  16  GRUB_DISTRIBUTOR="Plamo"
...
  24  # GRUB_BACKGROUND="/usr/share/grub/plamo_bg01.png"
  25  # GRUB_FONTS="/usr/share/grub/unicode.pf2"
  26  GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"

/etc/defaults/grubにGRUB_THEME="..."の設定を追加した上でgrub-mkconfigを実行すると、指定したテーマファイル(theme.txt)が読み込まれ、そこで使っているフォント等を反映したgrub用設定ファイル(下記ではtheme_tst.cfg)が作成されます。

$ sudo grub-mkconfig -o theme_tst.cfg
Generating grub configuration file ...
テーマを見つけました: /usr/share/grub/themes/starfield/theme.txt
Linux イメージを見つけました: /boot/vmlinuz-6.12.21-plamo64
Found initrd image: /boot/initrd.img-6.12.21-plamo64
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
完了

作成されたtheme_tst.cfgには、指定したテーマファイルに関する設定が追加されています。

$ sudo cat -n theme_tst.cfg
   1  #
   2  # DO NOT EDIT THIS FILE
   3  #
   4  # It is automatically generated by grub-mkconfig using templates
   5  # from /etc/grub.d and settings from /etc/default/grub
...
  91  insmod gfxmenu
  92  loadfont ($root)/usr/share/grub/themes/starfield/dejavu_10.pf2
  93  loadfont ($root)/usr/share/grub/themes/starfield/dejavu_12.pf2
  94  loadfont ($root)/usr/share/grub/themes/starfield/dejavu_14.pf2
  95  loadfont ($root)/usr/share/grub/themes/starfield/dejavu_16.pf2
  96  loadfont ($root)/usr/share/grub/themes/starfield/dejavu_bold_14.pf2
  97  insmod png
  98  set theme=($root)/usr/share/grub/themes/starfield/theme.txt
  99  export theme
...

こうして作った新しい設定ファイル(theme_tst.cfg)でシステムのgrub.cfgを置き替えます。念のため、古い設定ファイルも残しておきましょう。

$ sudo mv /boot/efi/grub/grub.cfg{,.org}
$ sudo cp ./theme_tst.cfg /boot/efi/grub/grub.cfg

grub.cfgを書き替えた上で再起動すれば、starfieldテーマを適用したPlamo Linuxの起動メニュー画面が表示されます。

図2 起動メニュー画面を“starfield”テーマで装飾
図2 起動メニュー画面を“starfield”テーマで装飾

テーマ画面テスト環境の準備

さて、それではテーマ設定を簡単にテストするための環境を作成しましょう。今回は、⁠VirtualBoxの仮想マシンをホスト側のUSBメモリから起動する」という方法を使います。

拡張機能パック(Extension Pack)を適用したVirtualBoxは、仮想マシンからホスト側のUSBデバイスを利用でき、そこにあるブートローダ(grub)から起動することも可能です。この機能を使えば、OSをインストールしていない仮想マシンからでもgrubのメニュー画面を表示できます。

この環境を作るための実際の手順を紹介してみましょう。まずは前回紹介したレスキューシステム(Plamo8_USBboot_img.zip)を展開したUSBメモリとExtension Packを適用したVirtualBox環境を用意し、新規に仮想マシンを作っておきます。その際は[システム][拡張機能]にある[EFIを有効化]を忘れずチェックしておきましょう。

仮想マシンはUEFI経由でgrubを読み込むだけなので、CPU数や仮想HDDのサイズ等を気にする必要はありません。

そして、[USB][USBコントローラーを有効化][USB-3.0(xHCI)コントローラー]を指定し、[USBデバイスフィルター]でホスト側に接続されているUSB機器のうち、レスキューシステムを置いたUSBメモリを追加します。

図3 VirtualBoxの仮想マシンでホスト機のUSBメモリを指定
図3 VirtualBoxの仮想マシンでホスト機のUSBメモリを指定

設定が終れば仮想マシンを起動します。新規に作成した仮想マシンには起動可能なHDDは存在しないため、上記で指定したUSBメモリが起動デバイスと認識され、レスキューシステムのメニュー画面が表示されるはずです。

新規に仮想マシンを用意するのが面倒な場合、既存の仮想マシンを流用してテストすることもできます。ただし、その場合はインストール済みのHDD上のgrubが優先的に起動されるので、いったんUEFIのメニュー画面に入って⁠Boot Manager⁠を選ぶ必要があります。UEFIのブートマネージャーはブート可能な周辺機器を探してリストアップするので、そこからPlamo Linuxのレスキューシステムを入れたUSBメモリを探します。

図4 VirtualBoxの“Boot Manager”画面
図4 VirtualBoxの“Boot Manager”画面

VirtualBoxでは、仮想マシンの電源ONやリセットと同時にESCキーを押すとUEFIのメニュー画面に入れるものの、タイミングを合わせるのは結構難しいので、いったんHDD上のgrubのメニュー画面を出し、⁠UEFI Firmware Settings⁠を選んでUEFIのメニューへ移る方が簡単でしょう。

theme.txtの更新

さて、前節の設定でOS無しの仮想マシンからUSBメモリ上のgrubメニュー画面を表示できるようになったので、次にtheme.txtを使ってレスキューシステム用の画面を変更してみます。

本来、grubテーマを変更する場合、利用する画像やフォント一式を用意しないといけませんが、今回試している"starfield"サンプルテーマはレスキューシステムにもそのまま入っているので流用できます。

$ ls /run/media/kojima/11B4-4E49/  # USBメモリのルートパーティション
EFI/  Plamo8_USBboot_img.zip  boot/  grub/
$ ls /run/media/kojima/11B4-4E49/grub/
fonts/  grub.cfg  grubenv  locale/  themes/  x86_64-efi/
$ ls /run/media/kojima/11B4-4E49/grub/themes 
plamo_bg01.png  starfield/  theme.txt

レスキューシステム上でも先に作ったtheme_tst.cfgを使ってみることにします。元のgrub.cfgをバックアップしておき、theme_tst.cfgをUSBメモリへコピーします。

$ mv /run/media/kojima/11B4-4E49/grub/grub.cfg{,.org}
$ cp theme_tst.cfg /run/media/kojima/11B4-4E49/grub/grub.cfg

実のところ、grub-mkconfigで作ったgrub.cfgには実行した環境のハードウェア情報(HDDパーティション等)が埋め込まれるので、そのままでは別環境で利用できません。

図5 grub.cfgを別マシンに持ち込んだ際のエラーの例
図5 grub.cfgを別マシンに持ち込んだ際のエラーの例

今回はテーマ設定に関する部分が動けばいいので、必要な部分のみを手動で修正することにします。USBメモリから起動した場合、grub的には(hd0,msdos1)としてUSBメモリ上のファイルへアクセスできます。そこで、rootを'hd0,msdos1'とし、フォントやテーマファイル(theme.txt)も/grub/themes/starfield/以下へ探しに行くようにしました。下記リストでは元の設定をコメントアウトし、USBメモリに合わせた設定を追加しています。

$ cat -n /run/media/kojima/11B4-4E49/grub/grub.cfg
...
    85  #set root='hd0,gpt3'
    86  set root='hd0,msdos1'
...
    92  insmod gfxmenu
    93  #loadfont ($root)/usr/share/grub/themes/starfield/dejavu_10.pf2
    94  #loadfont ($root)/usr/share/grub/themes/starfield/dejavu_12.pf2
    95  #loadfont ($root)/usr/share/grub/themes/starfield/dejavu_14.pf2
    96  #loadfont ($root)/usr/share/grub/themes/starfield/dejavu_16.pf2
    97  #loadfont ($root)/usr/share/grub/themes/starfield/dejavu_bold_14.pf2
    98  loadfont ($root)/grub/themes/starfield/dejavu_10.pf2
    99  loadfont ($root)/grub/themes/starfield/dejavu_12.pf2
   100  loadfont ($root)/grub/themes/starfield/dejavu_14.pf2
   101  loadfont ($root)/grub/themes/starfield/dejavu_16.pf2
   102  loadfont ($root)/grub/themes/starfield/dejavu_bold_14.pf2
   103  insmod png
   104  #set theme=($root)/usr/share/grub/themes/starfield/theme.txt
   105  set theme=($root)/grub/themes/starfield/theme.txt
...

これでUSBメモリ上のテーマ設定を利用できるようにはなったものの、このままだと先に示した⁠starfield⁠のテーマ例と同じ画面なので、背景画像をPlamo用の⁠plamo_bg01.png⁠に入れ替えてみましょう。

$ cd /run/media/kojima/11B4-4E49/grub/themes
$ ls
plamo_bg01.png  starfield/  theme.txt
$ cp plamo_bg01.png starfield

starfield/theme.txtで"desktop-image"の指定を⁠plamo_bg01.png⁠に変更します。

$ cat -n starfield/theme.txt
  1   # Default theme for GRUB2
  2   #
...
 29   #desktop-image: "starfield.png"
 30   desktop-image: "plamo_bg01.png"
...

設定編集後、再度VirtualBoxの仮想マシンをUSBメモリから起動すると、Plamoの背景画像とstarfieldテーマが混ったメニュー画面が表示できました。

図6 “starfield”テーマの背景画像を変えてみた
図6 “starfield”テーマの背景画像を変えてみた

このメニュー画面はUSBメモリ上のgrub.cfgとtheme.txtで調整できるので、ホスト側でファイルを修正、仮想マシンの電源ONで画面を確認、電源OFFすればUSBメモリの制御はホスト側に戻るのでホスト側からの再修正、が簡単に実現できます。次回は、この環境を用いてtheme.txtの書式について解説します。


実のところ、grubのメニュー画面を着せ替える各種テーマの存在には気づいてはいたものの、メンテナのさがか、⁠カーネルパラメータが正しく設定されているか」⁠HDDパーティションはちゃんと認識しているか」といった方面に気を取られ、画面装飾といった機能はあまり意識していませんでした。

しかしながら改めて調べてみると、起動時のわずかな時間しか表示されない画面の装飾用にずいぶん多彩な機能が用意されていることに驚かされました。次回では、そのような開発者のこだわりの一端を紹介してみようと思います。

おすすめ記事

記事・ニュース一覧