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


[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の4日目の記事です。
前回は、@PortierさんのUnityの[BigQueryのコストを制限する基本設定](https://qiita.com/Portier/items/037ff81c3a35a213c571)でした。


# はじめに

[Arch Linux](https://www.archlinux.jp/)はLinuxディストリビューションの1つです。
シンプルかつ軽量を旨としており、硬派なことで有名です。

たとえばOSのインストールに関しても、グラフィカルなインストーラーなどはなく、[インストールガイド](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)を見ながらコマンドを打っていくことになります。
このインストール手順が秀逸でして、ハマることも含めて沢山の気付きを得られます。

そんなArch Linuxのインストールを、**インストールそのものを目的に**やることを「素振り」と呼んでいます。
前回の素振り[こちら](https://qiita.com/honeniq/items/c1fc36780a638a6e20b6)。

:::note info
書き進めていたらどんどん長くなってしまったので、前後編に分割しました。
後編はこちら → [Arch Linuxインストールの素振り2023 with Appleシリコン（後編）](https://qiita.com/honeniq/items/eed06c6b436db215b0b0)
:::


# 今回の素振り環境について

毎回同じ構成で素振りしても面白くありませんし、ちょっと趣向を加えます。
今回はAppleシリコンMac上で、仮想マシンとして稼働させることにしました。

## AppleシリコンMacにおける仮想マシン環境

2020年より、MacのCPUはARMベースのAppleシリコンに置き換わっています。
それ以前のIntel製CPUだった頃とはCPUアーキテクチャそのものが変わったことで互換性もなくなりました。
（なのに、CPU互換レイヤーのRosetta 2が超優秀で、そこまで困ることもなかったり。）

仮想マシンについてもCPUの変更は大きく影響しています。
特に、ハイパーバイザー型仮想化を行う場合は、ゲストOSのCPUアーキテクチャはホストOSと同じものしか使えません。
ゲストOSにもある程度のパフォーマンスを求める場合は、ARMアーキテクチャを選択することになります。


## 仮想化ソフトにはUTMを選択

Appleシリコンが登場した当初と比べて、仮想化ソフトもかなり充実してきました。
今回はその中で、[UTM](https://mac.getutm.app/)を使用します。

UTMはQEMUのGUIフロントエンドのような立ち位置で、お手軽に仮想マシンが構築できます。
また、ハイパーバイザー型だけでなくエミュレーションでの仮想化も可能です。[^1]

[^1]: 試しにx86_64向けArch LinuxのライブISOを入れてみたところ、普通に起動しました。すごい。


## ディストリビューションにはArch Linux ARMを選択

前述の通りAppleシリコンはARMベースであり、ネイティブで動作するのは`aarch64`(ARM64)アーキテクチャです。
ところが、Linuxディストリビューションの多くはIntel系の`x86_64`アーキテクチャ向けで、それはArch Linuxも例外ではなく、公式から提供されているISOも`x86_64`向けです。

今回は、代わりにARM向けポートの[Arch Linux ARM](https://archlinuxarm.org/)を使用します。


# Arch Linux ARM on UTM

それでは、ここから本編です。

## 進め方

基本的に[Arch Wiki](https://wiki.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環境特有の手順がある場合など、適宜ガイドから寄り道して進めることもあります。

ここからは、インストールガイドの項番と一致する形で見出しに番号を付けていきます。
（仮想マシンの作成はインストールガイドの範囲外なため、0番としました。）


## 0. 仮想マシンの作成

UTMで新規仮想マシンを作ります。

* 仮想化 or エミュレート → 仮想化
* オペレーティングシステム → Linux
* 仮想化エンジンの「Apple仮想化を使用」はチェックなし
* メモリ 4096MB、CPUコア数 デフォルト
* ストレージ 10GB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/0ffd9e0d-0536-3a88-35f3-275210e85a89.png)

### 0-1. シリアルポートの追加

作成した仮想マシンを編集します。
デバイスの「新規」から、シリアルポートを追加してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/6eeb0480-64a8-fd10-b16c-5799e7a29043.png)

シリアルポートが無くても仮想マシンの画面から操作はできます。
ですが、この画面ではテキストのコピペができないのが非常に辛いため、シリアル通信で操作することをオススメします。


## 1. インストールの準備

### 1-1. インストールメディアの入手

今回は前述の通り、本家Arch LinuxではなくARM向けポートのArch Linux ARMを使います。
Arch Linux ARMの公式サイトではISOイメージが提供されていないため、[Archboot Project](https://archboot.com/)から「ARM - aarch64」用のISOを[ダウンロード](https://archboot.com/iso/aarch64/)します。

### 1-2. 署名の検証

Archbootのサイトから直接ダウンロードしているので必要ない気もしますが、一応ダイジェストだけでも比較しておきます。

``` bash
# b2sum archboot-2023.11.29-15.35-6.2.10-1-aarch64-ARCH-aarch64.iso
18ef364ebaa181570c94c136639b358a7bae365e30ea3186219aa2421d931f6e3fb948c47e2e94b75b981e9205a4475957d4a5c6d22c8571ee9f3623b9211b11  archboot-2023.11.29-15.35-6.2.10-1-aarch64-ARCH-aarch64.iso
# Archbootに記載されているB2SUMと一致
```

### 1-3. インストールメディアの準備

仮想マシンの起動ISOに、ArchbootからダウンロードしたISOファイルを指定します。
さらに、ISOファイルをマウントしたドライブをリストの一番上に移動させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/6b99a824-3361-86e7-318b-a959c2129d5a.png)

仮想マシンの起動時は、このリストの順番で起動ディスクとして探索されるようです。


### 1-4. ライブ環境の起動

この状態で仮想マシンを起動すると、ブートローダーのオプション選択画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/9c994f1e-2d80-936f-afc9-68f062bd1432.png)


1つ目の「Archboot - Aech Linux AA64」が選択されているので、そのままEnterで確定すると、OSが起動し、ライブ環境の初期設定に進みます。
ロケールやネットワークの設定は基本的にデフォルト設定のままで問題ありません。仮想ネットワークも自動認識されます。

一通り設定が済むとこの画面になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/da57b688-3654-d927-c935-950e879bc8ae.png)

カーソルで「Exit」を選択しEnterで確定、さらに「Exit Program」でランチャーを抜けます。
（ここで「2 Launch Desktop Environment」を選ぶとGUIが立ち上がるみたいです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/89db1606-855c-4e04-4f95-eafbb45bb72e.png)

シェルが触れるようになりました。


### 1-5. コンソールのキーボードレイアウト

USキーボードを使っているのでパス。
必要であれば、ここで日本語キーボードに変更できます。


### 1-6. 起動モードの確認

```
[root@archboot /]# ls /sys/firmware/efi/efivars
Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
(略)
```
ディレクトリが存在して中身が表示されたので、EFIモードです。


### 1-7. インターネットへの接続

UTMが仮想ネットワークを作ってくれているので、そのままインターネットに繋がるはずです。

```
[root@archboot /]# ping archlinux.jp
PING archlinux.jp (160.16.119.98) 56(84) bytes of data.
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=1 ttl=54 time=16.9 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=54 time=17.3 ms
(CTRL+C で止めないとずっと流れ続ける)
```

繋がりました。


### 1-8. システムクロックの更新

```
[root@archboot /]# timedatectl status
               Local time: Sun 2023-12-03 21:55:55 JST
           Universal time: Sun 2023-12-03 12:55:55 UTC
                 RTC time: Sun 2023-12-03 12:55:55
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```

同期されていることを確認。


### 1-9. パーティション

:::note warn
簡単な確認コマンドが続いたあとにしれっと出てきましたが、ここ超重要ポイントです。
:::

Arch Linuxをインストールする先のドライブに、パーティションを切っていきます。
一般的なOSインストールとは違い、Arch Linuxでは自分でコマンドを打って手動でやる必要があります。（が、それが楽しい）

```
[root@archboot /]fdisk -l
Disk /dev/vda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/zram0: 5 GiB, 5368709120 bytes, 1310720 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
```
``fdisk -l``で認識されているドライブのデバイス名を確認します。
1つ目の容量10GBのものがインストール先の仮想ドライブです。
名前は``/dev/vda`と分かりました。


#### 1-9-1. パーティション設計

早速作業していきたいところですが、まずはパーティションの設計からです。
この後``fdisk``でパーティションを切っていく際、どういう構成にしたいのかを把握していないと何度も後戻りする羽目になってしまいます。

Arch Wikiのレイアウト例に従って考えましょう。
詳しくはArch Wikiの[パーティショニング](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)を参照。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/bd40d0b9-e848-a46d-5791-bda1d0cb481b.png)

作成するパーティションは全部で３つ。
EFIシステムパーティションとスワップパーティション、それとシステムの`/`（ルート）が入るメインのパーティションです。

ほぼレイアウト例の通り、このように設計しました。

| 番号 | パーティションタイプ | フォーマット | 容量 | 備考 |
|:-|:-|:-|:-|:-|
| 1 | EFIシステムパーティション | FAT | 512MB |   |
| 2 | Linux swap | swap | 512MB |   |
| 3 | Linux | ext4 | 残り全部 | だいたい9GBくらいになるはず |

パーティションには番号を付ける必要があり、かつ作成する順番も重要です。
上記のように「残り全部」と指定するためには、それ以外のサイズが確定している必要があるためです。


#### 1-9-2. ``fdisk``でパーティション作成

それでは、``fdisk``でパーティションを切っていきます。



```
[root@archboot /]#fdisk /dev/vda

Welcome to fdisk (util-linux 2.39.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0xf9f5cbec.

Command (m for help):
```

``fdisk``は対話型のツールです。
たとえば``m``を入力すると、利用可能なコマンドの一覧が出てきます。

以下のように入力して、パーティション確保とタイプ指定を行っていきます。

1. EFIシステムパーティション
    1. ``n`` ``Enter`` # 新規パーティション作成
    1. ``p`` ``Enter`` # 種別はプライマリパーティション
    1. ``1`` ``Enter`` # パーティション番号は1
    1. ``Enter`` # 先頭セクタは推奨のまま確定
    1. ``+512M`` ``Enter`` # 512MB確保できる場所を末尾セクタに指定
    1. ``t`` ``Enter`` # パーティションタイプを指定
    1. (このパーティションは１つ目なので、パーティション番号入力はなし)
    1. ``EF`` ``Enter``# パーティションタイプコードを入力
1. スワップパーティション
    1. ``n`` ``Enter``
    1. ``p`` ``Enter``
    1. ``2`` ``Enter``
    1. ``Enter``
    1. ``+512M`` ``Enter``
    1. ``t`` ``Enter``
    1. ``2`` ``Enter`` # パーティション番号を指定
    1. ``82`` ``Enter``
1. Linuxルートパーティション
    1. ``n`` ``Enter``
    1. ``p`` ``Enter``
    1. ``3`` ``Enter``
    1. ``Enter``
    1. ``Enter`` 残りの領域全部を確保
    1. (デフォルトのパーティションタイプのままでよいので、タイプ変更は不要)

ここまでできたら、``p``でパーティション一覧を表示し、結果を確認。

```
Device     Boot   Start      End  Sectors  Size Id Type
/dev/vda1          2048  1001471   999424  488M ef EFI (FAT-12/16/32)
/dev/vda2       1001472  2050047  1048576  512M 82 Linux swap / Solaris
/dev/vda3       2050048 20971519 18921472    9G 83 Linux
```

各パーティションには、ドライブのデバイス名``vda``とパーティション番号を組み合わせた名前が付きます。
この後のステップでもちょくちょく遣うので、どこかにメモしておくとよいです。

最後に``w``でパーティションテーブルを書き込むのを忘れずに。


### 1-10. パーティションのフォーマット

パーティションが切れたので、実際に使えるようにフォーマットしていきます。

```
[root@archboot /]# mkfs.fat -F32 /dev/vda1 # EFIシステムパーティションはFAT32
[root@archboot /]# mkswap /dev/vda2
[root@archboot /]# mkfs.ext4 /dev/vda3 # Linuxルートパーティションはext4
```

### 1-11. ファイルシステムのマウント

フォーマットが済んだ各パーティションをマウントしていきます。

```
[root@archboot /]# mount /dev/vda3 /mnt # Linuxルートパーティションを /mnt の下に
[root@archboot /]# mount --mkdir /dev/vda1 /mnt/boot # /mnt/boot を作成しつつマウント
[root@archboot /]# swapon /dev/vda2
```

これでライブ環境から仮想ドライブに書き込める状態になりました。


# 前編まとめ

これで、インストールガイドのうち「1 インストールの準備」が完了しました。
「準備だけ？」と思うかもしれませんが、実はすでにインストールガイドページの75%くらいは終わっています。
それだけ準備が大事ってことですね。 :wink: 

前編の範囲だと、UTMの使いやすさに驚きました。
実はUTM公式のVMイメージを配布するサイトがあり、そこから[Arch Linux ARMのイメージ](https://mac.getutm.app/gallery/archlinux-arm)をダウンロードしてくれば、インストール不要で動かせたりします。（この記事はインストールが目的なのでやりませんが。）

あとは、パーティショニングをやるとファイルシステムが身近になっていいですね。
これだけで即実践できるわけではないけど、得体の知れない何か怖いものではないし、少なくとも操作するためのツール（``fdisk``など）を知っていると一歩前進できるように思います。

[後編](https://qiita.com/honeniq/items/eed06c6b436db215b0b0)へ続きます。（後日公開予定）

------

明日は @nissy_gp さんです!! 👏