1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

俺様サーバー構築記 - ZFS の上に Arch Linux をインストール;やり直し@デスクトップパソコン(BIOS)

Last updated at Posted at 2019-05-04

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

俺様サーバー構築記 - 基本方針」に基づいてデスクトップマシンにまず ArchLinux をインストールしたのが、ええと今年2019年、平成31年の2月ですか。

実はその後、会社で廃棄処分になったHDDを貰ったりして。これが 500GB の Enterprise Storage で、今のものよりスペックが上。ノートパソコン3台にインストールして知見を広げた事であるし、諸々込でやり直す事にしました。

インストールの準備

俺様サーバー構築記 - ZFSをarchisoに埋め込む@物理マシン(BIOS)」で作ったZFS埋め込みarchisoを使用して、物理マシンに Arch Linux をインストールします。このarchisoもだいぶ古いんですけどね。インストーラとしてならまだまだ問題無く使えるようです。

ZFS関連ツールを埋め込んだarchisoを焼き付けたUSBメモリをマシンに挿して電源を入れ、BIOSでブートメディアを設定。
そして起動すると、いつもの Arch Linux インストールメディアのメニューが出ます。
後はいつも通りに操作して起動。

キーボード

# loadkeys jp106

コンソールフォント

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

起動モードの確認

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

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

パーティション

HDDを確認しておきます。廃棄直前に、HDD内部を綺麗に消した上でサーバ構築実験か何かをした模様。訳の分からないパーティション分けになってます。

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sda3  /dev/sda4  /dev/sda5  /dev/sda6  /dev/sdb  /dev/sdb1  /dev/sdc  /dev/sdc1  /dev/sdc2

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

# 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 465.8G  0 disk
├sda1                                                            8:1    0    18G  0 part
├sda2                                                            8:2    0    18G  0 part
├sda3                                                            8:3    0 424.3G  0 part
│└VG_XenStorage--7f7c7256--7b1f--2791--e7f1--83837f05e1ed-MGT 254:0    0     4M  0 lvm
├sda4                                                            8:4    0   512M  0 part
├sda5                                                            8:5    0     4G  0 part
└sda6                                                            8:6    0     1G  0 part
sdb                                                               8:16   0 465.8G  0 disk
└sdb1                                                            8:17   0 465.8G  0 part
sdc                                                               8:32   0   7.3G  0 disk
├sdc1                                                            8:33   1   686M  0 part /run/archiso/bootmnt
└sdc2                                                            8:34   1    64M  0 part
sr0                                                              11:0    1  1024M  0 rom

/dev/sdc とその眷属(/dev/sdc1 /dev/sdc2)は、起動する時に使用したUSBメモリです。mountコマンドの結果にそれが表れます。

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

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

# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root  9 May  4 06:40 ata-TSSTcorp_DVD+_-RW_TS-H653F -> ../../sr0
lrwxrwxrwx 1 root root  9 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276 -> ../../sdb
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470 -> ../../sda
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 May  4 06:40 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part6 -> ../../sda6
lrwxrwxrwx 1 root root 10 May  4 06:40 dm-name-VG_XenStorage--7f7c7256--7b1f--2791--e7f1--83837f05e1ed-MGT -> ../../dm-0
lrwxrwxrwx 1 root root 10 May  4 06:40 dm-uuid-LVM-AeHdk8BhI6szQ8OfbY2esBY2mWmoFFR9A7Aq8jAjYPOjv4v6A0G00rIC0Iwe4gKJ -> ../../dm-0
lrwxrwxrwx 1 root root 10 May  4 06:40 lvm-pv-uuid-EamEil-Kfvu-L3Xo-xVPp-278T-gyLQ-31i2xk -> ../../sda3
lrwxrwxrwx 1 root root  9 May  4 06:40 usb-058f_6387_17082208002200-0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 May  4 06:40 usb-058f_6387_17082208002200-0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 May  4 06:40 usb-058f_6387_17082208002200-0:0-part2 -> ../../sdc2
lrwxrwxrwx 1 root root  9 May  4 06:40 wwn-0x50014ee003d2be9e -> ../../sda
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee003d2be9e-part6 -> ../../sda6
lrwxrwxrwx 1 root root  9 May  4 06:40 wwn-0x50014ee059271534 -> ../../sdb
lrwxrwxrwx 1 root root 10 May  4 06:40 wwn-0x50014ee059271534-part1 -> ../../sdb1

