「自宅サーバー構築譚:基本構想」で書いた通り、ArchLinuxをインストールします。まずはその為のインストーラを作成。ZFSの上にArchLinuxを乗せるので、その為の仕込みです。
が、今回は失敗しました。最後の最後で。なぜか、起動しません。失敗の経験も何かの役に立つかも知れないと考えまして、記録に残しておきます。
なお「Hyper-VをVirtualBoxと併存できる形でインストールして外部へブリッジ接続する」でHyper-Vを使えるように設定しましたので、今回はVirtualBoxではなくてHyper-Vで作業してみます。
download
Arch Linux をダウンロードのページから、適当なミラーを選択しましょう。私は何も考えずにリストの最上位 jaist.ac.jp を選択しました。テキトーに、ランダムに選ぶ方が良いのかも知れません。
そして今日の時点での ArchLinux インストーラー最新版をダウンロードします。今回は archlinux-2022.01.01-x86_64.iso です。
署名の検証
省略します。最初は ArchLinux 環境が無いって事で。
Hyper-V
Hyper-VをVirtualBoxと併存できる形でインストールして外部へブリッジ接続する でインストールした Hyper-V を使用し、仮想マシンを新規作成します。
仮想マシンはごく普通の設定です。メモリが少なめなのはホストマシンが非力だからです。
- 世代の指定: 第2世代 (UEFI)
- メモリの割り当て: 2048MB
- この仮想マシンに動的メモリを使用します。
- ネットワークの構成: (Hyper-VをVirtualBoxと併存できる形でインストールして外部へブリッジ接続するで作成したブリッジ接続用のネットワーク)
- 仮想ハードディスクの接続: 127GB
- インストールオプション: ブートイメージファイルからオペレーティングシステムをインストールする(ダウンロードしたisoファイルを指定)
以上で作成した後、設定によって少々いじります。
- セキュリティ: 「セキュアブートを有効にする」のチェックを外す
- メモリ: 「動的メモリを有効にする」のチェックを入れる(デフォルト)
- 最小RAM: 512MB (デフォルト)
- 最大RAM: 2048MB (割り当てたメモリと同じ)
- その他の設定は適当に…
- 仮想プロセッサの数: 参考文献: Hyper-V ホストが保有する「仮想プロセッサ数」の確認方法
- リソースコントロール: 適当に…
- チェックポイント: 「チェックポイントを有効にする」のチェックを外す
→考え方次第ですが、無闇にチェックポイントを作っても管理し切れないと私は考えています。
設定できたら接続して起動!ここからがインストールの本番です。
インストールの準備
キーボード
# loadkeys jp106
コンソールフォント
コンソールフォントはそのまま変更しません。日本語が表示されればそれなりに便利そうだけども、当面は必要無いと判断。
起動モードの確認
Hyper-V 第2世代なのでefiです。
# ls /sys/firmware/efi/efivars
〈表示省略〉
スクリプトなどで必要ならば、次のような書き方も可能です。
# ls /sys/firmware/efi/efivars 2>& /dev/null | wc -l
36
0ならばBIOS、1以上ならばUEFIとなります。
インターネットへの接続
ネットワーク環境が確立しているかどうか、外部への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=24.9 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=10.6 ms
--- archlinux.jp ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 10.641/17.756/24.872/7.115 ms
システムクロックの更新
ntpサーバは自分で設定したい。日本ならntp.nict.jpが鉄板です。特殊事情が無ければこの一択。システム推奨なんか知りませ~ん。
# cd /etc/systemd
# sed -i -e"/^#NTP=/c NTP=ntp.nict.jp" timesyncd.conf
# timedatectl set-ntp true
確認。
# grep "^NTP" timesyncd.conf
NTP=ntp.nict.jp
# timedatectl status
Local time: Sat 2022-01-15 08:32:54 UTC
Universal time: Sat 2022-01-15 08:32:54 UTC
RTC time: Sat 2022-01-15 08:32:54
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 2022-01-15 08:32:49 UTC; 2min 2s ago
Docs: man:systemd-timesyncd.service(8)
Main PID: 863 (systemd-timesyn)
Status: "Initial synchronization to time server 133.243.238.243:123 (ntp.nict.jp)."
Tasks: 2 (limit: 2211)
Memory: 1.7M
CPU: 182ms
CGroup: /system.slice/systemd-timesyncd.service
└─863 /usr/lib/systemd/systemd-timesyncd
Jan 15 08:32:49 archiso systemd[1]: Starting Network Time Synchronization...
Jan 15 08:32:49 archiso systemd[1]: Started Network Time Synchronization.
Jan 15 08:32:49 archiso systemd-timesyncd[863]: Initial syncronization to time server 133.243.238.243:123(ntp.nict.jp).
パーティション
一応 HDD を確認しておきます。
# ls /dev/sd*
/dev/sda
lsblkコマンドを使うと、多少整理されて見えます。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 715.4M 1 loop /run/archiso/airootfs
sda 8:0 0 127G 0 disk
sr0 11:0 1 864.3M 0 rom /run/archiso/bootmnt
ディスク構成が複雑な場合は /dev/disk/by-id
を見ると、ファイル名(=デバイスID)からもう少し情報を得られる可能性があるんですが。今回は Hyper-V なので省略します。
デバイスを確認した所で、HDDにパーティションを切ります。今回の用途の場合、最低でもbootパーティションを分ける必要があります。まぁ、すぐに廃棄するのでいい加減で大丈夫です。
参考文献: 1.9.1 レイアウト例 - 1.9.1 レイアウト例 - 1 インストールの準備 - インストールガイド
パーティショニング - ArchWikiの[パーティションの大きさはどうすればいいですか?]に下記のような記述があります。
大容量のメモリ(1024MB 以上)を積んでいるときは、スワップパーティションは小さく、または作らなくてもかまわないでしょう。2GB 以上の物理 RAM を持っているなら、スワップパーティションがないほうが一般的に良いパフォーマンスを発揮すると思われます。
これを信じてスワップパーティションは作りません。
また一応、HDDフォーマットの前に wipefs
コマンドを実行します。
# wipefs -a /dev/sda
# sgdisk -n 0::+300M -t 0:ef00 -c 0:"EFI System" -n 0:: /dev/sda
Creating new GPT entries in memory.
Setting name!
partNum is 0
The operation has completed successfully.
確認。
# sgdisk -p /dev/sda
Disk /dev/sda: 266338304 sectors, 127.0 GiB
Model: Virtual Disk
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): D6B1F7290A94C-40A2-8C85-B2DBF42C1200
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 266338270
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 616447 300.0 MiB EF00 EFI System
2 616448 266338270 126.7 GiB 8300
# ls -l /dev/sd*
brw-rw---- 1 root disk 8, 0 Jan 15 08:46 /dev/sda
brw-rw---- 1 root disk 8, 1 Jan 15 08:46 /dev/sda1
brw-rw---- 1 root disk 8, 2 Jan 15 08:46 /dev/sda2
パーティションのフォーマット
bootパーティションはFAT32。ルートは何でもいい。
# mkfs.fat -F32 /dev/sda1
mkfs.fat 4.2 (2021-01-31)
# mkfs.ext4 /dev/sda2
mke2fs 1.46.4 (18-Aug-2021)
Discarding device blocks: done
Creating filesystem with 33215227 4k blocks and 8306688 inodes
Filesystem UUID: e2cc1-ca8a-4d61-b9db-a191b460e783
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
インストール
ミラーの選択
日本ならJapanをリスト先頭に持ってきたい、んですけど。なんだか注釈として国名を付けるのを止めたのかな、自動で抜き出せなくなりました。
ちょっと調べてみると、どうもデフォルトのまま放っておいて良いような。下記の参考文献1を踏まえて head mirrorlist
してみますとね…
参考文献1: 3.1 速度で並び替える - 3 ミラーをソートする - ミラー - ArchWiki
しかしやっぱり日本のミラーを使いたい。と考えた場合、どうやら日本のミラーサイトは非公式だったようですな。それで mirrorlist
から除外されたのかなぁ。良くわかりません。
参考文献2: 5.8 日本 - 5 非公式ミラー - ミラー - ArchWiki
今回は、この非公式ミラーの中から1つを設定してみます。面倒だったらそのまま放置で構わないかと。
# cd /etc/pacman.d
# cat >mirrorlist <<'___'
\`heredoc> Server = http://ftp.nara.wide.ad.jp/pub/Linux/archlinux/$repo/os/$arch
\`heredoc> ___
ベースシステムのインストール
UEFIブートに必要なパッケージも同時に落としてきます。この時点では、カーネルは通常版で良いようです。
CPUのマイクロコードもOSが面倒を見るらしい。その為のパッケージintel-ucode
も落としておきます。CPUがAMDの場合は、代わりにamd-ucode
を落としてください。良く分からん場合は両方指定すれば両方落とせる模様。
とりあえず現時点で必要最小限のパッケージはこれだけ。他に必要なパッケージは、必要に迫られた時に追加する事にします。
※テキストエディタは何でも良いんですが、個人的な好みで vi を入れます。
※ man も入らないようです。インストールセットには不要と判断してそのままです。
# pacstrap /mnt base linux linux-firmware vi intel-ucode
〈表示省略〉
システムの設定
fstab
# genfstab -U /mnt >>/mnt/etc/fstab
chroot、タイムゾーン
# arch-chroot /mnt
# ln -s /usr/share/zoneinfo/Japan /etc/localtime
# hwclock --systohc --utc
ロケール
個人的にUnicodeが嫌いなので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 にしておきましょう。文字化けが非常に鬱陶しい事になります。正しくは en_US.UTF-8 らしいですけども、まあいいかなと。
ホストネーム
マシンに名前を付けます。こういうのはセンスが出ますよね。なんて思うのは私だけ?
# echo 〈ホスト名〉 >/etc/hostname
ArchWiki では同じ名前を /etc/hosts
にも記述する事になってますけど、今回はインストーラですし、不要でしょう。〈ホスト名〉
も本気で悩む段階ではありません。
Initramfs
pacstrap
で mkinitcpio
が呼ばれるので、普通は不要のようです。一応手順だけ書いておきます。
# mkinitcpio -p linux
〈表示省略〉
但し、途中で警告が出た:
==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x
==> WARNING: Possibly missing firmware for module: xhci_pci
良くわからないが、問題無さそうなので無視
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".
Created "/boot/EFI/Linux".
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 /etc/machine-info with KERNEL_INSTALL_LAYOUT=bls
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/syslinit.target.wants/systemd-network-generator.service -> /usr/lib/systemd/system/systemd-network-generator.service.
Created symlink /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service -> /usr/lib/systemd/system/systemd-networkd-wait-online.service.
そしてリゾルバは systemd-resolved
を有効にしておきます。/etc/resolv.conf
の調整だけではうまくいかないようです。
# 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.
再起動
終了。
# exit
exit
arch-chroot /mnt 13.30s user 4.10s system 0% cpu 8:29:37.01 total
# umount -R /mnt
仮想マシンをシャットダウン。
# shutdown -h now
そして、Hyper-VのDVDドライブからインストールメディアを除去した後に再起動します。
rootログイン
再起動してログイン画面になったら、rootユーザーでログインします。パスワードは先ほどpasswdコマンドで設定した通り。
Arch Linux 5.16.0-arch1-1 (tty1)
〈ホスト名〉 login: root
Password: 〈root用パスワード〉
archzfsパッケージをarchisoに埋め込む
さてここからが勝負所です。
参考文献: 8.1 archzfs パッケージを archiso に埋め込む - 8
ヒントとテクニック - ZFS - ArchWiki
まずはarchisoパッケージをダウンロード。
# pacman -Syy
〈省略〉
# pacman -S archiso --noconfirm --noprogress
次に、ArchWikiには「プロセスを開始」って書いてあるんだけど、意味がわかりません。「処理を開始」の誤訳でしょうか?とりあえず書いてあるコピーコマンドを実行。
# cp -r /usr/share/archiso/configs/releng/ /root/media
packages.x86_64 ファイルに追記。
# cd /root/media
# echo archzfs-linux >>packages.x86_64
pacman.conf ファイルに追記。
# cat >>pacman.conf <<'___'
>
> [archzfs]
> SigLevel = Never
> Server = http://archzfs.com/$repo/x86_64
> ___
isoを作成する手順が変わったようです。しかも日本語版archwikiにはその事が書かれていません。
頑張って英語版を読みました。
参考文献: 2.4 Kernel - 2 Prepare a custom profile - Archiso - ArchWiki
# mkarchiso -v .
〈表示省略〉
エラー:ダウンロード未完了
ここで失敗しました。zfs-utils-*-x86_64
のダウンロードが完了しません。下記のエラーが表示されてしまいます。原因は不明。
zfs-utils-2.1.2-1-x86_64.pkg.tar.zst failed to download
error: failed retrieving file 'zfs-utils-2.1.2-1-x86_64.pkg.tar.zst' from archzfs.com : Operation too slow. Less than 1 bytes/sec transferred the last 10 seconds
warning: failed to retrieve some files
error: failed to commit transaction (download library error)
Errors occurred, no packages were upgraded.
==> ERROR: Failed to install packages to new root
仕方が無いので、これは待ちました。次の休みまで1週間空けてからもう一度実行した所、解決したようです。
エラー:キー
error: key “C132293954BBE4AD” could not be looked up remotely
error: required key missing from key ring
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.
==> ERROR: Failed to install packages to new root
参考文献に従い、下記コマンドを実行。
# pacman -S archlinux-keyring —-noconfirm —-noprogress
〈省略〉
# pacman -Syu
〈省略〉
mkarchiso
を再実行します。
# mkarchiso -v .
エラー:メモリ不足
メモリが2GBでは足りなかったようです。 mkarchiso
コマンドが失敗しました。
[ 179.498580] Out of memory: Killed process 328 (pacman) total-vim:371564kB, anon-rss:51636kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:204kB oom_score_adj:0
/usr/bin/pacstrap: line 374: 327 Killed unshare —-fork —-paid pacman -r “$newroot” $pacmode “${pacman_args[@]}”
==> ERROR: Failed to install packages to new root
スワップファイルを作成して仮想メモリを用意します。仮想メモリの恩恵を感じたのは久し振りでした。
参考文献:3 スワップファイル - スワップ - ArchWiki
# fallocate -l 16384M /swapfile
# chmod 600 /swapfile
# mkswap /swapfile
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=2f272ff7-95c1-4e62-b024-3815316f8cf9
# swapon /swapfile
mkarchiso
を再実行する際には、中途半端になってしまった作業フォルダを削除します。
# rm -r work
# mkdir work
# mkarchiso -v .
isoイメージをホストマシンにコピー
ホストマシンにUSBメモリを挿して、ゲストマシン(今ArchLinuxを実行している仮想マシン)に割り当てます、と言いたい所ですが。Hyper-Vのゲストマシンは、ホストマシンのUSBデバイスを参照できないとの事。
愚痴は山程ありますが仕方ありません。
そこでちょっとした小技。仮想ドライブを作成し、ファイルをコピーしてからホストマシン(Win10Pro)でマウントします。Win10Proではこういう操作が可能になったんですな。
仮想ドライブを作成してHyper-Vゲストに追加する手順は省略。割と素直な手順で簡単に実行できます。
そしてゲストマシンのLinux側では下記のように見えます。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 127G 0 disk
|-sda1 8:1 0 300M 0 part /boot
`-sda2 8:2 0 126.7G 0 part /
sdb 8:16 0 127G 0 disk
sr0 11:0 1 1024M 0 rom
/dev/sdb
が増えました。これを/mnt
にマウントし、生成されたiso
ファイルをコピーします。
# mkfs.fat -F32 /dev/sdb
mkfs.fat 4.2 (2021-01-31)
# mount /dev/sdb /mnt
# cp out/*.iso /mnt
この後は作業中のゲストマシンをshutdown -h now
してから、Win10ホストマシン側で仮想ドライブをマウント。中のファイルを取り出します。これをゲストマシンのDVDドライブに設定してから電源ON。文字で書くとややこしいですな。
そして起動メニューが表示されます。
Arch Linux install medium (x86_64, UEFI)
Arch Linux install medium (x86_64, UEFI) with speech
Arch Linux install medium (x86_64, UEFI) Copy to RAM)
EFI Shell
Reboot Into Firmware Interface
デフォルトの一番上を選ぶと、下記画面で止まります。
:: running early look [udev]
Warning: /lib/modules/5.16.2-arch1-1/modules.devname not found - ignoring
Starting version 250.3-1-arch
:: running early hook [archiso_pxe_nbd]
:: running hook [udev]
:: Triggering uevents...
:: running hook [memdisk]
:: running hook [archiso]
:: running hook [archiso_loop_mnt]
:: running hook [archiso_pxe_common]
:: running hook [archiso_pxe_nbd]
:: running hook [archiso_pxe_http]
:: running hook [archiso_pxe_nfs]
::Mounting '/dev/disk/by-label/ARCH_202201' to '/run/archiso/bootmnt'
Waiting 30 seconds for device /dev/disk/by-label/ARCH_202201 ...
ERROR: '/dev/disk/by-label/ARCH_202201' device did not show up after 30 seconds...
Falling back to interactive prompt
You can try to fix the problem manually, log out when you are finished
sh: can't access tty; job control turned off
[rootfs ]#
色々試しましたがダメです。困りました。
zfsモジュールを入れないならちゃんと起動するisoファイルになります。という事はzfsがダメ。困りました。
今回はこれで諦める事にしました。zfs入りのarchisoを作らずに Linux on ZFS を実現する手順を考える事にしました。