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

（2020/07/05 追記ここから）
ZFSを使う場合は、ちょっと古いカーネルを利用した方が良さそうです。そのためLTS版カーネルでインストールする事にしました。その手順は下記になりますので、そちらをご覧ください。
[俺様サーバー構築記 - ZFS の上に Arch Linux をインストール; やり直し(Linux-LTS)@ノートパソコン(BIOS)](https://qiita.com/katz_engineer/items/3ec8f7bfd3051e60586b)
（2020/07/05 追記ここまで）

「[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)」に基づき、[前回](https://qiita.com/katz_engineer/items/90651e99825484d7b682)まで、自宅サーバーの構築を目指して Arch Linux + ZFS をインストールしてきました。

今回はサーバーではなくてクライアントマシンです。

# 前書き：マシンスペック

機種：lenovo R500 2714-CTO
CPU: Celeron Dual-Core T3000
クロック: 1.8GHz
メモリ: 3GB
HDD: 320GB

曲がりなりにも64ビットCPUでメモリも3GBあるので、ZFS を入れようと思います。
ノートパソコンに ZFS は意味が無い？いやいやそんな事はありませんよ、寧ろノートパソコンにこそ ZFS を、という面白い応用例を示してみたい。ちょっと考えている事があります。ご期待ください。

# インストールの準備

「[俺様サーバー構築記 - ZFSをarchisoに埋め込む@物理マシン(BIOS)](https://qiita.com/katz_engineer/items/6f6ef6171f1fdcc4ec23)」の続きです。そこで作ったZFS埋め込みarchisoを使用して、物理マシンに Arch Linux をインストールします。

ZFS関連ツールを埋め込んだarchisoを焼き付けたUSBメモリをマシンに挿して電源を入れ、BIOSでブートメディアを設定。
そして起動すると、いつもの 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を確認しておきます。Windowsが入っていたせいか、訳の分からないパーティション分けが見えます。

```console
# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4  /dev/sdb  /dev/sdb1  /dev/sdb2
```

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

```console
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 573.2M  1 loop /run/archiso/sfs/airootfs
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0   300M  0 part
├─sda2   8:2    0 282.5G  0 part
├─sda3   8:3    0  10.3G  0 part
└─sda4   8:4    0     5G  0 part
sdb      8:16   0   7.3G  0 disk
├─sdb1   8:17   1   686M  0 part /run/archiso/bootmnt
└─sdb2   8:18   1    64M  0 part
sr0     11:0    1  1024M  0 rom
```

```/dev/sdb``` とその眷属（```/dev/sdb1``` ```/dev/sdb2```）は、起動する時に使用したUSBメモリです。mountコマンドの結果にそれが表れます。

```console
# mount | grep /dev/sd
/dev/sdb1 on /run/archiso/bootmnt type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)
```

```/dev/disk/by-id``` を見ると、ファイル名（＝デバイスID）からもう少し情報を得られる可能性があります。どのようなデバイスなのかによって命名されるらしいので。BIOS画面などから得たHDDの商品名などと突き合わせればハッキリするでしょう。

```console
# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root  9 Jan 30 21:33 ata-HL-DT-ST_DVDRAM_GSA-T50N_M2G9CU23115 -> ../../sr0
lrwxrwxrwx 1 root root  9 Jan 30 21:33 ata-Hitachi_HTS723232A7A364_E3834263EDYUAD -> ../../sda
lrwxrwxrwx 1 root root 10 Jan 30 21:33 ata-Hitachi_HTS723232A7A364_E3834263EDYUAD-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jan 30 21:33 ata-Hitachi_HTS723232A7A364_E3834263EDYUAD-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jan 30 21:33 ata-Hitachi_HTS723232A7A364_E3834263EDYUAD-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Jan 30 21:33 ata-Hitachi_HTS723232A7A364_E3834263EDYUAD-part4 -> ../../sda4
lrwxrwxrwx 1 root root  9 Jan 30 21:33 usb-058f_6387_17082208002200-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jan 30 21:33 usb-058f_6387_17082208002200-0:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jan 30 21:33 usb-058f_6387_17082208002200-0:0-part2 -> ../../sdb2
lrwxrwxrwx 1 root root  9 Jan 30 21:33 wwn-0x5000cca6d4e21364 -> ../../sda
lrwxrwxrwx 1 root root  9 Jan 30 21:33 wwn-0x5000cca6d4e21364-part1 -> ../../sda1
lrwxrwxrwx 1 root root  9 Jan 30 21:33 wwn-0x5000cca6d4e21364-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9 Jan 30 21:33 wwn-0x5000cca6d4e21364-part3 -> ../../sda3
lrwxrwxrwx 1 root root  9 Jan 30 21:33 wwn-0x5000cca6d4e21364-part4 -> ../../sda4
```

最後の```wwn-```何とかいうデバイス名の正体が不明ですが、今回は関係無いので放置！

という訳で ```/dev/sda``` がHDDです。ちなみに ```/dev/sr0``` は、デバイスIDからわかる通りDVDドライブです。

デバイスを確認した所で、HDDにパーティションを切ります…が、
[1.11 性能が今ひとつなんだけど。 - ZFS on Linux FAQ](https://www.nosuz.jp/ZFSonLinux/faq_ja.html#PerformanceConsideration)という記事を発見。

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

ZFSに詳しい方にとっては常識なのだと思いますけども。そういう訳でパーティションを一切作りません。内蔵HDDだけでは完結しなくてちょっと悔しいですが、ブートに関しては外部メディアに頼る事にします。詳しくは後述。

また[前回](https://qiita.com/katz_engineer/items/6f6ef6171f1fdcc4ec23#%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)も書きましたが、一応、HDDフォーマットの前に ```wipefs``` コマンドを実行します。

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

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

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

```console
# wipefs -a /dev/sda
/dev/sda: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sda: 4 bytes were erased at offset 0x000001d2 (Atari): 07 fe ff ff
/dev/sda: calling ioctl to re-read partition table: Success
```

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

いよいよ 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/sda” ]; then echo "/dev/disk/by-id/$d"; fi; done | xargs -t zpool create -f tank
zpool create -f tank /dev/disk/by-id/ata-Hitachi-HTS723232A7A364_E3834263EDYUAD
# zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME                                          STATE    READ WRITE CKSUM
        tank                                          ONLINE      0     0     0
          ata-Hitachi-HTS723232A7A364_E3834263EDYUAD  ONLINE      0     0     0

errors: No known data errors
```

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

（2019/03/22 追加ここから）
メインのファイルシステムとして tank/main を作成します。

（2019/05/06 修正ここから）
また tank のマウントポイントは鬱陶しいので削除しますが、念の為 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        136K   289G    24K  legacy
tank/main    24K   289G    24K  /
```
（2019/05/06 修正ここまで）
（2019/03/22 追加ここまで）

また、今回もサブファイルシステムを作りません。/home や /var を個別のデータセットに分けるとか、そこまでしなくてもいいかな、と。
ちなみにシステムディレクトリ（/home とか /var とか /usr とか）の為にデータセットを作成した場合には、色々と細かい設定があるようです。上述の参考文献に色々書いてありますので、必要ならば参照して下さい。

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

（2019/03/22 修正ここから）

```console
# zpool set bootfs=tank/main tank
```
（2019/03/22 修正ここまで）

プール tank をエクスポートして、インポートし直します。理由が良くわからないんですが、やれって書いてあるので。

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

（2019/03/22 修正ここから）
ここで、マウントポイントの /mnt を確認します。

（2019/05/06 修正ここから）

```console
# mount | grep tank
tank/main on /mnt type zfs (rw,xattr,noacl)
# find /mnt
/mnt
```
（2019/05/06 修正ここまで）
（2019/03/22 修正ここまで）

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

（2019/03/22 修正ここから）

```console
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 Jan 30 22:14 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 1472 Jan 30 22:17 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt
```
（2019/03/22 修正ここまで）

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

bootパーティションが無いのでマウントはしません。

（2019/03/22 修正ここから）

```console
# mkdir /mnt/boot
```
（2019/03/22 修正ここまで）

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

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

…実は、ここで失敗しました。LANケーブルを挿していなかったので、ネットワークが繋がってませんでした。気付いてから挿したのですが、ダメでしたね。
仕方がないのでLANケーブルを挿したまま、再起動しました。再起動後は、まず zpool の import からです。上述の ```zpool import``` コマンドをそのまま実行して、それから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=8.56 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=9.47 ms

--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 8.562/9.015/9.469/0.463 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: Mon 2019-01-31 13:31:36 UTC
           Universal time: Mon 2019-01-31 13:31:36 UTC
                 RTC time: Mon 2019-01-31 13:31:36
                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: enabled
   Active: active (running) since Thu 2019-01-31 22:30:53 UTC; 8h left
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 935 (systemd-timesyn)
   Status: "Synchronized to time server 133.243.238.163:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 3423)
   CGroup: /system.slice/systemd-timesyncd.service
           └─935 /usr/lib/systemd/systemd-timesyncd

Jan 31 22:30:53 archiso systemd[1]: Starting Network Time Synchronization...
Jan 31 22:30:53 archiso systemd[1]: Started Network Time Synchronization.
Jan 31 13:31:32 archiso systemd-timesyncd[935]: Synchronized to time server 133.243.238.244:123 (ntp.nict.jp).
```

# インストール

## ミラーの選択

日本ならJapanをリスト先頭に持ってきましょう。っていうか、Japanだけ抜き出しました。下手に編集などするよりもコマンドが簡単なので。

```console
# cd /etc/pacman.d
# sed -i -ne"/^#.*Japan$/,+1 p" mirrorlist
# cat mirrorlist
## Japan
Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch
## Japan
Server = http://mirrors.cat.net/archlinux/$repo/os/$arch
## Japan
Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
```

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

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

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

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

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

（2019/03/22 修正ここから）

```console
# pacstrap /mnt base intel-ucode linux-headers spl-dkms zfs-dkms grub
〈表示省略〉
```
（2019/03/22 修正ここまで）

…そして夜、寝る前に実行したら、朝起きた時に電源が切れていました:sweat:
電源を入れ直して起動したら、最初にやるべきは```loadkeys```と```zpool import```です。もし再起動などしていなければ、黙って次へ進みます。

# システムの設定

（2019/03/22 追加ここから）
## pacman.conf

pacman.conf ファイルに zfs 関連のリポジトリを追記。これを忘れると、カーネルのアップグレードの際にzfsモジュールが追従しなくて酷い目に遭います。というか遭いました…

追記に当たってはヒアドキュメントを使ってもいいんですが、その場合は $repo のドル記号をバックスラッシュでエスケープして \$repo とする必要があります。どっちでもいいんですけど、ちょっと面倒臭いんで、標準入力からキーボード入力します。こんな細っかい使い分けなんかどうでもいいですが。

```console
# cd /mnt
# cat >>etc/pacman.conf

[archzfs]
SigLevel = Never
Server = http://archzfs.com/$repo/x86_64
〈Ctrl-d〉
```
（2019/03/22 追加ここまで）

## fstab

（2019/03/22 修正ここから）

```console
# genfstab -U -p . >>etc/fstab
# cat etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# tank
tank/main               /               zfs           rw,xattr,noacl  0 0

```
（2019/03/22 修正ここまで）

## 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 イメージを再生成する方法もあります」と書かれているので、その為の仕込みをします。

（2019/03/22 修正ここから）

```console
# ls etc/hostid
ls: cannot access 'etc/hostid': No such file or directory
# hostid >etc/hostid
```
（2019/03/22 修正ここまで）

## chroot、タイムゾーン

（2019/03/22 修正ここから）

```console
# arch-chroot .
# ln -fs /usr/share/zoneinfo/Japan /etc/localtime
# hwclock --systohc --utc
```
（2019/03/22 修正ここまで）

## ロケール

どの文字コードを有効にしても良いんですが。私は日本語系を全て有効にしました。

```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
〈表示省略〉
但し、途中で警告が出た:
==> 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)

…が、/dev/sda にはインストールできません。パーティションを切ってない上にZFSだから当然ですな。

```console
# grub-install --target=i386-pc /dev/sda
Installing for i386-pc platform.
grub-install: error: failed to get canonical path of `/dev/ata-Hitachi_HTS723232A7A364_E3834263EDYUAD’.
# ln -s /dev/sda /dev/ata-Hitachi_HTS723232A7A364_E3834263EDYUAD
# grub-install --target=i386-pc /dev/sda
Installing for i386-pc platform.
grub-install: error: unknown filesystem.
# rm /dev/ata-Hitachi_HTS723232A7A364_E3834263EDYUAD
```

[パーティションレスディスクへのインストール](https://wiki.archlinux.jp/index.php/GRUB#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.84.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.83.AC.E3.82.B9.E3.83.87.E3.82.A3.E3.82.B9.E3.82.AF.E3.81.AB.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB.E3.81.99.E3.82.8B)ってのもありましたけど、推奨されていないとの事。動作原理を考えれば当然です。

そこで、外部メディアのUSBメモリにGRUBをインストールします。起動用メディアを別に用意しなければならないのも業腹ですが、仕方ありませんな。
USB端子に挿すとほんのわずかしか飛び出さないタイプのUSBメモリを購入してきました。最小容量が8GB、お値段にして410円。これを、生きているUSB端子に挿します。

```console
# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 573.2M  1 loop
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0 298.1G  0 part
`─sda9   8:9    0     8M  0 part
sdb      8:16   0   7.3G  0 disk
├─sdb1   8:17   1   686M  0 part
`─sdb2   8:18   1    64M  0 part
sdc      8:32   1   7.5G  0 disk
`─sdc1   8:33   1   7.5G  0 part
sr0     11:0    1  1024M  0 rom
```

/dev/sdc が新しいUSBメモリです。調べると何やらWindows用のツールが入っているようですが、今回は不要なので全部廃棄。そしてGRUBをインストールします。

参考文献1: [2.3.1.2 USB スティックにインストール - GRUB - ArchWiki](https://wiki.archlinux.jp/index.php/GRUB#USB_.E3.82.B9.E3.83.86.E3.82.A3.E3.83.83.E3.82.AF.E3.81.AB.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB)
参考文献2: [GRUB2 からZFS rootの FreeBSDの起動を試す - とりあえず TBD](http://sntk.hatenablog.com/entry/2014/02/16/164459)

（2019/03/23 修正ここから）

```console
# exit
exit
# wipefs -a /dev/sdc
/dev/sdc: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdc: calling ioctl to re-read partition table: Success
# sfdisk /dev/sdc <<___
\`heredoc> ,16M
\`heredoc> ,
\`heredoc>___
〈以下略〉
# mkfs.fat /dev/sdc1
mkfs.fat 4.1 (2017-01-24)
# arch-chroot /mnt
# mount /dev/sdc1 /mnt
# grub-install --target=i386-pc --boot-directory=/mnt/boot /dev/sdc
Installing for i386-pc platform.
Installation finished. No error reported.
# cd /dev/disk/by-id/
# ls ata-* | while read d; do if [ "$(readlink -f $d)" = "/dev/sda” ]; then echo "/dev/$d"; fi; done | xargs -t ln -s /dev/sda
ln -s /dev/sda /dev/ata-Hitachi_HTS723232A7A364_E3834263EDYUAD
# cd /mnt/boot/grub
# grub-mkconfig -o grub.org
Generating grub configuration file ...
Found Linux image: /boot/vmlinuz-linux
Found initrd image: /boot/intel-ucode.img /boot/initramfs-Linux.img
/usr/bin/grub-probe: error: unknown filesystem.
/usr/bin/grub-probe: error: unknown filesystem.
Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img
/usr/bin/grub-probe: error: unknown filesystem.
done
# cp grub.org grub.cfg
# vi grub.cfg
〈編集〉
# diff -U0 grub.org grub.cfg
--- grub.org    2019-02-04 00:18:44.000000000 +0900
+++ grub.cfg    2019-02-04 00:20:00.000000000 +0900
@@ -81 +81,2 @@
-       insmod gzio
+       search --set --label tank
+       insmod zfs
@@ -84 +85 @@
-       linux /main@/boot/vmlinuz-linux root=ZFS=/ rw  quiet
+       linux /main@/boot/vmlinuz-linux zfs=tank/main rw
@@ -92 +93,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -95 +97 @@
-               linux /main@/boot/vmlinuz-linux root=ZFS=/ rw  quiet
+               linux /main@/boot/vmlinuz-linux zfs=tank/main rw
@@ -102 +104,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -105 +108 @@
-               linux /main@/boot/vmlinuz-linux root=ZFS=/ rw  quiet
+               linux /main@/boot/vmlinuz-linux zfs=tank/main rw
# rm grub.org
# sync
# cd
# umount /mnt
```
（2019/03/23 修正ここまで）

（2019/05/06 追加ここから）
USBメモリの残りの領域は捨てても良いんですが、折角なので使えるようにフォーマットしておきます。念の為 Windows からもアクセスできるよう FAT32 にしておきます。

```console
# exit
exit
# mkfs.fat -F32 /dev/sdc2
mkfs.fat 4.1 (2017-01-24)
# arch-chroot /mnt
```
（2019/05/06 追加ここまで）

## ネットワーク

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.
```

（2019/02/17 修正ここから）
名前解決は ```/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)

systemdの設定は arch-chroot の中では出来ないので、exitしてから設定します。

（2019/03/22 修正ここから）

```console
# exit
exit
# cd
# systemctl start systemd-resolved
# ln -fs /run/systemd/resolve/resolv.conf /mnt/etc/resolv.conf
```
（2019/03/22 修正ここまで）

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

（2019/03/22 修正ここから）

```console
# grep "^hosts:" /mnt/etc/nsswitch.conf | grep resolve
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
```
（2019/03/22 修正ここまで）
（2019/02/17 修正ここまで）

## 再起動

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

```console
# zfs umount -a
# zpool export tank
# shutdown -h now
```

そして、インストールメディアであるUSBメモリを外した後に電源を入れます。GRUBをインストールしたUSBメモリはそのままにして、GRUBから起動するようにします。

# 最初に起動した後

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

## rootログイン

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

```console

Arch Linux 4.20.5-arch1-1-ARCH (tty1)

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

（2019/03/22 修正ここから）
## ネットワークの名前解決

```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.
```
（2019/03/22 修正ここまで）

## 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を確認：

（2019/03/24 修正ここから）

```console
# mount | grep zfs
tank/main on / type zfs (rw,relatime,xattr,noacl)
```
（2019/03/24 修正ここまで）

やったね :thumbsup_tone1:

# 追伸：マシン入手の経緯

マシン入手の経緯なんて私の日記としてしか意味がありません。この先は読まなくても何の影響もありませんので、御安心下さい。  

IT素人の親戚から、仕事で重要なデータを保存していたノートパソコンが起動しなくなったので何とかして欲しいと持ち込まれました。古い機種なので復活できないなら諦めるが、最低でもデータは取り出したいとの事。

見てみるとBIOS画面すら表示されない。これでは手の出しようもない、と思ってHDDを取り外して見てみたら、HDDの中身は普通に見る事が出来ました。そのままデータを普通にコピーしてミッションコンプリート。マシンの方は部品取りに使えるかも知れないので、譲り受けて部屋の隅に転がしておいたのが昨年末の話です。

それがですね。先週、何気ないネットサーフィンの中で、なんと！同一機種の同じ症状から回復させる記事を発見してしまったのでした！

機種：lenovo R500 2714-CTO

その記事によると、この機種は本体の横のUSB端子が弱くて、同じトラブルが世界的に頻発していたようです。ここのUSB端子のピンが接触すると、起動直後の最初の画面で停止してしまってBIOS画面にすら進まないとの事。

手元のマシンを見ると、やはり件の端子のピンが潰れていました。ラジオペンチで曲がったピンを強く引っ張って整えると、1本は根元で折れてしまいましたが、それも含めて接触を解消。私はUSB端子などほとんど使わないので、3つある内の1つが使用不可になった所で痛くも痒くも無い。

そうやって整えた所で電源を入れると、何という事でしょう！何事も無かったかのようにWindowsが起動してしまったではありませんか！

もう二度と起動しないと判断したノートパソコンが、裏蓋すら開けずに直ってしまいました。さすがに気まずくて一応連絡を入れておきました…

という訳で上記の機種が手に入りました。

HDD: 150GB
OS: Windows 7 HOME 32ビット版
CPU: Celeron Dual-Core T3000 1.8GHz
メモリ: 3GB

なぜか64ビットCPUに32ビット版Windowsです:sweat: あの当時ってこういうのが普通でしたっけ？あんまり覚えてないのですが。

ここでHDDを換装してSSDを入れられれば御の字だったのですがね。住宅ローンを抱えながら妻子を養って小遣いも極限まで削られているお父ちゃんです。それでなくても、消費税増税を機に1台くらいは最高性能を目指したマシンを購入したいと考えて、1年がかりで乏しい小遣いをへそくっている真っ最中。SSDなんて贅沢品を購入する余裕などありません。

そんな訳で、たまたま会社で廃棄処分になっていた320GBのHDDを譲り受け、こいつに換装しました。小さい会社なのでこういう事には大らかです。その代わり事故とか起こさないように個人レベルで気を使いますけどね、今後規則が五月蠅くならないように。自由を守る為の戦いってヤツですな。

ま、それはどうでもよくて。古いノートパソコンですが Linux で再生して、ありがたく私の普段使いのノートパソコンにさせていただきます。