Web更新

UnuntuでZFSを使ってみよう #第8回 Ubuntu 20.04 LTS の ZFS boot で変わる機能(Grub)

前回は、Ubuntu 20.04 LTSでZFS bootする方法について説明しました。知人などからUbuntuのZFSの重複排除って大丈夫なのか、という問題が指摘されました。個人的にUbuntu 18.04上で重複排除を有効にしたZFSを /homeにマウントしていましたが、数年立っても特に問題ありません。そもそもZFS bootはまだ実験的な機能であり、desktop版でのリリースであることから、ZFS bootの使用を実サーバに適用するのはお勧めしません。現時点では、個人の趣味、検証の範囲でお使いください。

ZFSを rootファイルシステムにしたことでいくつかの変更点が分かっています。今わかっているだけでも、Grub、autosnapshot、zsysdなど、動作が違うことが分かっています。

今回は、ZFS bootを採用することで変更されたGrubの機能追加について説明します。

Grub

ZFS boot環境では、apt install や update 時に、必ずgrub への書き込みが発生します。

以下は、Git パッケージをインストールしたときの例です。

$ sudo apt install git
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  git-man liberror-perl
提案パッケージ:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn
以下のパッケージが新たにインストールされます:
  git git-man liberror-perl
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 184 個。
5,464 kB のアーカイブを取得する必要があります。
この操作後に追加で 38.4 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 liberror-perl all 0.17029-1 [26.5 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 git-man all 1:2.25.1-1ubuntu3 [884 kB]
取得:3 http://jp.archive.ubuntu.com/ubuntu focal/main amd64 git amd64 1:2.25.1-1ubuntu3 [4,554 kB]
5,464 kB を 33秒 で取得しました (165 kB/s)
INFO Requesting to save current system state
Successfully saved as "autozsys_p2vz26"
以前に未選択のパッケージ liberror-perl を選択しています。
(データベースを読み込んでいます ... 現在 173240 個のファイルとディレクトリがインストールされています。)
.../liberror-perl_0.17029-1_all.deb を展開する準備をしています ...
liberror-perl (0.17029-1) を展開しています...
以前に未選択のパッケージ git-man を選択しています。
.../git-man_1%3a2.25.1-1ubuntu3_all.deb を展開する準備をしています ...
git-man (1:2.25.1-1ubuntu3) を展開しています...
以前に未選択のパッケージ git を選択しています。
.../git_1%3a2.25.1-1ubuntu3_amd64.deb を展開する準備をしています ...
git (1:2.25.1-1ubuntu3) を展開しています...
liberror-perl (0.17029-1) を設定しています ...
git-man (1:2.25.1-1ubuntu3) を設定しています ...
git (1:2.25.1-1ubuntu3) を設定しています ...
man-db (2.9.1-1) のトリガを処理しています ...
INFO Updating GRUB menu

ファイル /boot/grub.cfg の、アップデート前との差分をとってみました。

--- grub.cfg.01 2020-06-21 18:25:53.180388765 +0900
+++ grub.cfg.02 2020-06-21 18:33:05.642117653 +0900
@@ -340,6 +340,9 @@
        }
 }
 submenu 'History for Ubuntu 20.04 LTS' ${menuentry_id_option} 'gnulinux-history-rpool/ROOT/ubuntu_979uk7' {
+       submenu 'Revert to 2020年06月21日 @ 18:30' ${menuentry_id_option} 'gnulinux-history-rpool/ROOT/ubuntu_979uk7@autozsys_p2vz26' {
+               zsyshistorymenu "rpool/ROOT/ubuntu_979uk7@autozsys_p2vz26" "/dev/sda3" "/BOOT/ubuntu_979uk7@autozsys_p2vz26/initrd.img-5.4.0-37-generic" "/BOOT/ubuntu_979uk7@autozsys_p2vz26/vmlinuz-5.4.0-37-generic" "5.4.0-37-generic"
+       }
        submenu 'Revert to 2020年06月21日 @ 18:24' ${menuentry_id_option} 'gnulinux-history-rpool/ROOT/ubuntu_979uk7@autozsys_vr9ixj' {
                zsyshistorymenu "rpool/ROOT/ubuntu_979uk7@autozsys_vr9ixj" "/dev/sda3" "/BOOT/ubuntu_979uk7@autozsys_vr9ixj/initrd.img-5.4.0-37-generic" "/BOOT/ubuntu_979uk7@autozsys_vr9ixj/vmlinuz-5.4.0-37-generic" "5.4.0-37-generic"
        }

上記の通り、grub.cfg のsubmenuにエントリが1つエントリされています。追加されたエントリをよく見ると、rootパーティションと boot用のカーネルおよびinitrd に、スナップショット名が異なるPATHを設定しています。
※zfs にも該当のスナップショットが登録されています。ZFSのスナップショット機能については、後日まとめて説明させていただきます。

$ zfs list rpool/ROOT/ubuntu_979uk7@autozsys_vr9ixj
NAME                                       USED  AVAIL     REFER  MOUNTPOINT
rpool/ROOT/ubuntu_979uk7@autozsys_vr9ixj  5.61M      -     3.14G  -

つまり、パッケージがインストールされたときに、ZFSのスナップショットが自動的に取られGrubのサブメニューとして登録されます。これは、何らかの不具合でパッケージインストールした以前の状態に戻したいとき、Grubのサブメニューからパッケージインストール以前の環境で起動できるということです。

OpenSolaris系ディストリビューションにおける Boot Environment と同じ機能が、Ubuntu 20.04で使用できるようになりました。

終わりに

今回は、ZFS boot時のGrub機能の変更について説明しました。この変更により、一度問題が発生してもOSパッケージごと以前の状態に戻すことが簡単にできるようになります。次回も、ZFS bootの変更点について説明します。次回をお楽しみに。

さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス

関連記事一覧