昨日自宅のメインPCのOSをArch Linuxをインストールしました。 128GBのNVMe SSDを使っていたのですが、 docker pullpacman -Syu すると度々Disk Fullになって限界だったので、1TBのSSDに換装することにしました。 最後にArch Linuxをインストールしたのは5年以上前で知識のアップデートが必要だったので作業メモとして残しておきます。

インストールディスクの作成

インストールディスクは家に余っていたUSBディスクに作りました。 クラウド上にデータを保存するのが当たり前になった今日、USBディスクを使ったのも5年ぶりくらいかもしれません。 Arch LinuxのダウンロードサイトからインストーラーのISOを取得して、USB flash installation mediumにある方法でインストールディクスを作ります。 これは以前から変わらずddでポンッと作ることができます。

# dd bs=4M if=archlinux-version-x86_64.iso of=/dev/sdx conv=fsync oflag=direct status=progress

またddだけではなくcatやcpによる方法も紹介されており、Unixらしくていいなと思いました。

データのバックアップ

自分のマザーボードはM.2スロットが1つしかありません。 新しいNVMe SSDに載せ替える前に、今のディスクからバックアップしておきます。 /home だけではなく /etc/usr も対象とします。 必要なファイルをtarで固めても良いのですが、ddで取得したデータはあとからマウント可能と言うのを知ったのでそちらの方法でバックアップを作りました。

起動中のOSでバックアップを実行するのは危険なので、先程作成したインストールディスクから起動してバックアップデータを作成します。 HDDに十分な容量が余っていたので、そのディスクをマウントしてddの結果を保存します。 余分なディスクがない方は、ddの出力をs3などに流してクラウドに保存できるかもしれません(未検証なのでできなかったらすみません)。

# sudo mount /dev/md127 /mnt/workspace/   # /dev/md127はHDDで構成しているRAID
# dd bs=4M if=/dev/nvme0n1 of=/mnt/nvme0n1.img status=progress

無事バックアップが完了すれば、一度マシンをシャットダウンして新しいNVMe SSDに交換します。

Arch Linuxのインストール

基本的にInstallation guideに従いますが、ディスク構成とブートローダーの手順のみ記述します。

ディスク構成

新しいNVMe SSDが認識されたら、まずはパーティションの作成とファイルシステムの初期化です。 パーティションはGPT(MBRでは無い方)で作成します。 これまでは //home を別パーティションで作ってたのですが、役に立った覚えがないので同一パーティションにしました。 SWAP領域は32GiBメモリに対して最適なサイズがわからなかったのですが、Red Hatのドキュメントを参考に4GiBにしました。

UEFIから起動するにはEFI system partition (ESP) が必要で、容量は260 MiB以上が推奨です。 Installation guideにはESPのマウント先は /efi または /boot と書いてありますが、ESPのページ にその違いが書いてあります。 ESPの領域が小さかったり明示的に分けたい場合は /efi/boot を分けるそうなのですが、特別な理由がないので /boot にマウントしてブートローダーとカーネルの両方を配置します。 最終的なパーティション構成は以下のとおりです。

nvme0n1     259:0    0 931.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part  /boot
├─nvme0n1p2 259:2    0     4G  0 part  [SWAP]
└─nvme0n1p3 259:3    0   927G  0 part  /

ブートローダー

以前はGRUBを使っていましたが、現在はsystemdがブートローダーを内包しているのでそちらを利用してみます。 インストール先にchrootした状態で、bootctlコマンドでブートローダーとなるEFIアプリケーションを展開します。

# bootctl install

ブートローダーおよびエントリーの設定をそれぞれ保存します。

# /boot/loader/entries/arch.conf

title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img   # Intel CPUなら事前にintel-ucodeパッケージをインストールしておく
initrd /initramfs-linux.img
# /dev/disk/by-uuid からディスクのUUIDを確認できる
options root="UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" rw
# /boot/loader/entries/arch-fallback.conf

title Arch Linux (fallback initramfs)
linux /vmlinuz-linux
initrd /intel-ucode.img   # Intel CPUなら事前にintel-ucodeパッケージをインストールしておく
initrd /initramfs-linux-fallback.img
# /dev/disk/by-uuid からディスクのUUIDを確認できる
options root="UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" rw
# /boot/loader/loader.conf

#timeout 3
#console-mode keep
default arch.conf

bootctl status で正しく設定できているか確認します。

# bootctl status

再起動してNVMe SSDからArch Linuxが起動するか確認します。

再起動後のセットアップ

無事Arch Linuxが起動できることを確認したら、次はデスクトップ環境として利用できるようにセットアップします。 基本的にGeneral recommendationsに従いますが、特筆すべき手順だけ抜粋します。

ネットワーク

以前はdhcpcdを使っていましたが、現在はsystemdからネットワークの設定ができます。 我が家のネットワーク構成はDHCPでアドレス設定をするので、 /etc/systemd/network 以下に設定を書きます。

# /etc/systemd/network/00-enpXsXXXX.network

