タグは grub か grub2 かでちょっと悩みました。ど〜でもいい事ですがね。両方付けるのも馬鹿莫迦しいと思ったんで、ちょっと悩んだ末に grub だけにしました。
「俺様サーバー構築記 - 基本方針」に基づいて自宅サーバーの構築を進め、ノートパソコンにも Arch Linux + ZFS をインストールしました。
大きなインストールをする際にはやり直す可能性もある訳で、実際にインストールのやり直しが発生したりしました。まあこの時は勘違いだったようで、わざわざロールバックする必要も無かったのですが。
こういう時には仮想コンソールを切り替えて原因の調査と対応という手段もありまして、それが Linux の凄い所ではあります。しかしせっかく超絶ファイルシステム ZFS を入れ、それを直接読み出せるブートローダ GRUB を入れたので、一捻りした設定をしてみました。
目標
やりたいこと:
- 安全確実に起動できる時点の環境を残す
- その安全確実環境でブートする選択肢を用意する
スナップショットのクローン
Xfce をインストールした際に用意した、インストール直前のスナップショットがまだ残っているので、これを利用します。
このスナップショットを使えるようにします。具体的にはスナップショットからクローンを作成します。
参考文献1: Documentation Home > Oracle Solaris ZFS 管理ガイド > 第 7 章 Oracle Solaris ZFS のスナップショットとクローンの操作 > ZFS スナップショットの概要 > ZFS スナップショットを作成および破棄する: ZFS スナップショットの名前を変更する
参考文献2: Documentation Home > Oracle Solaris ZFS 管理ガイド > 第 7 章 Oracle Solaris ZFS のスナップショットとクローンの操作 > ZFS クローンの概要 > ZFS クローンを作成する
Xfce が動いているので、ターミナルエミュレータを起動してコマンドラインを使用します。ちなみに一般ユーザでも zfs
コマンドを使用できる模様。
(2019/03/23 修正ここから)
$ ls -l /.zfs/snapshot/
合計 0
drwxrwxrwx 1 root root 0 3月 23 21:38 20190317_001325_before_Xfce
drwxrwxrwx 1 root root 0 3月 23 21:38 20190317_193558_before_nkf
$ zfs list -t snapshot -o name -S name
tank/main@20190317_193558_before_nkf
tank/main@20190317_001325_before_Xfce
(2019/03/23 修正ここまで)
このスナップショットからクローンを作成します。zfs clone
は一般ユーザでは実行できないようなので、 root ユーザになって実行。
(2019/03/23 修正ここから)
$ zfs list -t snapshot -o name -S name | tail -n1 | xargs -t -I{} zfs clone {} tank/oldversion
zfs clone tank/main@20190317_001325_before_Xfce tank/oldversion
cannot create 'tank/oldversion': permission denied
$ su
パスワード:
# zfs list -t snapshot -o name -S name | tail -n1 | xargs -t -I{} zfs clone -o mountpoint=/ {} tank/oldversion
zfs clone -o mountpoint=/ tank/main@20190317_001325_before_Xfce tank/oldversion
cannot mount '/': directory is not empty
filesystem successfully created, but not mounted
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 4.36G 140G 24K /tank
tank/main 4.35G 140G 4.31G /
tank/oldversion 1K 140G 1.91G /
(2019/03/23 修正ここまで)
GRUB メニュー
GRUB は外付けのUSBメモリにインストールしました。その設定ファイルなどもUSBメモリに入っていますので、アクセスできるようにマウントします。
# mount /dev/sdb1 /mnt/usb
# cd /mnt/usb/boot/grub/
設定 grub.cfg に新しいメニュー項目を追加します。
(2019/03/23 修正ここから)
# mv -v grub.cfg grub.org
renamed 'grub.cfg' -> 'grub.org'
# cp -v grub.org grub.cfg
'grub.org' -> 'grub.cfg'
# vi grub.cfg
〈編集内容省略〉
# diff -U0 grub.org grub.cfg
--- grub.org 2019-03-23 22:00:24.000000000 +0900
+++ grub.cfg 2019-03-23 22:01:08.000000000 +0900
@@ -115,0 +116,11 @@
+menuentry 'Arch Linux: old version' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-/dev/sda' {
+ load_video
+ set gfxpayload=keep
+ search --set --label tank
+ insmod zfs
+
+ echo 'Loading Linux linux ...'
+ linux /oldversion@/boot/vmlinuz-linux zfs=tank/oldversion rw
+ echo 'Loading initial ramdisk ...'
+ initrd /oldversion@/boot/intel-ucode.img /oldversion@/boot/initramfs-linux.img
+}
# rm -v grub.org
'grub.org' を削除しました
(2019/03/23 修正ここまで)
ここで再起動すると、GRUB のメニューに Arch Linux: old version
が追加されています。
これを選択すると、 Xfce のウィンドウ画面ではなくて無骨なコンソール画面になります。
Arch Linux 4.20.7-arch1-1-ARCH (tty1)
〈マシン名〉 login: root
Password: 〈rootユーザのパスワードを入力〉
Last login: Sat Feb 9 19:53:34 on tty1
# mount | grep zfs
tank/oldversion on / type zfs (rw,relatime,xattr,noacl)
確かに古いバージョンで起動したようです。
やったね