💻

Arch Linux Install Battle 2022 Summer

2022/08/24に公開

というわけで、3年ぶりくらい?に、Arch Linux のインストールをしていこうと思います。

!WARNING!

基本的には自分用の作業記録というスタンスなので、もしこの記事を見つけても、あまり参考にしないでください。

今回インストールするマシン

CPU は Intel Alder Lake の P シリーズにしてみました。
Linux で使う場合、Intel Thread Director をサポートしている Kernel 5.18 以降がよろしいかと。
今回インストールする Arch Linux のカーネルバージョンは 5.18.16 なので、一体どんなもんか、見てみようじゃないですか。

また、デスクトップ環境として Xfce を入れる予定です。

本筋とは関係ないこと

ThinkPad の納期、「1ヶ月半から(今はあーだこーだで遅れがちなので)2ヶ月くらいです」と言われていたのですが、何故か2週間で届きました。
ありがとう Lenovo さん。

追記:2022/11/29

ThinkPad が故障したのでその話。

2022/11/13 壊れる

https://twitter.com/23_prime/status/1591631418282893312

電源ボタンが全く反応しないので、多分ハードが逝ったのかなと。

2022/11/19 修理に出す(集荷日)

一応保証期間内ではあったので、ダメ元で修理に出すことにしました。

2022/11/23 修理完了連絡

先に症状の連絡とかがあるものだと思っていたのですが、いきなり完了連絡が来ました。
まあ無償でやってくれたので全く文句ないです。

2022/11/25 受け取り

帰ってきました。思ったより早い。

ボードごと交換してくれました。

インストールメディアを作る

ISO ファイルをダウンロードする

Arch Linux - Downloads にある適当なミラーサーバーから ISO ファイルをダウンロードします。
日本に住んでいるなら Japan のものを選んでおけばおk。

個人的な縁という理由で筑波のサーバーを使っています。
http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/2022.08.05/

ここから archlinux-2022.08.05-x86_64.iso をダウンロードします。
私の家だと10分程度で完了しました。

USB メディアを作る

今は Rufus とかいうのが良いっぽいです。
https://rufus.ie/ja/

↑から最新版をダウンロードして、そのファイルをそのまま実行すれば起動します。

多分 MBR でも大丈夫ですが、今どき MBR にする理由もないので GPT でやります。

入力したら「スタート」します。

「ISO イメージモードで書き込む(推奨)」にしておきます。
1分くらいで完了したので、閉じます。

ThinkPad の SSD を入れ替える

爪が折れるんじゃないかと心配になりつつ、公式動画の通りにこじ開けて、SSD を入れ替えました。

セキュアブートを OFF にする

ThinkPad X1 Carbon Gen 10 の場合、起動時に F1 キー押下で BIOS 設定画面が開きます。
「ピッ」音がクソデカくてちょっとビックリしました。

Security > Secure Boot と進み、トグルで off に切り替えます。
最後に Save and Exit して完了です。

USB ブートする

再起動すると、ブートローダーの画面に飛ぶので、Arch Linux のインストール用っぽいやつを選びます。

ネットワークに接続する

新しい ThinkPad には Ethernet 端子が無いので、無線でやります。
iwd を使います。

デバイスを確認します。

# iwctl
[iwd]# device list
...
----------
  Name ...
----------
  wlan0 ...  

wlan0 がそれですね。
ネットワークの一覧を取得します。

[iwd]# station wlan0 scan
[iwd]# station wlan0 get-networks

ここでヒットした SSID の中から接続したいものを選び、下記コマンドを実行します。
パスワードは対話的に入力します。

[iwd]# station wlan0 connect {SSID}

疎通確認します。

# ping archlinux.org

システムクロックを設定する

# timedatectl set-ntp true

ディスクの設定をする

パーティショニングは GPT で、ファイルシステムは XFS にします。

パーティショニング

まず、ディスクが認識されていることを確認します。

# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0     7:0    0  680M  1 loop /run/archiso/airrootfs
sda       8:1    1  14.8G 0 dist
└─sda1    8:1    1  14.8G 0 part /run/archiso/bootmnt
nvme0n1 259:0    0 931.5G 0 disk
# fdisk -l
Dsik /dev/nvme0n1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk mode: ...
...

nvme0n1 が、今回インストールする先です。

レイアウトはこんな感じにしました。

type file sysytem start end
boot ESP fat32 1MiB 551MiB
swap primary linux-swap 551MiB 48.5GiB
/ primary xfs 48.5GiB 100%

RAM 32 GB なので、RedHat によると 1.5 倍のスワップ領域があると良さそうとのことです。
つまり 48 GB くらい。

GPT でラベルを作ります。

# parted /dev/nvme0n1 mklabel gpt

上表の通りにパーティションを切っていきます。

# parted /dev/nvme0n1 mkpart ESP fat32 1MiB 551MiB
# parted /dev/nvme0n1 mkpart primary linux-swap 551MiB 48.5GiB
# parted /dev/nvme0n1 mkpart primary xfs 48.5GiB 100%

ブートボリュームに対しては、起動可能にするために下記コマンドを打ちます。
1 は、パーティションの番号です。
今回は明らかに 1 なのですが、心配であれば print で確認できます。

# parted /dev/nvme0n1 mkpart set 1 esp on

結果を確認します。

# parted /dev/nvme0n1 print
Model:...
...
Disk Flags:

Number  Start    End     Size   File system  Name     Flags
 1      1049KB   578MB   577MB               ESP      boot,esp
 2      578MB    52.1GB  51.5GB              primary  swap
 3      52.1GB   1000GB  948GB               primary  swap
# fdisk -l
Dsik /dev/nvme0n1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk mode: ...
...
Divice             Start        End    Sectors Size Type
/dev/nvme0n1p1      2048    1128447    1126400 550M EFI System
/dev/nvme0n1p2   1128448  101711871  100583424  48G Linux swap
/dev/nvme0n1p3 101711872 1953523711 1851811840 883G Linux filesysytem
...

ファイルシステムを作る

ブート、ルートボリュームには mkfs を、スワップボリュームには mkswap を使います。

# mkfs.fat -F 32 /dev/nvme0n1p1
# mkswap /dev/nvme0n1p2
# mkfs.xfs /dev/nvme0n1p3

ファイルシステムをマウントする

# mount --mkdir /dev/nvme0n1p1 /mnt/boot
# swapon /dev/nvme0n1p2
# mount /dev/nvme0n1p3 /mnt

確認します。

# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0         7:0    0  680M  1 loop /run/archiso/airrootfs
sda           8:1    1  14.8G 0 dist
└─sda1        8:1    1  14.8G 0 part /run/archiso/bootmnt
nvme0n1     259:0    0 931.5G 0 disk
├─nvme0n1p1 259:2    0   550M 0 part /mnt/boot
├─nvme0n1p2 259:5    0    48G 0 part [SWAP]
└─nvme0n1p3 259:6    0   883G 0 part /mnt

初期パッケージをインストールする

インストールガイドのものプラス、一時的な作業用エディタとして vi を入れておきます。

# pacstrap /mnt base linux linux-firmware vi

システムの初期設定をする

fstab を作る

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

念のため中身を確認します。
ルート、ブート、スワップボリュームが正しい場所にマウントされていればおkです。

# cat /mnt/etc/fstab

chroot する

# arch-chroot /mnt

タイムゾーンの設定をする

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

JST になっていることを確認します。

# date
Tue Aug 23 22:52:58 JST 2022

ロケールの設定をする

/etc/locale.gen を編集し、

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

をアンコメントします。

# sed -i s/#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g /etc/locale.gen
# sed -i s/#ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/g /etc/locale.gen
# cat /etc/locale.gen | grep -v '#'
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8

