事の起こり
昔と違い、Getting Startedも充実してきて色々なディストリビューションのRoot on ZFSがありますが、なぜかUEFI bootingにしか対応していないディストリビューションが多いです。
OS | UEFI boot | legacy (BIOS) boot |
---|---|---|
Alpine Linux | 対応 | 非対応 |
Arch Linux | 対応 | 非対応 |
Debian | 対応 | 対応 |
Fedora | 対応 | 非対応 |
NixOS | 対応 | 非対応 |
openSUSE | 対応 | 対応 |
Rocky Linux | 対応 | 非対応 |
Ubuntu | 対応 | 対応 |
本当はMBRにインストールしたいのですがGPTだらけです。仕方がないので、まずは前哨戦としてlegacy (BIOS) bootingで環境構築して、それを踏まえてMBRへのインストールは自力で何とかすることにします。何事も予行練習は大事です。
なお、上の表で分かるとおり、legacy (BIOS) bootingに対応しているのはDebinaとUbuntu、それにopenSUSEしかありません。まあ、Red HatがCentOSを切り捨てた時点で移行先を探して、結局ほかのRHEL互換OSを選択することに一抹の不安があったので思いきって見切りをつけてopenSUSEに乗り換えたので個人的には問題なしです。最近になってRHELのソースコード非公開とかやり始めて、乗り換えて正解だったと思うことしきり(笑)。できればSUSEには、RHEL互換OS騒動に首を突っ込む余裕があるならopenSUSEの痒いところに手が届かない残念なところを改善することに注力してほしいのですが。
不幸のはじまり
そんなこんなで、openSUSE Leap Root on ZFSを見ながらRoot on ZFS環境を構築してみた訳ですが、記述どおりに実行していっても構築出来ません! 基本的な流れは合っているけど、細かいところが適当すぎて、間違った記述が大量にあります。これ絶対検証してません(断言)。
という訳で、ここでは記述どおりに実行していった際に遭遇する不幸と、その対策を実行順に説明していこうと思います。まあ、備忘録ですね。
「ごたくはいいからさっさと正しい手順を出せー」というカルシウム足りてない人は、ページ最後の正誤表まで飛んでください。
また、実行順に説明するため、説明に沿って環境構築していくと何度か最初からやり直すことになるので、このページを読みながら環境構築しても一発では完了しません。不幸を追体験したい人以外は、やはりページ最後の正誤表を見ながら環境構築することをお勧めします。
ちなみに、実行環境はVirtualBoxで、LiveイメージはopenSUSE-Leap-15.5-Rescue-CD-x86_64-Build12.1-Media.isoを使用しています。
それでは、数々の不幸を順番に見ていきましょう。
一周目
不幸その1
最初の不幸は、Step 5: System Configurationの4. Configure a basic system environment:です。
localhost:/ # ln -s /proc/self/mounts /etc/mtab
ln: failed to create symbolic link '/etc/mtab': File exists
これはエラーメッセージのまんまで/etc/mtabが存在しており、しかも/proc/self/mountsにシンボリックリンクが張られているので無視して構いません。というか、実行する必要がありません。
不幸その2
次なる不幸は、同じくStep 5の5. Optional: Reinstallation for stability:です。
localhost:/ # zypper install -f permissions-config iputils ca-certificates ca-certificates-mozilla pam shadow dbus libutempter0 suse-module-tools util-linux
Loading repository data...
Reading installed packages...
Package 'permissions-config' not found.
Forcing installation of 'shadow-4.8.1-150400.10.12.1.x86_64' from repository 'Update repository with updates from SUSE Linux Enterprise 15'.
Forcing installation of 'util-linux-2.37.4-150500.7.16.x86_64' from repository 'oss'.
Forcing installation of 'pam-1.3.0-150000.6.61.1.x86_64' from repository 'oss'.
Forcing installation of 'ca-certificates-2+git20210309.21162a6-2.1.noarch' from repository 'oss'.
Forcing installation of 'ca-certificates-mozilla-2.62-150200.30.1.noarch' from repository 'Update repository with updates from SUSE Linux Enterprise 15'.
Forcing installation of 'suse-module-tools-15.5.3-150500.3.6.1.x86_64' from repository 'Update repository with updates from SUSE Linux Enterprise 15'.
Forcing installation of 'iputils-20221126-150500.1.1.x86_64' from repository 'oss'.
Forcing installation of 'libutempter0-1.1.6-3.42.x86_64' from repository 'oss'.
'dbus' not found in package names. Trying capabilities.
No provider of 'dbus' found.
Resolving package dependencies...
The following 3 packages are going to be upgraded:
ca-certificates-mozilla shadow suse-module-tools
The following 4 packages are going to be reinstalled:
ca-certificates libutempter0 pam util-linux
The following NEW package is going to be installed:
iputils
3 packages to upgrade, 1 new, 4 to reinstall.
Overall download size: 2.9 MiB. Already cached: 0 B. After the operation,
additional 465.3 KiB will be used.
Continue? [y/n/v/...? shows all options] (y):
パッケージ名間違えているわ再インストールと言いつつ新規インストールしようとするわで酷い有り様です。
とりあえず、存在するそれっぽいパッケージ名を指定すれば再インストールは可能です。
zypper install -f permissions iputils ca-certificates ca-certificates-mozilla pam shadow dbus-1 libutempter0 suse-module-tools util-linux
もっとも、ドキュメントでSome packages may have minor errors
とあるそもそもの原因は以下の2点だと思われます。
- 最初に追加するリポジトリが不足している
- パッケージのインストール時にファイルの競合チェックをしていない
ですので、正しい対応は以下のようになります。
-
Step 4の1. Add repositories into chrooting directory:でsle-updateリポジトリを追加する
ちなみに、この対応を行うと4. Install openSUSE zypper package system into chroot:は不要になります。
zypper --root /mnt ar http://download.opensuse.org/update/leap/$(lsb_release -rs)/sle repo-sle-update
- 同じくStep 4の3. Install openSUSE Leap with zypper:および5. Recommended: Install openSUSE yast2 system into chroot:で
--download-in-advance
を追加するなお、zypper --root /mnt install --download-in-advance -t pattern base(もしくはenhanced_base) zypper --root /mnt install --download-in-advance yast2 zypper --root /mnt install --download-in-advance -t pattern yast2_basis
--download-in-advance
を追加すると、baseパターンのインストール時にgzipの代わりにbusybox-gzipがインストールされる事があります(条件はさっぱり不明)。その場合、yast2_basisパターンのインストール時に競合が発生します。ですので、この状態になったら1を選択します。localhost:~ # zypper --root /mnt install -t pattern yast2_basis Loading repository data... Reading installed packages... Resolving package dependencies... Problem: the to be installed pattern:yast2_basis-20220411-lp155.2.4.x86_64 requires 'patterns-yast-yast2_basis', but this requirement cannot be provided not installable providers: patterns-yast-yast2_basis-20220411-lp155.2.4.x86_64[oss] Solution 1: deinstallation of busybox-gzip-1.35.0-150400.4.5.1.noarch Solution 2: do not install pattern:yast2_basis-20220411-lp155.2.4.x86_64 Solution 3: break pattern:yast2_basis-20220411-lp155.2.4.x86_64 by ignoring some of its dependencies Choose from above solutions by number or cancel [1/2/3/c/d/?] (c):
バッチ的に処理したければ、以下の手順でもOKです。- baseパターンのインストール後にbusybox-gzipをremoveする
- yast2のインストール時にgzipもインストールする
なお、これは致命的な不幸ではない(そもそもOptionalだし)ので、このまま続行します。どうせこの後に嫌でも周回プレイすることになるので、まずは行けるところまで行きます。
不幸その3
Step 5の11. Install GRUBも同じ不幸です。
localhost:/ # zypper install grub2-x86_64-pc
Loading repository data...
Reading installed packages...
Package 'grub2-x86_64-pc' not found.
Resolving package dependencies...
Nothing to do.
zypper search grub2
を実行してみれば分かりますが、UEFI用のgrub2は確かにx86_64(grub2-x86_64-efi)ですが、legacy (BIOS)用のgrub2はi386(grub2-i386-pc)です。
なんでこうもパッケージ名を間違えられるのか不思議で仕方無いですが、それはともかくzypper install grub2-i386-pc
するのが正解、と思ったら実は大間違い。でも現時点では間違いに気付くのは困難(エラー出ないし)なので、ここではgrub2-i386-pcをインストールして先に進みます。
不幸その4
Step 5の14. Enable importing bpoolですが、Step 4の3. Install openSUSE Leap with zypper:でbaseパターンをインストールした場合は以下の不幸が見付かります。
localhost:/ # vi /etc/systemd/system/zfs-import-bpool.service
bash: vi: command not found
これは簡単。zypper install -y vim
するだけです。
不幸その5
Step 6: Kernel Installationの4. Refresh the initrd files:です。
localhost:/ # mkinitrd
bash: mkinitrd: command not found
これもzypper install -y dracut-mkinitrd-deprecated
するだけです。
不幸その6
Step 7: Grub2 Installationがlegacy (BIOS) bootingにおける最大の鬼門です。
この辺りから、不幸レベルが上昇してきます。
まず、5. Check that /boot/grub2/grub.cfg have the menuentry root=ZFS=rpool/ROOT/suse, like this:ですが、そもそも/boot/grub2/grub.cfgが存在しません。
localhost:/ # ls /boot/grub2/
themes
これ、エラーメッセージは何も出ていませんが、直前のupdate-bootloader
が失敗してます。正確にはブートローダーの種類を指定しない為に処理をスキップしているので、echo LOADER_TYPE="grub2" > /etc/sysconfig/bootloader
を実行してからupdate-bootloader
を実行します。
これで/boot/grub2/grub.cfgが生成されます。
localhost:/ # ls /boot/grub2/
grub.cfg grubenv themes
ところが、いざ/boot/grub2/grub.cfgを確認してみると、root=が正しく設定されていません。
localhost:/ # grep -m1 linux.*root= /boot/grub2/grub.cfg
linux /BOOT/suse@/vmlinuz-5.14.21-150500.55.31-default root=ZFS=/ROOT/suse
ここで「その後に書いてある通りに、/etc/default/grubに設定追加すればいいじゃん」と思ったそこのアナタ、大甘です。山葉堂の新メニューのワッフルより甘いです(黙れ)。たしかにこの通りに設定してupdate-bootloader
を実行すれば、以下のように一応正しいroot=は設定されます。(間違った設定も残ったままだけど、とりあえずそれは置いておく)
localhost:/ # echo 'GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/suse"' >> /etc/default/grub
localhost:/ # update-bootloader
localhost:/ # grep -m1 linux.*root= /boot/grub2/grub.cfg
linux /BOOT/suse@/vmlinuz-5.14.21-150500.55.31-default root=ZFS=/ROOT/suse root=ZFS=rpool/ROOT/suse
でも、この後の6. Install the boot loader:が同じ理由で失敗するので、ここでの対処は不要(というか無駄)です。
不幸その7
という訳で、やってきました回避不能の不幸其の壱。
localhost:/ # grub2-install $DISK
Installing for i386-pc platform.
grub2-install: error: ../grub-core/kern/fs.c:121:unknown filesystem.
「Step 7の最初にgrub2-probe /boot
で正しくzfsを認識してるの確認してるのに何で?」と思うかもしれませんが、/bootだけ認識できても駄目なのです。legacy (BIOS) booting環境では、/もzfsとして認識できないとgrub2-install
は成功しません。
localhost:/ # grub2-probe /
grub2-probe: error: ../grub-core/kern/fs.c:121:unknown filesystem.
なので、/をgrub2に正しく認識させる必要があるのですが、もう詰んでます。どうにもなりません。
この原因は、Step 2: Disk Formattingの5. Create the root pool:でrpoolを作成する際にdnodesizeプロパティを変更したためです。なので、rpool作成時に-O dnodesize=auto
を指定してはいけません。ダメ。ゼッタイ。
また、zfs-2.2.0から追加された以下のfeatureは自動的にactiveになってしまうので、明示的にdisabledにする必要があります。
- head_errlog
- vdev_zaps_v2
という訳で、最初からやり直しです。二週目の開始〜。
ちなみに、周回プレイ(笑)する時は、Live CDの再起動からやり直す必要があります。
「chrootからexitしてからStep 3: System Installationのmount解除してzpoolをexportすれば、Step 2: Disk Formattingの5. Create the root pool:から再開できるんじゃ?」と思った聡い人は、実際試してみてください。理屈の上では正しいのですが、少なくと私の環境では駄目でした。(この件に関しては後にも出てきます)
二周目
不幸その8
今まで説明した不幸を全て回避しながら進めばStep 7: Grub2 Installationの6. Install the boot loader:までは問題なく進むと思ったらぎっちょんちょん、Step 2: Disk Formattingの4. Create the boot pool:にて一週目には出現しなかった不幸が出現します。
localhost:~ # zpool create \
> -o cachefile=/etc/zfs/zpool.cache \
> -o ashift=12 -d \
> -o feature@async_destroy=enabled \
> -o feature@bookmarks=enabled \
> -o feature@embedded_data=enabled \
> -o feature@empty_bpobj=enabled \
> -o feature@enabled_txg=enabled \
> -o feature@extensible_dataset=enabled \
> -o feature@filesystem_limits=enabled \
> -o feature@hole_birth=enabled \
> -o feature@large_blocks=enabled \
> -o feature@lz4_compress=enabled \
> -o feature@spacemap_histogram=enabled \
> -o feature@zpool_checkpoint=enabled \
> -O acltype=posixacl -O canmount=off -O compression=lz4 \
> -O devices=off -O normalization=formD -O relatime=on -O xattr=sa \
> -O mountpoint=/boot -R /mnt \
> bpool ${DISK}-part3
invalid vdev specification
use '-f' to override the following errors:
/dev/disk/by-id/scsi-SATA_VBOX_HARDDISK_VB0167fad0-f4c6ae75-part3 is part of exported pool 'bpool'
まあ、エラーメッセージに従って-f
を指定すれば済む話ではありますが。ちなみに、ある意味当然ですが、この後のrpool作成も同様の対応が必要です。
これでようやく不幸その7まで戻ってこられます。
一周目と違って正しい設定がされているか確認してみます。念の為、grub2が/を認識できるかも確認します。
localhost:/ # grub2-probe /
zfs
localhost:/ # grep -m1 linux.*root= /boot/grub2/grub.cfg
linux /BOOT/suse@/vmlinuz-5.14.21-150500.55.31-default root=ZFS=rpool/ROOT/suse
不幸その9
なので、安心してgrub2-install
を実行すると、一週目から変態した不幸が。
localhost:/ # grub2-install $DISK
Installing for i386-pc platform.
grub2-install: error: cannot open `/usr/share/grub2/i386-pc/zfs.mod': No such file or directory.
不幸その2の回避策でgrub2-i386-pcをインストールしましたが、grubがzfsにアクセスするために必要なzfs.modはgrub2-i386-pcに含まれておらず、実はgrub2-i386-pc-extrasに含まれているので、本当はgrub2-i386-pc-extrasをインストールするのが正しいです。
なお、grub2が/を認識できるようになったので、Step 8: Systemd-Boot Installationは不要です。そもそもこれ、どう見てもUEFI booting用なんだけど……。
不幸その10
Step 9: Filesystem Configurationの1. Fix filesystem mount ordering:で見たことのある不幸に再会です。
localhost:/ # ln -s /usr/lib/zfs/zed.d/history_event-zfs-list-cacher.sh /etc/zfs/zed.d
ln: failed to create symbolic link '/etc/zfs/zed.d/history_event-zfs-list-cacher.sh': File exists
不幸その1と同じなので、これも無視です。
不幸その11
Step 10: First Bootの4. Run these commands in the LiveCD environment to unmount all filesystems:、やってきました回避不能の不幸其の弍。
localhost:~ # zpool export -a
cannot export 'rpool': pool is busy
/proc/mountsを確認すると/mnt配下は全てアンマウントしてあるのに、なぜかexportできません。bpoolはexportできてるのに……。
「もうこの後はrebootするだけだし、別にいいんじゃね?」と思うかもしれませんが、さにあらず、baseパターンをインストールした場合、ここでexportできないと再起動した際にzpoolのimportに失敗してemergency modeに入ってしまいます。(enhanced_baseパターンイストール時にimportに失敗しない理由はさっぱり不明)
本当にexportできれば正常にimport出来るのかは確認したことがない(なにせexport出来ないんだから)のですが、実際にimport出来ないのは事実なので何とかします。
とりあえず手っ取り早いのは、emergency modeで強制的にimportしてexportすることです。
:/root# zpool import -f rpool
:/root# zpool export rpool
:/root# reboot
これで正常にimportできるようになり、無事起動するようになります。
ちなみに、そもそもimportに失敗せずemergency modeに入らないようにする対応方法もあります。
という訳で、確認のために三週目いってみよ〜。興味の無い人は次の不幸までスキップしてOKです。
三周目
まず、Step 2の5. Create the root pool:の前にStep 5の10. Recommended: Generate and setup hostid:を実行します。
そして、Step 4の3. Install openSUSE Leap with zypper:の後にcp /etc/hostid /mnt/etc/
を実行します。
これでStep 10の5. Reboot:でreboot
を実行すると、起動時にrpoolも正常にimportされるようになります。
一応、ここまででRoot on ZFSに起因する不幸は全て解消しました。なので、これ以降の不幸はZFSとは関係ない内容とその対処になります。……正直、この時点でもう自分としてはやりきった感があるので、これ以降の説明は適当です(笑)。
不幸その12
そんな訳で、ここから環境構築の第二部を始めたいところですが、この時点で一つ大きな不幸が行く手を阻んでいます。
それは、ネットワーク設定してないから適当なターミナルソフトからssh接続してコマンドのコピペが出来ない!
コンソールからログインしてコマンドをちまちま手打ちしなきゃいけないとか、何の嫌がらせですか?
という訳で、まずネットワーク設定です。ちなみにDHCP設定だけです。固定IP環境の人は自力でガンガレ。
cat > /etc/sysconfig/network/ifcfg-eth0 <<EOF
BOOTPROTO=dhcp
STARTMODE=hotplug
EOF
systemctl restart wicked
ちなみに、真っ当な方法はYaSTでのネットワーク設定ですが、YaSTの画面キャプチャーをペタペタ貼るのは面倒臭い(ヲイヲイ)なので、手順だけ列挙しておきます。こちらもDHCP設定だけです。固定(以下略)。
- [YaST Control Center]
- Systemを選択→Enter→Network Settingsを選択→Enter
- [Network Settings]
- F4キー押下(Edit)
- [Network Card Setup]
- TABキー2回押下で、Dynamic Addressを選択→スペースキー押下→F10キー押下(Next)
- [Network Settings]
- F10キー押下(OK)
- [YaST Control Center]
- F9キー押下(Quit)
ネットワーク設定が終わったらsystemctl enable --now sshd
を実行します。本来ならインストール時に有効化しておくべきなのに、インストールだけして放置って何がしたいのやら。
sshdを起動したらログアウトします。すると、再起動直後は何も表示されていなかったeth0にIPアドレスが設定されている筈です。う〜ん、openSUSEはこれが便利。
不幸その13
ようやく環境構築が再開できると思ったら、しょっぱなのStep 10: First Bootの6. Create a user account:で不幸の三連撃です。
(面倒臭いの(ヲイ)で、usernameのまま実行しています)
HOSTNAME:~ # adduser username
-bash: adduser: command not found
openSUSEにadduserなんてコマンドは無いYO! あるのはuseraddだYO!
しかし、useraddでも何やらエラーが出ます。
HOSTNAME:~ # useradd username
Group 'mail' not found. Creating the user mailbox file with 0600 mode.
HOSTNAME:~ # grep mail /etc/group
HOSTNAME:~ # ls -l /var/spool/mail/
total 1
-rw------- 1 username users 0 Nov 4 14:58 username
たしかにmailグループは存在しないようです(useradd(1)のバグ?)。system-groupパッケージを検索してもmailグループが含まれていそうなパッケージは見当たらないし、とりあえずメールボックスは作成されているので気にしないことにします。
不幸その14
そして次なる不幸が。
HOSTNAME:~ # chown -R username:username /home/username
chown: invalid group: 'username:username'
HOSTNAME:~ # grep username /etc/group
HOSTNAME:~ #
たしかにusernameグループは存在しないようです(dejavu)。
理由は、openSUSEのuseradd(1)は、-Uオプションを指定しないとユーザー名と同名のグループは作成しないからです。
なので、-Uを指定してユーザーアカウントを作り直したい訳ですが、既に存在するユーザーアカウントを上書きすることは出来ないので、一旦削除してからやり直します。
HOSTNAME:~ # userdel -r username
userdel: /home/username not owned by username, not removing
HOSTNAME:~ # useradd -U username
Group 'mail' not found. Creating the user mailbox file with 0600 mode.
HOSTNAME:~ # grep username /etc/group
username:!:1000:
HOSTNAME:~ #
userdel(1)のエラーも無視します。たとえ/home/usernameのオーナーがusernameだったとしても、zfs create
で作成したdatasetなのでuserdel(1)で削除するのは不可能だし。
不幸その15
そして、最後のコマンドでも不幸が。
HOSTNAME:~ # usermod -a -G audio,cdrom,dip,floppy,netdev,plugdev,sudo,video username
usermod: group 'dip' does not exist
usermod: group 'floppy' does not exist
usermod: group 'netdev' does not exist
usermod: group 'plugdev' does not exist
usermod: group 'sudo' does not exist
HOSTNAME:~ # grep -e dip -e floppy -e netdev -e plugdev -e sudo /etc/group
HOSTNAME:~ #
たしかに(以下略)。存在しないグループは無視して存在するグループにだけ設定するような気の利いた挙動はしてくれないので、正しくusermod -a -G audio,cdrom,video username
と指定する必要があります。
それにしても、なんでこんなエラー出まくるのかというと、実はここの内容はDebianのStep 6: First Bootの6. Create a user account:の劣化コピペなので、全然openSUSE用になってないからです。██なの? █ぬの?(検閲済)
不幸その16
Step 10の7. Mirror GRUBは複数ディスクにインストールした場合に必要らしいので今回はスキップしますが、まあ書いてある内容は酷いの一言です。
efibootmgr(1)はインストールされていないわインストールして実行してみたらlegacy_bootなんてメッセージは出ないわgrub-installなんてコマンドopenSUSEには無いわ(またDebianか!?)$DISKなんて設定していない環境変数指定してるわ最後の説明文は意味不明だわ(やっぱりDebianか!?)、6. Create a user account:と合わせて、よくもまあこんな適当な内容を書けるもんだと、感心することしきりです。
という訳で、対処方法はありません(強いて言えば無視するのが対処方法)が、不幸として記録しておきます。
不幸(?)その17
Step 11: Optional: Configure Swapの1. Create a volume dataset (zvol) for use as a swap device:では、以下のWarningが出ます。環境によっては16384ではなく8192と出力される場合もあります。
Warning: volblocksize (4096) is less than the default minimum block size (16384).
To reduce wasted space a volblocksize of 16384 is recommended.
普通に考えたらページサイズ単位でスワップする筈なので、ブロックサイズはページサイズに合わせておいた方が良さそうな気もするけど、zfsのvolblocksizeをデフォルトより小さくするのって、実際どうなんでしょうね?
まあ、今時はzram使うのが普通(?)だから、そもそもスワップデバイス作る必要無いかも(Optionalだし)。
不幸その18
同じくStep 11の2. Configure the swap device:では、以下の不幸が発生します。
HOSTNAME:~ # echo RESUME=none > /etc/initramfs-tools/conf.d/resume
-bash: /etc/initramfs-tools/conf.d/resume: No such file or directory
とりあえず、ディレクトリを作成すればエラーは出なくなるけど、こんな存在しないディレクトリ配下のファイルを誰が参照するの? 無駄じゃね? という訳で無視します。
不幸その19
最後のStepです(長かった……)。Step 12: Final Cleanupの最初にこう書いてあります。
Login using the account you created.
Step 10の6. Create a user account:で確かにアカウント作成した(エラー出まくりだったけどな!)けど、パスワード設定してないからログイン出来ねーよ!
ついでに言えば、
Ensure the system (including networking) works normally.
とも書いてあるけど、ネットワーク設定の話もどこにも書いてないけどな! 暗黙の設定を前提にするのは止めてもらえませんかね?
という訳で、rootでパスワードを設定します。
HOSTNAME:~ # passwd username
New password: (雑なパスワードを入力)
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password: (雑なパスワードを入力)
passwd: password updated successfully
cracklibがインストールしてあるので、雑なパスワードを設定しようとすると怒られますが、rootで実行しているので華麗にスルーです(笑)。
ちゃんとした環境で運用する場合は、初回ログイン時にパスワードを再設定するように仕込んで、雑なパスワードでは利用できないようにしましょう。
不幸その20
ここから一般ユーザーでの操作になりますが、しょっぱなから不幸に見舞われます……前途多難だ。
username@HOSTNAME:~> sudo zfs destroy bpool/BOOT/suse@install
-bash: sudo: command not found
Step 4. Install Systemの3. Install openSUSE Leap with zypper:でbaseパターンを選んでいるとsudoはインストールされません。なので、これまたrootでzypper install -y sudo
を実行します。
不幸その21
これ以降、運がいい(悪い?)と何の不幸にも見舞われず、最後まで進むかもしれませんが、Step 12: Final Cleanupの3. Optional: Disable the root password:を実行した人は最後のブービートラップにハメられました。ご愁傷様です(-人-)。
rootのパスワードを削除しても、しばらく(5分?)はキャッシュが残っているのでsudoを実行してもパスワードを訊かれないため気が付かない(私だけ?)のですが、時間が経ってから実行するとsudo出来なくなります。
username@HOSTNAME:~> sudo vi /etc/default/grub
[sudo] password for root:
Sorry, try again.
[sudo] password for root:
Sorry, try again.
[sudo] password for root:
sudo: 3 incorrect password attempts
openSUSE Leap使いには常識(他のディストリからしたら非常識かも)ですが、一般ユーザーのsudoにはrootのパスワードが要求されます。それなのにOptionalとはいえrootのパスワードを無効化するとか、もうね、アボカド。バナナかと。(権力による改竄)
openSUSE LeapのGetting Started書いた奴、絶対にopenSUSE Leap使ったこと無いだろ……。
という訳で、3. Optional: Disable the root password:は実行してはいけません。ダメ。ゼッタイ。(2回目)
なお「openSUSE使ってるなら何も考えずにrootのパスワード無効化してるんじゃねーよ。自業自得だろ」というツッコミは禁止です。正論だからって何言ってもいい訳じゃねーぞ(逆ギレ)。
この時点で、コンソールなりターミナルソフトからのrootログインが残っていれば、そこからrootのパスワードを設定し直すことで復活することが出来ますが、残ってなかったら……最後の最後になって周回を重ねましょうか(滅)。まあ、最初から全部環境構築し直さなくても復活させる方法は幾つかあるので、致命的な不幸という訳でもありません。疲れたから説明はしないけど。もう、ゴールしていいよね(だから黙れ)。
それにしても、直下にTroubleshootingでRescuing using a Live CDが書かれているのは、親切なんだかマッチポンプなんだかよく分からん(笑)。
不幸その22
ゴールできなかった(笑)。
Step 12の5. Optional: Re-enable the graphical boot process:で、既にStep 7の4. Update the boot configuration:で回避した不幸が再び襲ってきます。
username@HOSTNAME:~> sudo update-bootloader
update-bootloader: 2023-12-01 23:13:38 <3> update-bootloader-8837 run_command.336: '/usr/lib/bootloader/grub2/config' failed with exit code 1, output:
<<<<<<<<<<<<<<<<
+ /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
/usr/sbin/grub2-probe: error: failed to get canonical path of `/dev/ata-VBOX_HARDDISK_VB0167fad0-f4c6ae75-part4'.
>>>>>>>>>>>>>>>>
rootで実行すると問題ないのに一般ユーザーがsudo経由で実行するとエラーになるのは、環境変数ZPOOL_VDEV_NAME_PATHが未設定になってしまうからです。
なので、sudo実行時に環境変数を引き継ぐようにsudo sh -c "echo Defaults env_keep += ZPOOL_VDEV_NAME_PATH > /etc/sudoers.d/grub"
を実行します。
始まりの終わり
最後まで気の抜けないドキュメントですが、何とかopenSUSE Leap Root on ZFSを元にlegacy (BIOS) bootingでの環境構築が出来ました。
この次は今回の成果を踏まえて、GPTでなくMBRでインストールする手順について書く予定です。(本当に書きたいのはさらにその次の内容なんだけど)
不幸の回避方法(という名の正誤表)
5. Create the root pool: | |
---|---|
誤 |
zpool create \ -o cachefile=/etc/zfs/zpool.cache \ -o ashift=12 \ -O acltype=posixacl -O canmount=off -O compression=lz4 \ -O dnodesize=auto -O normalization=formD -O relatime=on \ -O xattr=sa -O mountpoint=/ -R /mnt \ rpool ${DISK}-part4 |
正 |
cd /root zypper install wget wget https://github.com/openzfs/zfs/files/4537537/genhostid.sh.gz gzip -d genhostid.sh.gz chmod +x genhostid.sh zgenhostid `/root/genhostid.sh` zpool create \ -o cachefile=/etc/zfs/zpool.cache \ -o ashift=12 \ -o feature@head_errlog=disabled \ -o feature@vdev_zaps_v2=disabled \ -O acltype=posixacl -O canmount=off -O compression=lz4 \ -O normalization=formD -O relatime=on \ -O xattr=sa -O mountpoint=/ -R /mnt \ rpool ${DISK}-part4 |
1. Add repositories into chrooting directory: | |
---|---|
誤 | - |
正 |
最後に以下のコマンドを実行 zypper --root /mnt ar http://download.opensuse.org/update/leap/$(lsb_release -rs)/sle repo-sle-update |
3. Install openSUSE Leap with zypper: a. Install base packages of openSUSE Leap with zypper (Recommended for server): | |
誤 | zypper --root /mnt install -t pattern base |
正 |
zypper --root /mnt install -y --download-in-advance -t pattern base zypper --root /mnt install -y --download-in-advance vim dracut-mkinitrd-deprecated sudo cp /etc/hostid /mnt/etc/ ※busybox-gzipがインストールされた場合 zypper --root /mnt install --download-in-advance gzip → 1(deinstallation of busybox-gzip)を選択 |
3. Install openSUSE Leap with zypper: b. Install enhanced base of openSUSE Leap with zypper (Recommended for desktop): | |
誤 | zypper --root /mnt install -t pattern enhanced_base |
正 |
zypper --root /mnt install -y --download-in-advance -t pattern enhanced_base cp /etc/hostid /mnt/etc/ |
4. Install openSUSE zypper package system into chroot: | |
誤 | zypper --root /mnt install zypper |
正 | 実行しない |
5. Recommended: Install openSUSE yast2 system into chroot: (baseパターンインストール時のみ実行) | |
誤 |
zypper --root /mnt install yast2 zypper --root /mnt install -t pattern yast2_basis |
正 |
zypper --root /mnt install -y --download-in-advance yast2 zypper --root /mnt install -y --download-in-advance -t pattern yast2_basis |
4. Configure a basic system environment: | |
---|---|
誤 | ln -s /proc/self/mounts /etc/mtab |
正 | 実行しない |
5. Optional: Reinstallation for stability: | |
誤 | zypper install -f permissions-config iputils ca-certificates ca-certificates-mozilla pam shadow dbus libutempter0 suse-module-tools util-linux |
正 | 実行しない |
10. Recommended: Generate and setup hostid: | |
誤 |
cd /root zypper install wget wget https://github.com/openzfs/zfs/files/4537537/genhostid.sh.gz gzip -d genhostid.sh.gz chmod +x genhostid.sh zgenhostid `/root/genhostid.sh` |
正 | 実行しない(Step 2で実行済) |
11. Install GRUB | |
誤 | zypper install grub2-x86_64-pc |
正 | zypper install -y grub2-i386-pc-extras |
4. Update the boot configuration: | |
---|---|
誤 | update-bootloader |
正 |
echo LOADER_TYPE="grub2" > /etc/sysconfig/bootloader update-bootloader |
1. Filesystem Configuration | |
---|---|
誤 | ln -s /usr/lib/zfs/zed.d/history_event-zfs-list-cacher.sh /etc/zfs/zed.d |
正 | 実行しない |
1. Optional: Install SSH: | |
---|---|
誤 | zypper install -y openssh-server |
正 |
zypper install -y openssh-server systemctl enable sshd cat > /etc/sysconfig/network/ifcfg-eth0 <<EOF BOOTPROTO=dhcp STARTMODE=hotplug EOF |
4. Run these commands in the LiveCD environment to unmount all filesystems: | |
誤 | zpool export -a |
正 | エラーを無視 |
6. Create a user account: | |
誤 | adduser username |
正 |
useradd -U username passwd username |
6. Create a user account: | |
誤 | usermod -a -G audio,cdrom,dip,floppy,netdev,plugdev,sudo,video username |
正 | usermod -a -G audio,cdrom,video username |
7. Mirror GRUB | |
誤 |
efibootmgr -v grub-install $DISK |
正 | 実行しない |
2. Configure the swap device: | |
---|---|
誤 | echo RESUME=none > /etc/initramfs-tools/conf.d/resume |
正 |
実行しない ※ファイルを作成したい場合は、以下を実行する mkdir -p /etc/initramfs-tools/conf.d echo RESUME=none > /etc/initramfs-tools/conf.d/resume |
3. Optional: Disable the root password: | |
---|---|
誤 | sudo usermod -p '*' root |
正 | 実行しない |
5. Optional: Re-enable the graphical boot process: | |
誤 | sudo update-bootloader |
正 |
sudo sh -c "echo Defaults env_keep += ZPOOL_VDEV_NAME_PATH > /etc/sudoers.d/grub" sudo update-bootloader |