Linux初心者がGWにArchLinuxをインストールしてみた話

# はじめに

この記事は、Linux初心者である筆者がGWにArchLinuxをインストールしてみた時の話について書いています。

## ArchLinuxとは

筆者の抱いている印象は、

- インストールが難しいけど、その分インストールの作業を通してLinuxについての知見を深めることができるLinuxのディストリビューション
- 本当に最小限のものしかインストールされないから、必要なものは適宜自分で追加でインストールする必要がある (そういう点で知識が求められるが、勉強にもなる)

こんな感じです。

※ 詳細や正確な情報は[公式](https://wiki.archlinux.jp/index.php/Arch_Linux)を見てください。

## 何故ArchLinuxをインストールしようと思ったか？

きっかけは今年の年始くらいにあった会社の同じ部署の若手飲み会に遡ります。
酒の席にて、「自分がインストールしたLinuxディストリビューションの話」になりました。筆者はせいぜい仕事と趣味でUbuntuを1回ずつインストールしたことがあった程度でしたが、先輩方はもっと経験豊富で面白いエピソードを沢山お持ちでした。
中でも印象に残ったのがArchLinuxで、何でも「インストールするだけでも大変」なのだとか。なんだか玄人感があってカッコ良いのと、「インストールする過程でLinuxの知識がつく」という触れ込みにすっかり魅了されました。
こんなエピソードがあったため、今年の年始くらいから(いつかArchLinuxをインストールしてみたいな……)と漠然と思っていました。
そんな折、今年のGWは ~~あまり遊びに誘われなかったこともあり~~ 時間に余裕があったため、前々から抱いていた「ArchLinuxのインストール」という野望に挑戦してみる運びとなりました。

### 余談

ちなみに、ArchLinuxはあまりにもインストールが大変なあまり「ArchLinuxをインストールする行為」を指して "ArchLinuxインストールバトル"なんて呼ばれたりするそうです。

# 環境

- PC
    - 2万弱のミニPCを今回のためにわざわざ買いました。元々ミニPCがどんなものなのか気になっていた時に、会社の同期にちょうどいい感じのものをお薦めされたのでそのまま購入したという次第です。
    - [これ](https://www.amazon.co.jp/gp/product/B0C1YY8GSB/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1)
- インストールメディアの準備
    - 今回はUSBにisoイメージを焼きました。この作業は普段プライベートで使っているMacで行いました。

# 奮闘の記録

今回のArchLinuxインストールバトルにあたって、ローカル環境でホストしているredmineに作業ログを残していました。(予期せぬ事態が起きた際にトラブルシューティングとかをやりやすくするため)
今回の記事は、**めんどくさいのでこの作業ログをほぼ丸々コピペします**。

## Day1

### インストールメディア(USB)の作成

#### 手順の調査

- まずは [ArchWikiのインストールガイド](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)を参照。
    - ISOファイルと「署名」が必要とのこと。

- 署名はよく分からんが、
    - ISOファイルのインストールページにある `archlinux-version-x86_64.iso.sig` と、 (ダウンロードページの中の "チェックサム" の下にある) "PGP 署名" があれば良いらしい。
    - 署名を確認するコマンドは以下。実行には GnuPGが必要らしい

```bash
$ gpg --keyserver-options auto-key-retrieve --verify archlinux-version-x86_64.iso.sig
```

#### 想定手順

- Mac上での作業
    - GnuPGのインストール
    - ISOイメージと署名ファイルのインストール
    - 署名確認コマンドの実行
    - USBにISOイメージを焼く

- ミニPC上での作業
    - USBをミニPCに繋ぐ
    - 何らかの方法でネットに繋いで、インストール開始？

#### 実作業

作業ディレクトリ： ~/Programming/ArchLinux

- [ダウンロードページ](https://archlinux.org/download/)
    - PGP署名はこのページの "Checksums and signatures" という項目からDL
    - isoと.sigはこのページにリンクがあった[ミラーサイト？](https://jp.mirrors.cicku.me/archlinux/iso/2024.05.01/)からDL
        - ファイル名から察するに、「PGP署名」と .sig ファイルは同じものだったっぽい

- GnuPGのインストール
    - `$ brew install gnupg`

##### 署名確認コマンドの実行

- isoファイルとsigファイルを同じディレクトリに入れる
    - `archlinux-x86_64.iso`,`archlinux-x86_64.iso.sig`
- `$ gpg --keyserver-options auto-key-retrieve --verify archlinux-x86_64.iso.sig`

(結果)

```bash
❯ gpg --keyserver-options auto-key-retrieve --verify archlinux-x86_64.iso.sig 
gpg: 署名されたデータが'archlinux-x86_64.iso'にあると想定します
[...]
gpg: 究極的に信用する鍵が見つかりません
gpg: "Pierre Schmitz <pierre@archlinux.org>"からの正しい署名 [不明の]
gpg: *警告*: この鍵のユーザIDは信用できる署名で証明されていません!
gpg:       この署名が所有者のものかどうかの検証手段がありません。
 主鍵フィンガープリント: 3E80 CA1A 8B89 F69C BA57  D98A 76A5 EF90 5444 9A5C
```

- むむむ。

- 別の isoとsigの組み合わせにしてみる
    - `archlinux-2024.05.01-x86_64.iso`と`archlinux-2024.05.01-x86_64.iso.sig`の組でもダメだった

- ダウンロードページをよく見たら、ミラーサイトの鍵は改変されてるかもと書かれている
    - ダウンロードページの.sigでもダメだった
    - ミラーサイトがよくない？

- ダウンロードページを更によく見たら、「署名を検証する他の方法として ISO ファイルに署名している [Arch Linux の開発者](https://archlinux.org/people/developers/) のフィンガープリントと公開鍵のフィンガープリントが一致していることを確認することでも検証できます。」との記述。
    - 実際に見てみたところ、 `Pierre Schmitz`氏のフィンガープリントが公開鍵のフィンガープリント( `3E80 CA1A 8B89 F69C BA57  D98A 76A5 EF90 5444 9A5C` )と一致していることが確認できた。

##### USBにISOイメージを焼く

- [インストールガイドのMacの項目](https://wiki.archlinux.jp/index.php/USB_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2#macOS_.E3.81.A7)を読みながら。
    - Ubuntuのディスク作った時とあまり変わらなさそう

```bash
$ diskutil list
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *62.1 GB    disk4
   1:                        EFI EFI                     209.7 MB   disk4s1
   2:                  Apple_HFS 名称未設定              61.7 GB    disk4s2

$ diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
$ sudo dd if=archlinux-2024.05.01-x86_64.iso of=/dev/rdisk4 bs=1m
```

- ddコマンド実行後は、無事に終わることを祈りながら放置

- ↑エラーを吐いたが、wikiには「完了すると macOS が セットしたディスクは、このコンピュータで読み取れないディスクでした。 とエラーを吐くことがあります。無視 を選択してください。」とあったので問題なさそう
- USBを取り出し、続きは明日以降へ。

(結果)

```
❯ sudo dd if=archlinux-2024.05.01-x86_64.iso of=/dev/rdisk4 bs=1m       00:08 
Password:
1078+1 records in
1078+1 records out
1130704896 bytes transferred in 93.574233 secs (12083507 bytes/sec)
```

## Day2

### USBメディアから起動

- 本体にUSBを差して、再起動からの esc長押しでBIOS起動。
- Boot画面から、起動ディスクを選択。
    - Boot Option #1 を [USB Device:UEFI: ADATA USB Flash Drive 1100] にする
    - Save and Exit

- 上記を実行したところ、Arch Linuxのインストール画面が表示された。
- 自動で勝手に色々コンソールログが流れた

### インストール開始！
- `root@archiso ~ #`
	- この後にコマンドを入力できる状態となっている

- [インストールガイド](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)に従って進める
	- ライブ環境の起動
		- ※ BIOSの画面でセキュアブートを無効化することを忘れていた。
		- 特に何もしなくても、仮想コンソールの zshは開いてるっぽい
	- コンソールのキーボードレイアウト
		-  一旦ここは飛ばして良さそう
	- 起動モードの確認
		- `ls /sys/firmware/efi/efivars` でちゃんとファイルが表示されることを確認した

- ひとまず wifiに繋げなければならない

#### インターネット接続

- `$ ip link` で[ネットワークインターフェイス](https://wiki.archlinux.jp/index.php/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A#.E3.83.8D.E3.83.83.E3.83.88.E3.83.AF.E3.83.BC.E3.82.AF.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.BC.E3.83.95.E3.82.A7.E3.82.A4.E3.82.B9)を確認した 
	- wlan0があり、 `UP` があるのでインターフェイスが立ち上がってそう
	- "後ろにある `state DOWN` は関係ありません。"
- `$ iwctl`コマンドで接続を試みる
	- [iwd]# までがprefix
	- `[iwd]# device list` → wlan0が1個だけ表示された
	- `[iwd]# station wlan0 scan` → 何も出ず
	- `[iwd]# station _device_ get-networks` → 普段使ってる無線LANの名前が出てくる
	- `[iwd]# station wlan0 connect 483[...]`
		- SSID(ネットワーク名)もタブ補完効いた。便利
	- 一旦 Ctrl d で終了
- `ping archlinux.jp` を叩いたところ、無事接続できていた

#### インストール前準備

##### システムクロックの更新

- `# timedatectl status`
	- UTC時刻が表示された。問題なさそう (2024-05-05)

##### パーティション

- この辺は結構ちゃんと読んでやらないとダメそう。一旦中断

## Day3

#### パーティションについて

- [参考](https://wiki.archlinux.jp/index.php/%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8B%E3%83%B3%E3%82%B0#UEFI.2FGPT_.E3.83.AC.E3.82.A4.E3.82.A2.E3.82.A6.E3.83.88.E4.BE.8B)

- まず `fdisk -l` で様子見
	- Disk /dev/sda と /dev/sdb, /dev/loop0 の3つがある
	- この /dev/sda がブロックデバイスなのだろう
	- /dev/sdaには1から4までがあった。1がEFI System、残りはwindows系。

- パーティションの構成
	- {BIOS | UEFI }, {GPT | MBR} など複数種類ある。
	- 見る感じ UEFI-GPT が最もモダンな構成らしいので、ひとまずそれで
		- レイアウト例も載ってるし

- パーティションツール
	- これもfdiskやらpartedやら色々あるそう
	- 一旦fdiskで

#### fdiskによるパーティショニング

- 既存のパーティションテーブルのバックアップ： `# sfdisk -d /dev/sda > sda.dump`
	- ※ ~/ で実行した。実際 sda.dumpというファイルも生成されている
- パーティションテーブルの作成
	- `# fdisk /dev/sda` で対話開始
		- 変更した内容は上書きされるらしい
		- まずは `g` で新しいテーブルを作る (今回使うのはGPTなので)
		- 次に `n` で新しいパーティションを作成
			- 1個目 (/dev/sda1; EFI)
				- Partition number : デフォルト値の1を入力
				- First sector: 一旦デフォルト値の 2048。
				- Last sector: +500M
				- パーティションタイプの変更: tコマンドからの "EFI System"
			- 2個目 (dev/sda2; スワップ領域)
				- 基本1個目と同じ(First sectorはデフォルト値)
				- Lastは1GBにしといた
				- パーティションタイプは Linux swap
			- 3個目 (dev/sda3; ルート)
				- Last sectorでenter押したら残り全部になった (237GB)
				- パーティションタイプは Linux root (x86-64)
					- ※wikiの表記と微妙に違うが、m コマンドのマニュアルの方を信じる
		- 終わったので、 `w` で保存

#### パーティションのフォーマット

※このタイミングで、 `script` コマンドでログを取り始める

- `lsblk -f` でデバイスファイルがマウントされてるか確認
	- UUIDがないのが不安だが、マウントはされてなさそう。アンマウントは不要
- EFI(sda1)は `mkfs.fat -F 32` で、スワップ(sda2)は `mkswap`で、ルート(sda3)は `mkfs.ext4` を使ってファイルシステムを作る (インストールガイドの記述に従う)

#### ファイルシステムのマウント

ここもインストールガイドだけ見てれば大丈夫そう

- /dev/sda3 を /mnt にマウントする
- /dev/sda1を /mnt/bootにマウントする
- /dev/sda2を `swapon`で有効化する

### インストール

- `/etc/pacman.d/mirrorlist`を確認
	- 先頭のサイトだけ一応見てみたけど特に問題なさそう
- `pacstrap` でインストール
	- ひとまず baseパッケージのダウンロードだけする。
- システムの設定
	- インストールガイドに書かれてる通りに書かれてる順番で実行する
		- 個々の操作の意味は後で勉強しておきたい

### ローカリゼーション

- ローカリゼーションのところでエディタが必要になった。
	-  `pacman`で nanoをインストールする
- /etc/locale.gen を nanoで直接編集して、 
	-  en_US.UTF-8 UTF-8と`ja_JP.UTF-8 UTF-8` をアンコメント
	- `locale-gen`
	-  `/etc/locale.conf`に以下を追加
		- LANG=en_US.UTF-8
		- LANG=ja_JP.UTF-8

### ネットワーク設定

- /etc/hostname を作成
	- 名前は ArchCamino

>新しくインストールされた環境で[ネットワーク設定](https://wiki.archlinux.jp/index.php/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E8%A8%AD%E5%AE%9A "ネットワーク設定")を完了させてください。必要に応じて、適切なネットワーク管理ソフトウェアをインストールする必要があります。

とのことだが、一体何をすればいいのやら

- 今の所インターネットには繋がっているが、これはあくまで一時的なもの？


----

昼休憩につき一旦中断。

- [このQiita記事](https://qiita.com/j8takagi/items/235e4ae484e8c587ca92#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%BE%8C%E3%81%AE%E4%BD%9C%E6%A5%AD)が参考になりそう

あとやること
- ネットワークの設定
- ブートローダーの設定
- Rootパスワードの設定
- (ユーザーの作成と設定)
- (ssh設定)

wikiの記載だと具体的に何すれば良いか分からないやつも、Qiita記事だと結構丁寧に解説してたりする

- ↑を実行する前に再起動してみて大丈夫か見てみたさもある

### ネットワーク設定(続)

- 上のqiita記事によれば、ネットワーク設定は以下の2つで良いっぽい
	- systemd-networkdの設定と起動
	- systemd-resolvedの設定と起動



- 以下は、いずれも起動時だけchrootから抜けていた
- systemd-networkd-wait-online.serviceは何故か失敗していた
#### systemd-resolved

 - 設定
	- chrootの外でresolv.confのシンボリックリンクを作成
	- `# ln -sf /run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.conf`

- 起動
#### systemd-networkd

- 設定ファイルを作成( /etc/systemd/network/25-wireless.network)
	- 今回は無線接続のみ設定
	- `ip link` で表示される無線アダプタ名(wlan0)を入力する
- 起動

```
[Match]
Name=wlan0

[Network]
DHCP=yes
IgnoreCarrierLoss=3s
```

### ルートパスワードの設定

- ひみつ

### ブートローダー

- Qiita記事と[ブートローダー]()のページを参考に、systemd-bootを使うことに
- [Systemd-bootのページ](https://wiki.archlinux.jp/index.php/Systemd-boot)を参考に作業を進める

- `bootctl install`
- `/boot/loader/loader.conf` を編集

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

- `/boot/loader/entries/arch.conf` を作成して、以下を記述

```
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_ rw
```

- optionsのrootは、qiitaを見るにルートファイルシステムを構築したsdaのUUIDを指定すれば良いっぽい？
- 英語版のwikiではUUIDを指定する方法になってる https://wiki.archlinux.org/title/systemd-boot
	- UUIDの調べ方とかはQiita記事をみた
		- `blkid -o export /dev/sda3 | grep ^UUID`

- 同様に arch-fallback.conf も設定する

```
title   Arch Linux (fallback initramfs)
linux   /vmlinuz-linux
initrd  /initramfs-linux-fallback.img
options root=UUID=_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_ rw
```


### 再起動

- chroot環境から抜ける
- scriptコマンドの記録を停止する
	- `[root@archiso /]# cp typescript /mnt/root/arch_linux_install.log` でドライブへコピー
- reboot
	- 再起動中にUSBを抜く

### ログインを試みる

```
ArchCamino login: root
Password: 
```

- ログイン成功！
- 次にpingを試すが上手くいかず。
	- そもそも出力結果が全部 ◾️ になってる。
		- nanoとか別のコマンドを叩いても一部の表示がそうなる
	- 言語周りの設定を何か間違えた？
	- 一旦日本語をオフにしてみる(ローカリゼーションの設定)
	- →直った

- 改めて ping したところ、
	- Temporary failure in name resolution
	- DNSがうまくいってない？
	- ip linkをよくみたら、デバイス名が変わっている。
		- `wlan0` だったはずのものが、 `wlp2s0`になってる
		- STATEもDOWN
	- /etc/systemd/network/25-wireless.network を直したけどダメだった
		- 相変わらず STATE DOWN

- ひとまず、インターフェース自体は立ち上がっている (stateDOWNではなく、前半部分の UP)

- 再度USBを使ってライブ環境にアクセス
	- ヒントになったのは[このページ]( https://www.reddit.com/r/archlinux/comments/bnbw7g/bash_command_iw_not_found/)
	- /mntにマウント `mount /dev/sda3 /mnt`
	- `iwctl` で家の無線LANに繋ぎ直す
	- arch-chroot に入る
	- pacmanでiwをインストールする

	- ※この方法で、iwに限らずネット接続できなくてもパッケージをインストールできるな
	- iw使いにくいし、iwdでよくね？

- iwdで、インストール時にやったのと同じ方法で無線LANに接続。
- iwdにしたところ、また名前がwlan0になってた。
	- 再度 25-...を編集
	- →これでネットに繋がった！やったね！

# おわりに

いかがでしたか？ ~~(Googleで上の方に出てくる中身スカスカの記事並感)~~
基本的には自分用のログに残していたものをそのまま持ってきたので、読みにくかったと思います。それに、色々回り道をしていたり、推測で書いている内容に一部誤りを含んでいるかもしれません。これらの点はご了承ください。

ひとまず現時点での進捗は、

- ArchLinuxをインストールし、問題なく動作している
- 無線でのネット接続も問題なくできており、(上の作業ログでは省略していますが)メインで使っているMacからのssh接続もできている状態
- ユーザーの作成やGUIの導入などはまだ (wikiの「一般的な推奨事項」はまだ出来ていない)

といった感じです。
まだまだ弄りたい所はありますが、「ArchLinuxをインストールする」という目標はひとまず達成できたと出来たといってもよいのではないでしょうか。

## 感想

確かに、前評判通りインストール作業は大変でした。
ですが、wikiが充実していたこともあって、「原因不明のエラーに延々と苦しめられ詰まる」みたいなトラブルには一度も遭遇せずにインストール作業を終えられました。
インストールを終えられたときは思わずガッツポーズしてしまうほど達成感があり、全体を通してとても楽しい作業だと感じました。
また、「インストールを通してLinuxの知見を深める」という目標もある程度は達成できたと思います。特にパーティションやファイルシステム周りは全然知識がなかったので、かなり勉強になりました。一方で、正直よく分からないまま進めていた工程もあり、記事に書いた内容を全部理解できてるかと言われたら全然そんなことはなく、まだまだ勉強が必要だなと感じています。ですが、今回のインストール作業で触れたものに関しては「あの時のあれはこういうことだったんだ！」といった風に、今は理解出来ていなくても後々勉強するにあたっての足がかりになるのではないかな……？とほんのり期待しています。
今回のインストール作業は、総じて得られるものの大きい、充足感の高い体験だったと感じています。

----

今回の記事は以上になります。
上でも述べた通りArchLinuxインストールバトルは結構楽しかったので、皆さんもぜひやってみてはいかがでしょうか？
ではでは〜 👋


(おまけ)
インストール成功記念に撮った写真です。
![IMG_1621.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726845/5cd1563b-af1b-3ee1-a3e8-0bb4363890a8.jpeg)
(モニタがめっちゃ埃まみれなのは許してください！)