俺様サーバー構築記 - ZFS の上に Arch Linux をインストール(Linux-LTS)@VirtualBox(BIOS)

「[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)」に基づいてZFS上にArchLinuxをインストールしてきて、[前回](https://qiita.com/katz_engineer/items/792f1c411c19ce3cfca5)からVirtualBox上でLTS版Linuxカーネルを使用して構築を試みています。

# インストールの準備

VirtualBoxで仮想マシンを作り、[前回のZFS関連ツールを埋め込んだarchisoを焼き付けたisoファイル](https://qiita.com/katz_engineer/items/792f1c411c19ce3cfca5)を設定して電源を入れます。起動すると、いつもの Arch Linux インストールメディアのメニューが出ます。いつも通りに選択して起動。

## 署名の検証

省略。

## キーボード

```console
# loadkeys jp106
```

## コンソールフォント

コンソールフォントはそのまま変更しません。日本語が表示されればそれなりに便利そうだけども、当面は必要無いと判断。

## 起動モードの確認

BIOSだという事はわかっていますが念の為。

```console
# ls /sys/firmware/efi/efivars
ls: cannot access '/sys/firmware/efi/efivars': No such file or directory
```

## パーティション

一応 HDD を確認しておきます。

```console
# ls /dev/sd*
/dev/sda
```

lsblkコマンドを使うと、多少整理されて見えます。

```console
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 604.7M  1 loop /run/archiso/sfs/airootfs
sda      8:0    0    50G  0 disk
sr0     11:0    1   719M  0 rom  /run/archiso/bootmnt
```

ディスク構成が複雑な場合は```/dev/disk/by-id```を見ると、ファイル名（＝デバイスID）からもう少し情報を得られる可能性があるんですが。今回は VirtualBox なので、以下のような当たり前の結果です。

```console
# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root  9 Jul 25 11:03 ata-VBOX_CD-ROM_VB2-01700376 -> ../../sr0
lrwxrwxrwx 1 root root  9 Jul 25 11:03 ata-VBOX_HARDDISK_VBda1d1874-5cc60c10 -> ../../sda
```

デバイスを確認した所で、HDDにパーティションを切ります。

[1.11 性能が今ひとつなんだけど。 - ZFS on Linux FAQ](https://www.nosuz.jp/ZFSonLinux/faq_ja.html#PerformanceConsideration)という記事によると：

> ディスク全体を使ってpoolを作成する: ディスク全体を指す名前を使ってzpool createを実行します。こうするとZFSは、正しい配置になるように自動的にパーティションを作成します。さらにwholedisk設定のおかげで他のZFS実装との相互運用性も改善されます。

しかし今回は仮想マシンなので、あんまり気にしなくていいかな、と考えてます。bootパーティションを作成する方向で。

スワップ領域については [パーティショニング - ArchWiki](https://wiki.archlinux.jp/index.php/パーティショニング#.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97) の [パーティションの大きさはどうすればいいですか？] に下記のような記述があります。

> 大容量のメモリ（1024MB 以上）を積んでいるときは、スワップパーティションは小さく、または作らなくてもかまわないでしょう。2GB 以上の物理 RAM を持っているなら、スワップパーティションがないほうが一般的に良いパフォーマンスを発揮すると思われます。

これを信じてスワップパーティションは作りません。

また一応、HDDフォーマットの前に wipefs コマンドを実行します。

なお、ブートローダとしてgrubを使用する予定なんですが、設定ファイルを自動作成すると```/dev/sda1```をrootパーティションと仮定するようです。その為bootパーティションは```/dev/sda2```にします。サイズに関しては、少なめになるように適当に調整。

```console
# wipefs -a /dev/sda
# sfdisk /dev/sda <<___
\`heredoc> ,51100M
\`heredoc> ,
\`heredoc>___
Checking that no-one is using this disk right now ... OK
〈省略〉
```

確認。

```console
# sfdisk -l /dev/sda
Disk /dev/sda: 50GiB, 53687091200 bytes, 104857600 sectors
Disk model: VBOX HARDDISK
Utils: sectors of 1 * 512 = 512 bytes
Sector size (minimum/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x18cd29c8

Device      Boot     Start       End   Sectors  Size Id Type
/dev/sda1             2048 104654847 104652800 49.9G 83 Linux
/dev/sda2        104654848 104857599    202752   99M 83 Linux
# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Jul 25 11:45 /dev/sda
brw-rw---- 1 root disk 8, 1 Jul 25 11:45 /dev/sda1
brw-rw---- 1 root disk 8, 2 Jul 25 11:45 /dev/sda2
```

## パーティションのフォーマット

bootパーティションはFAT32。

```console
# mkfs.fat -F32 /dev/sda2
mkfs.fat 4.1 (2017-01-24)
```

いよいよ ZFS です。
参考文献：[3 ディスクのフォーマット - ZFS に Arch Linux をインストール - ArchWiki](https://wiki.archlinux.jp/index.php/ZFS_に_Arch_Linux_をインストール#.E3.83.87.E3.82.A3.E3.82.B9.E3.82.AF.E3.81.AE.E3.83.95.E3.82.A9.E3.83.BC.E3.83.9E.E3.83.83.E3.83.88)

まず、ZFS モジュールがロードされていることを確認。
下記コマンドで、結果が何も表示されなければ成功です。わかりにくい…

```console
# modprobe zfs
```

どうしても画面に反応が欲しいなら wc -l で出力行数を数えましょう。
0 だけが表示されれば成功です。問題があればエラーメッセージも表示される筈です。

```console
# modprobe zfs | wc -l
0
```

zpool を作成します。

このzpoolの名前なんですが、ArchWikiにはzpoolと書いてあります。コマンド名と同じというのも混乱の元ですし、そもそもOracle製のマニュアルに書いてある実行例ではtankなんですよね。FreeNASもtankです。
という訳で、ArchWikiとは違いますがここではtankと名付けます。

そしてもう1点。
デバイスの指定にはidを使え、とArchWikiに書かれています。しかしデバイス名からidを取得するコマンドが無い。SCSI関係のコマンドで取得できるようですが。
```ls -l /dev/disk/by-id``` を見ればわかるんですが、シンボリックリンク先が相対パスになっているのがまた残念。
それでも目で見ればわかるんですが、ファイル名が長いですし、コマンドで取得します。

```console
# cd /dev/disk/by-id
# ls ata-* | while read d; do if [ "$(readlink -f $d)" = "/dev/sda1" ]; then echo "/dev/disk/by-id/$d"; fi; done | xargs -t zpool create -f tank
zpool create -f tank /dev/disk/by-id/ata-VBOX_HARDDISK_VBda1d1874-5cc60c10-part1
# zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME                                           STATE    READ WRITE CKSUM
        tank                                           ONLINE      0     0     0
          ata-VBOX_HARDDISK_VBda1d1874-5cc60c10-part1  ONLINE      0     0     0

errors: No known data errors
```

最後のエラー「No known data errors」は「既知のエラーは何も無い」という意味です。だったら「Success」とか「ok」とか表示してくれればいいのに…

メインのファイルシステムとして tank/main を作成します。
また tank のマウントポイントは削除しますが、念の為noneではなくlegacyにしておきます。

```console
# zfs create -o mountpoint=/ tank/main
cannot mount '/': directory is not empty
filesystem successfully created, but not mounted
# zfs set mountpoint=legacy tank
# zfs list
NAME        USED  AVAIL     REFER  MOUNTPOINT
tank        148K  48.0G       24K  legacy
tank/main    24K  48.0G       24K  /
```

## サブファイルシステム

サブファイルシステムを作ります。

今回のノートパソコンではなくて、サーバとして建てたデスクトップマシンの為の設定ではありますが。今までの経験からユーザデータは分離した方が何かと都合が良い事がわかりました。システムがぶっ壊れた場合にもユーザデータを保護できるよう、システムとユーザの領域を分離します。その為にノートパソコンでもサブファイルシステムを用意します。

参考文献: [俺様サーバー構築記 - 待機系構築を睨んだディレクトリ構造の変更@デスクトップパソコン; やり直し](https://qiita.com/katz_engineer/items/e1d27692e9e5dd4e11c9)

以下の4つのディレクトリをサブファイルシステムにします。

- ```/home```
- ```/opt```
- ```/srv```
- ```/var/opt```

後日検討してもっと増える可能性もあります。例えば ```/usr``` ディレクトリは元々複数マシン間で共有対象となるコマンドなどの置き場所としてFHSで仕様化されていますが、今回の用途では共有不要と考えました。その辺で判断が変わる可能性が無きにしも非ず。

参考文献: [重ね重ね・ArchLinux インストール覚書](https://qiita.com/katz_engineer/items/3c4bafd3aeb32aa2eaf0)

しかしマウントポイントは、なぜかうまく効いてくれません。理由がわからなくて、諦めました。```genfstab```の都合で設定しておきますが、後で```/etc/fstab```を作成したらlegacyに変更します。

```console
# for d in /home /opt /srv /var/opt; do zfs create -p tank/sub0$d -o mountpoint=$d; done
cannot mount '/srv': directory is not empty
filesystem successfully created, but not mounted
```

プロパティは```/var```のみ要求される物があるようです。systemdの関係。大嫌いです…

参考文献：[9.9 起動時に systemd-tmpfiles-setup.service の実行に失敗する - 9 トラブルシューティング - systemd - ArchWiki](https://wiki.archlinux.jp/index.php/Systemd#.E8.B5.B7.E5.8B.95.E6.99.82.E3.81.AB_systemd-tmpfiles-setup.service_.E3.81.AE.E5.AE.9F.E8.A1.8C.E3.81.AB.E5.A4.B1.E6.95.97.E3.81.99.E3.82.8B)

```console
# zfs set xattr=sa acltype=posixacl tank/sub0/var
```

## ブート用の設定

ルートファイルシステムに bootfs プロパティを設定します。

```console
# zpool set bootfs=tank/main tank
```

プール tank をエクスポートして、```/mnt``` 以下にインポートし直します。

```console
# zpool export tank
# zpool import -d /dev/disk/by-id -R /mnt tank
```

ここで、マウントポイントの /mnt を確認します。

```console
# mount | grep tank
tank/main on /mnt type zfs (rw,xattr,noacl)
tank/sub0/home on /mnt/home type zfs (rw,xattr,noacl)
tank/sub0/srv on /mnt/srv type zfs (rw,xattr,noacl)
tank/sub0/opt on /mnt/opt type zfs (rw,xattr,noacl)
tank/sub0/var/opt on /mnt/var/opt type zfs (rw,xattr,posixacl)
```

最後に、新しいシステムに zpool.cache ファイルをコピーします。そしてイヤらしい事に、 /etc/zfs/zpool.cache は存在するんですが中身がありません。最初はこれに気付かなくてエライ目に遭いました。

```console
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 Jul 25 12:02 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 1368 Jul 25 12:04 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt
```

## bootパーティションのマウント

```console
# mkdir /mnt/boot
# mount /dev/sda2 /mnt/boot
```

## インターネットへの接続

ネットワーク環境が確立しているかどうか、外部へのpingによって確認します。

```console
# ping -c2 archlinux.jp
PING archlinux.jp (160.16.119.98) 56(84) bytes of data.
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=1 ttl=54 time=11.0 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=10.7 ms

--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1003ms
rtt min/avg/max/mdev = 10.658/10.809/10.961/0.151 ms
```

## システムクロックの更新

ntpサーバは自分で設定したい。日本なら ntp.nict.jp が鉄板です。特殊事情が無ければこの一択。システム推奨なんか知りませ～ん。

```console
# cd /etc/systemd
# sed -i -e"s/^#NTP=.*$/NTP=ntp.nict.jp/" timesyncd.conf
# timedatectl set-ntp true
# timedatectl status
               Local time: Sat 2020-07-25 12:25:06 UTC
           Universal time: Sat 2020-07-25 12:25:06 UTC
                 RTC time: Sat 2020-07-25 12:25:07
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
# systemctl status systemd-timesyncd
  systemd-timesyncd.service - Network Time Synchronization
   Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: ena>
   Active: active (running) since Sat 2020-07-25 12:07:42 UTC; 18min ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 1707 (systemd-timesyn)
   Status: "Synchronized to time server 133.243.238.244:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 3538)
   Memory: 1.5M
   CGroup: /system.slice/systemd-timesyncd.service
           └─1707 /usr/lib/systemd/systemd-timesyncd

Jul 25 12:07:42 archiso systemd[1]: Starting Network Time Synchronization...
Jul 25 12:07:42 archiso systemd[1]: Started Network Time Synchronization.
Jul 25 12:07:42 archiso systemd-timesyncd[1707]: Initial synchronization to time server 133.243.238>
```

# インストール

## ミラーの選択

日本ならJapanをリスト先頭に持ってきたい、んですけど。なんだか注釈として国名を付けるのを止めたのかな。自動で抜き出せなくなりました。なんだかなぁ。

ちょっと調べてみると、どうもデフォルトのまま放っておいて良いような。下記の参考文献を踏まえて head mirrorlist してみますとね…

参考文献：[3.1 速度で並び替える - 3 ミラーをソートする - ミラー - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%9F%E3%83%A9%E3%83%BC#.E9.80.9F.E5.BA.A6.E3.81.A7.E4.B8.A6.E3.81.B3.E6.9B.BF.E3.81.88.E3.82.8B)

しかしやっぱり日本のミラーを使いたい。と考えた場合、どうやら日本のミラーサイトは非公式だったようですな。それで mirrorlist から除外されたのかなぁ。良くわかりません。

参考文献：[5.8 日本 - 5 非公式ミラー - ミラー - ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%9F%E3%83%A9%E3%83%BC#.E6.97.A5.E6.9C.AC)

今回は、この非公式ミラーを設定してみます。面倒だったらそのまま放置で構わないかと。

```console
# cd /etc/pacman.d
# echo 'Server = http://mirror.archlinuxjp.org/$repo/os/$arch' >mirrorlist
```

## ベースシステムのインストール

BIOSブートに必要なパッケージも同時に落としてきます。ブートローダはGRUBを使います。

今時は、CPUのデバッグ用パッチもOSが面倒を見るらしい。その為のパッケージintel-ucodeも落としておきます。

ZFS関連パッケージも落とします。

今回は普段使いの為のインストールなので、manなどもインストールしておきます。マニュアルだいじ。超だいじ。

とりあえず現時点で必要最小限のパッケージはこれだけ。他に必要なパッケージは、必要に迫られた時に追加する事にします。

```console
# pacstrap /mnt base linux-lts zfs-linux-lts linux-firmware vi intel-ucode grub man-db man-pages texinfo
```

### エラー: バージョン不一致

zfsとカーネルでバージョン不一致が発生した場合。もういやッ！

```console
# pacstrap /mnt base linux-lts zfs-linux-lts linux-firmware vi intel-ucode grub man-db man-pages texinfo
〈省略〉
warning: cannot resolve "linux-lts=5.4.52-1", a dependency of "zfs-linux-lts"
:: The following package cannot be upgraded due to unresolvable dependencies:
      zfs-linux-lts

:: Do you want to skip the above package for this upgrade? [y/N]
error: failed to prepare transaction (could not satisfy dependencies)
:: unalbe to satisfy dependency 'linux-lts=5.4.52-1' required by zfs-linux-lts
==> ERROR: Failed to install packages to new root
```

ArchWikiなどで、[今の時点のlinux-lts パッケージ](https://www.archlinux.org/packages/core/x86_64/linux-lts/)のパージョンを確認しました。linux-lts 5.4.53-1でした…

恐らく、数日？の差でzfsのバージョンアップが間に合ってないのでしょう。きちんとバージョンが揃うのを待つ手もあります。しかし今回は、リポジトリを数日遡ればバージョンが揃っていただろう事を期待して、coreリポジトリの変更を試みました。

[Arch Linux Archive](https://wiki.archlinux.jp/index.php/Arch_Linux_Archive)という、公式リポジトリのスナップショットを保存する場所があるそうです。そこの一番新しい日付のリポジトリから順に（手作業で）調べて、```zfs-linux-lts```が要求する```linux-lts```のバージョンが存在する場所を探します。今回は  https://archive.archlinux.org/repos/2020/07/23/core/os/x86_64/ が該当の場所でした。

ミラーサイトを更新したら、pacmanデータベースを更新します。

参考文献：[1.4.2	データベースの構造 - 1.4	パッケージ・データベースに問い合わせる - 1	使い方 - pacman - ArchWiki](https://wiki.archlinux.jp/index.php/Pacman#.E3.83.87.E3.83.BC.E3.82.BF.E3.83.99.E3.83.BC.E3.82.B9.E3.81.AE.E6.A7.8B.E9.80.A0)

```console
# echo 'Server = https://archive.archlinux.org/repos/2020/07/23/$repo/os/$arch' >/etc/pacman.d/mirrorlist
# rm /mnt/var/lib/pacman/sync/*.db
# pacstrap /mnt base linux-lts zfs-linux-lts linux-firmware vi intel-ucode grub man-db man-pages texinfo
```

# システムの設定

## pacman.conf

```console
# cd /mnt
# cat >>etc/pacman.conf <<'___'
\`heredoc>
\`heredoc> [archzfs]
\`heredoc> SigLevel = Never
\`heredoc> Server = http://archzfs.com/$repo/x86_64
\`heredoc> ___
```

## fstab

```console
# genfstab -U -p . >>etc/fstab
```


fstabを作成した後は、各サブファイルシステムのマウントポイントをlegacyにしておきます。

```console
# for d in /home /opt /srv /var/opt; do zfs set mountpoint=legacy tank/sub0$d; done
```

## hostid

zfsインストールに当たってはhostidが必要らしいです。ここで設定しておきましょう。
参考文献：[最初に起動した後 - ZFS に Arch Linux をインストール - ArchWiki](https://wiki.archlinux.jp/index.php/ZFS_に_Arch_Linux_をインストール#.E6.9C.80.E5.88.9D.E3.81.AB.E8.B5.B7.E5.8B.95.E3.81.97.E3.81.9F.E5.BE.8C)
ここに「/etc/hostid に hostid を書き出してから initramfs イメージを再生成する方法もあります」と書かれているので、その為の仕込みをします。

```console
# ls etc/hostid
ls: cannot access 'etc/hostid': No such file or directory
# hostid >etc/hostid
```

## chroot、タイムゾーン

```console
# arch-chroot .
# ln -fs /usr/share/zoneinfo/Japan /etc/localtime
# hwclock --systohc --utc
```

## ロケール

どの文字コードを有効にしても良いんですが。私は日本語系を全て有効にしました。個人的な好みでEUCは必須。最近の世界の流れも無視できないのでUTF-8も有効に。

```console
# sed -i -e"s/^#\(ja_JP\.\)/\1/" /etc/locale.gen
# locale-gen
Generating locales...
  ja_JP.EUC-JP... done
  ja_JP.UTF-8... done
Generation complete.
# echo LANG=C >/etc/locale.conf
# echo KEYMAP=jp106 >/etc/vconsole.conf
```

日本語フォントが入っていない場合は LANG=C にしておきましょう。文字化けが非常に鬱陶しい事になります。

## ホストネーム

マシンに名前を付けます。こういうのはセンスが出ますよね。なんて思うのは私だけ？

```console
# echo 〈ホスト名〉 >/etc/hostname
```

## Initramfs

ZFS対応の為に```/etc/mkinitcpio.conf```を修正します。
もしも```/usr```のデータセットを別に作成した場合はzfsフックの後にusrフックが必要らしい。今回は作っていないので不要。
また、ext3やext4のファイルシステムを使用する場合は、末尾にfsckフックを入れます。今回はZFSだけなので不要。

```console
# sed -i -e"s/^HOOKS=.*$/HOOKS=(base udev autodetect modconf block keyboard zfs filesystems)/" /etc/mkinitcpio.conf
```

initramfsを再生成。

```console
# mkinitcpio -p linux-lts
〈表示省略〉
但し、途中で警告が出た:
==> WARNING: Possibly missing firmware for module: wd719x
==> WARNING: Possibly missing firmware for module: aic94xx
良くわからないが、ひとまず無視
```

##　Rootパスワード

```console
# passwd
New password: 〈root用パスワード〉
Retype new password: 〈root用パスワード〉
passwd: password updated successfully
```

## ブートローダー

### GRUBをインストール

参考文献: [BIOS マザーボードの場合 - ブートローダーのインストールと設定 - ZFS に Arch Linux をインストール - ArchWiki](https://wiki.archlinux.jp/index.php/ZFS_に_Arch_Linux_をインストール#BIOS_.E3.83.9E.E3.82.B6.E3.83.BC.E3.83.9C.E3.83.BC.E3.83.89.E3.81.AE.E5.A0.B4.E5.90.88)

```console
# grub-install --target=i386-pc /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
```

### 設定ファイル

```console
# cd /dev/disk/by-id/
# ls ata-* | while read d; do if [ "$(readlink -f $d)" = "/dev/sda1" ]; then echo "/dev/$d"; fi; done | xargs -t ln -s /dev/sda
ln -s /dev/sda1 /dev/ata-VBOX_HARDDISK_VBda1d1874-5cc60c10-part1
# cd /boot/grub
# grub-mkconfig -o grub.org
Generating grub configuration file ...
Found Linux image: /boot/vmlinuz-linux-lts
Found initrd image: /boot/intel-ucode.img /boot/initramfs-Linux-lts.img
Found fallback initrd image(s) in /boot: initramfs-linux-lts-fallback.img
done
# cp grub.org grub.cfg
# vi grub.cfg
〈編集〉
# diff -U0 grub.org grub.cfg
--- grub.org    2020-07-25 22:30:52.000000000 +0900
+++ grub.cfg    2020-07-25 22:34:10.000000000 +0900
@@ -84 +84,2 @@
-       insmod gzio
+       search --set --label tank
+       insmod zfs
@@ -94 +95 @@
-       linux /vmlinuz-linux-lts root=ZFS=/main rw  loglevel=3 quiet
+       linux /vmlinuz-linux-lts zfs=tank/main rw
@@ -102 +103,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -112 +114 @@
-               linux /vmlinuz-linux-lts root=ZFS=/main rw  loglevel=3 quiet
+               linux /vmlinuz-linux-lts zfs=tank/main rw
@@ -119 +121,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -129 +132 @@
-               linux /vmlinuz-linux-lts root=ZFS=/main rw  loglevel=3 quiet
+               linux /vmlinuz-linux-lts zfs=tank/main rw
# rm grub.org
```

## ネットワーク

NICのデバイス名についてですが。
systemdを使用すると、デバイス名を固定してくれるようです。

参考文献：[CentOS 7のネットワーク名「enp1s0」という文字列の謎に迫る](https://qiita.com/fetaro/items/b61282130fa638de4528)

従って面倒な設定は省きます。
とすると、やる事はDHCPクライアントの設定になります。

```console
# cat >/etc/systemd/network/all.network <<___
> [Match]
> Name=*
>
> [Network]
> DHCP=ipv4
> ___
```

ネットワークの有効化

```console
# systemctl enable systemd-networkd
Created symlink /etc/systemd/system/dbus-org.freedesktop.network1.service → /usr/lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /usr/lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /usr/lib/systemd/system/systemd-networkd.socket.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service → /usr/lib/systemd/system/systemd-networkd-wait-online.service.
```

名前解決は ```/etc/resolv.conf``` ではなくて、systemd-resolved を使用するようです。DHCPによるDNSの指定を考慮してくれます。

参考文献: [必要なサービスと設定 - 基本的な使い方 - systemd-networkd - ArchWiki](https://wiki.archlinux.jp/index.php/Systemd-networkd#.E5.BF.85.E8.A6.81.E3.81.AA.E3.82.B5.E3.83.BC.E3.83.93.E3.82.B9.E3.81.A8.E8.A8.AD.E5.AE.9A)

```console
# systemctl enable systemd-resolved
Created symlink /etc/systemd/system/dbus-org.freedesktop.resolve1.service -> /usr/lib/systemd/system/systemd-resolved.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-resolved.service -> /usr/lib/systemd/system/systemd-resolved.service.
```

上記の参考文献には ```/etc/nsswitch.conf``` の hosts: 行に resolve を書くように記述されていますが、現在はデフォルトで書かれているようですので、それを確認。

```console
# grep "^hosts:" /etc/nsswitch.conf | grep resolve
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
```

## 再起動

マシンをシャットダウン。

```console
# exit
exit
arch-chroot .  16.19s user 4.48s system 1% cpu 20:15.61 total
# cd
# umount /mnt/boot
# zfs umount -a
# zpool export tank
# shutdown -h now
```

そして、仮想ドライブからインストールメディアを外した後に電源を入れます。

# 最初に起動した後

ここまで問題が無ければ、再起動すると最初にGRUBのメニュー画面が表示されます。数秒放置するか、Enterキーを押すと起動します。

## rootログイン

rootユーザーでログインします。パスワードは先ほどpasswdコマンドで設定した通り。

```console

Arch Linux 5.4.52-1-lts (tty1)

〈ホスト名〉 login: root
Password: 〈root用パスワード〉
```

## ZFS の設定

```console
# systemctl enable zfs.target
Created symlink /etc/systemd/system/multi-user.target.wants/zfs.target -> /usr/lib/systemd/system/zfs.target.
# zpool set cachefile=/etc/zfs/zpool.cache tank
```

最後の cachefile の設定は、自動でマウントさせたいプールごとに実行する必要があるとの事。今回は tank のみです。

念の為に ```shutdown -h now```→電源入れ直して、再起動を確認できればOK。
も一つ念を入れて、再起動・ログイン後にzfsを確認：

```console
# mount | grep zfs
tank/main on / type zfs (rw,relatime,xattr,noacl)
tank/sub0/home on /home type zfs (rw,relatime,xattr,noacl)
tank/sub0/opt on /opt type zfs (rw,relatime,xattr,noacl)
tank/sub0/srv on /srv type zfs (rw,relatime,xattr,noacl)
tank/sub0/var/opt on /var/opt type zfs (rw,relatime,xattr,posixacl)
```

（2020/07/26 追加ここから）

# linux-lts の更新を止める

[ベースシステムのインストール](https://qiita.com/katz_engineer/items/2c05b03ec82989f0e2b0#%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の時に[エラー: バージョン不一致](https://qiita.com/katz_engineer/items/2c05b03ec82989f0e2b0#%E3%82%A8%E3%83%A9%E3%83%BC-%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E4%B8%8D%E4%B8%80%E8%87%B4)で小細工を施した場合、それを戻しておく必要があります。その場合は linux-lts の更新を止めないといけません。

```console
# sed -i -e"/^#IgnorePkg /c IgnorePkg = linux-lts" /etc/pacman.conf
# echo 'Server = http://mirror.archlinuxjp.org/$repo/os/$arch' >/etc/pacman.d/mirrorlist
# pacman -Syu
```

後日、zfs-linux-ltsパッケージが更新されて新しいlinux-ltsカーネルに対応した際に、下記を実行して戻しておきます。

```console
# sed -i -e"/^IgnorePkg /c #IgnorePkg   =" /etc/pacman.conf
```

（2020/07/26 追加ここまで）

これで大丈夫でしょう。やったね :thumbsup_tone1: