CentOS 8.1のインストール用ISOイメージ上でzfsを使えるようにする

ZFS on Linuxの[Getting Started](https://github.com/zfsonlinux/zfs/wiki/Getting-Started)を見ていくと、なぜかrpm系のディストリビューションだけRoot on ZFSに関する情報が無いわけですが、まあLive DVDとZFSへの愛(笑)さえあれば手動インストールはそれほど難しくはありません。
しかし、なぜかCentOS 8は8.1がリリースされたにも関わらずLive DVDのISOイメージが公開される気配がありません。まあ、5以前の状態に戻っただけといえばそれまでですが。

ZFS on LinuxもEL8.1用リポジトリが公開されたし、いつまでも指をくわえて待っていても仕方が無いので、インストール用ISOイメージを使用してRoot on ZFSを構築できるか試してみたところ、結構アッサリ出来ました。
という訳で、以下はVirtualBoxを使ってCentOS 8.1でRoot on ZFSを構築するためにzfsを使えるようにするまでの手順になります。あくまでもzfsを使えるようにするまでなので、実際のインストール作業については別の機会に。

zfsを使えるようにするのが主眼なので、それ以外の細かい設定やらエラーやらは華麗にスルーしてます。そこら辺は必要に応じて各自で対処してください(手抜き)。

## VirtualBoxの設定
特別な設定はほとんど必要ないので割愛しますが、メインメモリーに3072 MB位は割り当てないと、各種パッケージのインストールでメモリが枯渇して謎のInput/Output errorが発生して詰みます。
それ以外はお好みで。今回はDHCP環境でネットワークアダプタとしてブリッジアダプターを使用します。

## 起動パラメータの変更
CentOS-8.1.1911-x86_64-boot.isoを使用して起動します。
grubのメニューが表示されたら、Install CentOS Linux 8を選んでTABキーを押下します。
GUIインストーラー(anaconda)は不要なので、起動パラメータの末尾に、"selinux=0 3"を追加してカーネルを起動します。
ちなみに、selinux=0を追加しないと、コンソールからrootでログイン出来ません(パスワード要求されます)。
selinux=0を追加すると、パスワード無しでrootログイン出来ます。……謎です。まあ、rootログイン出来なくても、Alt+F2でコンソール切り替えるとrootログイン済の状態なので困らないのですが(笑)。

## キーボード設定
日本語キーボードを使用している場合は、以下のコマンドを実行します。

```
[anaconda root@localhost /]# loadkeys jp106
```

## sshdの有効化
全部コンソールで作業するのであれば不要ですが、いちいちコマンド叩くのメンドいコピペしたいので、sshでログイン出来るようにします。

sshdのサービスは有効化されていますが、設定ファイル(/etc/ssh/sshd_config)が無いので、再起動を繰り返しています。
なぜか設定ファイルは/etc/ssh/sshd_config.anacondaという名前で置いてあるので、リネームします。

```
[anaconda root@localhost /]# mv -v /etc/ssh/sshd_config{.anaconda,}
```
sshdサービスは42秒間隔で再起動を繰り返していますので、その間にIPアドレスの設定をします。
## IPアドレスの設定
DHCPでIPアドレスを設定します。

```
[anaconda root@localhost /]# dhclient enp0s3
```
`grep: /etc/sysconfig/network-scripts/ifcfg-*: No such file or directory`というエラーメッセージが複数出力されますが、気にしたら負けです。IPアドレスが正しく設定されていればOKです。

## sshログイン
ここまで作業してるうちに、きっとsshdが起動しているでしょうから、確認します。

```
[anaconda root@localhost /]# systemctl is-active sshd
active
```
もしactiveではなくactivatingと出力されたら、少し待ってから再度確認してください。
無事sshdが起動していたら、sshクライアントからrootでログインします。パスワードは不要です。

## 弱い依存関係の無効化
必要なのはzfsパッケージだけなので、余計なパッケージをインストールして時間とネットワーク帯域を無駄遣いしないように、以下の設定を行います。

```
[anaconda root@localhost ~]# echo install_weak_deps=0 >> /etc/dnf/dnf.conf
```

## CentOS用リポジトリの追加
Live DVDと違い、インストール用ISOはdnfのリポジトリ情報が/etc/yum.repos.d/にありません。anacondaはインストール用リポジトリを指定しない時、どこからリポジトリ情報を取得してるのでしょう。……謎です。

無いものは仕方がないので、rpmパッケージを直接指定してインストールします。
今回は、日本最強の看板を下ろしたミラーサーバを使わせてもらいます。

```
[anaconda root@localhost ~]# dnf -y install http://ftp.jaist.ac.jp/pub/Linux/CentOS/8.1.1911/BaseOS/x86_64/os/Packages/centos-{gpg-keys-8.1-1.1911.0.8.el8.noarch,{release,repos}-8.1-1.1911.0.8.el8.x86_64}.rpm
```

## zfs用リポジトリの追加
zfsのリポジトリを登録します。
langpackとして何も指定しないとglibc-all-langpacks(25MB)がインストールされてしまうので、時間とネ(以下略)、glibc-langpack-ja(323kB)を明に指定します。

```
[anaconda root@localhost ~]# dnf -y install glibc-langpack-ja http://download.zfsonlinux.org/epel/zfs-release.el8_1.noarch.rpm
```
zfs-release-1-8.1.noarchのインストールで/etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinuxのインポートに失敗したというメッセージが出力されますが、気にしたら負けです。
\#後でzfsパッケージをインストールするときにインポートされます。

## dkmsからkmodへの切り替え
dkmsを使ってzfsをソースからコンパイルするのは時間と電気代の無駄なので、kmod-zfsをインストールするようにリポジトリを切り替えます。

```
[anaconda root@localhost ~]# sed -e '0,/enabled=0/s/\(enabled=\)0/\11/' -e '0,/enabled=1/s/\(enabled=\)1/\10/' -i /etc/yum.repos.d/zfs.repo
```

## zfsパッケージのインストール
`dnf install zfs`と叩いてインストールすると、依存関係でkernel-coreパッケージもインストールされるのですが、最新のパッケージがインストールされてしまいます。
今起動しているインストール用ISOイメージのカーネル版数のkernel-coreをインストールしないとzfsモジュールがロードできないので、版数を指定してkernel-coreパッケージをインストールします。

```
[anaconda root@localhost ~]# dnf -y install kernel-core-$(uname -r) zfs
```
インストール中にdepmodが大量にWARNINGを吐きますが、気にしたら負けです。
\#どのモジュールもVirtualBoxでは使わなそうだし。

## zfsモジュールのロード
インストールが完了したら、zfsモジュールをロードします。

```
[anaconda root@localhost ~]# modprobe zfs
[anaconda root@localhost ~]# dmesg | tail -5
[ 697.454758] spl: loading out-of-tree module taints kernel.
[ 697.454928] spl: module verification failed: signature and/or required key missing - tainting kernel
[ 697.492743] icp: module license 'CDDL' taints kernel.
[ 697.492745] Disabling lock debugging due to kernel taint
[ 699.817926] ZFS: Loaded module v0.8.2-1, ZFS pool version 5000, ZFS filesystem version 5
```
これでzfsが使えるようになりました。

あとは、zpool createするなり、既存のpoolにzfs createするなりしてから、手動でインストールすればRoot on ZFSの出来上がりです。