Arch Linux インストールの素振り

[PONOS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ponos) の12日目の記事です。:gift:
昨日は@kenta-sanさんの[VContainerという新しい選択肢　〜UnityのDIライブラリ〜](https://qiita.com/kenta-san/items/59bc9d9300b4d1b7af9a)でした。

## はじめに

### Arch Linuxとは
[Arch Linux](https://www.archlinux.jp/)はLinuxディストリビューションの1つです。
インストール直後の状態ではほぼ何も入っていない、硬派な作りになっています。

Arch Linuxのインストールは、メジャーなディストリビューションとは若干毛色が違い、インストールウィザード的なものがありません。
自分でコマンドを叩いて、ひとつずつ進めていく必要があります。

ざっくりこんな感じの手順です。

1. USBメモリや光学ディスクでライブ環境を起動する
2. ライブ環境上で、以下の操作を行う
    1. インストール先のディスクにパーティションを作る
    2. 必須パッケージをインストールする
    3. `chroot`でインストール先環境に入る
    4. 詳細な設定を行う
3. マシンを再起動し、インストール先ディスクから立ち上げる


### 素振りの意義

前述の通り、Arch Linuxのインストールはほぼ手作業です。
また、ファイルシステムやブートローダーなどの構成要素は、それぞれ複数の選択肢があり、ユーザーが選択する必要があります。
「何を基準に選ぶの？」と思うところですが、[ArchWiki](https://wiki.archlinux.jp/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)にめちゃくちゃ充実した情報が載っていますので、これを見て自分なりに各構成要素を理解し、選択していくことになります。

というわけで、何かと手間はかかりますが、Linuxシステムに対する理解が深まることは確かです！
私は、何年かおきにArch Linuxのインストールをしていて、これを「素振り」と呼んでいます。（インストールするだけで使わないので。）

### 進め方

基本的に、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)の手順を順番に進めていきます。
特につまづくことが無さそうな項目については、記事中では触れずに進んでいきますが、実際には全手順をこなしていると思ってください。

以下、雑に引用されている場合はインストールガイド本編からの引用です。

## 0. 仮想マシンの支度

VirtualBoxで仮想マシンをこしらえます。
ちゃんと（OS）タイプに「Arch Linux(64-bit)」が用意されているので、これを使いましょう。

> Arch Linux は 530 MiB 以上のメモリが搭載された x86_64 互換のマシンで動作します。基本的なインストールで使用するディスク容量は 2 GiB 以下です。

こう書かれているので、メモリは4096MB・仮想ハードディスクは可変サイズで10GiBに設定しました。

作成後に、設定を一部修正します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/bb70af85-66a6-55ff-fa44-3e3d2d20036d.png)
「システム」-「マザーボード」から、「EFIを有効化」をオンにします。

これはマザーボードのファームウェアとして、EFIを使うように指定しています。
オフの場合は、代わりにBIOSが使われます。

BIOSはかなりレガシーなファームウェアであり、あえて2020年に選ぶものではないので、EFIを指定しました。

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

### ライブ環境の起動

今回はVirtualBoxを使っているので、ライブ環境のISOファイルをそのまま使って起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/a31573d3-69b7-135c-8d75-9fc8c18cd019.png)

自動的にrootでログインされて、プロンプトが表示されます。

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

VirtualBoxのデフォルト設定（NAT）のままなら、すでにネット接続できているはずです。
適当なホストにPingできることを確認しておきます。

後でインターネット上のホストからパッケージを取得するので、ネット接続は必須です。

### パーティション

インストール先ディスクのパーティションを作ります。
実機でデュアルブートする場合は、失敗すると既存OSが立ち上がらなくなったりするので、一番神経を使うところです。

`fdisk -l`で、インストール先のデバイス名を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/47b9dcf2-b458-f0f6-6cb4-bbe56adf8a54.png)
「/dev/sda」ですね。

インストールガイドには詳細が載っていないので、ここからは[パーティショニング](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)を参照しながら進めます。

#### GPTかMBRの選択

パーティションテーブルの形式が複数あるので、どれを使うか決めておく必要があります。
比較的新しいGPTと、レガシーなMBRの2つがメジャーな形式です。

あえて古い方を使う理由もないし、EFIとの親和性も考えて、GPTを使うことにします。

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

`gdisk`コマンドを使って、パーティションを作成していきます。（gdiskはfdiskのGPT版です。）
今回はディスクが1つだけなので、細かく分けずに必要なパーティションだけ作ります。

| 用途 | サイズ |　ファイルシステム |
|:-:|:-:|:-:|
| EFIシステムパーティション  | 512MiB  |FAT32|
| /（ルート）  | 残り全部  |ext4|
| スワップ  | 512MiB  |swap|
インストールガイドの例をそのまま採用して、こういう設計にします。

`gdisk`は対話型のコマンドで、ここに操作内容を載せると長くなってしまうので、省略します。


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

各パーティションを、適切なファイルシステムでフォーマットしていきます。

