Arch Linux インストールメモ

新しく PC を購入し、Arch Linux をインストールしたので、その作業の個人用メモ。 あとから思い出しながら書いているので、実際に実行したコマンド等は省略気味。実際には紆余曲折があったが、その辺りも省略して、最終的にやったことの記録(それも思い出せる範囲で)。

用途

ssh でログインして使う開発マシン兼おもちゃ用途の汎用自宅サーバ

すでに 1 台同じ用途のがあり、特に問題なく使えているが、5 年前に買ったものなのでスペックアップも兼ねて買い替えることにした。

以前は Gentoo を使っていたが、別のものも使ってみたいと思っていたので、今回は Arch Linux にしてみる。インストールは初めて。

マシン

パーツ 商品 スペック 価格 コメント
ベアボーンPC Intel BXNUC10I7FNH Core i7-10710U (CPU) ドスパラWEB 67,660 円 通称 NUC。あまり深く考えずに選んだ。前から気になっていたシリーズではある。
メモリ G.SKILL F4-2666C18S-32GRS x2 SO-DIMM DDR4-2666MHz 32GB ドスパラWEB 12,693 円 x2 気付いたら 2 枚買っていた。絶対使いきれないと思うが後悔はしていない。
ストレージ CT1000P1SSD8JP M.2 SSD 1TB アマゾン ジャパン 12,800 円 NUC には 2.5 インチ SSD も載るが、これで足りるのでそちらは空けてある。
電源コード KB-DM3S-1 3P ストレートプラグ 1m ヨドバシ.com 624 円 上記が一通り届いた後でこれも必要なのに気付いて買い足した…圧倒的確認不足。

計 106,470 円。メモリもりもりにした割には安い。

インストール方針

ざっくり方針。

なお、ドライブ暗号化や btrfs の導入は個人的には今回が初めて。

インストールメディア作成

Windows マシンで作業。

Arch Linux のダウンロードページからインストールイメージ(archlinux-yyyy.mm.dd-x86_64.iso のようなファイル)をダウンロード。

自宅にあった 4GB の USB メモリに Rufus を使ってイメージを書き込み。特筆すべき点はなし。

インストール

基本は ArchWiki のインストールガイドに従って進める。

パーティション作成

parted を使ってパーティションを切る。

最終的な構成。

モデル: CT1000P1SSD8 (nvme)
ディスク /dev/nvme0n1: 1000GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt
ディスクフラグ:

番号  開始    終了    サイズ  ファイルシステム  名前      フラグ
 1    1049kB  1074MB  1073MB  fat32             efi-boot  boot, esp
 2    1074MB  550GB   549GB                     root
 3    550GB   1000GB  450GB                     home

なんとなく root と home は分けた。ざっくり 2 分割。

実は最初は /boot 用と /boot/efi 用でパーティションを分けてそれぞれ 512MB ずつ振っていたのだが、作業を進めるなかでブートローダーに systemd-boot を使おうとしたところ、そのような構成には対応していないとのことだったので、仕方なく 2 つのパーティションをがっちゃんこしたのだった。 root 用のパーティションはすでに暗号化 + 各種ファイルの配置が終わっていて、開始位置をずらすのは面倒だったし、512 MB くらいケチってもしゃーないので割とリッチなサイズの /boot になった。

ディスク暗号化

パーティションのうち、root と home は暗号化する。暗号化には dm-crypt + LUKS を使う。

何もわからないのでいつも通り ArchWiki の dm-crypt の項目を読んだり人に聞いたりしながら進めた。

鍵は外付けのストレージに置き、刺していないと起動できない構成にする。 外付けストレージは、自宅に転がっていた 2GB の SD カードを使う。もう 10 年近く前の代物…。余裕で壊れる可能性があるので当然鍵はバックアップする(暗号化されているデバイス上に保存されていなければよい)。

まずは鍵ファイルを作成する。これは適当なサイズのランダムなバイナリデータでよい。適当なサイズがどれくらいなのかが全然わからなかったので、適当に 8192 バイトの鍵ファイルを作った。