ロケールを作成します。

# locale-gen
Generating locales...
  en_US.UTF-8 UTF-8
  ja_JP.UTF-8 UTF-8
Generation complete.

ロケールの設定を書きます。

# echo 'LANG=ja_JP.UTF-8' > /etc/locale.conf

root のパスワードを設定する

# passwd

ブートローダーの設定をする

最近は systemd-boot を使うのが良いっぽいです。

ブートマネージャーをインストールする

# bootctl install
Created "/boot/EFI".
...
Created EFI Boot entry "Linux Boot Manager".

ローダーエントリーを作る

/boot/loader/entries/arch.conf を作成、編集します。

…が、なんかおかしい。
/boot/ 直下にいたはずの vmlinuz-linux initramfs-linux.img nitramfs-linux-fallback.img が消滅している。

# ls /boot/
EFI  loader

一応↓これで解決したっぽい。

# pacman -S linux
...
# ls /boot/
EFI  initramfs-linux-fallback.img  initramfs-linux.img  loader  vmlinuz-linux

インテル CPU 用のマイクロコードのインストールもしておきます。

# pacman -S intel-ucode
...
# ls -l /boot
EFI  initramfs-linux-fallback.img  initramfs-linux.img  intel-ucode.img  loader  vmlinuz-linux

これでエントリー設定を書けます。
タイプミスしたくないのでなるべく確実な方法でやります。

# basename `ls /boot/vmlinuz-linux` > /boot/loader/entries/arch.conf
# basename `ls /boot/intel-ucode.img` >> /boot/loader/entries/arch.conf
# basename `ls /boot/initramfs-linux.img` >> /boot/loader/entries/arch.conf
# blkid -o export /dev/nvme0n1p3 | grep ^UUID >>/boot/loader/entries/arch.conf

これを編集して、最終的に↓こんな感じにします。

title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root=UUID={ルートパーティションの UUID} rw

設定内容を確認します。

# bootctl list
Boot Loader Entries:
...

ローダーの設定を書く

/boot/loader/loader.conf を編集します。

default  arch.conf
timeout  4
console-mode max
editor   no

iwd をインストールしておく

再起動前のライブメディアでの作業段階でインストールしておきます。
後からだとそもそも iwd とかがなくてネットワークに接続できず、インストールできないので。

# pacman -S iwd

再起動する

chroot から抜けて、再起動します。

# exit
# reboot

ブートローダーの画面が出て、Arch Linux にログインできたら成功です。

ネットワークに接続する

iwd を有効化する

# systemctl enable iwd
# systemctl start iwd

iwd での具体的な接続方法は先述の通り。

systemd-resolved を有効化する

これをしないと名前解決ができません。

# systemctl enable systemd-resolved
# systemctl start systemd-resolved

これだけでもある程度ちゃんと動いている(名前解決できている)のですが、従来の /etc/resolv.conf には、ローカルのスタブ DNS リスナーのみを記載するのが推奨されているそうです。

# mv /etc/resolv.conf /etc/resolv.conf.orig
# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

疎通確認します。

# ping archlinux.org

ただ、この時点だと IPv6 非対応のサーバーへは接続できません。
例えば github.com に ping すると、

# ping github.com
ping: connect: Network is unreachable

となります。
名前解決はできているので、単に通信が届いていないようです。

LAN 内への ping も同様なので、IP アドレス割当てを調べてみると、

# ip address
...
3: wlan0: ...
    link/ether 8c:...
    inet6 2400::...
      valid_lft ...
    inet6 fe80::...
      valid_lft ...      

となっており、IPv4 アドレスがないですね。
やはりネットワークマネージャーは入れないとダメっぽい。

systemd-networkd の設定をする

とりあえず起動していることを確認します。

# systemctl status systemd-networkd
# networkctl -a
IDX LINK  TYPE     OPERATIONAL SETUP
  1 lo    loopback carrier     unmanaged
  2 wlan0 wlan     routable    unmanaged

