(2020/07/05 追記ここから)
ZFSを使う場合は、ちょっと古いカーネルを利用した方が良さそうです。そのためLTS版カーネルでインストールする事にしました。その手順は下記になりますので、そちらをご覧ください。
俺様サーバー構築記 - ZFS の上に Arch Linux と無線LANをインストール; やり直し(Linux-LTS)@ノートパソコン(UEFI+wifi)
(2020/07/05 追記ここまで)
「俺様サーバー構築記 - 基本方針」に基づいて、自宅サーバーの構築を目指して Arch Linux + ZFS をインストールしてきて早3台目。前回はHDDの中身をバックアップしました。今回は Arch Linux のインストールです。
今回のノートパソコンは無線LANインターフェイスが内蔵されているので、インストール時からすべて無線LANを使ってみます。また最近のマシンらしくUEFIなので、その為の設定も行います。
参考文献1: 俺様サーバー構築記 - ZFS の上に Arch Linux をインストール@ノートパソコン(BIOS)
参考文献2: 俺様サーバー構築記 - archiso で無線LANを使って Windows が入っている HDD をバックアップ@ノートパソコン3台目(UEFI)
インストールの準備
「俺様サーバー構築記 - ZFSをarchisoに埋め込む@物理マシン(BIOS)」で作ったZFS埋め込みarchisoを焼き付けたUSBメモリを使用します。このUSBメモリをマシンに挿して電源を入れ、BIOSでブートメディアを設定。
そして起動すると、いつもの Arch Linux インストールメディアのメニューが出ます。
後はいつも通りに操作して起動します。
キーボード
# loadkeys jp106
コンソールフォント
コンソールフォントはそのまま変更しません。日本語が表示されればそれなりに便利そうだけども、当面は必要無いと判断。
起動モードの確認
UEFIだという事はわかっていますが念の為。エラーは発生せず、UEFI変数が表示されます。
# ls /sys/firmware/efi/efivars
〈表示内容省略〉
パーティション
HDDを確認しておきます。Windowsが入っていたせいか、訳の分からないパーティション分けが見えます。
# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 /dev/sdb /dev/sdb1 /dev/sdb2
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 298.1G 0 disk
├sda1 8:1 0 400M 0 part
├sda2 8:2 0 260M 0 part
├sda3 8:3 0 128M 0 part
├sda4 8:4 0 285G 0 part
└sda5 8:5 0 12.3G 0 part
sdb 8:16 1 7.3G 0 disk
├sdb1 8:17 1 686M 0 part /run/archiso/bootmnt
└sdb2 8:18 1 64M 0 part
/dev/sdb
とその眷属(/dev/sdb1
/dev/sdb2
)は、起動する時に使用したUSBメモリです。mountコマンドの結果にそれが表れます。
# 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の商品名などと突き合わせればハッキリするでしょう。
# ls -l /dev/disk/by-id
total 0
lrwxrwxrwx 1 root root 9 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17 -> ../../sda
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part5 -> ../../sda5
lrwxrwxrwx 1 root root 10 Apr 7 15:23 ata-ST320LT012-1DG14C_S3P11L17-part5 -> ../../sda5
lrwxrwxrwx 1 root root 9 Apr 7 15:23 usb-058f_6387_17082208002200-0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 Apr 7 15:23 usb-058f_6387_17082208002200-0:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Apr 7 15:23 usb-058f_6387_17082208002200-0:0-part2 -> ../../sdb2
lrwxrwxrwx 1 root root 9 Apr 7 15:23 wwn-0x5000c5006d071946 -> ../../sda
lrwxrwxrwx 1 root root 10 Apr 7 15:23 wwn-0x5000c5006d071946-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Apr 7 15:23 wwn-0x5000c5006d071946-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Apr 7 15:23 wwn-0x5000c5006d071946-part3 -> ../../sda3
lrwxrwxrwx 1 root root 10 Apr 7 15:23 wwn-0x5000c5006d071946-part4 -> ../../sda4
lrwxrwxrwx 1 root root 10 Apr 7 15:23 wwn-0x5000c5006d071946-part5 -> ../../sda5
最後のwwn-
何とかいうデバイス名の正体が不明ですが、今回は関係無いので放置!
という訳で /dev/sda
がHDDです。
デバイスを確認した所で、HDDにパーティションを切ります…が、
1.11 性能が今ひとつなんだけど。 - ZFS on Linux FAQという記事を発見。
ディスク全体を使ってpoolを作成する: ディスク全体を指す名前を使ってzpool createを実行します。こうするとZFSは、正しい配置になるように自動的にパーティションを作成します。さらにwholedisk設定のおかげで他のZFS実装との相互運用性も改善されます。
ZFSに詳しい方にとっては常識なのだと思いますけども。そういう訳でパーティションを一切作りません。内蔵HDDだけでは完結しなくてちょっと悔しいですが、ブートに関しては外部メディアに頼る事にします。詳しくは後述。
また以前も書きましたが、一応、HDDフォーマットの前に wipefs
コマンドを実行します。
スワップ領域については パーティショニング - ArchWiki の [パーティションの大きさはどうすればいいですか?] に下記のような記述があります。
大容量のメモリ(1024MB 以上)を積んでいるときは、スワップパーティションは小さく、または作らなくてもかまわないでしょう。2GB 以上の物理 RAM を持っているなら、スワップパーティションがないほうが一般的に良いパフォーマンスを発揮すると思われます。
これを信じてスワップパーティションは作りません。
# wipefs -a /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 0x4a85d55e00 (gpt): 45 46 49 20 50 41 52 54
/dev/sda: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
/dev/sda: 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
# 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-ST320LT012-1DG14C_S3P11L17
# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
ata-ST320LT012-1DG14C_S3P11L17 ONLINE 0 0 0
errors: No known data errors
最後のエラー「No known data errors」は「既知のエラーは何も無い」という意味です。だったら「Success」とか「ok」とか表示してくれればいいのに…
メインのファイルシステムとして tank/main を作成します。
# zfs create -o mountpoint=/ tank/main
cannot mount '/': directory is not empty
filesystem successfully created, but not mounted
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 456K 289G 96K /tank
tank/main 96K 289G 96K /
また、今回もサブファイルシステムを作りません。/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)
tank on /mnt/tank type zfs (rw,xattr,noacl)
# find /mnt
/mnt
/mnt/tank
/mnt/tank は不要です。
# zfs umount /mnt/tank
# rmdir /mnt/tank
最後に、新しいシステムに zpool.cache ファイルをコピーします。そしてイヤらしい事に、 /etc/zfs/zpool.cache は存在するんですが中身がありません。最初はこれに気付かなくてエライ目に遭いました。
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 Apr 7 16:12 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 1440 Apr 7 16:15 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt
bootパーティションのマウント
USB端子に挿すとほんのわずかしか飛び出さないタイプのUSBメモリを購入してきました。先週購入したら、最小容量が16GBに倍増していました。お値段は据え置き410円!
これを、生きているUSB端子に挿します。
# 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 298.1G 0 part
└sda9 8:9 0 8M 0 part
sdb 8:16 1 7.3G 0 disk
├sdb1 8:17 1 686M 0 part /run/archiso/bootmnt
└sdb2 8:18 1 64M 0 part
sdc 8:32 1 14.7G 0 disk
└sdc1 8:33 1 14.7G 0 part
/dev/sdc が新しいUSBメモリです。調べると何やらWindows用のツールが入っているようですが、今回は不要なので全部廃棄。そして ESP を作成します。
参考文献1: 2.3.1.2 USB スティックにインストール - GRUB - ArchWiki
参考文献2: 1.1 GPT でパーティションされたディスク - 1 パーティションの作成 - EFI システムパーティション - ArchWiki
参考文献3: GRUB2 からZFS rootの FreeBSDの起動を試す - とりあえず TBD
# 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
# sgdisk -n0::+512M -t0:0xEF00 -n0:: /dev/sdc
Creating new GPT entries in memory.
The operation has completed successfully.
# sgdisk -p /dev/sdc
Disk /dev/sdc: 30843880 sectors, 14.7 GiB
Model: Cruzer Fit
Sector size (logical/physical): 512/512 bytes
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 30842846
Partitions will be aligned on 2048-sector boundaries
Total free space is 2014 sectors (1007.0 KiB)
Number Start (sector) End (sector) Size Code Name
1 2048 1050623 512.0 MiB EF00
2 1050624 30842846 14.2 GiB 8300
# mkfs.fat -F32 /dev/sdc1
mkfs.fat 4.1 (2017-01-24)
# mkdir -p /mnt/boot/efi
# mount /dev/sdc1 /mnt/boot/efi
無線LAN
ここで無線LANを設定します。
ドライバーの状態を確認する
# lspci -k | grep -i wireless
01:00.0 Network controller: Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe
$ lspci -ks 01:00.0
01:00.0 Network controller: Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe
DeviceName: Ralink RT3290LE 802.11bgn Wi-Fi Adapter
Subsystem: Hewlette-Packard Company Ralink RT3290LE 802.11bgn 1x1 Wi-Fi and Bluetooth 4.0 Combo Adapter
Kernel driver in use: rt2800pci
Kernel modules: rt2800pci, wl
無線インターフェイスが作成されているか確認。
(2020/02/02 修正)
デバイス名は wlo1 ではなくて、従来型の wlan0 になるのが正しいようです。
以下、誤って書いてしまった wlo1 は、適宜 wlan0 に修正します。
# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether 00:11:22:33:44:b2 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:11:22:33:44:c5 brd ff:ff:ff:ff:ff:ff
無線インターフェイスを起こして確認。
# ip link set wlan0 up
# ip link show wlan0
3: wlo1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 00:11:22:33:44:c5 brd ff:ff:ff:ff:ff:ff
<
>
で囲まれた部分に UP
の文字が見えたら起きています。その後に続く文字列の中の status DOWN
は無視しましょう。
ワイヤレス管理
情報を取得する
# iw dev
phy#0
Interface wlan0
ifindex 3
wdev 0x1
addr 00:11:22:33:44:c5
type managed
txpower 20.00 dBm
# iw dev wlan0 link
Not connected.
アクセスポイント検索
# iw dev wlan0 scan | grep SSID
SSID: 〈我が家のアクセスポイントのSSID〉
〈以下省略〉
関連付け
参考文献:WPA supplicant - ArchWiki
/etc/wpa_supplicant/wpa_supplicant.conf
は存在しません。
# ls -a /etc/wpa_supplicant/
. ..
必要な内容で作成し、コマンドを実行します。
# cat >/etc/wpa_supplicant/wpa_supplicant.conf <<___
\`heredoc> ctrl_interface=/run/wpa_supplicant
\`heredoc> update_config=1
\`heredoc> ___
# wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant
wpa_cli
コマンドを使って操作します。
# wpa_cli
wpa_cli v2.6
Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi> and contributors
This software may be distributed under the terms of the BSD license.
See README for more details.
Selected interface 'wlan0'
Interactive mode
> scan
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-NETWORK-NOT-FOUND
> scan_results
bssid / frequency / signal level / flags / ssid
aa:bb:cc:dd:6e:f3 2462 -39 [WPA2-PSK-CCMP][ESS] 〈我が家のSSID〉
〈省略〉
> add_network
0
> set_network 0 ssid "〈我が家のSSID〉"
OK
> set_network 0 psk "〈我が家のSSIDのパスワード〉"
OK
> enable_network 0
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>SME: Trying to authenticate with aa:bb:cc:dd:6e:f3 (SSID='〈我が家のSSID〉' freq=2462 MHz)
<3>Trying to associate with aa:bb:cc:dd:6e:f3 (SSID='〈我が家のSSID〉' freq=2462 MHz)
<3>Associated with aa:bb:cc:dd:6e:f3
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-REGDOM-CHANGE init=COUNTRY_IE type=COUNTRY alpha2=JP
<3>WPA: Key negotiation completed with aa:bb:cc:dd:6e:f3 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to aa:bb:cc:dd:6e:f3 completed [id=0 id_str=]
> save_config
OK
> quit
ネットワーク
IPv4で接続する為の設定です。
# cat >/etc/systemd/network/all.network <<___
\`heredoc> [Match]
\`heredoc> Name=*
\`heredoc>
\`heredoc> [Network]
\`heredoc> DHCP=ipv4
\`heredoc> ___
# systemctl start systemd-networkd
# ip addr show wlan0
3: wlo1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:11:22:33:44:c5 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.2/24 brd 10.0.0.255 scope global dynamic wlo1
valid_lft 86377sec preferred_lft 86377sec
inet6 fe80::5635:30ff:fe9b:f8c5/64 scope link
valid_lft forever preferred_lft forever
家庭内無線LANに接続できました!
最後に名前解決を設定します。
参考文献: 必要なサービスと設定 - 基本的な使い方 - systemd-networkd - ArchWiki
# systemctl start systemd-resolved
インターネットへの接続
ネットワーク環境が確立しているかどうか、外部へのpingによって確認します。
(2020/02/02 修正ここから)
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=120 ms
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=2 ttl=52 time=117 ms
--- example.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 117.494/118.956/120.418/1.462 ms
システムクロックの更新
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: Sun 2019-04-07 07:35:38 UTC
Universal time: Sun 2019-04-07 07:35:38 UTC
RTC time: Sun 2019-04-07 07:35:38
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-04-07 16:35:32 UTC; 8h left
Docs: man:systemd-timesyncd.service(8)
Main PID: 1329 (systemd-timesyn)
Status: "Synchronized to time server 133.243.238.164:123 (ntp.nict.jp)."
Tasks: 2 (limit: 1929)
CGroup: /system.slice/systemd-timesyncd.service
└1329 /usr/lib/systemd/systemd-timesyncd
Apr 07 16:35:32 archiso systemd[1]: Starting Network Time Synchronization...
Apr 07 16:35:32 archiso systemd[1]: Started Network Time Synchronization.
Apr 07 07:35:33 archiso systemd-timesyncd[1329]: Synchronized to time server 133.243.238.164: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
ベースシステムのインストール
このマシンは UEFI ですが、今回はブートローダとして GRUB を使います。その為 efibootmgr もインストールします。
今時は、CPUのデバッグ用パッチもOSが面倒を見るらしい。その為のパッケージ intel-ucode も落としておきます。
ZFSと無線LANの関連パッケージも落とします。
とりあえず現時点で必要最小限のパッケージはこれだけ。他に必要なパッケージは、必要に迫られた時に追加する事にします。
(2020/02/02 修正ここから)
パッケージの構成がいろいろ変わったようです。
# pacstrap /mnt base linux linux-firmware linux-headers zfs-dkms vi man-db man-pages texinfo intel-ucode iw wpa_supplicant grub efibootmgr
〈表示省略〉
(2020/02/02 修正ここまで)
dkms install(splとzfsの両方)で何やらエラーが出るんですが…
[ 2107.470384] i2c i2c-7: sendbytes: error -110
[ 3285.164134] i2c i2c-7: readbytes: ack/nak timeout
[ 2107.4703841]
の数値だけ異なる同様のエラーが数回連続します。調べてみたんですが全くわからん!何が起きているのでしょう… どうもハードウェア絡みのようなんですが。他のマシンと違うのは無線LANくらいなので、無線LANで何かが起きていると思われます。状況も原因も対策も何もかも不明ですが、特に問題が起きているようにも見えないので、ひとまず放置します。
システムの設定
pacman.conf
pacman.conf ファイルに zfs 関連のリポジトリを追記。これを忘れると、カーネルのアップグレードの際にzfsモジュールが追従しなくて酷い目に遭います。というか遭いました…
追記に当たってはヒアドキュメントを使ってもいいんですが、その場合は $repo のドル記号をバックスラッシュでエスケープして $repo とする必要があります。どっちでもいいんですけど、ちょっと面倒臭いんで、標準入力からキーボード入力します。こんな細っかい使い分けなんかどうでもいいですが。
(2020/02/02 修正ここから)
エスケープする必要の無いヒアドキュメントの書き方を覚えたので、以下はそのように修正します。
# cd /mnt
# cat >>etc/pacman.conf <<'___'
\`heredoc>
\`heredoc> [archzfs]
\`heredoc> SigLevel = Never
\`heredoc> Server = http://archzfs.com/$repo/x86_64
\`heredoc> ___
fstab
# genfstab -U -p . >>etc/fstab
# cat /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# tank/main
tank/main / zfs rw,xattr,noacl 0 0
# /dev/sdc1
UUID=171E-25B8 /boot/efi vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
(2020/02/02 修正ここまで)
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
ロケール
どの文字コードを有効にしても良いんですが。私は日本語系を全て有効にしました。
# 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 にしておきましょう。文字化けが非常に鬱陶しい事になります。
ホストネーム
マシンに名前を付けます。こういうのはセンスが出ますよね。なんて思うのは私だけ?
# 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 をインストールします。今回は UEFI である事に注意。ESP (EFI System Partition) は外部のUSBメモリに作成し、そこに GRUB をインストールします。 /dev/sda はデバイス丸ごと ZFS に任せたいので。
参考文献: 3 UEFI システム - GRUB - ArchWiki
# 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-ST320LT012-1DG14C_S3P11L17
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --boot-directory=/boot/efi --bootloader-id=grub
Installing for x86_64-efi platform.
Installation finished. No error reported.
# cd /boot/efi/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-04-13 23:30:38.000000000 +0900
+++ grub.cfg 2019-04-13 23:35:16.000000000 +0900
@@ -84 +84,2 @@
- insmod gzio
+ search --set --label tank
+ insmod zfs
@@ -87 +88 @@
- linux /main@/boot/vmlinuz-linux root=ZFS=/ 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=/ 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=/ rw quiet
+ linux /main@/boot/vmlinuz-linux zfs=tank/main rw
# rm grub.org
# sync
# cd
# umount /boot/efi
ネットワーク
ネットワークを有効にします。
# 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.
起動時に無線LANが自動接続されるように設定。
# systemctl enable wpa_supplicant@wlo1
Created symlink /etc/systemd/system/multi-user.target.wants/wpa_supplicant@wlo1.service → /usr/lib/systemd/system/wpa_supplicant@.service.
# exit
exit
# cp /etc/wpa_supplicant/wpa_supplicant.conf /mnt/etc/wpa_supplicant/wpa_supplicant-wlo1.conf
NICのデバイス名についてですが。
systemdを使用すると、デバイス名を固定してくれるようです。
参考文献:CentOS 7のネットワーク名「enp1s0」という文字列の謎に迫る
従って面倒な設定は省きます。
とするとやる事はDHCPクライアントの設定になりますが、最初の無線LAN設定時に用意したファイルをコピーするだけです。
# cp --parents /etc/systemd/network/all.network /mnt
名前解決は /etc/resolv.conf
ではなくて systemd-resolved を使用するようですが、これも最初の無線LAN設定時に設定済。
# 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.7-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)
更にインターネット接続を確認:
# 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.51 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=7.99 ms
--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 7.994/8.251/8.508/0.257 ms
やったね