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 5 years have passed since last update.

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

Last updated at Posted at 2019-01-14

(2019/05/04 追記 ここから)
この物理マシンは、HDDを換装してインストールし直しました。
俺様サーバー構築記 - ZFS の上に Arch Linux をインストール;やり直し@物理マシン(BIOS)を参照して下さい。
(2019/05/04 追記 ここまで)

前回「俺様サーバー構築記 - ZFSをarchisoに埋め込む@物理マシン(BIOS)」の続きです。そこで作ったZFS埋め込みarchisoを使用して、物理マシンにArchLinuxをインストールします。

俺様サーバー構築に関する能書きは「俺様サーバー構築記 - 基本方針」を参照。

インストールの準備

ZFS関連ツールを埋め込んだarchisoを焼き付けたUSBメモリをマシンに挿して電源を入れます。起動すると、自動的にrootでログインしてプロンプトが表示されます。

キーボード

# loadkeys jp106

コンソールフォント

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

起動モードの確認

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

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

パーティション

一応HDDを確認しておきます。archisoを作ったりUSBメモリを挿したりしているので、少々わかりにくい表示になります。

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdc1  /dev/sdc2

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

# lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop     7:0    0 573.2M  1 loop /run/archiso/sfs/airootfs
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0   512M  0 part
└─sda2   8:2    0 297.6G  0 part
sdb      8:16   0 298.1G  0 disk
sdc      8:32   1   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 Jan 13 11:56 ata-ST3320620AS_9QF4W7SD -> ../../sda
lrwxrwxrwx 1 root root 10 Jan 13 11:56 ata-ST3320620AS_9QF4W7SD-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jan 13 11:56 ata-ST3320620AS_9QF4W7SD-part2 -> ../../sda2
lrwxrwxrwx 1 root root  9 Jan 13 11:56 ata-TSSTcorp_DVD+_-RW_TS-H653F -> ../../sr0
lrwxrwxrwx 1 root root  9 Jan 13 11:56 ata-WDC_WD3200AAKS-00B3A0_WD-WCAT14603857 -> ../../sdb
lrwxrwxrwx 1 root root  9 Jan 13 11:56 usb-058f_6387_17082208002200-0:0 -> ../../sdc
lrwxrwxrwx 1 root root 10 Jan 13 11:56 usb-058f_6387_17082208002200-0:0-part1 -> ../../sdc1
lrwxrwxrwx 1 root root 10 Jan 13 11:56 usb-058f_6387_17082208002200-0:0-part2 -> ../../sdc2
lrwxrwxrwx 1 root root  9 Jan 13 11:56 wwn-0x50014ee156ab43c7 -> ../../sdb

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

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

デバイスを確認した所で、HDDにパーティションを切ります。今回の用途の場合、最低でもbootパーティションを分ける必要があります。

前回書いた通り、デバイス丸ごとbtrfsしていた関係で、パーティショニングに先立って wipefs コマンドを実行します。

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

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

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

コマンドは sfdisk を利用します。

作業対象は、2台あるHDD両方です。