いくつか知らないデバイス名が見えますが、今回は関係無いので放置!

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

デバイスを確認した所で、HDDにパーティションを切ります…が、
1.11 性能が今ひとつなんだけど。 - ZFS on Linux FAQという記事を発見。

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

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

スワップ領域については パーティショニング - ArchWiki の [パーティションの大きさはどうすればいいですか?] に下記のような記述があります。

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

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

また以前も書きましたが、一応、HDDフォーマットの前に wipefs コマンドを実行します。が、なぜか失敗しました:weary:

# wipefs -a /dev/sda
wipefs: error: /dev/sda: probing initialization failed: Device or resource busy

理由は不明ですが、全データを潰しても問題無い…というより全データを潰したいデバイスなので、強制的に実行するオプションを付けて実行。

# wipefs -af /dev/sda
/dev/sda: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 8 bytes were erased at offset 0x7470c05e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

/dev/sdb の方は問題無し。

# wipefs -a /dev/sdb
/dev/sdb: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/sdb: 8 bytes were erased at offset 0x7470c05e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sdb: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
/dev/sdb: calling ioctl to re-read partition table: Success

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

いよいよ ZFS です。
参考文献:3 ディスクのフォーマット - ZFS に Arch Linux をインストール - ArchWiki

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

# modprobe zfs

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

# 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 を見ればわかるんですが、シンボリックリンク先が相対パスになっているのがまた残念。
それでも目で見ればわかるんですが、ファイル名が長いですし、コマンドで取得します。

# cd /dev/disk/by-id
# for p in /dev/sda /dev/sdb; do ls ata-* | while read d; do if [ "$(readlink -f $d)" = "$p" ]; then echo "/dev/disk/by-id/$d"; fi; done; done | xargs -t zpool create -f tank mirror
zpool create -f tank mirror /dev/disk/by-id/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470 /dev/disk/by-id/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276
/dev/disk/by-id/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470 is in use and contains a unknown filesystem.

…失敗。先程の wipefs の時と同じですね、 /dev/sda が使用中の扱いになっているようです。再起動してもう一度やったらうまく行きました。

# reboot
  〈再起動の過程は省略〉
# loadkeys jp106
# cd /dev/disk/by-id
# for p in /dev/sda /dev/sdb; do ls ata-* | while read d; do if [ "$(readlink -f $d)" = "$p" ]; then echo "/dev/disk/by-id/$d"; fi; done; done | xargs -t zpool create -f tank mirror
zpool create -f tank mirror /dev/disk/by-id/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470 /dev/disk/by-id/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276
# zpool status
  pool: tank
 state: ONLINE
  scan: none requested
config:

        NAME                                          STATE    READ WRITE CKSUM
        tank                                          ONLINE      0     0     0
          ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470  ONLINE      0     0     0
          ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276  ONLINE      0     0     0

errors: No known data errors

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

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

# 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   449G    24K  legacy
tank/main    24K   449G    24K  /

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

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

# zpool set bootfs=tank/main tank

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

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

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

# mount | grep tank
tank/main on /mnt type zfs (rw,xattr,noacl)
# find /mnt
/mnt

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

# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 May  4 07:46 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 2176 May  4 07:48 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt

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

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

# mkdir /mnt/boot

インターネットへの接続

ネットワーク環境が確立しているかどうか、外部へのpingによって確認します。…が、今回はネットワークがぼろぼろでした。

# ping -c2 archlinux.jp
ping: archlinux.jp: Temporary failure in name resolution
# ping -c2 8.8.8.8
connect: Network is unreadhable
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:11:22:33:44:55:df brd ff:ff:ff:ff:ff:ff
    inet6 fe80:907f:405a:1381:d765/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 00:11:22:33:44:55:94 brd ff:ff:ff:ff:ff:ff