# mkdir /mnt/sd_card
# mount /dev/mmcblk0p1 /mnt/sd_card
# dd bs=512 count=16 if=/dev/urandom of=/mnt/sd_card/root.key
# dd bs=512 count=16 if=/dev/urandom of=/mnt/sd_card/home.key

この鍵を使ってパーティションを暗号化する。

# cryptsetup -v luksFormat /dev/nvme0n1p2 /mnt/sd_card/root.key
# cryptsetup -v luksFormat /dev/nvme0n1p3 /mnt/sd_card/home.key

作った暗号化デバイスをオープンする。

# cryptsetup open --type luks /dev/nvme0n1p2 crypt-root --key-file=/mnt/sd_card/root.key
# cryptsetup open --type luks /dev/nvme0n1p3 crypt-home --key-file=/mnt/sd_card/home.key

それぞれ名前を指定していて、 /dev/mapper/crypt-root のような名前でアクセスできる。このデバイスを操作すれば、暗号化されたデバイスを通常のデバイスのように操作できる。

ディスクマウントまで

まずはフォーマット。 /bootEFI System Partition なので FAT32 でフォーマットする。

# mkfs.fat -F 32 /dev/nvme0n1p1
# mkfs.btrfs /dev/mapper/crypt-root
# mkfs.btrfs /dev/mapper/crypt-home

そしてマウント。

# mkdir /mnt/arch
# mount /dev/mapper/crypt-root /mnt/arch
# mkdir /mnt/arch/home
# mount /dev/mapper/crypt-home /mnt/arch/home
# mkdir /mnt/arch/boot
# mount /dev/nvme0n1p1 /mnt/arch/boot

マウントをしたので fstab を生成しておく。

genfstab -U /mnt/arch >> /mnt/arch/etc/fstab

インストール

マウントしたデバイスに対して Arch Linux の必要なファイルをインストールする。

# pacstrap /mnt base btrfs-progs linux linux-firmware

今回は btrfs を採用したので、 btrfs-progs パッケージを指定する必要があった。

chroot

Arch Linux には arch-chroot というのがあるのでカンタン。Gentoo の時は結構面倒だった(今は変わってたりするんだろうか)。

# arch-chroot /mnt/arch

細かな設定

おおむねインストールガイド通り。

タイムゾーンの設定

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc

言語設定

/etc/locale.gen に以下を追記。

ja_JP.UTF-8 UTF-8
en_US.UTF-8 UTF-8

以下のコマンドでロケールを生成。

# locale-gen

/etc/locale.conf に以下を書き込んで起動時のデフォルトにしておく。

LANG=ja_JP.UTF-8

コンソールの設定

普段は ssh で接続する前提なのでコンソールはインストール作業や緊急時くらいにしか使わないんですが。

コンソールではCaps Lock を Ctrl に置き換えておく。Arch Linux では keymap ファイルは /usr/share/kbd/keymaps/i386/qwerty/ 以下にあった。

以下のコマンドでキーボードのキー配列を変更する。jp106-caps-ctrl は時前で用意した Caps Lock を Ctrl に置き換えた配列。

# loadkeys jp106-caps-ctrl

/etc/vconsole.conf に以下を書き込んで起動時のデフォルトにしておく。

KEYMAP=jp106-caps-ctrl

ネットワーク設定

/etc/hostname/etc/hosts をサクッと設定する。

dhcpcd を入れておく。実はインストール中に入れ忘れて起動後にネットに繋がらなくて後から入れ直した。

# pacman -S dhcpcd

root のパスワード

忘れずに設定しておく。

# passwd

ブート設定

先に少し触れた通り、今回はブートローダーに systemd-boot を使う。個人的には今までは GRUB を使っていた。特に GRUB には不満はなかったが、最近は猫も杓子も systemd という風潮を感じるので、せっかくだから systemd に寄せてみるか、程度の動機。

