0
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 と無線LANをインストール@ノートパソコン3台目(UEFI)

Last updated at Posted at 2019-04-14

(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

やったね :thumbsup_tone1:

0
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
0
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?