2 links listed.

これの 2 wlan0 の設定を /etc/systemd/network/wlan0.network に作成します。

[Match]
Name=wlan0

[Network]
DHCP=yes

これでサービスを再起動して完了です。

# systemctl restart systemd-networkd
# networkctl -a
IDX LINK  TYPE     OPERATIONAL SETUP
  1 lo    loopback carrier     unmanaged
  2 wlan0 wlan     routable    configured

2 links listed.
# ip address
...
3: wlan0: ...
    link/ether 8c:...
    inet 192.168.3.14/24...
      valid_lft ...
    inet6 2400::...
      valid_lft ...
    inet6 fe80::...
      valid_lft ...

ちゃんと configured になっていて、IPv4 アドレスも割当られました。

ユーザーを作る

# useradd -m -G wheel okkey

パスワードを設定しておきます。

# passwd okkey

権限設定

sudo を使えるようにします。

# pacman -S sudo

visudo/etc/sudoers を編集し、wheel グループが sudo できるようにします。
NOPASSWD はさすがにちょっとアレなので、弱い方をアンコメントします。

%wheel ALL=(ALL:ALL) ALL

試しにコマンドを打ってみます。

# su - okkey
# sudo ls /
(いつもの警告文が出ればおk)

ホスト名を設定する

注意:ここから先は、作業用に作ったユーザーで行います。

$ sudo hostnamectl set-hostname x1-carbon-gen10-arch

Static hostname が、↑で設定したものになっていれば成功です。

$ hostnamectl status
 Static hostname: x1-carbon-gen10-arch
...

AUR ヘルパーをインストールする

今は yay が主流でしょう。

GitHub リポジトリの手順に従ってインストールします。

$ pacman -S --needed git base-devel
$ git clone https://aur.archlinux.org/yay-bin.git
$ cd yay-binc
$ makepkg -si

動作確認を兼ねて、パッケージを最新化しておきましょうか。

$ yay -Syu

デスクトップ環境を作る

https://zenn.dev/imzrust/articles/4d694619111f07

こちらの記事を参考にさせていただきました。ほぼ同じです。

  • pacman ではなく yay を使いました。
    • sudo も外します。yay は内部で(必要なときに?) sudo を呼ぶらしく、最初から sudo 付きで実行すると警告が出ます。
  • xfce4-goodies のものは正直全部入れちゃっていい(というか本当に不要なものの方が少ない)ので、全部入れました。

コマンドだけ列挙しておきます。

$ yay -S xorg-server
$ yay -S xfce4
$ yay -S xfce4-goodies
$ yay -S noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra ttf-dejavu
$ yay -S lightdm lightdm-gtk-greeter
$ sudo systemctl enable lightdm

ここまでやって再起動すると、GUI が起動します!やったね!

次にやること

ここから先は、昔の記憶昔の記憶を頼りにやっていけば良さそうです。

以下、あーだこーだしている最中にダメだったり、やり直したりしたことです。

グラフィックドライバーをあーだこーだする

とりあえず Xfce が起動していたのですが、あるタイミングでの再起動で、急に起動しなくなりました。

画面上、以下のログのところでスタックしました。

[  OK  ] Reached target Graphical Interface.

このキーワードで調べると、NVIDIA 用のドライバーのインストールやら設定やらが上手くいっていないという記事ばかりで、自分には当てはまりませんでした。

とりあえずインストール時に使った USB メモリで起動、SSD の方をマウントし、Xorg のログを確認します。
エラーログのプリフィックスには (EE) とあるので、エラーログがないか見てみます。

# cat /var/log/Xorg.0.log | grep '(EE)'
[     8.606] (EE) Failed to load module "intel" (module does not exist, 0)
[     8.607] (EE) Failed to load module "fbdev" (module does not exist, 0)
[     8.607] (EE) Failed to load module "vesa" (module does not exist, 0)

