新しく 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 円。メモリもりもりにした割には安い。
インストール方針
ざっくり方針。
- ベースは systemd
- ディスク暗号化
- ルートパーティションは btrfs
なお、ドライブ暗号化や 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
のような名前でアクセスできる。このデバイスを操作すれば、暗号化されたデバイスを通常のデバイスのように操作できる。
ディスクマウントまで
まずはフォーマット。 /boot
は EFI 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 チャンネルの皆さんに大変御助力頂きました。本当にありがとうございます。ログはこの辺り。