2
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 をインストール@VirtualBox(UEFI)

Last updated at Posted at 2019-01-05

(2020/06/28 追記 ここから)
この記事を推敲するのも今更なんですが、Googleでかなり上位にヒットする記事だった事に気が付きまして、一言追加しておきます。

紆余曲折ありまして、2020年6月現在、LTS版カーネルをZFSの上にインストールする事にしました。その手順は下記以降の記事になります。手順もだいぶ洗練されてきた(と思いたい:sweat_smile:)ので、そちらを御参照ください。

VirtualBoxはインストーラarchisoを作る時だけで、それ以降は実機へのインストールばかりですが、手順は実機とほとんど変わらないと思います。

俺様サーバー構築記 - ZFSをarchisoに埋め込む(linux-lts)@VirtualBox(UEFI)
(2020/06/28 追記 ここまで)

前稿「俺様サーバー構築記 - ZFSをarchisoに埋め込む@VirtualBox(UEFI)」の続きです。気付いたら1年経ってしまったんですね。月日の経つのは早いもんだ…

最新版の archiso に zfs の為のツールを埋め込みます。作業は昨年末に行ったので、使用したisoは archlinux-2018.12.01-x86_64.iso 、これをベースに加工したisoのファイル名は archlinux-2018.12.31-x86_64.iso です。

なお、手順は「俺様サーバー構築記 - ZFSをarchisoに埋め込む@VirtualBox(UEFI)」と全く同じ。NTP設定周りで画面に表示されるメッセージが若干変わっているようですが、手順には影響ありません。

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

VirtualBox

archisoを作成した時の仮想マシンを、そのまま流用します。その設定を再掲:

タイプ: Linux
バージョン: Arch Linux (64-bit)
メモリーサイズ: 4096MB
仮想ハードディスクを作成する
 ファイルサイズ: 100.00GB
 ハードディスクのタイプ: VDI (VirtualBox Disk Image)
 物理ハードディスクにあるストレージ: 可変サイズ

以上で作成した後、設定によって少々いじります。
システム:
 拡張機能: EFIを有効化(一部のOSのみ)
 プロセッサー数: 2
ストレージ:
 コントローラー: (作成した archlinux-2018.12.31-x86_64.iso を選択)
オーディオ: オーディオを無効にする
ネットワーク: ネットワークアダプターを有効化、割り当て=NAT (ホストマシンはノートパソコンで無線LANを使用しているので、ブリッジではゲストのネットワークがうまくつながらない)

待つ

画面真っ黒のまま、しばらく待ちます。

インストールの準備

参考文献:

文献をあっちこっち引っ繰り返しながら作業するのも嫌なので、作業はすべて以下にまとめておきます。私自身の備忘録を兼ねて。

キーボード

# loadkeys jp106

コンソールフォント

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

起動モードの確認

VirtualBox仮想マシンの設定で UEFI にしましたが、念の為。

# ls /sys/firmware/efi/efivars
(表示省略)

パーティション

一応HDDを確認しておきます。流用しているマシンなので、パーティション分割したものが表示されます。

# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2

UEFIなので、EFIシステムパーティションが必要です。それとルートディレクトリのパーティション。

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

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

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

そして今回は、sgdiskなるコマンドを見つけたので使ってみました。

# sgdisk -Z /dev/sda
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
# sgdisk -n "0::+512M" -t 0:ef00 -c 0:"EFI System" /dev/sda
Creating new GPT entries in memory.
Setting name!
partNum is 0
The operation has completed successfully.
# sgdisk -n "0::" -t 0:bf00 -c 0:"Solaris root" /dev/sda
Setting name!
partNum is 1
The operation has completed successfully.

確認。

# sgdisk -p /dev/sda
Disk /dev/sda: 209715200 sectors, 100.0 GiB
Model: VBOX HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 675444CC-7ABB-4734-872A-D9130F4A25EF
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 209715166
Partitions will be aligned on 2048-sectr 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  EFI System
   2         1050624       209715166   99.5 GiB    BF00  Solaris root
# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Jan  5 04:29 /dev/sda
brw-rw---- 1 root disk 8, 1 Jan  5 04:29 /dev/sda1
brw-rw---- 1 root disk 8, 2 Jan  5 04:29 /dev/sda2

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

EFIパーティションはFAT32。

# mkfs.fat -F32 /dev/sda1
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 を見ればわかるんですが、シンボリックリンク先が相対パスになっているのがまた残念。
という訳で、若干わかりにくいですが、下記のような一行野郎にまとめました。

# zpool create tank /dev/disk/by-id/$(cd /dev/disk/by-id; ls | while read d; do if [ "$(readlink -f $d)" = "/dev/sda2" ]; then echo $d; fi; done)

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

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

ルートファイルシステムに 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  5 05:09 /etc/zfs/zpool.cache
# zpool set cachefile=/etc/zfs/zpool.cache tank
# ls -l /etc/zfs/zpool.cache
-rw-r--r-- 1 root root 1328 Jan  5 05:22 /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=53 time=9.09 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=53 time=9.66 ms

--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 9.091/9.375/9.659/0.284 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 2019-01-05 05:37:49 UTC
           Universal time: Sat 2019-01-05 05:37:49 UTC
                 RTC time: Sat 2019-01-05 05:37:51
                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: enabl>
   Active: active (running) since Sat 2019-01-05 05:37:41 UTC; 2min 3s ago
     Docs: man:systemd-timesyncd.service(8)
 Main PID: 1458 (systemd-timesyn)
   Status: "Synchronized to time server 133.243.238.163:123 (ntp.nict.jp)."
    Tasks: 2 (limit: 4645)
   CGroup: /system.slice/systemd-timesyncd.service
           └─1458 /usr/lib/systemd/systemd-timesyncd

Jan 05 05:37:41 archiso systemd[1]: Starting Network Time Synchronization...
Jan 05 05:37:41 archiso systemd[1]: Started Network Time Synchronization.
Jan 05 05:37:44 archiso systemd-timesyncd[1458]: Synchronized to time server 133.243.238.244:123 (n>

インストール

ミラーの選択

日本ならJapanをリスト先頭に持ってきましょう。っていうか、Japanだけ抜き出しました。

# cd /etc/pacman.d
# sed -i -ne"/^#.*Japan$/,+1 p" mirrorlist

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

インストールに先立って、bootディレクトリの内容を削除しておきます。これが残っていると pacstrap に失敗します。この手順の通りに実行していたら、最初に /dev/sda1 をフォーマットしていたはずですが。手抜きしていたら、この段階で消して下さい。

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

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

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

システムの設定

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 LABEL=tank
UUID=EADE-FAAD          /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
# rm /etc/localtime
# ln -s /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
# 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

ブートローダー

…は、使いません。今回はEFISTUBを使用します。ブートローダなんて余計なプロセスを経由しなくて済むのがUEFIの良い所です。

参考文献:EFISTUB - ArchWiki

但し、ですね。VirtualBoxのUEFI実装は腐っているようです。しかも修正の予定が無いらしい。阿保かと馬鹿かと。

色々調べて下記手順に落ち着きました。実機にインストールする際にはもうちょっとエレガントな手順がある筈です。

# echo "FS0:\vmlinuz-linux zfs=tank rw initrd=\intel-ucode.img initrd=\initramfs-linux.img" >/boot/startup.nsh

ネットワーク

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/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 /etc/resolv.conf /mnt/tank/etc/.
# vi /mnt/tank/etc/resolv.conf
【必要に応じて修正】

再起動

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

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

電源が切れたらVirtualBoxのストレージからインストールメディアを除去し、再起動します。

最初に起動した後

ここまで問題が無ければ、再起動してログイン画面になるはずです。ちなみに起動は鬼のように速いです。さすがはArchLinuxと言った所でしょうか。

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→電源入れ直して、再起動を確認できればOK。
やったね :thumbsup_tone1:

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