# wipefs -a /dev/sda /dev/sdb
/dev/sda: 2 bytes were erased at offset 0x000001fe (dos): 55 aa
/dev/sdb: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sda: calling ioctl to re-read partition table: Success
# cat >/tmp/partitions.txt <<___
\`heredoc> ,512M
\`heredoc> ,
\`heredoc>___
# cat /tmp/partitions.txt | sfdisk /dev/sda
Checking that no-one is using this disk right now ... OK
〈以下、長いので省略〉
# cat /tmp/partitions.txt | sfdisk /dev/sdb
Checking that no-one is using this disk right now ... OK
〈以下、長いので省略〉

Bootフラグは、ブートローダのインストール時に立ててくれるので、ここでは省略します。

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

ブートパーティションはFAT32。

# mkfs.fat -F32 /dev/sda1
mkfs.fat 4.1 (2017-01-24)
# mkfs.fat -F32 /dev/sdb1
mkfs.fat 4.1 (2017-01-24)

そしてルートパーティション。いよいよ 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 を見ればわかるんですが、シンボリックリンク先が相対パスになっているのがまた残念。

特に今回は複数台のHDDでミラーリングしようと考えました。そうすると一行野郎でまとめるのは少々無理があります。出来ないとは言いませんが、無理をするより分かり易さを優先して、下記のように実行します。

まあ、目で見れば済む話ですが。ここまで面倒臭いコマンドを実行する理由は、いずれこれをスクリプトにまとめたいからです。その為の布石なのでした。

# cd /dev/disk/by-id
# for p in /dev/sda2 /dev/sdb2; do ls ata-* | while read d; do if [ "$(readlink -f $d)" = "$p" ]; then echo "/dev/disk/by-id/$d"; fi; done; done >/tmp/devices.txt
# cat /tmp/devices.txt
/dev/disk/by-id/ata-ST3320620AS_9QF4W7SD-part2
/dev/disk/by-id/ata-WDC_WD3200AAKS-00B3A0_WD-WCAT14603857-part2
# cat /tmp/devices.txt | xargs -t zpool create -f tank mirror
zpool create -f tank mirror /dev/disk/by-id/ata-ST3320620AS_9QF4W7SD-part2 /dev/disk/by-id/ata-WDC_WD3200AAKS-00B3A0_WD-WCAT14603857-part2
# 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-ST3320620AS_9QF4W7SD-part2                   ONLINE      0     0     0
            ata-WDC_WD3200AAKS-00B3A0_WD-WCAT14603857-part2  ONLINE      0     0     0

errors: No known data errors

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

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

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

# zpool set bootfs=tank tank

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

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

ここで、マウントポイントの /mnt を確認します。/mnt の場合と /mnt/tank になっている場合があるようです。どうして2通りの結果になるのか、理由がわかりませんが。

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

今回は /mnt/tank でした。もし /mnt の場合は、以下の操作手順において /mnt/tank の個所を /mnt に読み替えて下さい。

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

# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 0 Jan 14 03:38 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 1872 Jan 14 03:40 /etc/zfs/zpool.cache
# cp --parents /etc/zfs/zpool.cache /mnt/tank

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

# mkdir /mnt/tank/boot
# mount /dev/sda1 /mnt/tank/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=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 が鉄板です。特殊事情が無ければこの一択。システム推奨なんか知りませ~ん。

# 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-14 03:43:19 UTC
           Universal time: Mon 2019-01-14 03:43:19 UTC
                 RTC time: Mon 2019-01-14 03:43:19
                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 Mon 2019-01-14 03:43:14 UTC; 57s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 3316 (systemd-timesyn)
   Status: "Synchronized to time server 133.243.238.163:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/systemd-timesyncd.service
           └─1458 /usr/lib/systemd/systemd-timesyncd

Jan 14 03:43:14 archiso systemd[1]: Starting Network Time Synchronization...
Jan 14 03:43:14 archiso systemd[1]: Started Network Time Synchronization.
Jan 14 03:43:15 archiso systemd-timesyncd[1458]: Synchronized to time server 133.243.238.244:123 (ntp.nict.jp).

インストール

ミラーの選択

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

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

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

BIOSブートに必要なパッケージも同時に落としてきます。ブートローダは、今回は syslinux を使ってみます。詳細は後述。

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

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

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

# pacstrap /mnt/tank base intel-ucode linux-headers spl-dkms zfs-dkms syslinux
〈表示省略〉

システムの設定

fstab

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

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

# /dev/sda1
UUID=DABA-C6CB          /boot           vfat           rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro        0 2

hostid

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

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

chroot、タイムゾーン

# arch-chroot /mnt/tank
# 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

ブートローダー

今回は syslinux を使いたい。いえ特別な理由は無いんですけど、GRUB はデカいという噂を時折耳にしますので。小さい事は良い事です。

参考文献:

# syslinux-install_update -i -a -m
Syslinux BIOS install successful
/usr/bin/syslinux-install_update: line 117: warning: command substitution: ignored null byte in input
Boot Flag Set - /dev/sda1
Installed MBR (/usr/lib/syslinux/bios/mbr.bin) to /dev/sda
# sfdisk -l /dev/sda
Disk /dev/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Disk model: ST3320620AS
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5164dd3e

Device     Boot    Start       End   Sectors   Size Id Type
/dev/sda1  *        2048   1050623   1048576   512M 83 Linux
/dev/sda2        1050624 625142447 624091824 297.6G 83 Linux

syslinux の設定ファイルを弄ります。
なぜか /dev/sda3 をrootにしようとしてるので直したり、Intelのマイクロコードのアップデートを有効にしたり。

# cd /boot/syslinux
# cp syslinux.cfg syslinux.cfg.org
# vi syslinux.cfg
# diff -U3 syslinux.cfg{.org,}
--- syslinux.cfg.org    2019-01-14 14:06:28.000000000 +0900
+++ syslinux.cfg        2019-01-14 14:09:50.000000000 +0900
@@ -51,13 +51,15 @@
 LABEL arch
     MENU LABEL Arch Linux
     LINUX ../vmlinuz-linux
-    APPEND root=/dev/sda3 rw
+    APPEND zfs=tank rw
+    INITRD ../intel-ucode.img
     INITRD ../initramfs-linux.img

 LABEL archfallback
     MENU LABEL Arch Linux Fallback
     LINUX ../vmlinuz-linux
-    APPEND root=/dev/sda3 rw
+    APPEND zfs=tank rw
+    INITRD ../intel-ucode.img
     INITRD ../initramfs-linux-fallback.img

 #LABEL windows

これを /dev/sdb1 の方にも実施。

# cd /
# cp -pr /boot /tmp
# umount /boot
# mount /dev/sdb1 /boot
# cp -pr /tmp/boot/. /boot
# ls /boot
initramfs-linux-fallback.img  initramfs-linux.img  intel-ucode.img  syslinux  vmlinuz-linux
# syslinux-install_update -a -m
/usr/bin/syslinux-install_update: line 117: warning: command substitution: ignored null byte in input
Boot Flag Set - /dev/sdb1
Installed MBR (/usr/lib/syslinux/bios/mbr.bin) to /dev/sdb
# sfdisk -l /dev/sdb
Disk /dev/sda: 298.1 GiB, 320072933376 bytes, 625142448 sectors
Disk model: WDC WD3200AAKS-0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xa3cc179b

Device     Boot    Start       End   Sectors   Size Id Type
/dev/sdb1  *        2048   1050623   1048576   512M 83 Linux
/dev/sdb2        1050624 625142447 624091824 297.6G 83 Linux

ネットワーク

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

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

従って面倒な設定は省きます。
とすると、やる事はDHCPクライアントの設定だけになります。

# cat >/etc/systemd/network/all.network <<-___
> [Match]
> Name=*
>
> [Network]
> DHCP=ipv4
> ___

ネットワークの有効化

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

なお /mnt/tank/etc/resolv.conf は arch-chroot によって /etc/resolv.conf に置き換えられているようです。そのため exit してから設定しないと、設定前の何も無い状態に書き戻されてしまいます。インストール手順としてちょっと歪な気がしますが、arch-chrootをexitした後にresolv.confを修正します。

# exit
exit
arch-chroot /mnt/tank  15.08s user 12.79s system 0% cpu 2:03.21.39 total
# cp --parents /etc/resolv.conf /mnt/tank
# vi /mnt/tank/etc/resolv.conf
〈必要に応じて修正〉

再起動

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

# umount /mnt/tank/boot
# zfs umount -a
# zpool export tank
# shutdown -h now

そして、インストールメディアであるUSBメモリを外した後に電源を入れます。

最初に起動した後

ここまで問題が無ければ、再起動すると最初に syslinux のメニュー画面が表示されます。デフォルトの設定ですと5秒で自動的に先へ進みます。

rootログイン

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


Arch Linux 4.20.0-arch1-1-ARCH (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 on / type zfs (rw,relatime,xattr,noacl)

やったね :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?