[Match]
# ip linkコマンドでインターフェイスの名前を確認できる
Name=enpXsXXXX

[Network]
DHCP=yes

systemd-networkd および systemd-resolved サービスを有効化します。 ping archlinux.org が成功すれば大丈夫です。

# systemctl status systemd-networkd.service
# systemctl status systemd-resolved.service

ディスプレイマネージャ

以前はSLiMというディスプレイマネージャーを使っていましたが今はメンテナンスされていないようです。 軽量ディスプレイマネージャーであるxdmの、Arch Linux向けに手が加えられているxdm-archlinuxを利用します。 以下のパッケージをpacmanでインストールします。

$ sudo pacman -S xdm-archlinux xterm

以下のコマンドでxdmの起動と有効化をします。

# systemctl enable --now xdm-archlinux.service

xdmが起動すればログイン画面がでますが、.xsession ファイルが必要です。 ログイン時にEnterキーではなくF1キーでログインすることで緊急用のxtermが起動します。 .xsession にWindow Managerの設定を書いて、Enterキーでログインができれば成功です。

$ touch ~/.xsession && chmod +x ~/.xsession
# ~/.xsession

# fcitxを利用する場合
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS='@im=fcitx'
fcitx

# Awesome WMを利用する場合
awesome

ビデオドライバ

うちはNVIDIAのグラフィックカードを使っているので、ドライバーのインストールをします。

$ sudo pacman -S nvidia

Xの設定を生成しログインし直してNVIDIAのドライバが有効になればOKです。

$ sudo nvidia-xconfig

オーディオ

ALSAはLinux上で音を出すためのモジュールです。 昔のアプリケーションは音を出すためにALSAとやりとりしてたのですが、現在FirefoxなどはPulseAudioとやり取りします。 オーディオの設定をするために、PulseAudioとALSAのユーティリティをインストールします。

$ sudo pacman -S alsa-utils pulseaudio

次に出力するデフォルトのデバイスを設定するために、aplayコマンドでデバイスカードの番号を取得します。 うちではJBL Pebblesを使っています。

$ aplay -l
...
card 2: Pebbles [JBL Pebbles], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
...

利用するオーディオデバイスが card 0 ならとくに何もする必要はありませんが、そうでない場合はデフォルトで利用するカードを ~/.asoundrc に保存します。

# ~/.asoundrc

defaults.pcm.card 2   # デフォルトの出力先
defaults.ctl.card 2   # デフォルトの設定先

そしてログインし直すか、pulseaudio -D でPulseAudioサーバーを起動します。 PulseAudioで音を鳴らせるpaplayコマンドで期待するデバイスから音が流れ、ALSAのalsamixerコマンドでボリュームが調整できれば大丈夫です。

$ paplay /usr/share/sounds/alsa/Noise.wav
$ alsamixer

以前の環境の復元

グラフィックとオーディオの設定ができれば、Linuxデスクトップの設定もほぼ完了と言っても過言ではないです。 あとは以前の設定を参考にしながら必要な設定をします。

以前のNVMe SSDからバックアップしたデータはmountコマンドでマウントできます。 バックアップデータの中に複数のパーティションが存在するので、マウントするときにどのパーティションを使うかを知る必要があります。 まずはバックアップデータのセクタサイズとパーティションのオフセットをfdiskまたはgdiskコマンドで確認します。

$ gdisk -l /workspace/nvme0n1.img
...
Sector size (logical): 512 bytes
...
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   EF00
   2         1050624        62914559   29.5 GiB    8300
   3        62914560       250068991   89.2 GiB    8300

セクタサイズと開始位置をかけ合わせた数を、mountコマンドの offset オプションに渡します。 これで /mnt 以下から以前のNVMeに保存されていたデータにアクセスできます。

$ sudo mount -o ro,loop,offset=$((512 * 1050624)) /workspace/nvme0n1.img /mnt/

以前の設定ファイルが欲しくなれば /mnt からコピーできます。 またルートディレクトリをマウントしたのなら、chrootでルートディレクトリを新たに切り替えることで、前のディスク上で作業をすることもできます。

$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
$ sudo mount --type tmpfs tmpfs /mnt/tmp  # chroot以下の作業の記録は /tmp にできる
$ sudo chroot /mnt

chrootした環境でコマンドの結果(例えばインストール済みパッケージに一覧など)を /tmp に保存すれば、ホスト側からは /mnt/tmp からアクセスできます。

まとめと感想

週末にArch Linuxインストールチャレンジをしましたが、Linuxの再勉強と頭の体操にちょうど良かったです。 Arch Linuxのwikiは、Arch Linuxユーザー以外にも非常に価値のあるドキュメントで、サーバー管理者やエンジニアにとっては必読書とも言えます。 また昔話にはなりますが、ブートローダー、グラフィック、サウンド周りの設定がものすごく簡単になりました。 Linuxが起動しなくなったり音が出なくなったときに、ドキュメントを必死に探して、設定を試行錯誤した青春時代が懐かしく感じます。