昨日自宅のメイン PC の OS を Arch Linux をインストールしました。
128GB の NVMe SSD を使っていたのですが、 docker pull
や pacman -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 が起動しなくなったり音が出なくなったときに、ドキュメントを必死に探して、設定を試行錯誤した青春時代が懐かしく感じます。