(2020.06.15. 追記ここから)
ZFSを使う場合は、ちょっと古いカーネルを利用した方が良さそうです。そのためLTS版カーネルによるarchisoを作成する事にしました。その手順は下記になりますので、そちらをご覧ください。
俺様サーバー構築記 - ZFSをarchisoに埋め込む(linux-lts)@VirtualBox(UEFI)
(2020.06.15. 追記ここまで)
「俺様サーバー構築記 - 基本方針」に基づいて ArchLinux+ZFS をインストールしてきたノートパソコン三代目3台目ですが。実は、先日、やらかしまして…
pacman -Syu
した時に、その途中で電源が切れてしまいました やべぇ!ってんで直前に撮った命綱のスナップショットにロールバックしようと、最初にインストーラを焼いたUSBメモリから起動…できませんでした
どういう訳か、起動できなくなっていたようです。壊れたか、別の理由があるのか。まぁ内容も古いし作り直そうかと。…思ったのですが、その手順も微妙に変わった模様
仕方ありません。やり直しました。
折角なので Win10 上の VirtualBox に作成してUSBメモリへの焼き付けも試みてみました。
参考文献
- 俺様サーバー構築記 - ZFS の上に Arch Linux をインストール@VirtualBox(UEFI)
- 俺様サーバー構築記 - ZFSをarchisoに埋め込む@デスクトップパソコン(BIOS)
- インストールガイド - ArchWiki
download
Arch Linux をダウンロードのページから、適当なミラーを選択しましょう。私は何も考えずにリストの最上位 jaist.ac.jp を選択しました。
そして今日の時点での ArchLinux インストーラー最新版をダウンロードします。今回は archlinux-2019.12.01-x86_64.iso です。
VirtualBox
Windows10 にインストールしてあった VirtualBox を使用し、新規作成します。
私の VirtualBox のバージョンは 6.0.14 r133895 (Qt5.6.2) でした。
仮想マシンはごく普通の設定です。強いて言えば、メモリが若干多めですかね。今時はこの程度でも普通だと思いますが。サーバにするならむしろ少ないくらいですか。
タイプ: Linux
バージョン: Arch Linux (64-bit)
メモリーサイズ: 4096MB
仮想ハードディスクを作成する
ファイルサイズ: 100.00GB
ハードディスクのタイプ: VDI (VirtualBox Disk Image)
物理ハードディスクにあるストレージ: 可変サイズ
以上で作成した後、設定によって少々いじります。
システム:
拡張機能: EFIを有効化(一部のOSのみ)
プロセッサー数: 2
ストレージ:
コントローラー: (ダウンロードした archlinux-2019.12.01-x86_64.iso を選択)
オーディオ: オーディオを無効にする
ネットワーク: ネットワークアダプターを有効化、割り当て=NAT (ホストマシンはノートパソコンで無線LANを使用しているので、ブリッジではゲストのネットワークがうまくつながらない)
そして起動!ここからがインストールの本番です。
待つ
画面真っ黒のまま、しばらく待たされるんですよね~… いつまで経っても改善されません。これ、慣れないと心臓に悪い。何とかなりませんかねぇ。
インストールの準備
署名の検証
省略します。最初は ArchLinux 環境が無いって事で。
キーボード
# loadkeys jp106
コンソールフォント
コンソールフォントはそのまま変更しません。日本語が表示されればそれなりに便利そうだけども、当面は必要無いと判断。
起動モードの確認
VirtualBox仮想マシンの設定で UEFI にしましたが、念の為。
# ls /sys/firmware/efi/efivars
(表示省略)
パーティション
一応 HDD を確認しておきます。
# ls /dev/sd*
/dev/sda
lsblkコマンドを使うと、多少整理されて見えます。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 524.5M 1 loop /run/archiso/sfs/airootfs
sda 8:0 0 100G 0 disk
sr0 11:0 1 639M 0 rom /run/archiso/bootmnt
ディスク構成が複雑な場合は /dev/disk/by-id
を見ると、ファイル名(=デバイスID)からもう少し情報を得られる可能性があるんですが。今回は VirtualBox なので省略します。
デバイスを確認した所で、HDDにパーティションを切ります。UEFIなので、EFIシステムパーティションが必要です。それとルートディレクトリのパーティション。まぁ、すぐに廃棄するのでいい加減で大丈夫です。
パーティショニング - ArchWikiの[パーティションの大きさはどうすればいいですか?]に下記のような記述があります。
大容量のメモリ(1024MB 以上)を積んでいるときは、スワップパーティションは小さく、または作らなくてもかまわないでしょう。2GB 以上の物理 RAM を持っているなら、スワップパーティションがないほうが一般的に良いパフォーマンスを発揮すると思われます。
これを信じてスワップパーティションは作りません。
また以前も書きましたが、一応、HDDフォーマットの前に wipefs
コマンドを実行します。
# wipefs -a /dev/sda
# 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): C8D9AEB5-644D-4B8F-8654-678B4B8ACD76
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 Dec 24 08:35 /dev/sda
brw-rw---- 1 root disk 8, 1 Dec 24 08:35 /dev/sda1
brw-rw---- 1 root disk 8, 2 Dec 24 08:35 /dev/sda2
パーティションのフォーマット
EFIパーティションはFAT32。ルートは…ハッキリ言って何でもいい。すぐにzfsで再インストールしますので。
# mkfs.fat -F32 /dev/sda1
mkfs.fat 4.1 (2017-01-24)
# mkfs.ext4 /dev/sda2
mke2fs 1.45.4 (23-Sep-2019)
Creating filesystem with 26083067 4k blocks and 6520832 inodes
Filesystem UUID: 1b5fe8d9-9118-4cd5-be9c-3c2d2b293ac9
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872
Allocating group tables: done
Writing inode tables: done
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done
パーティションのマウント
# mount /dev/sda2 /mnt
# mkdir /mnt/boot
# mount /dev/sda1 /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=51 time=10.9 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=51 time=18.6 ms
--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1028ms
rtt min/avg/max/mdev = 10.884/14.754/18.625/3.870 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: Tue 2019-12-24 08:50:49 UTC
Universal time: Tue 2019-12-24 08:50:49 UTC
RTC time: Tue 2019-12-24 08:50:49
Time zone: UTC (UTC, +0000)
System clock synchronized: yes
systemd-timesyncd.service active: 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 Tue 2019-12-24 08:50:30 UTC; 1min 33s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 866 (systemd-timesyn)
Status: "Initial synchronization to time server 133.243.238.243:123 (ntp.nict.jp)."
Tasks: 2 (limit: 4670)
Memory: 1.4M
CGroup: /system.slice/systemd-timesyncd.service
└─866 /usr/lib/systemd/systemd-timesyncd
Dec 24 08:50:30 archiso systemd[1]: Starting Network Time Synchronization...
Dec 24 08:50:30 archiso systemd[1]: Started Network Time Synchronization.
Dec 24 08:50:32 archiso systemd-timesyncd[866]: Initial syncronization to time server 133.243.238.243:123 (ntp.nict.jp).
インストール
ミラーの選択
日本ならJapanをリスト先頭に持ってきましょう。っていうか Japan だけ抜き出しました。
# cd /etc/pacman.d
# sed -i -ne"/^#.*Japan$/,+1 p" mirrorlist
ベースシステムのインストール
UEFIブートに必要なパッケージも同時に落としてきます。
今時は、CPUのデバッグ用パッチもOSが面倒を見るらしい。その為のパッケージ intel-ucode も落としておきます。
とりあえず現時点で必要最小限のパッケージはこれだけ。他に必要なパッケージは、必要に迫られた時に追加する事にします。
※ ArchWiki を見ると、パッケージの構成が少し変わったようです。
※特にテキストエディタが入っていません。何でも良いんですが、個人的な好みで vi を入れます。
※ man も入らないようです。インストールセットには要らないだろうと判断してそのままです。
# pacstrap /mnt base linux linux-firmware vi dosfstools efibootmgr intel-ucode
〈表示省略〉
システムの設定
fstab
# genfstab -U /mnt >>/mnt/etc/fstab
# cat /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda2
UUID=1b5fe8d9-9118-4cd5-be9c-3c2d2b293ac9 / ext4 rw,relatime 0 1
# /dev/sda1
UUID=EC46-153B /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2
chroot、タイムゾーン
# arch-chroot /mnt
# 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
Generation complete.
# echo LANG=C >/etc/locale.conf
# echo KEYMAP=jp106 >/etc/vconsole.conf
日本語フォントが入っていない場合は LANG=C にしておきましょう。文字化けが非常に鬱陶しい事になります。正しくは en_US.UTF-8 らしいですけども、まあいいかなと。
ホストネーム
マシンに名前を付けます。こういうのはセンスが出ますよね。なんて思うのは私だけ?
# echo 〈ホスト名〉 >/etc/hostname
ArchWiki では同じ名前を /etc/hosts にも記述する事になってますけど、今回はインストーラですし、要らないでしょう。
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
ブートローダー
UEFI起動の場合、systemdがブートローダを持っているらしい。
参考文献:
# bootctl --path=/boot install
Created "/boot/EFI".
Created "/boot/EFI/systemd".
Created "/boot/EFI/BOOT".
Created "/boot/loader".
Created "/boot/loader/entries".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi"
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Created "/boot/f4127869934740bb9da39f6475438a89".
Random seed file /boot/loader/random-seed successfully written (512 bytes).
Not installing system token, since we are running in a virtualized environment.
Created EFI boot entry "Linux Boot Manager".
更にIntelのマイクロコードのアップデートを有効にします。
参考文献:
# cat >/boot/loader/entries/entry.conf <<___
> title Arch Linux
> linux /vmlinuz-linux
> initrd /intel-ucode.img
> initrd /initramfs-linux.img
> options root=PARTUUID=$(blkid --match-tag PARTUUID -o value /dev/sda2)
> ___
ネットワーク
デバイス名の固定は考えません。すぐにzfsで再インストールしますので。と言っても systemd を使うと勝手に固定してくれるようですが。
# 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 12.62s user 2.81s system 2% cpu 12:04.39 total
# cp {,/mnt}/etc/resolv.conf
# vi /mnt/etc/resolv.conf
〈必要に応じて修正〉
再起動
仮想マシンをシャットダウン。
# umount -R /mnt
# shutdown -h now
そして、VirtualBoxのストレージからインストールメディアを除去した後に再起動します。
rootログイン
再起動してログイン画面になったら、rootユーザーでログインします。パスワードは先ほどpasswdコマンドで設定した通り。
Arch Linux 4.14.9-1-ARCH (tty1)
〈ホスト名〉 login: root
Password: 〈root用パスワード〉
archzfsパッケージをarchisoに埋め込む
さてここからが今回の手順の目玉。
参考文献: 8.1 archzfs パッケージを archiso に埋め込む - 8
ヒントとテクニック - ZFS - ArchWiki
まずはarchisoパッケージをダウンロード。
# pacman -Syy
〈省略〉
# pacman -S archiso --noconfirm --noprogressbar
次に、ArchWikiには「プロセスを開始」って書いてあるんだけど…意味がよくわかりません。とりあえず書いてあるコピーコマンドを実行。
# cp -r /usr/share/archiso/configs/releng /root/media
packages.x86_64 ファイルに追記。ここではダイナミックカーネルモジュールをサポートしているバージョンを選択します。いえ zfs-linux-git で何度かやったんですがね、結構頻繁にダメになるんですよ、 zfs のバージョンとカーネルバージョンの不一致で。あまりにも面倒なので zfs-dkms を使う事にしました。
zfs を使う時には spl (Solaris Porting Layer) も入れる必要があります。また dkms を使う時には linux-headers をインストールしておく必要があります。
# cd /root/media
# cat >>packages.x86_64 <<___
> linux-headers
> zfs-dkms
> ___
pacman.conf ファイルに追記。
# cat >>pacman.conf <<'___'
>
> [archzfs]
> SigLevel = Never
> Server = http://archzfs.com/$repo/x86_64
> ___
イメージ作成。ここで、結構な時間が掛かります。
# ./build.sh -v
(省略)
[mkarchiso] INFO: Done! | 743M out/archlinux-2019.12.24-x86_64.iso
USBメモリへの焼き付け
ホストマシンの USB 端子に USB メモリを挿して、仮想マシンに接続します。それは手作業で。
接続できたらゲストマシンで確認。
# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdb2
USBメモリを挿した後に下記コマンドを実行して、焼き付けるべきデバイスが /dev/sdb である事を確認します。以前入れたモノが表示に影響してますかね。
# lsblk -dpo NAME,FSTYPE,LABEL,UUID /dev/sdb
NAME FSTYPE LABEL UUID
/dev/sdb iso9660 ARCH_201901 2019-01-13-11-36-23-00
完成したisoイメージファイルをUSBメモリに焼き付けます。
# ls out
archlinux-2019.12.24-x86_64.iso
# dd bs=4M if=out/archlinux-2019.12.24-x86_64.iso of=/dev/sdb status=progress && sync
708837376 bytes (709 MB, 676 MiB) copied, 2 s, 352 MB/s[ 2457.727593] INFO: task systemd-udevd:264 blocked for more than 122 secondes.
[ 2457.732177] Not tainted 5.4.6-arch1-1 #1
[ 2457.734542] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
185+1 records in
185+1 records out
779091968 bytes (779 MB, 743 MiB) copied, 259.159 s, 3.0 MB/s
これでUSBメモリに焼けたハズ。
これで ArchLinux をシャットダウン。
# shutdown -h now
VirtualBox その他ホストマシンで起動していたアプリも全部終了し、ホストマシンをそのままUSBメモリから起動してみます。
まずは ArchLinux の起動を確認。それから zfs を確認します。
# modprobe zfs
何も表示されなければOKです!やったね