Arch Linuxインストールの素振り2023 with Appleシリコン（後編）

[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の13日目の記事です。
前回は、@iixd_pogさんの[Unityのツールバーにボタンを追加する方法(Unity 2021.2以降)](https://qiita.com/iixd_pog/items/ae7220bfeae49750f354)でした。


# はじめに

この記事は前後編のうち **後編** です。
前編では、仮想マシンの作成からインストール準備までを進めました。
→ [Arch Linuxインストールの素振り2023 with Appleシリコン（前編）](https://qiita.com/honeniq/private/394e6a613ad22030204f)

前編と同じく、[Arch Wiki](https://www.archlinux.jp/)の[インストールガイド](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)に沿って進めていきます。
ARM（Appleシリコン）特有の工夫が必要な箇所は、適宜手順を足したり変更したりします。


## 2.　インストール

ようやく折り返し地点です。

### 2-1. ミラーの選択

``/etc/pacman.d/mirrorlist`` を編集し、日本のミラーサイトを指定します。
コメントアウトされている``Server = ...``のコメントを外すだけ。


### 2-2. 必須パッケージのインストール

``pacstrap``を使って一通りのパッケージをインストールします。

```
[root@archboot /]# pacstrap -K /mnt base linux vim archlinuxarm-keyring
```

これで、`/mnt`配下に`base`や`linux`などがインストールされます。
`/mnt`にはLinuxの`/`（ルート）にする予定のパーティションがマウントされていますので、このコマンドでLinuxが動作するためのディレクトリ構造が作成されることになります。

インストールガイドで書かれている`base`・`linux`の他に、以下も追加しました。

* vim : 後々何かと編集したくなるので
* archlinuxarm-keyring : ArchLinux ARMのビルドシステムからのパッケージを検証するために必要



## 3. システムの設定

### 3-1. fstab の生成

起動時にパーティションを自動マウントさせるため、``fstab``を作成します。
手書きすることもできますが、``genfstab``で現在のマウント状況を元に生成するのが楽です。

```
[root@archboot /mnt/boot]# genfstab -U /mnt >> /mnt/etc/fstab
[root@archboot /]# cat /mnt/etc/fstab
# /dev/vda3
UUID=6f9304ec-52ea-47f8-897a-091c90747d01       /               ext4           rw,relatime      0 1

# /dev/vda1
UUID=E380-7E4F          /boot           vfat            rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro       0 2

# /dev/vda2
UUID=f4c90e90-5d77-4380-a953-7ba016248d2c       none            swap           defaults         0 0
```


### 3-2. chroot

新しいArch Linuxに``chroot``して、初期設定をします。
インストール作業時に必要な設定を色々やった上で``chroot``してくれる``arch-chroot``を実行。

```
[root@archboot /mnt/boot]# arch-chroot /mnt
[root@archboot /]# 
```

Linuxルートパーティションをマウントした``/mnt``に``chroot``できました。
擬似的に``/``（ルート）を変更することで、インストール先環境固有のアプリを使ったり、設定編集したりできます。

ここから先は``chroot``した状態でコマンドを打っていきます。

:::note info
便宜上、``chroot``した先を「新OS」・元のOSを「親OS」と呼びます。
``chroot``状態で一通りの設定を済ませることで、準備が十分整った状態で新OSを立ち上げることができます。
:::


### 3-3. タイムゾーン

東京のタイムゾーンを``/etc/localtime``にリンクして有効化します。

```
[root@archboot /]# ln -df /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```


### 3-4. ローカリゼーション

``/etc/locale.gen``を編集して、``en_US.UTF-8 UTF-8``と``ja_JP.UTF-8 UTF-8 ``をアンコメントします。
さらに``locale-gen``で生成。

```
[root@archboot /]# locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
```

``/etc/locale.conf``に``LANG``環境変数の指定を書き込みます。

```
[root@archboot /]# echo LANG=en_US.UTF-8 > /etc/locale.conf
```


### 3-5. ネットワーク設定

ホストネームを設定します。

```
[root@archboot /]# echo hogehost > /etc/hostname
```

#### 3-5-1. DHCPクライアント設定

:::note warn
インストールガイドには含まれていませんが、必須の手順です。
:::

[ネットワーク設定:自動](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#.E8.87.AA.E5.8B.95)を参照し、DHCPでIPアドレスを自動取得する設定にします。

Arch Linuxのネットワークマネージャはたくさんの選択肢がありますが、今回はデフォルトでインストールされている[``systemd-networkd``](https://wiki.archlinux.jp/index.php/Systemd-networkd)を使用します。

仮想マシンのネットワークインターフェース名を調べます。

```
[root@honearch network]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 8e:ef:2e:e8:e1:2c brd ff:ff:ff:ff:ff:ff
```

``enp0s1``がインターフェース名です。

[systemd-networkd:有線アダプタで DHCP を使用](https://wiki.archlinux.jp/index.php/Systemd-networkd#.E6.9C.89.E7.B7.9A.E3.82.A2.E3.83.80.E3.83.97.E3.82.BF.E3.81.A7_DHCP_.E3.82.92.E4.BD.BF.E7.94.A8)を参考に、``/etc/systemd/network/20-wired.network``を作成します。

```
[root@honearch network]# cat 20-wired.network 
[Match]
Name=enp0s1

[Network]
DHCP=yes
```

これで設定完了です。
後述しますが、Arch Linuxインストール直後はネットワークマネージャが無効状態になっています。
有効化するのをお忘れなく。



### 3-6. Initramfs

``pacstrap``の最中で実行されており、不要なので省略。


### 3-7. Root パスワード

Rootパスワードを設定します。

```
[root@archboot /]# passwd
New password: 
Retype new password: 
passwd: password updated successfully
```


### 3-Ex. pacmanキーリングの追加設定

:::note warn
インストールガイドには含まれていませんが、必須の手順です。
:::

このあと`pacman`でパッケージのインストールを行うとすると、信頼できないパッケージとして弾かれてしまう問題があります。

```
error: <package>: signature from "Arch Linux ARM Build System <builder@archlinuxarm.org>" is marginal trust
```

これで数時間ハマって色々調べてみたところ、「Arch Linux ARM Build System」の鍵が信頼されていないことが原因のようです。

```
[root@honearch keyrings]# pacman-key --list-sigs Build
pub   rsa4096 2014-01-18 [SC]
      68B3537F39A313B3E574D06777193F152BDBE6A6
uid           [marginal] Arch Linux ARM Build System <builder@archlinuxarm.org>
sig 3        77193F152BDBE6A6 2014-01-18  [self-signature]
sig          B55C5315DCD9EE1A 2014-01-18  Jason Plum (Arch Linux ARM Master Key) <jplum@master-key.archlinuxarm.org>
sig          BC704E86B823CD25 2014-01-18  Kevin Mihelich (Arch Linux ARM Master Key) <kevin@master-key.archlinuxarm.org>
sub   rsa4096 2014-01-18 [E]
sig          77193F152BDBE6A6 2014-01-18  [self-signature]
```

``pacman-key --list-sigs``で鍵のIDを調べます。
引数に``Build``を指定して、「Arch Linux ARM Build System」をヒットさせようとしています。
ステータスが``marginal``（限定的）となっているのが分かります。

```
[root@honearch keyrings]# pacman-key --lsign-key 68B3537F39A313B3E574D06777193F152BDBE6A6
  -> Locally signed 1 keys.
==> Updating trust database...
gpg: Note: third-party key signatures using the SHA1 algorithm are rejected
gpg: (use option "--allow-weak-key-signatures" to override)
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:  10  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: depth: 1  valid:  10  signed:  97  trust: 1-, 0q, 0n, 9m, 0f, 0u
gpg: depth: 2  valid:  75  signed:  21  trust: 75-, 0q, 0n, 0m, 0f, 0u
gpg: next trustdb check due at 2023-12-31
```

次に``pacman-key --lsign-key``で、先ほど調べたキーIDに対してローカル署名します。
このあと再度状態確認すると・・・

```
[root@honearch ~]# pacman-key --list-sigs Build
pub   rsa4096 2014-01-18 [SC]
      68B3537F39A313B3E574D06777193F152BDBE6A6
uid           [  full  ] Arch Linux ARM Build System <builder@archlinuxarm.org>
sig 3        77193F152BDBE6A6 2014-01-18  [self-signature]
sig   L      083A98E05FB197DE 2023-12-11  Pacman Keyring Master Key <pacman@localhost>
sig          B55C5315DCD9EE1A 2014-01-18  Jason Plum (Arch Linux ARM Master Key) <jplum@master-key.archlinuxarm.org>
sig          BC704E86B823CD25 2014-01-18  Kevin Mihelich (Arch Linux ARM Master Key) <kevin@master-key.archlinuxarm.org>
sub   rsa4096 2014-01-18 [E]
sig          77193F152BDBE6A6 2014-01-18  [self-signature]
```

``marginal``から``full``に変わりました。
これで、Arch Linux ARM Buildが署名したパッケージを信頼するようになります。

Arch Linux ARMのパッケージは、[2-2. 必須パッケージのインストール](https://qiita.com/drafts/eed06c6b436db215b0b0/edit#2-2-%E5%BF%85%E9%A0%88%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)でインストールした``archlinuxarm-keyring``を使ってカギの検証をします。
キーリングをインストールしただけでは完全に信頼したことにはならず、``pacman-key --lsign-key``でローカル署名を追加する必要があるという理解をしています。


### 3-8. ブートローダー

ブートローダーをインストール・設定していきます。
インストールガイドには超あっさりしか書かれていないため、[ブートローダー](https://wiki.archlinux.jp/index.php/Arch_%E3%83%96%E3%83%BC%E3%83%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9#.E3.83.96.E3.83.BC.E3.83.88.E3.83.AD.E3.83.BC.E3.83.80.E3.83.BC)を参考に導入することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/daaccfae-1a42-ddfc-31ad-f0cef48f092d.png)


色々と選択肢がありますが、今回はメジャーどころの[GRUB](https://wiki.archlinux.jp/index.php/GRUB)を使用します。
さらにファームウェア（BIOS / UEFI）とパーティションテーブル（MBR / GPT）の組み合わせについては、現在主流のUEFI+GPTで進めることにします。

GRUBの[UEFI用インストールガイド](https://wiki.archlinux.jp/index.php/GRUB#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB)を見つつ進めます。

#### 3-8-Ex. ネームサーバーの設定

2023/12/19追記

改めて手順を検証していたところ、``chroot``状態だと名前解決できないことがわかりました。
``/etc/resolv.conf``を修正して、DNSサーバーを指定する必要があります。

```
[root@archboot /]# cat /etc/resolv.conf
# Resolver configuration file.
# See resolv.conf(5) for details.
nameserver 8.8.8.8
```

#### 3-8-1. ブートローダーのインストール

``grub``と``efibootmgr``をインストールします。
``chroot``中ですので、このパッケージは新OSの中に入ります。

```
# pacman -S grub efibootmgr
```

さらに、GRUBを``/boot``内にインストールします。
このパスは、親OSから見ると``/mnt/boot``にマウントしたEFIシステムパーティションのことです。


```
[root@archboot /]# grub-install --target=arm64-efi --efi-directory=/boot --bootloader-id=grub
Installing for arm64-efi platform.
Installation finished. No error reported.
```

#### 3-8-2. grub.cfg の生成

[GRUB:grub.cfgの生成](https://wiki.archlinux.jp/index.php/GRUB#grub.cfg_.E3.81.AE.E7.94.9F.E6.88.90)を参考に、``grub-mkconfig``で設定ファイルを生成します。

```
[root@archboot /]# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
Adding boot menu entry for UEFI Firmware Settings ...
done
```

``grub-mkconfig``は、``chroot``した状態のルートファイルシステムを判定して、GRUBからのブートに必要な情報を生成してくれます。


### 4. 再起動

これで準備完了です。
再起動して新しいArch Linux ARMが立ち上がってくれば成功！

ですがその前に、仮想マシンのドライブの起動順を設定する必要があります。
一度シャットダウンして、仮想マシンの設定画面を開きます。

```
[root@archboot /]# exit  # chrootから抜ける
[root@archboot /mnt/boot]# shutdown -h now
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/fa3cb8b7-e491-62f9-ee17-45eb89ba9884.png)

仮想マシンの起動時は、このリストの上から順に起動できそうなドライブを探します。
ドライブの上で右クリックして「上に移動」し、VirtIOドライブがUSBドライブよりも上に来るように変更します。

「保存」で確定したら、仮想マシンを再度立ち上げます。


### 5. インストール後

うまくインストールできていたら、ブートローダーのGRUBが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/64c76e24-6133-eb4e-b3c2-1891572bf2bc.png)

成功です!! 🎉


このままだとサービス類もほとんど立ち上がっていないので、必要に応じて起動します。
``start``で起動、``enable``で次回起動時に自動的に起動するようになります。

```
# systemctl start systemd-networkd
# systemctl enable systemd-networkd

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

# systemctl start systemd-timesyncd
# systemctl enable systemd-timesyncd
```

あとは好きなソフトを入れて好きに使いましょう。


# まとめ

何度もやっている手順でしたが、手順をすっ飛ばしたりコマンドを打ち間違えたりで、すんなりとはいきませんでした。

特に、[3-Ex. pacmanキーリングの追加設定](https://qiita.com/drafts/eed06c6b436db215b0b0/edit#3-ex-pacman%E3%82%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E8%BF%BD%E5%8A%A0%E8%A8%AD%E5%AE%9A)の箇所については、過去に踏んだことのないエラーだったこともあり、大変手こずりました。（2晩くらいは悩んだ）
おかげで``pacman``におけるパッケージ署名の仕組みや、GnuPGについての理解が進み、大変良い素振りになったと思います。

----

明日は @kerimeka さんです!! 🎊