通常、intelfbdevvesa という順序でドライバーを探すらしいのですが、どれもコケています。
というか modesetting が選ばれるべきなのですが、なぜかロードされていません。

※ここでもう少し真面目に調べれば良かったのですが、明日も朝から仕事なので解決を優先しました。

Intel 用のドライバをインストールしてみます。
ただし、これは本来 非推奨 です。

# yay -S xf86-video-intel

これで再起動したら X が起動したのですが、めちゃくちゃ重い(特に Web ブラウザとか VSCode とか)し、クリックを受け付けなくなるし、最終的にフリーズしました。

もう一度調査しようと思って、一旦 xf86-video-intel をアンインストールし、再起動します。

# yay -Rs xf86-video-intel

すると、今度はなぜかちゃんと起動しました。
なんで?

覚書:仮想コンソールの切り替え

こういうグラフィック系の問題を調査したり対応したりするとき、仮想コンソールが便利です。

  • Ctrl + Alt + F[1-6] でコンソールを切り替えられる。
  • デフォルトは1番で、Ctrl + Alt + F1 が対応する。
  • Ctrl + Alt + F7 で GUI に復帰できる。

ネットワークマネージャーを変更する

systemd-networkd でここまでやってきましたが、GUI と良く連携できるツールがありません。
(作るという手もあるけどちょっとしんどそう。)

ということで、残念ながら NetworkManager を使うことにしました。

nm-applet と併せてインストールします。

$ yay -S networkmanager network-manager-applet

NetworkManager のサービスを有効化し、systemd-networkd と iwd は無効化します。

$ sudo systemctl enable NetworkManager
$ sudo systemctl disable systemd-networkd
$ sudo systemctl disable iwd

これで再起動すれば、システムトレーに nm-applet が表示され、そこからネットワーク関連の設定が可能になります。

サウンド関連の設定をする

PulseAudio をインストール・起動する

サウンドドライバーには組み込みの ALSA を使います。
サウンドサーバーには PulseAudio を、GUI ツールとして PulseAudio Volume Control を使います。

$ yay -S pulseaudio pavucontrol

とりあえず手動で起動します。

$ pulseaudio --start

--check オプションでステータスを確認できるのですが、終了コードでしか結果を確認できないので注意。

$ pulseaudio --check || echo $?
0

…が、音が出ません。

音が出ない

PulseAudio の GUI から「ハードウェア出力装置」を見てみると、デバイスが出てきません。

設定タブでも、サウンドカードがないとのこと。

一応 CLI でも確認してみますが、サウンドカード認識されてないっぽいですね。

$ pacmd list-cards
0 card(s) available.

sof-firmware をインストールする

そういえば、起動時に sof-firmware が無いだかなんだかでエラーが出ていたような?

$ sudo dmesg | grep -E 'sof.*firmware' 
[    7.187399] sof-audio-pci-intel-tgl 0000:00:1f.3: Direct firmware load for intel/sof/sof-adl.ri failed with error -2
[    7.187401] sof-audio-pci-intel-tgl 0000:00:1f.3: error: sof firmware file is missing, you might need to
[    7.187433] sof-audio-pci-intel-tgl 0000:00:1f.3: error: failed to load DSP firmware -2

やっぱ出てますね。
インストールしましょう。

$ yay -S sof-firmware

で再起動すると、たくさんのデバイスが認識されていました。

ちょうど良いタイミングでぶいすぽっ!の新人さんがデビュー配信をなさっていたので、動作確認がてら拝見しました。

一応 dmesg 確認しましたが、エラーはなくなっていました。

$ sudo dmesg | grep -E 'sof.*firmware' 

所感

なんか systemd の守備範囲めっちゃ広くなってない?

書き忘れたこと

  • Greeter の設定
  • スリープ(サスペンド、ハイバネート)関連の設定調整

参考

Discussion