#### EFIシステムパーティション
>EFI System Partition (ESP や EFISYS とも呼ばれます) は FAT32 でフォーマットされた物理パーティション (ディスクのメインのパーティションディスクで、LVM やソフトウェア RAID などとは異なります) でここから UEFI ファームウェアは UEFI ブートローダやアプリケーションを起動します。
[EFIシステムパーティション](https://wiki.archlinux.jp/index.php/EFI_%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3)

上記引用の通り、FAT３２を使う仕様です。
`# mkfs.fat -F32 /dev/sda1`　←こんな感じでフォーマットします。

#### /（ルート）パーティション
ファイルシステムの指定は特にないので、何を使ってもOKです。
[ファイルシステムのタイプ](https://wiki.archlinux.jp/index.php/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0#.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.AE.E3.82.BF.E3.82.A4.E3.83.97) を見ると色々載っているので、気になるものを試してみてもいいかも。

今回はext4にしておきます。
`# mkfs.ext4 /dev/sda2`

#### スワップ領域
スワップは`mkswap`コマンドで作成します。
`# mkswap /dev/sda3`

さらにスワップを有効にします。
`# swapon /dev/sda3`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/3ee39737-2d35-1d9b-c107-55d803195d28.png)
こうなりました。

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

作成したパーティションを /mnt 配下にマウントしていきます。
後ほど`arch-chroot`を使って、ここをルートとして操作することになります。
なので、/（ルート）パーティションは /mnt に、EFIシステムパーティションは /mnt/efi にマウントします。

```
# mkdir /mnt/efi
# mount /dev/sda2 /mnt
# mount /dev/sda1 /mnt/efi
```
※ 初期状態では /mnt 以外のマウントポイントが存在しないので、適宜ディレクトリを作成します。


## 2. インストール

### ミラーの選択
> インストールされるパッケージは、 /etc/pacman.d/mirrorlist に定義されているミラーからダウンロードされます。

Arch Linuxのパッケージは、ミラーリストに書かれたサーバーから取得されます。
優先度はリストの順番通りなので、速いサーバーがリストの上位にくるように並べ替えておく必要があります。

手動で並べ替えてもいいんですが、せっかくなのでツールを使いましょう。
ライブ環境には [Reflector](https://wiki.archlinux.jp/index.php/Reflector) というツールが同梱されているので、これを使います。

`# reflector -country 'Japan' --sort rate -save /etc/pacman.d/mirrorlist`
これで、日本のサーバーのみに絞り、レートが高い順にソートされた mirrorlist が生成され、上書きされます。

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

> pacstrap スクリプトを使用して base パッケージと Linux カーネル、一般的なハードウェアのためのファームウェアをインストールしてください:

今回は仮想マシンを使っているので、ファームウェアは除外します。
あと、何かと必要になるので Vim を入れておきます。

`# pacstrap /mnt base linux vim`


## 3. システムの設定

### fstabの生成

`# genfstab -U /mnt >> /mnt/etc/fstab`
現在のマウント状況から、`fstab`ファイルを生成します。
マウントし忘れがあったりすると、当然`fstab`には書き込まれないので、ご注意ください。
（swapとか忘れがち。）

### chroot

`# arch-chroot /mnt`
これで、/mnt直下が仮の /（ルート） として取り扱われます。

シェルから実行するコマンドも、/mnt配下のディレクトリから探索されるようになるので、ライブ環境にしか入っていないコマンドは使えなくなります。要注意。

### ブートローダー

最後に、ブートローダーのインストールを行います。
[ブートローダー](https://wiki.archlinux.jp/index.php/%E3%83%96%E3%83%BC%E3%83%88%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC)のページに色々載っていますが、特にこだわりがないので [GRUB](https://wiki.archlinux.jp/index.php/GRUB) を使います。

GRUB はBIOS・UEFI両方に対応したブートローダーで、インストール手順もそれぞれに分かれています。
今回はUEFIを使っているので、[UEFIシステム](https://wiki.archlinux.jp/index.php/GRUB#UEFI_.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0)向け手順を見ながら進めます。

#### GRUBのインストール

GRUBのインストールに必要なパッケージを入れます。
`# pacman -S grub efibootmgr`
いきなり登場しましたが、Arch Linuxでは pacman というパッケージマネージャを使います。
※ 先ほど chroot しているので、パッケージは /mnt 配下の然るべきディレクトリに入ります。

GRUBのインストールを行います。
`# grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=grub`

#### GRUBの設定

※ 実はここの工程を飛ばして再起動してしまい、ちょっと苦労しました。後述します。

GRUB の設定ファイルを生成します。
`# grub-mkconfig -o /boot/grub/grub.cfg`
ファイルの中には、どのLinuxカーネルを使ってブートするか　みたいな設定が書かれています。

デュアルブートする場合、この設定をいじってOSを選択できるようにします。


### 再起動

ここまでで、最低限必要な設定は終わりました。再起動してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/319a1020-8d3f-ad09-c5d8-e3b745be5fc6.png)
GRUBのメニューでArch Linuxを選んで・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492/a92fa539-51ff-a333-0090-be2fd1718ed4.png)
キタ！ 🎉
素振り成功です。


## (おまけ) GRUBコンソールからLinuxを起動

GRUBのインストール後、設定ファイルの生成を忘れて再起動してしまいました。
そうすると、GRUBは起動するものの、OSが起動できなくなります。

実はGRUB自身にもコンソールがあり、コマンドを叩いてOSを起動することができます。
参考: [起動失敗してgrubプロンプト(grub >)が出た場合の対処](https://urotasm.hatenablog.com/entry/2018/01/12/232111)

```
> set root=(hd0,gpt2)
> linux /boot/vmlinuz-linux root=/dev/sda2
> initrd /boot/initramfs-linux.img
> boot
```

1行目の`set root=(hd0,gpt2)`で、1台目のHDDの2つ目のGPTパーティション をルートに指定しています。（/dev/sda2に相当）
この状態で``ls /boot``とかすると、ファイル名の確認くらいはできます。
そうやって調べたファイル名を、2・3行目で指定しています。

ミスのおかげで勉強になりました。✨

--------
明日は@nissy_gpさんの記事です！