「俺様サーバー構築記 - 基本方針」に基づく作業の続き。以前インストールしたサーバに仕立てるデスクトップパソコンに、LTS版Linux + ZFSでインストールをやり直します。
ノートパソコンへのインストールとの違いは、このデスクトップパソコンはHDDが2台入っている点です。以前同様、zfsでミラーリングを設定します。
なお前回も書きましたが、インストーラをLTS版にする必要は無さそうですな。LTS版カーネルによるインストーラ作成手順に意味が無い訳では無いですけど。カーネル改変でzfsが対応していない期間にインストーラを作成できない事になったら大変ですし。
参考文献1: 俺様サーバー構築記 - ZFS の上に Arch Linux をインストール;やり直し@デスクトップパソコン(BIOS)
参考文献1: 俺様サーバー構築記 - ZFS の上に Arch Linux をインストール; やり直し(Linux-LTS)@ノートパソコン(BIOS)
参考文献2: 俺様サーバー構築記 - ZFSをarchisoに埋め込む(linux-lts)@VirtualBox(UEFI)
前書き:マシンスペック
そういえばスペックを書いていなかった気がします。
機種:Inspiron 530s
CPU: Intel Core2 Duo E8500
クロック: 3.16GHz
メモリ: 8GB
HDD: 500GB×2台
化石のようなふっっっるいマシンなので、CPUがあり得ないほどしょぼいですな…
会社が廃棄処分にした物をロハで貰ったから文句は言えませんが。
インストールの準備
何はともあれ、ローカルに溜め込んだファイルが無いか確認。あればどこかに保存します。完全にフォーマットからやり直して、ローカルの内容を全部吹っ飛ばすつもりなので。
それとマシン名も確認。同じ名前で作成します。マシン名も有限な資源の一つ。特に、何らかの規則で自分だけの微笑ましい名前を付けてる場合は重要…
ブートメディアは、現時点ではUSBメモリになってる筈。もし違うようならBIOS画面で設定します。
ここまでやってから、前回の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を確認しておきます。何だか訳の分からないパーティションになってますが。
# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda9 /dev/sdb /dev/sdb1 /dev/sdb9 /dev/sdc /dev/sdc1 /dev/sdc2 /dev/sdd /dev/sdd1 /dev/sdd2
lsblkコマンドを使うと、多少整理されて見えます。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 621M 1 loop /run/archiso/sfs/airootfs
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 0 465.8M 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 1 14.7G 0 disk
├─sdc1 8:33 1 16M 0 part
└─sdc2 8:34 1 14.7G 0 part
sdd 8:48 1 7.3G 0 disk
├─sdd1 8:49 1 736M 0 part /run/archiso/bootmnt
└─sdd2 8:50 1 64M 0 part
sr0 11:0 1 1024M 0 rom
このマシンはHDDを2台積んでいます(/dev/sda
/dev/sdb
)
/dev/sdc
とその眷属(/dev/sdc1
/dev/sdc2
)は、今まで起動用に使っていたUSBメモリですね。/dev/sdc1
にGRUBを入れていて、/dev/sdc2
はFAT32でフォーマットしてある外部記憶装置扱いの部分です。
/dev/sdd
とその眷属(/dev/sdd1
/dev/sdd2
)が起動する時に使用したUSBメモリです。mountコマンドの結果にそれが表れます。
# mount | grep /dev/sd
/dev/sdd1 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 Jul 4 13:41 ata-TSSTcorp_DVD+_-RW_TS-H653F -> ../../sr0
lrwxrwxrwx 1 root root 9 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7949276-part9 -> ../../sdb9
lrwxrwxrwx 1 root root 9 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470 -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 ata-WDC_WD5003ABYX-50WERA1_WD-WMAYP7972470-part9 -> ../../sda6
lrwxrwxrwx 1 root root 9 Jul 4 13:41 usb-058f_6387_17082208002200-0:0 -> ../../sdd
lrwxrwxrwx 1 root root 10 Jul 4 13:41 usb-058f_6387_17082208002200-0:0-part1 -> ../../sdd1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 usb-058f_6387_17082208002200-0:0-part2 -> ../../sdd2
lrwxrwxrwx 1 root root 9 Jul 4 13:41 usb-SanDisk__Cruzer_Fit_4C530000100129117210-0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 Jul 4 13:41 usb-SanDisk__Cruzer_Fit_4C530000100129117210-0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 usb-SanDisk__Cruzer_Fit_4C530000100129117210-0:0-part2 -> ../../sdc2
lrwxrwxrwx 1 root root 9 Jul 4 13:41 wwn-0x50014ee003d2be9e -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 4 13:41 wwn-0x50014ee003d2be9e-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 wwn-0x50014ee003d2be9e-part9 -> ../../sda9
lrwxrwxrwx 1 root root 9 Jul 4 13:41 wwn-0x50014ee059271534 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jul 4 13:41 wwn-0x50014ee059271534-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Jul 4 13:41 wwn-0x50014ee059271534-part9 -> ../../sdb9
最後のwwn-
何とかいうデバイス名の正体が不明ですが、今回は関係無いので放置!
という訳で /dev/sda
と /dev/sdb
がHDDです。ちなみに /dev/sr0
は、デバイスIDからわかる通りDVDドライブです。
デバイスを確認した所で、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/sdb
/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: 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
/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 を作成します。今回は2台のHDDをミラーリングします。
この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
# zpool status
pool: tank
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
mirror-0 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 のマウントポイントは削除しますが、念の為noneではなく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 148K 449G 24K legacy
tank/main 24K 449G 24K /
サブファイルシステム
サブファイルシステムを作ります。
今までの経験からユーザデータは分離した方が何かと都合が良い事がわかりました。システムがぶっ壊れた場合にもユーザデータを保護できるよう、システムとユーザの領域を分離します。その為にサブファイルシステムを用意します。
参考文献: 俺様サーバー構築記 - 待機系構築を睨んだディレクトリ構造の変更@デスクトップパソコン; やり直し
以下の4つのディレクトリをサブファイルシステムにします。
/home
/opt
/srv
/var/opt
後日検討してもっと増える可能性もあります。例えば /usr
ディレクトリは元々複数マシン間で共有対象となるコマンドなどの置き場所として FHS で仕様化されていますが、今回の用途では共有不要と考えました。その辺で判断が変わる可能性が無きにしも非ず。
参考文献: 重ね重ね・ArchLinux インストール覚書
しかしマウントポイントは、なぜかうまく効いてくれません。理由がわからなくて、諦めました… genfstab
の都合で設定しておきますが、後で /etc/fstab
を作成したらlegacyに変更します。
# 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-journald
# zfs set xattr=sa acltype=posixacl tank/sub0/var
ブート用の設定
ルートファイルシステムに bootfs プロパティを設定します。
# zpool set bootfs=tank/main tank
プール tank をエクスポートして、/mnt
以下にインポートし直します。
# 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/sub0/home on /mnt/home type zfs (rw,xattr,noacl)
tank/sub0/srv on /mnt/srv type zfs (rw,xattr,noacl)
tank/sub0/var/opt on /mnt/var/opt type zfs (rw,xattr,posixacl)
tank/sub0/opt on /mnt/opt type zfs (rw,xattr,noacl)
最後に、新しいシステムに zpool.cache ファイルをコピーします。そしてイヤらしい事に、 /etc/zfs/zpool.cache
は存在するんですが中身がありません。最初はこれに気付かなくてエライ目に遭いました。
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 Jul 4 14: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 2216 Jul 4 14:18 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt
bootパーティションのマウント
bootパーティションが無いのでマウントはしません。ディレクトリを作るだけです。
# mkdir /mnt/boot
インターネットへの接続
ネットワーク環境が確立しているかどうか、外部へのpingによって確認します。
# 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=9.77 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=8.22 ms
--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 8.224/8.998/9.773/0.774 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: Sat 2020-07-04 14:26:12 UTC
Universal time: Sat 2020-07-04 14:26:12 UTC
RTC time: Sat 2020-07-04 14:26:12
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 2020-07-04 14:22:09 UTC; 4min 53s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 1566 (systemd-timesyn)
Status: "Initial synchronization to time server 66.205.120.130:123 (ntp.nict.jp)."
Tasks: 2 (limit: 9488)
Memory: 1.6M
CGroup: /system.slice/systemd-timesyncd.service
└─1566 /usr/lib/systemd/systemd-timesyncd
Jul 04 14:22:08 archiso systemd[1]: Starting Network Time Synchronization...
Jul 04 14:22:09 archiso systemd[1]: Started Network Time Synchronization.
Jul 04 14:22:08 archiso systemd-timesyncd[1566]: Initial synchronization to time server 66.205.120.130:123 (ntp.nict.jp).
インストール
ミラーの選択
日本ならJapanをリスト先頭に持ってきましょう。っていうか、Japanだけ抜き出しました。下手に編集などするよりもコマンドが簡単なので。
# cd /etc/pacman.d
# sed -i -ne"/^#.*Japan/,+1 p" mirrorlist
ベースシステムのインストール
このマシンは UEFI ですが、今回はブートローダとして GRUB を使います。その為 efibootmgr もインストールします。
今時は、CPUのデバッグ用パッチもOSが面倒を見るらしい。その為のパッケージintel-ucodeも落としておきます。
ZFSと無線LANの関連パッケージも落とします。
今回は普段使いの為のインストールなので、manなどもインストールしておきます。マニュアルだいじ。超だいじ。
とりあえず現時点で必要最小限のパッケージはこれだけ。他に必要なパッケージは、必要に迫られた時に追加する事にします。
# pacstrap /mnt base linux-lts zfs-linux-lts linux-firmware vi intel-ucode grub man-db man-pages texinfo
システムの設定
pacman.conf
# 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
fstabを作成した後は、各サブファイルシステムのマウントポイントをlegacyにしておきます。mountpointを設定しておいても、なぜかうまくいかないので。原因がわからなくて諦めました…
# for d in /home /opt /srv /var/opt; do zfs set mountpoint=legacy tank/sub0$d; done
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
ロケール
どの文字コードを有効にしても良いんですが。私は日本語系を全て有効にしました。個人的な好みでEUCは必須。最近の世界の流れも無視できないのでUTF-8も有効に。
# 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-lts
〈表示省略〉
但し、途中で警告が出た:
==> 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をインストール
外部のUSBメモリに GRUB をインストールします。起動用メディアを別に用意しなければならないのも業腹ですが、仕方ありませんな。
以前から使っていた小さなUSBメモリをUSB端子に挿しっ放しにしてあるので、これをそのまま流用します。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 621M 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 0 465.8M 0 part
└─sdb9 8:25 0 8M 0 part
sdc 8:32 1 14.7G 0 disk
├─sdc1 8:33 1 16M 0 part
└─sdc2 8:34 1 14.7G 0 part
sdd 8:48 1 7.3G 0 disk
├─sdd1 8:49 1 736M 0 part
└─sdd2 8:50 1 64M 0 part
sr0 11:0 1 1024M 0 rom
該当のUSBメモリは/dev/sdc
です。ここにGRUBを上書きインストールします。
参考文献: 3 UEFI システム - GRUB - ArchWiki
boot用USBメモリをここでマウントします。
# 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)
USBメモリの余った領域は、FAT32でフォーマットして自由に使えるように解放します。FAT32なら、万が一の場合はWindowsマシンでも読み出せますので。
# mkfs.fat -F32 /dev/sdc2
mkfs.fat 4.1 (2017-01-24)
前準備が終わったのでGRUBをインストールします。
# 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/
# 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-lts
Found initrd image: /boot/intel-ucode.img /boot/initramfs-Linux-lts.img
/usr/bin/grub-probe: error: unknown filesystem.
/usr/bin/grub-probe: error: unknown filesystem.
Found fallback initrd image(s) in /boot: initramfs-linux-lts-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 2020-07-04 23:57:06.000000000 +0900
+++ grub.cfg 2020-07-04 23:58:58.000000000 +0900
@@ -84 +84,2 @@
- insmod gzio
+ search --set --label tank
+ insmod zfs
@@ -87 +88 @@
- linux /main@/boot/vmlinuz-linux-lts root=ZFS=/main rw loglevel=3 quiet
+ linux /main@/boot/vmlinuz-linux-lts zfs=tank/main rw
@@ -95 +96,2 @@
- insmod gzio
+ search --set --label tank
+ insmod zfs
@@ -98 +100 @@
- linux /main@/boot/vmlinuz-linux-lts root=ZFS=/main rw loglevel=3 quiet
+ linux /main@/boot/vmlinuz-linux-lts zfs=tank/main rw
@@ -105 +107,2 @@
- insmod gzio
+ search --set --label tank
+ insmod zfs
@@ -108 +111 @@
- linux /main@/boot/vmlinuz-linux-lts root=ZFS=/main rw loglevel=3 quiet
+ linux /main@/boot/vmlinuz-linux-lts 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.
# 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.
NICのデバイス名についてですが。
systemdを使用すると、デバイス名を固定してくれるようです。
参考文献:CentOS 7のネットワーク名「enp1s0」という文字列の謎に迫る
従って面倒な設定は省きます。
(2020/07/11 修正ここから)
現在はデフォルトで /etc/nsswitch.conf
の hosts: 行に resolve が書かれているようですので、それを確認。
# grep "^hosts:" /etc/nsswitch.conf | grep resolve
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
そしてIPアドレスの設定ですが。
このデスクトップパソコンはサーバに仕立てる予定なので、IPアドレスは固定にします。我が家のネットワーク構成では 172.16.0.3(仮) を割り当てるので、そのように設定します。
参考文献1: デスクトップパソコン - 俺様サーバー構築記 - dhcp サーバ冗長化@デスクトップパソコン
まず、このマシンは2枚のNICを持っています。
参考文献2: LinuxネットワークTip: MACアドレスを取得する
# find /sys/devices \! -path "*/virtual/*" -path "*/net" -exec ls {} \;
enp0s25
enp2s1
片方はオンボードで、もう片方はギガビットイーサのPCIネットワークカードです。オンボードの方は遅いのでケーブルを外してあります。
# 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:df brd ff:ff:ff:ff:ff:ff
inet 172.16.2.6/16 brd 172.16.255.255 scope global dynamic enp2s1
valid_lft 83091sec preferred_lft 83091sec
inet6 fe80::216:1ff:fe5c:19df/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 66:77:88:99:aa:94 brd ff:ff:ff:ff:ff:ff
こうしてみるとenp2s1の方が動いているNICのようです。こちらに固定IPアドレスを振ります。 enp0s25は放置でも良いんですが、こちらも固定で割り振っておきましょう。IP アドレス空間を広く取っているので無駄遣いしても問題ありませんし。
そして今回は、[Match]
にName
ではなくてMACAddress
を使ってみます。NIC名とMACaddressを結び付ける情報が他に無いので、何かあった場合にこれを見れば思い出せる…というもっともらしい理由ですが。知らない設定を試してみたかったというのが実の所
参考文献: systemd.network(5) - Arch manual pages
# cd /etc/systemd/network
# ls -a
. ..
# cat >enp2s1.network <<___
> [Match]
> MACAddress=$(find /sys/devices \! -path "*/virtual/*" -path "*/net/enp2s1/address" -execdir cat {} +)
>
> [Network]
> Address=172.16.0.3/16
> Gateway=172.16.0.1
> DNS=172.16.0.1
> ___
# cat >enp0s25.network <<___
> [Match]
> MACAddress=$(find /sys/devices \! -path "*/virtual/*" -path "*/net/enp0s25/address" -execdir cat {} +)
>
> [Network]
> Address=172.16.0.4/16
> Gateway=172.16.0.1
> DNS=172.16.0.1
> ___
(2020/07/11 修正ここまで)
再起動
マシンをシャットダウン。
# exit
exit
# cd
# zfs umount -a
# zpool export tank
# shutdown -h now
そして、インストールメディアであるUSBメモリを外した後に電源を入れます。GRUBをインストールしたUSBメモリはそのままにして、GRUBから起動するようにします。
最初に起動した後
ここまで問題が無ければ、再起動すると最初にGRUBのメニュー画面が表示されます。数秒放置するか、Enterキーを押すと起動します。
rootログイン
rootユーザーでログインします。パスワードは先ほどpasswdコマンドで設定した通り。
Arch Linux 5.4.50-1-lts (tty1)
〈ホスト名〉 login: root
Password: 〈root用パスワード〉
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)
tank/sub0/srv on /srv type zfs (rw,relatime,xattr,noacl)
tank/sub0/opt on /opt type zfs (rw,relatime,xattr,noacl)
tank/sub0/home on /home type zfs (rw,relatime,xattr,noacl)
tank/sub0/var/opt on /var/opt type zfs (rw,relatime,xattr,posixacl)
更にインターネット接続を確認:
# 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=19.9 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=22.4 ms
--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 19.097/21.169/22.442/1.272 ms
(2020/07/11 追記ここから)
自分自身のIPアドレスも確認します。
驚いた事に、hostname
コマンドがインストールされてないんですね。うひゃあ。
ip
コマンドでもいいんですが、情報量が多過ぎます。
という訳で今回はnetworkctl
コマンドを使ってみました。
# networkctl status
State: routable
Address: 172.16.0.3 on enp2s1
2408:211:1283:500:216:1ff:fe5c:19df on enp2s1
fe80::216:1ff:fe5c:19df on enp2s1
Gateway: 172.16.0.1 (NEC Paltforms, Ltd.) on enp2s1
fe80::5675:d0ff:fe97:eec8 (Cisco Systems, Inc) on enp2s1
DNS: 172.16.0.1
Jul 11 17:05:29 〈マシン名〉 systemd-networkd[535]: Enumeration completed
Jul 11 17:05:29 〈マシン名〉 systemd[1]: Started Network Service.
Jul 11 17:05:29 〈マシン名〉 systemd-networkd[535]: eth1: Interface name change detected, eth1 has been renamed to enp0s25.
Jul 11 17:05:29 〈マシン名〉 systemd-networkd[535]: eth0: Interface name change detected, eth0 has been renamed to enp2s1.
Jul 11 17:05:29 〈マシン名〉 systemd-networkd[535]: enp0s25: IPv6 successfully enabled
Jul 11 17:05:30 〈マシン名〉 systemd-networkd[535]: enp0s25: Link UP
Jul 11 17:05:30 〈マシン名〉 systemd-networkd[535]: enp2s1: IPv6 successfully enabled
Jul 11 17:05:30 〈マシン名〉 systemd-networkd[535]: enp2s1: Link UP
Jul 11 17:05:40 〈マシン名〉 systemd-networkd[535]: enp2s1: Gained carrier
Jul 11 17:05:41 〈マシン名〉 systemd-networkd[535]: enp2s1: Gained IPv6LL
う~ん、networkctl
だと有効なNICしか表示されないのか。ダメじゃん。-a
オプションを付けると表示が多過ぎるし、それなら素直にip addr
を使いたい。
# 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:df brd ff:ff:ff:ff:ff:ff
inet 172.16.0.3/16 brd 172.16.255.255 scope global dynamic enp2s1
valid_lft forever preferred_lft forever
inet6 2408:211:1283:500:216:1ff:fe5c:19df/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591879sec preferred_lft 604679sec
inet6 fe80::216:1ff:fe5c:19df/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 66:77:88:99:aa:94 brd ff:ff:ff:ff:ff:ff
おっと。enp0s25の方にはIPアドレスが設定されてなかった模様。どうせ使わないからいいか。
生きてるenp2s1の方は、指定したIPアドレス172.16.0.3がしっかり設定されました!
(2020/07/11 追記ここまで)
これで大丈夫でしょう。やったね