ArchWiki の systemd-boot の項目に沿って進める。

まずは EFI システムパーティション(/boot)に systemd-boot をインストールする。

# bootctl --path=/boot install

Arch Linux を起動するためのローダーを追加する。GRUB では自動でやってくれた部分が手で書くしかないと知った時は絶望した。将来に期待したい…。

/boot/loader/entries/arch.conf に以下の内容のファイルを作成する。

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options luks.uuid=84b7c414-4d5a-4958-ae55-c5beb137acd8
options luks.name=84b7c414-4d5a-4958-ae55-c5beb137acd8=encrypt-root
options luks.key=84b7c414-4d5a-4958-ae55-c5beb137acd8=/root.key:UUID=4081-FA31
options luks.uuid=fb18406d-4cee-404a-b33a-bd3163cef23d
options luks.name=fb18406d-4cee-404a-b33a-bd3163cef23d=encrypt-home
options luks.key=fb18406d-4cee-404a-b33a-bd3163cef23d=/home.key:UUID=4081-FA31
options root=UUID=09afad0f-0fd9-4464-8980-2fddd6f5e15c rw

ここが一番ハマった。

luks.uuid には、暗号化されたパーティションの UUID を指定する。 luks.name には、暗号化されたパーティションをオープンする際の名前(/dev/mapper/{name} で参照できる名前)を {UUID}={name} の形式で指定する。 luks.key には、暗号化に使った鍵ファイルの場所を {UUID}={path}:{partition} の形式で指定する。{partition} 内の {path} にある鍵ファイルが使われる。 root は通常通り。当然複合化されたパーティションを指定する必要がある。

参考までに私の環境での各パーティションの UUID なんかの情報を載せておく。

# blkid
/dev/nvme0n1p1: UUID="8FDB-7D9C" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="efi-boot" PARTUUID="56d44349-149f-4f0c-83b8-d81f15ce7afd"
/dev/nvme0n1p2: UUID="84b7c414-4d5a-4958-ae55-c5beb137acd8" TYPE="crypto_LUKS" PARTLABEL="root" PARTUUID="52179ba4-a678-48bc-b2f0-89609ddc7c25"
/dev/nvme0n1p3: UUID="fb18406d-4cee-404a-b33a-bd3163cef23d" TYPE="crypto_LUKS" PARTLABEL="home" PARTUUID="a0806d30-22bd-49a1-9de1-acffbad6321f"
/dev/mmcblk0p1: SEC_TYPE="msdos" UUID="4081-FA31" BLOCK_SIZE="512" TYPE="vfat"
/dev/mapper/encrypt-root: UUID="09afad0f-0fd9-4464-8980-2fddd6f5e15c" UUID_SUB="77041826-2e8c-49b9-b3d0-f7267ac8c231" BLOCK_SIZE="4096" TYPE="btrfs"
/dev/mapper/encrypt-home: UUID="6e980051-5837-4be6-aff2-00551a20339a" UUID_SUB="3a3e48ee-2c56-4a48-97b4-55f0d2779723" BLOCK_SIZE="4096" TYPE="btrfs"

最初は /etc/crypttab ファイルや /etc/crypttab.initramfs ファイルに記載してブートを試みたが、うまくいかず。恐らく書式が間違っていたのだと思う(調べるのをやめてしまったので真相は不明…)。起動時のオプションから渡すようにしたらうまくいった。

マイクロコード

前述の arch.conf 内で参照している intel-ucode.img を用意するために intel-ucode をインストールする。

# pacman -S intel-ucode

再起動

うまく起動するように祈る。

# systemctl reboot

実際には1度でうまく行く訳がなく、何度も再起動した(主にブートローダーの設定辺り)。

無事起動できたら、一般ユーザーの作成とかをやっていく。

謝辞

インストール作業にあたって、vim-jp Slack の #os-linux チャンネルの皆さんに大変御助力頂きました。本当にありがとうございます。ログはこの辺り