Arch Linuxの最小限インストール

## はじめに

Arch Linuxのインストールは、Arch Linuxに興味のある人はもちろん、Linux一般やコンピューターの仕組みを深く知りたい人は一度試してみることをオススメします。ほかのLinuxディストリビューションやOSのインストールでは隠されている、興味深い技術や知識を体験するよい機会になります。たとえば、[chroot](https://wiki.archlinux.jp/index.php/Change_Root "Change Root - ArchWiki")や[ブートローダの設定](https://wiki.archlinux.jp/index.php/ブートローダー "ブートローダー - ArchWiki")などです。

また、Arch Linuxはブートモード[UEFI](http://www.uefi.org "UEFI")やシステムサービスマネージャー[systemd](https://www.freedesktop.org/wiki/Software/systemd/ "systemd")など新技術にも積極的に対応しています。Arch Linuxのインストールは、こうした新技術に触れるよい機会にもなります。

OSのインストールにあたってはさまざまな設定を行います。ですが、ここではSSDやハードディスクなどのドライブからArch Linuxを起動できるようになるまでの最小限のインストール手順を説明します。たとえばユーザーの作成やネットワークの設定などといったインストールと一緒に行われることが多い作業も後回しにします。

インストールの対象は、実機と、[QEMU](https://www.qemu.org "QEMU")/[KVM](https://www.linux-kvm.org/page/Main_Page "KVM")の仮想マシン、[VirtualBox](https://www.virtualbox.org "Oracle VM VirtualBox")の仮想マシンの3種類です。QEMU/KVMやVirtualBoxを使うとを気軽にArch Linuxのインストールを試せますし、インストールを繰り返し練習することもできます。

なお、デュアルブートは、ここでは扱いません。

## 準備と確認

### インストール要件の確認

Arch Linuxのインストール要件は、次のとおり。

- 機種:  x86_64 互換
- メモリ: 512MB以上
- インターネット接続
- ドライブ容量: 2GiB以上

意外と高い要件が求められるので、注意してください。

### ブートモードとパーティション方式の確認

ブートモードはコンピューターに電源が入ってからOSがブート（起動）するまでの間に動作するもので、主にBIOSとUEFIが用いられます。かつてはBIOSがブートモードの代名詞でしたが、最近のマシンではUEFIが一般的です。実機では、マシンによりブートモードが決まります。QEMU/KVMやVirtualBoxでは、仮想マシン作成時などにBIOSかUEFIかを設定します。

また、ドライブを管理するときのパーティション方式は、かつてはMBR（Master Boot Record）が代名詞でした。最近は、とくにブートモードがUEFIの場合、GPT（GUID Partition Table）が用いられます。

ここでは、ブートモードはUEFI、パーティション方式はGPTでインストールします。

### ISOファイルのダウンロード

Arch Linuxのインストールに必要なISOファイルは、[Arch Linux をダウンロード](https://www.archlinux.jp/download/ "Arch Linux をダウンロード")に記載されたサーバーからダウンロードします。日本国内の場合、日本のサーバーからダウンロードするといいでしょう。ISOファイルは、`archlinux-2018.10.01-x86_64.iso`のような「archlinux-<日付>-x86_64.iso」という形式の名前のISOファイルで、容量は600MB程度です。

#### インストールメディアへのコピー

実機にArch Linuxをインストールする場合は、CD-ROMやUSBメモリーなどのリムーバブルメディアにISOファイルをコピーしてください。可能な場合は、USBメモリーを使うのがオススメです。

## マシンのブートと状態の確認

###  マシンのブート

実機の場合は、USBメモリを挿すなどしてインストールメディアからマシンをブートさせてください。QEMU/KVMやVirtualBoxの仮想マシンの場合は、ダウンロードしたISOファイルからブートするように設定し、ブートさせてください。

マシンがブートすると、次のようなzshシェルの画面になります。
![capture 2021-03-23 17.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15467/d362b646-eac5-b5c8-d2f2-8bae0bb8aabb.png)

この画面からArch Linuxをインストールします。硬派だねぇ。

### インストール中のキーボードの設定

初期設定では英語キーボードレイアウトが設定されるため、日本語キーボードを使っていると記号などの入力がむつかしいかもしれません。その場合は、次のコマンドで日本語キーボードレイアウトに変更します。

```:参考
root@archiso ~ # loadkeys jp106
```

詳細は、[ArchWiki](https://wiki.archlinux.jp/index.php/コンソールでのキーボード設定 "コンソールでのキーボード設定 - ArchWiki")を参照してください。ただし、ここでの変更はインストールのときだけ有効です。永続的な設定は、インストール完了後にあらためてやります。

### 作業記録の開始

`script`コマンドで、シェルに入力したコマンドや出力結果などの作業を記録し、ファイルに保存できます。引数を指定しない場合、カレントディレクトリのtypescriptファイルが作業記録の保存先になります。

```
root@archiso ~ # script
```

```:実行結果
Script started, file is typescript
```

こうした作業記録は必須ではありませんが、あとからインストール手順を検証できるるため、保存しておくことをオススメします。とくにインストールが失敗した場合には、失敗した原因を調べるために役立ちます。

作業記録を止めるには、`exit`コマンドを実行します。保存したファイルは、そのままではインストール完了時の再起動で失われてしまうため、あとでドライブにコピーする必要があります。

### 接続デバイスの確認

マシンに接続されているドライブなどのデバイスを`lsblk`で確認します。

```
root@archiso ~ # lsblk
```

```:実行結果
NAME  MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0   7:0    0 446.8M  1 loop /run/archiso/sfs/airootfs
sr0    11:0    1   556M  0 rom  /run/archiso/bootmnt
sda   254:0    0    50G  0 disk
```

この場合、`sda`ドライブがArch Linuxインストールの対象となります。

KVM/QEMUでvirtioドライバーを用いた仮想ドライブを使っている場合は、ドライブが`sda`のかわりに`vda`と表示されます。

### ブートモードの確認
ブートモードを`efivar`コマンドで確認します。`efivar`はUEFIについての変数を設定・確認するためのコマンドで、`-l`オプションで変数一覧を表示します。このコマンドで変数名のリストが表示される場合のブートモードは、UEFIです。

```
root@archiso ~ # efivar -l
```

```:実行結果
8be4df61-93ca-11d2-aa0d-00e098032b8c-BootOrder
8be4df61-93ca-11d2-aa0d-00e098032b8c-Boot0003
8be4df61-93ca-11d2-aa0d-00e098032b8c-Boot0002
... // 以下略
```

### インターネット接続の確認
マシンがインターネットに接続していることを`ping`コマンドで確認します。

```
root@archiso ~ # ping -c 4 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=50 time=7.73 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=2 ttl=50 time=5.43 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=3 ttl=50 time=5.36 ms
64 bytes from tk2-235-27344.vs.sakura.ne.jp (160.16.119.98): icmp_seq=4 ttl=50 time=6.15 ms

--- archlinux.jp ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3858ms
rtt min/avg/max/mdev = 5.363/6.168/7.731/0.956 ms
```

## パーティションの設定

インストールメディアからブートした直後の状態では、ドライブへのデータの読み書きはできません。次の3つの作業でパーティションを設定することでデータの読み書きができるようになります。

- パーティションの作成
- ファイルシステムの構築
- ファイルシステムのマウント

### パーティションの作成

ドライブのパーティションをgdiskで設定します。gdiskは、MBRのパーティション設定で用いられていたfdiskとよく似た、コマンドライン上のGPTパーティション設定ツールです。

`sda`ドライブに対するgdiskを次のコマンドで開始します。

```
root@archiso ~ # gdisk /dev/sda
```

```:実行結果
GPT fdisk (gdisk) version 1.0.3


Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): 
```

gdiskのプロンプトが表示されました。`?`コマンドで、コマンド一覧が表示されます。

```
Command (? for help): ?
```

```:実行結果
b   back up GPT data to a file
c   change a partition's name
d   delete a partition
i   show detailed information on a partition
l   list known partition types
n   add a new partition
o   create a new empty GUID partition table (GPT)
p   print the partition table
q   quit without saving changes
r   recovery and transformation options (experts only)
s   sort partitions
t   change a partition's type code
v   verify disk
w   write table to disk and exit
x   extra functionality (experts only)
?   print this menu
```

`p`コマンドで現在のパーティションを表示します。パーティションが空の場合、次のように表示されます。

```
Command (? for help): p
```

```:実行結果
Disk /dev/sda: 104857600 sectors, 50.0 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 8EC9B916-FFB9-46A8-81DB-C845CE21CAEA
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 103811004 sectors (49.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
```

`n`コマンドを実行した後、パーティション番号、先頭セクター、最終セクター、パーティションタイプを指定し、EFIシステムパーティション（ESP）を1つめのパーティションとして作成します。ます。

`First Sector`、`Last Sector`、`type`（Hex code or GID）を設定します。パーティションサイズを推奨値である512MB、パーティションタイプは必ずEFI System（ef00）にします。HexCode or GIDは、`L`コマンドで確認できます。

```
Command (? for help): n
```

Enterキーを押します。パーティション番号「1」が指定されます。

```
Partition number (1-128, default 1):    // Enterキーを押す
```

Enterキーを押します。ドライブ全体で利用できる先頭のセクターが自動的に先頭セクターとして設定されます。

```
First sector (34-104857566, default = 2048) or {+-}size{KMGTP}:     // Enterキーを押す
```

`512M`と入力してEnterキーを押します。サイズが512MBになるように最終セクターが設定されます。

```
Last sector (2048-104857566, default = 104857566) or {+-}size{KMGTP}: 512M
```

パーティションタイプを16進数番号のリストを表示します。

```
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): L // HexCode or GIDの確認
```

```:実行結果
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE
3000 ONIE boot             3001 ONIE config           3900 Plan 9
4100 PowerPC PReP boot     4200 Windows LDM data      4201 Windows LDM metadata
...        // 中略
af01 Apple RAID            af02 Apple RAID offline    af03 Apple label
```

```
Press the <Enter> key to see more codes:    // Enterキーを押す
```

```:実行結果
af04 AppleTV recovery      af05 Apple Core Storage    af06 Apple SoftRAID Statu
af07 Apple SoftRAID Scrat  af08 Apple SoftRAID Volum  af09 Apple SoftRAID Cache
b300 QNX6 Power-Safe       bc00 Acronis Secure Zone   be00 Solaris boot
...        // 中略
e101 ONIE config           ea00 Freedesktop $BOOT     eb00 Haiku BFS
ed00 Sony system partitio  ed01 Lenovo system partit  ef00 EFI System
ef01 MBR partition scheme  ef02 BIOS boot partition   f800 Ceph OSD
f801 Ceph dm-crypt OSD     f802 Ceph journal          f803 Ceph dm-crypt journa
f804 Ceph disk in creatio  f805 Ceph dm-crypt disk i  fb00 VMWare VMFS
fb01 VMWare reserved       fc00 VMWare kcore crash p  fd00 Linux RAID
```

パーティションタイプEFI Systemに対応する16進数番号`ef00`を入力してEnterキーを押します。
パーティションタイプがEFI Systemに設定されます。

```
Hex code or GUID (L to show codes, Enter = 8300): ef00
```

```:実行結果
Changed type of partition to 'EFI System'
```

`p`コマンドで現在のパーティションを表示します。

```
Command (? for help): p
```

```:実行結果
Disk /dev/sda: 104857600 sectors, 50.0 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 8EC9B916-FFB9-46A8-81DB-C845CE21CAEA
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 103811004 sectors (49.5 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1048576   511.0 MiB   EF00  EFI System
```

2つめのパーティションは、ルートファイルシステムのパーティションとして設定します。今回は、EFIシステムパーティション以外のパーティションは分割しないことにします。また、パーティションタイプは[Linuxファイルシステムをまとめてみました](https://qiita.com/sion_cojp/items/c8e015db39ddbf43012e)に記載されているようなさまざまなLinuxファイルシステムから選べます。ここでは、もっとも一般的なLinuxファイルシステムであるExt4にします。結果として、Enterキーを押していけばルートファイルシステムのパーティションが設定されます。

```
Command (? for help): n
```

Enterキーを押します。パーティション番号が2に設定されます。

```
Partition number (2-128, default 2):    // Enterキーを押す
```

Enterキーを押します。既存のパーティション（EFIシステムパーティション）の直後のセクターが自動的に先頭セクターとして設定されます。

```
First sector (34-104857566, default = 1050624) or {+-}size{KMGTP}: // Enterキーを押す
```

Enterキーを押します。ドライブ全体の最終セクターが自動的に最終セクターとして設定されます。

```
Last sector (1050624-104857566, default = 104857566) or {+-}size{KMGTP}: // Enterキーを押す
```

Enterキーを押します。パーティションタイプが自動的にLinux filesystemに設定されます。

```
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):   // Enterキーを押す
```

```:実行結果
Changed type of partition to 'Linux filesystem'
```

再び、パーティションテーブルを表示します。

```
Command (? for help): p
```

```:実行結果
Disk /dev/sda: 104857600 sectors, 50.0 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 8EC9B916-FFB9-46A8-81DB-C845CE21CAEA
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 104857566
Partitions will be aligned on 2048-sector boundaries
Total free space is 4061 sectors (2.0 MiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1048576   511.0 MiB   EF00  EFI System
   2         1050624       104857566   49.5 GiB    8300  Linux filesystem
```

問題がなければ、`w`コマンドを実行します。設定されたパーティションテーブルが実際に反映され、gdiskが終了します。

```
Command (? for help): w
```

既存のデータが削除されることの確認を求められるので、`y`を入力します。

```
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
```

パーティションテーブルが書き込まれ、シェルに戻ります。

```:実行結果
OK; writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
```

シェルで`lsblk`コマンドを実行し、改めてデバイスとパーティションを表示します。作成したパーティションsda1とsda2が表示されていることを確認してください。これらのパーティションはこの後の作業で`/dev/sda1`や`/dev/sda2`と指定します。

```
root@archiso ~ # lsblk
```

```:実行結果
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 446.8M  1 loop /run/archiso/sfs/airootfs
sr0     11:0    1   556M  0 rom  /run/archiso/bootmnt
sda    254:0    0    50G  0 disk
├─sda1 254:1    0   511M  0 part
└─sda2 254:2    0  49.5G  0 part
```

### ファイルシステムの構築
作成したパーティションごとにフォーマット（初期化）し、ファイルシステムを構築します。sda1はEFIシステムパーティションとし、sda2にルートファイルシステムを構築します。

EFIシステムパーティションには、`mkfs.fat`コマンドでFAT32形式のファイルシステムを構築します。FATはMS Windowsなどで用いられてきたファイルシステムの総称で、MS DOSやWindows 95で使われたFAT16やWindows 98で使われたFAT32などが含まれます。`-F32`はFAT32を指定します。

```
root@archiso ~ # mkfs.fat -F32 /dev/sda1
```

```:実行結果
mkfs.fat 4.1 (2017-01-24)
```

ルートファイルシステムは```mkfs.ext4```コマンドを用いて、EXT4形式で構築します。ドライブのサイズが大きい場合は、ちょっと時間がかかります。

```
root@archiso ~ # mkfs.ext4 /dev/sda2
```

```:実行結果
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 12975867 4k blocks and 3244032 inodes
Filesystem UUID: c00d997e-3b71-4e59-89fc-aa47d478cd33
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424

Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done
```

### ファイルシステムのマウント
構築したファイルシステムをマウントし、データの読み書きができるようにします。

まず、ルートファイルシステムをマウントします。マウントするディレクトリーは、`/mnt`にします。`/mnt`は、インストールメディアからブートしたArch Linuxによりすでに作成されたディレクトリーです。ルートファイルシステムは構築直後完了直後で空なので、マウント完了後の`/mnt`の下も空になります。

```
root@archiso ~ # mount /dev/sda2 /mnt
```

なお、`/mnt`にマウントするパーティションが`sda2`であり、`sda1`ではないことに注意してください。

次に、EFIシステムパーティションをマウントします。マウントするディレクトリーは、`/mnt/boot`です。

`/mnt/boot`を作成します。

```
root@archiso ~ # mkdir /mnt/boot
```

EFIシステムパーティションを`/mnt/boot`にマウントします。

```
root@archiso ~ # mount /dev/sda1 /mnt/boot
```

マウントが正常にできたかどうかを、`mount`コマンドで確認します。

```
root@archiso ~ # mount | grep /mnt
```

```:実行結果
/dev/sda2 on /mnt type ext4 (rw,realtime)
/dev/sda1 on /mnt/boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro)
```

`mount`コマンドを引数なしで実行すると、現在マウントされているファイルシステム（パーティションなど）が一覧表示されます。パイプ（|）と`grep`コマンドで、`/mnt`以下のディレクトリーにマウントされているパーティションを絞り込んで表示します。

sda2が`/mnt`、sda1が`/mnt/boot`にマウントされていることを確認してください。もし誤ったマウントをしていた場合は、次のコマンドで`/mnt`以下をすべてアンマウントできます。

```:参考
root@archiso ~ # umount -R /mnt
```

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

マウントが完了したら、ルートファイルシステムへ次の3種類の必須パッケージグループをインストールします。

* base - Arch Linuxを使う上で最小限必要とされている基本的なパッケージ群
* linux - ブートに必要な `vmlinuz-linux ` や `initramfs-linux.img` を生成するために必要
* linux-firmware - 一般的なハードウェアのためのファームウェア

パッケージグループに含まれるパッケージは、[Package Groups Overview](https://archlinux.org/groups/)で確認できます。

必須パッケージのインストールは、ミラーリストを設定してから実行します。

### ミラーリストの設定
Arch Linuxでは、[pacman](https://wiki.archlinux.jp/index.php/Pacman "pacman")を用いてパッケージを管理しており、インストール時のbaseグループなどのパッケージのダウンロードとインストールにpacmanを内部的に用います。pacmanは、コピー元のサーバーをミラーリスト設定ファイル`/etc/pacman.d/mirrorlist`で決定しています。このファイルは初期設定では世界中のミラーサーバーが記述されているため、遠方のサーバーに接続されてダウンロードに時間がかかってしまいます。

そこで、ミラーリスト設定ファイルを編集し、近くにあるミラーサーバーを使うようにします。日本国内の場合、日本のサーバーを一番上に移動させます。

Arch Linuxのインストール時にはファイル編集のために、vim、nanoなどのテキストエディタが利用できます。もともとの世界中のサーバーが記載されたファイルを上のような形に編集するのは、viの面白い練習課題だと思います。

### pacstrapの実行

ミラーリスト設定ファイルを編集したら、`pacstrap`コマンドを実行します。途中で、インストールするパッケージを選択するように聞かれる場合もあるので、画面の案内に従ってください。

```
root@archiso ~ # pacstrap /mnt base linux linux-firmware
```

```:実行結果
==> Creating install root at /mnt
==> Installing packages to /mnt
:: Synchronizing package databases...
...
```

## fstabの設定

`/etc/fstab`は、Linux（と、そのほかのUnix系OS）がブートするときなどにマウントするファイルシステムを決める重要な設定ファイルです。`pacstrap`は、実行時に`/mnt/etc/fstab`を次の内容で作成します。

```:/mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
```

`/mnt/etc/fstab`は後で`arch-chroot`するときに`/etc/fstab`となります。ただし、このままでは実質的に何も設定されておらず、Arch Linuxは正常にブートできません。

### genfstabの実行

Arch Linuxのインストール時は`genfstab`コマンドで、`/mnt`以下にマウントされたファイルシステムを反映し、`fstab`ファイルを作成できます。

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

実行後の`/mnt/etc/fstab`の一例です。

```:/mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda2
UUID=c00d997e-3b71-4e59-89fc-aa47d478cd33   /           ext4        rw,relatime,data=ordered    0 1

# /dev/sda1
UUID=2A0A-CBEA          /boot       vfat        rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro   0 2
```

なお、`genfstab`の`-U`オプションは、パーティションを`/dev/sda1`のようなデバイス名ではなく、`UUID=2A0A-CBEA`のようなUUIDで指定することを意味します。`/dev/sda1`などのデバイス名は、新しい周辺機器の接続などといったなにかのはずみで別のパーティションやデバイスに代わってしまい、ブートできないトラブルが発生することがあります。UUIDでパーティションを指定すればそうしたトラブル発生を防げます。

## ブートローダーの設定

インストールしたLinuxなどのOSをブートするためには、ブートローダーの設定が必要です。Linuxでのブートローダーの設定には[GRUB](https://qiita.com/tags/grub "GRUB")が用いられることが一般的でした。しかし最近は、ブートモードがUEFIの場合にはsystemdに含まれるsystemd-bootも多く用いられています。
ここでは、[systemd-boot](https://wiki.archlinux.jp/index.php/Systemd-boot "systemd-boot")を用いてブートローダーを設定します。

### arch-chrootの実行
`arch-chroot`を実行してchrootし、`/`（ルートディレクトリー）を`/mnt`にします。

```
root@archiso ~ # arch-chroot /mnt
```

chrootにより、`/mnt`、すなわちドライブにインストールされた設定が用いられるようになります。一方で、今まで使っていたインストールメディアのプログラムやデータにはアクセスできなくなります。たとえば、ここまで使ってきた`pacstrap`や`genfstab`、`arch-chroot`はドライブにはインストールされていないため、使えなくなります。

chrootは、今回のようなインストール時のほか、システム復旧時にも用いられます。また、ftpやDNSなどのセキュリティを確保するために用いられる場合もあります。さらに、近年多く用いられているDockerはchrootを進化させたものでもあります。

### systemd-bootのインストール

bootctlは、systemd-bootを用いたブートローダー管理に用いるコマンドです。`bootctl install`でsystemd-bootのブートローダーをEFIシステムパーティションにインストールします。

```
[root@archiso /]# bootctl install
```

```:実行結果
Created "/boot/EFI".
Created "/boot/EFI/systemd".
Created "/boot/EFI/BOOT".
Created "/boot/loader".
Created "/boot/loader/entries".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Created EFI boot entry "Linux Boot Manager".
```

### ローダーの設定

systemd-bootを用いる場合、`/boot/loader/loader.conf`ファイルでローダーを設定します。ローダーでは、ブート時に表示されるブートメニュー画面について設定します。viなどのテキストエディタで、`/boot/loader/loader.conf`を次のように編集し、保存します。

```/boot/loader/loader.conf
default arch
timeout 3
editor  no
```

この設定では、デフォルトで選択されるローダーエントリーを`arch`にしています。ブート時に、対応するローダーエントリーファイル`arch.conf`が`/boot/loader/entries`ディレクトリーにあることが必要になります。

`timeout`は、ブートメニュー画面が表示される秒数を指定します。`timeout=0`とすると、Spaceキーを押さないとブートメニュー画面が表示されなくなります。

`editor`は、ブートメニュー画面でカーネルパラメーターの編集ができるかどうかを指定します。セキュリティのため、`editor=no`が強く推奨されています。

### ローダーエントリの追加
ローダーの設定に対応するローダーエントリーファイル`/boot/loader/entries/arch.conf`を作成します。

このファイルでは、`title`でOS（Linuxディストリビューション）などの名前、`linux`でlinuxファイル、`initrd`で起動時に用いられるRAMディスクファイルを指定し、さらに`options`でルートファイルシステム`/dev/sda2`を指定します。linuxファイル、RAMディスクファイル、ルートファイルシステムの設定は、Linuxをブートするために必須です。

linuxファイルとRAMディスクは、pacstrapの実行のなかでlinuxパッケージがインストールされるときに`/boot`ディレクトリに作成されます。また、ローダーエントリーファイルでは`/boot`は`/`と記述します。

実在するlinuxファイルのパスを、sedで`/boot`から`/`に置換し、ローダーエントリーファイルに入力します。

```
[root@archiso /]# ls /boot/vmlinuz-linux | sed s~/boot~~ >/boot/loader/entries/arch.conf
```

実在するRAMディスクファイルのパスを、sedで`/boot`から`/`に置換し、ローダーエントリーファイルに追加入力します。

```
[root@archiso /]# ls /boot/initramfs-linux.img | sed s~/boot~~ >>/boot/loader/entries/arch.conf
```

`options`でのルートファイルシステム`/dev/sda2`の指定では、`/etc/fstab`と同様の理由でUUIDを用います。`/dev/sda2`のUUIDをローダーエントリーファイルに入力します。

blkidは、ドライブなどのデバイス情報をさまざまな形式で出力します。`-o export`は行ごとに「<設定項目>=<設定値>」の出力形式を指定するオプションです。`blkid`コマンドではほかの情報も出力されるので、パイプとgrepで絞り込みます。`^UUID`は、行の先頭が「UUID」ではじまることをあらわす正規表現です。

```
[root@archiso /]# blkid -o export /dev/sda2 | grep ^UUID >>/boot/loader/entries/arch.conf
```

その結果、ローダーエントリーファイル`/boot/loader/entries/arch.conf`は次のようになります。`UUID`は、`/etc/fstab`のルートファイルシステムに指定したのと同じ値です。

```:/boot/loader/entries/arch.conf
/vmlinuz-linux
/initramfs-linux.img
UUID=c00d997e-3b71-4e59-89fc-aa47d478cd33
```

このファイルをテキストエディタで編集し、titleの行を追加するとともに、入力されている内容がlinux、initrd、optionsの設定値になるように編集し、保存してください。optionsでのルートファイルシステムの指定では、パーティションを読み書き可能な状態にすることを表すrwを追加します。

```:/boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=c00d997e-3b71-4e59-89fc-aa47d478cd33 rw
```

`bootctl list`コマンドでローダーとローダーエントリーの設定が正しく反映されているかどうかを確認できます。ただし、linuxやinitrdのファイルやoptionsのUUIDが実在するかどうかはチェックされません。

```
[root@archiso /]# bootctl list
```

```:実行結果
Available boot entries:
        title: Arch Linux (default)
        linux: /vmlinuz-linux
       initrd: /initramfs-linux.img
      options: root=UUID=c00d997e-3b71-4e59-89fc-aa47d478cd33 rw
```

## rootユーザーのパスワード設定

`passwd`コマンドで、rootユーザーのパスワードを設定します。パスワードが設定されていないと、再起動後にArch Linuxにログインできなくなります。

```
[root@archiso /]# passwd
```

同じパスワードを2回入力して、設定します。再起動後はこのパスワードを使ってrootユーザーとしてログインします。

```
New password:
Retype new Password:
```

パスワードが設定されると、次のメッセージが表示されます。

```:実行結果
passwd: Password updated successfully
```

## インストールの終了と再起動

### arch-chrootの終了

ブートローダーの設定が完了したら、`exit`コマンドでchrootを終了します。

```
[root@archiso /]# exit
```

### 作業記録の終了

`script`コマンドで作業を記録していた場合は、もういちど`exit`コマンドを実行して終了します。

```
[root@archiso /]# exit
```

```:実行結果
Script done, file is typescript
```

### 作業記録ファイルのドライブへのコピー

作業を記録していた場合は、記録していたファイルをドライブにコピーします。ここでは、ドライブの`/root`ディレクトリーに`arch_linux_install.log`というファイル名で保存されるようにしています。

```
[root@archiso /]# cp typescript /mnt/root/arch_linux_install.log
```

コピーしないと、コンピューターを再起動したときに作業記録はなくなります。

### 再起動

コンピューターを再起動します。

```
[root@archiso /]# reboot
```

起動が開始するまでに、インストールメディアを取り外してください。

インストールに成功していて正常に起動できた場合は、Arch Linuxのログイン画面が表示されます。
![VirtualBox_Arch_23_10_2018_11_52_15.png](https://qiita-image-store.s3.amazonaws.com/0/15467/73884b2b-123c-db4e-a85e-5e66d4921977.png)

ここまでの手順できちんと設定ができている場合、`archlinux login:`に`root`、`Password:`に設定したパスワードを入力することでログインできます。お疲れ様でした！ QEMU/KVMやVirtualBoxの場合、この時点でスナップショットを作成しておくのもいいと思います。

うまくいかなかった場合は、作業記録などをもとに原因を探ってください。

## インストール後の作業

ここまでの作業では、通常はインストール時に行うさまざまな設定を省略しています。参考資料などをもとに、環境や用途に応じた設定をしてください。多くの場合、時間や言語などの設定と、ユーザーの作成、ネットワークの設定と設定は必要になるでしょう。

- [ロケールとキーボードの設定](https://qiita.com/j8takagi/items/1ff632ce15d02b595718)
    - キーボードレイアウトの設定
    - ロケールの設定
- [日時の設定](https://qiita.com/j8takagi/items/cc63ee5e9cfcb20fd244)
    - タイムゾーンの設定
    - NTPサーバーとの同期の設定
- ユーザーの作成と設定
    - ユーザーの作成 `useradd -m -G wheel <username>`
    - sudoの設定 `visudo`
    - rootユーザーのロック
- ホスト名の設定 `hostnamectl set-hostname <hostname>`
- ネットワークの設定
    - systemd-networkdの設定と起動
    - systemd-resolvedの設定と起動
- swapの設定
- sshのインストールと設定
- デスクトップ環境の設定
    - X Window Systemのインストールと設定
    - デスクトップ環境のインストールと設定
    - フォントの設定
    - 日本語入力システムのインストールと設定
- LTS版カーネルのインストールと設定

Arch LinuxなどのOSのインストールとシステム設定の作業は、モジュール化することを提案します。モジュール化とは、複雑なものごとを、一連のものごとに分割して考えることを意味し、プログラム作成時などに特に重要な考え方です。インストール作業はモジュール化することで、作業の理解と効率化につながるはずです。ここまで述べた最小限インストールの手順が、モジュール化のよい道しるべになってほしいです。

## 参考資料
Arch Linuxインストール時に真っ先に参照すべきは、[ArchWiki](https://wiki.archlinux.jp/index.php/メインページ)にあるインストールガイドです。

- [インストールガイド - ArchWiki](https://wiki.archlinux.jp/index.php/インストールガイド)
- [一般的な推奨事項](https://wiki.archlinux.jp/index.php/一般的な推奨事項)

ほかにも、ブログなどにArch Linuxのインストールについての記事があります。私は、次の記事が役立ちました。

- [Arch LinuxをUEFI + GPT環境にインストールする - クロの思考ノート](http://note.kurodigi.com/archlinux-uefi-install/)
- [Arch Linuxのインストール後の環境設定まとめ - クロの思考ノート](http://note.kurodigi.com/archlinux-setting/)
- [Arch Linux の KVM へのインストール](https://github.com/sgrsmt/doc/blob/master/os/arch/install-to-kvm.md)
- [Arch Linux で KVM/qemu (環境構築から VM の作成まで) - 私をペロペロするがよい ](http://lazy-dog.hatenablog.com/entry/2014/07/13/015538)

### Qiitaの記事
Qiita上にも、すでに多くの解説記事があります。私は特に、1. が役立ちました。

1. [VirtualBoxにArchLinuxをインストールする](https://qiita.com/tomi_sheep/items/ddd9c7b0f0f7c774a222)
1. [arch linux + LVM + UEFI + GPT なインストール手順](https://qiita.com/niwatolli3/items/926563abb65e1a9a8d4b)
1. [ArchLinuxをGPTなUEFIのGRUBで起動する](https://qiita.com/air-gh/items/4265cf4308114092a7a7)
1. [Arch Linux インストール俺々式完全版](https://qiita.com/TsutomuNakamura/items/b60518f8788e5e998744)
1. [ArchLinuxのインストール(3つのブート方式ごとの設定)](https://qiita.com/Gen_Arch/items/da296b7cbe5d87abc5a4)
1. [ArchLinuxを久々にインストールしたらハマった話](https://qiita.com/Shinko/items/88261e59d899db184936)

## まとめ

今回実行したコマンドをまとめると、次のようになります。

- `script`
- `gdisk /dev/sda`
- `mkfs.fat -F32 /dev/sda1`
- `mkfs.ext4 /dev/sda2`
- `mount /dev/sda2 /mnt`
- `mkdir /mnt/boot`
- `mount /dev/sda1 /mnt/boot`
- `vi /etc/pacman.d/mirrorlist`
- `pacstrap /mnt linux`
- `genfstab -U /mnt >>/mnt/etc/fstab`
- `arch-chroot /mnt`
- `bootctl install`
- `vi /boot/loader/loader.conf`
- `ls /boot/vmlinuz-linux | sed s~/boot~~ >/boot/loader/entries/arch.conf`
- `ls /boot/initramfs-linux | sed s~/boot~~ >>/boot/loader/entries/arch.conf`
- `blkid -o export UUID /dev/sda2 | grep ^UUID >>/boot/loader/entries/arch.conf`
- `vi /boot/loader/entries/arch.conf`
- `passwd`
- `exit`
- `exit`
- `cp typescript /mnt/root/arch_linux_install.log`
- `reboot`