仕方が無いので自力でネットワークを設定します。

# cat >/etc/systemd/network/all.network <<___
\`heredoc> [Match]
\`heredoc> Name=*
\`heredoc> 
\`heredoc> [Network]
\`heredoc> DHCP=ipv4
\`heredoc> ___
# systemctl start systemd-networkd
# ip addr show enp2s1
2: enp2s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:11:22:33:44:55:df brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.250/24 brd 10.0.0.255 scope global dynamic enp2s1
       valid_lft 86392sec preferred_lft 86392sec
    inet6 fe80:907f:405a:1381:d765/64 scope link
       valid_lft forever preferred_lft forever
# systemctl start systemd-resolved

今度は成功!

(2020/02/09 修正ここから)

archlinux.jp は、現在何故か名前が解決できない事があるようです。その場合は example.com を使ってみました。まあ、確認できれば何でも良いです。

# ping -c2 example.com
PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=52 time=130 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=52 time=115 ms

--- example.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 115.331/122.739/130.148/7.408 ms

(2020/02/09 修正ここまで)

システムクロックの更新

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

# cd /etc/systemd
# sed -i -e"s/^#NTP=.*$/NTP=ntp.nict.jp/" timesyncd.conf
# timedatectl set-ntp true
# timedatectl status
               Local time: Sat 2019-05-04 08:23:30 UTC
           Universal time: Sat 2019-05-04 08:23:30 UTC
                 RTC time: Sat 2019-05-04 08:23:30
                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 Sat 2019-05-04 08:19:55 UTC; 4min 53s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 1329 (systemd-timesyn)
   Status: "Synchronized to time server 133.243.238.163:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 4915)
   Memory: 1.2M
   CGroup: /system.slice/systemd-timesyncd.service
           └1329 /usr/lib/systemd/systemd-timesyncd

May 04 08:19:54 archiso systemd[1]: Starting Network Time Synchronization...
May 04 08:19:55 archiso systemd[1]: Started Network Time Synchronization.
May 04 08:23:25 archiso systemd-timesyncd[1329]: Synchronized to time server 133.243.238.163:123 (ntp.nict.jp).

インストール

ミラーの選択

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

# 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関連パッケージも落とします。

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

(2020/02/08 修正ここから)

# pacstrap /mnt base linux linux-firmware linux-headers zfs-dkms vi man-db man-pages texinfo intel-ucode grub
〈表示省略〉

(2020/02/08 修正ここまで)

システムの設定

pacman.conf

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

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

(2020/02/08 修正ここから)
エスケープする必要の無いヒアドキュメントの書き方を覚えたので、以下はそのように修正します。

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

[archzfs]
SigLevel = Never
Server = http://archzfs.com/$repo/x86_64
〈Ctrl-d〉

(2020/02/08 修正ここまで)

fstab

# 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

hostid

zfsインストールに当たってはhostidが必要らしいです。ここで設定しておきましょう。
参考文献:最初に起動した後 - ZFS に Arch Linux をインストール - ArchWiki
ここに「/etc/hostid に hostid を書き出してから initramfs イメージを再生成する方法もあります」と書かれているので、その為の仕込みをします。

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

chroot、タイムゾーン

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

ロケール

どの文字コードを有効にしても良いんですが。私は日本語系を全て有効にしました。いわゆる Shift_JIS、そのMicrosoftの方言である cp932 も有効にしておきます。

# 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.
# localedef -f WINDOWS-31J -i ja_JP ja_JP.sjis
# echo LANG=C >/etc/locale.conf
# echo KEYMAP=jp106 >/etc/vconsole.conf

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

ホストネーム

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

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

Initramfs

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

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

initramfsを生成。

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

## Rootパスワード

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

ブートローダー

GRUB をインストールします。

参考文献: BIOS マザーボードの場合 - ブートローダーのインストールと設定 - ZFS に Arch Linux をインストール - ArchWiki

パーティションレスディスクへのインストールってのもありましたけど、推奨されていないとの事。動作原理を考えれば当然です。

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

# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 573.2M  1 loop
sda      8:0    0 465.8G  0 disk
|-sda1   8:1    0 465.8G  0 part
`-sda9   8:9    0     8M  0 part
sdb      8:16   0 465.8G  0 disk
|-sdb1   8:17   1     8M  0 part
`-sdb9   8:25   1    64M  0 part
sdc      8:32   1   7.3G  0 disk
|-sdc1   8:33   1   686M  0 part
`-sdc2   8:34   1    64M  0 part
sdd      8:48   1  14.7G  0 disk
`-sdd1   8:49   1  14.7G  0 part
sr0     11:0    1  1024M  0 rom

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

参考文献1: 2.3.1.2 USB スティックにインストール - GRUB - ArchWiki
参考文献2: GRUB2 からZFS rootの FreeBSDの起動を試す - とりあえず TBD

残りの領域は捨てても良いんですが、折角なので使えるようにフォーマットしておきます。念の為 FAT32 にしておきます。

# exit
exit
# wipefs -a /dev/sdd
/dev/sdd: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdd: calling ioctl to re-read partition table: Success
# sfdisk /dev/sdd <<___
\`heredoc> ,16M
\`heredoc> ,
\`heredoc>___
  〈省略〉
# mkfs.fat /dev/sdd1
mkfs.fat 4.1 (2017-01-24)
# mkfs.fat -F32 /dev/sdd2
mkfs.fat 4.1 (2017-01-24)
# arch-chroot /mnt
# mount /dev/sdd1 /mnt
# grub-install —-target=i386-pc —-boot-directory=/mnt/boot /dev/sdd
Installing for i386-pc platform.
Installation finished. No error reported.
# cd /dev/disk/by-id/
# for p in /dev/sda /dev/sdb; do ls ata-* | while read d; do if [ "$(readlink -f $d)" = "$p" ]; then echo "/dev/$d"; fi; done | xargs -rt ln -s "$p"; done
ln -s /dev/sda /dev/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470
ln -s /dev/sdb /dev/ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276
# 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-05-04 18:34:18.000000000 +0900
+++ grub.cfg    2019-05-04 18:36:56.000000000 +0900
@@ -84 +84,2 @@
-       insmod gzio
+       search --set --label tank
+       insmod zfs
@@ -87 +88 @@
-       linux /main@/boot/vmlinuz-linux root=ZFS=/main rw  quiet
+       linux /main@/boot/vmlinuz-linux zfs=tank/main rw
@@ -95 +96,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -98 +100 @@
-               linux /main@/boot/vmlinuz-linux root=ZFS=/main rw  quiet
+               linux /main@/boot/vmlinuz-linux zfs=tank/main rw
@@ -105 +107,2 @@
-               insmod gzio
+               search --set --label tank
+               insmod zfs
@@ -108 +111 @@
-               linux /main@/boot/vmlinuz-linux root=ZFS=/main rw  quiet
+               linux /main@/boot/vmlinuz-linux zfs=tank/main rw
# rm grub.org
# sync
# cd
# umount /mnt

ネットワーク

ネットワークを有効にします。

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

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

参考文献:CentOS 7のネットワーク名「enp1s0」という文字列の謎に迫る

従って面倒な設定は省きます。
とするとやる事はDHCPクライアントの設定になりますが、今回は最初にLANを自力設定したので、その時に用意したファイルをコピーするだけです。

# exit
exit
# cp --parents /etc/systemd/network/all.network /mnt

名前解決は /etc/resolv.conf ではなくて、systemd-resolved を使用するようですが、これも最初の自力設定時に設定済。

# ln -fs /run/systemd/resolve/resolv.conf /mnt/etc/resolv.conf

デフォルトで /etc/nsswitch.conf の hosts: 行に resolve が書かれているようですので、それを確認。

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

再起動

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

# cd
# zfs umount -a
# zpool export tank
# shutdown -h now

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

最初に起動した後

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

rootログイン

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


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

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

ネットワークの名前解決

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

ZFS の設定

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

# mount | grep zfs
tank/main on / type zfs (rw,relatime,xattr,noacl)

やったね :thumbsup_tone1:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?