俺様サーバー構築記 - ZFS の上に Arch Linux をインストール@VirtualBox(UEFI)
(2020/06/28 追記 ここから)
この記事を推敲するのも今更なんですが、Googleでかなり上位にヒットする記事だった事に気が付きまして、一言追加しておきます。
紆余曲折ありまして、2020年6月現在、LTS版カーネルをZFSの上にインストールする事にしました。その手順は下記以降の記事になります。手順もだいぶ洗練されてきた(と思いたい)ので、そちらを御参照ください。
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を使用しているので、ブリッジではゲストのネットワークがうまくつながらない)
待つ
画面真っ黒のまま、しばらく待ちます。
インストールの準備
参考文献:
- 俺様サーバー構築記 - ZFSをarchisoに埋め込む@VirtualBox(UEFI)
- 続々・ArchLinux インストール覚書
文献をあっちこっち引っ繰り返しながら作業するのも嫌なので、作業はすべて以下にまとめておきます。私自身の備忘録を兼ねて。
キーボード
# 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
# 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
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。
やったね
Author And Source
この問題について(俺様サーバー構築記 - ZFS の上に Arch Linux をインストール@VirtualBox(UEFI)), 我々は、より多くの情報をここで見つけました https://qiita.com/katz_engineer/items/2c013369a51d3fd2f69e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .