Arch Linuxのインストール方法(Windows)

Arch Linuxの記事はシリーズになっています。
記事を順番に読み進めると、Arch Linuxをいい感じにセットアップできます。

- Arch Linuxのインストール方法(Windows)　__←イマココ__
- [Arch Linuxのセットアップ方法](https://qiita.com/uhooi/items/29c3b381a9a498ca067d)

## はじめに

Windowsでパーティションを切ってArch Linuxをインストールしたので、その手順を紹介します。

## 環境

- PC: ThinkPad T480
- プロセッサ: Intel(R) Core(TM) i5-8350U CPU @ 1.70GHz 1.90 GHz
- 実装 RAM: 8.00 GB (7.84 GB 使用可能)
- システムの種類: 64 ビット オペレーティングシステム、x64 ベース プロセッサ
- OS: Windows 10 Pro

## 必要な物

- WindowsがインストールされたPC
  - わからなかったら中古でThinkPadを買うのがオススメです
- USBメモリ
- インターネット環境

## 注意

基本的には以下のインストールガイド通りに作業するだけです。
英語版をメインで読みつつ、日本語版を併用して読むのがオススメです。

- [Installation guide - ArchWiki](https://wiki.archlinux.org/title/Installation_guide)
- [インストールガイド - ArchWiki](https://wiki.archlinux.jp/index.php/インストールガイド)

## Windowsのボリューム縮小

Arch Linuxのインストール領域を確保するため、Cドライブのボリュームを縮小します。
本記事で詳細な手順は省略しますが、簡単に紹介します。

左下のWindowsを右クリック > コンピュータの管理 > 記憶域 > ディスクの管理

私のPCの容量は256GBで、半分の128GB（128 * 1,024 = 131,072）を解放します。

![IMG_1732.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/324df7ae-cb0e-da51-44ac-0760286fd2e6.jpeg)

未割り当ての領域が「128.00 GB」になったら成功です。

![IMG_1733.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/19f21f42-31be-78b2-5198-fa18aeeba276.jpeg)

## Arch Linuxのインストール手順

Arch Linuxのインストール手順です。

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

#### 1.1 インストールメディアの入手

適当なミラーサイトからISOファイルをダウンロードします。

https://archlinux.org/download/

64ビットの場合、ファイル名は `archlinux-x86_64.iso` となります。

ISOファイルはArch LinuxをインストールするためのArch Linuxで、USBメモリに焼いて使います。
PCにインストールするArch Linuxはインターネット経由でダウンロードします。

#### 1.2 署名の検証

ISOファイルが悪意あるイメージに差し替えられていないか確認します。
スキップできますが、検証することが推奨されています。

#### 1.3 インストールメディアの準備

USBメモリにArch Linuxインストールイメージを焼きます。
USBメモリはウイルスの感染経路としてリスクが高いため、新品を使うのが望ましいです。

以下のページから適当なツールをインストールします。

https://wiki.archlinux.org/title/USB_flash_installation_medium

私は「1.2.2 Using win32diskimager」をインストールしました。

https://sourceforge.net/projects/win32diskimager/

あとはツールの手順に従って焼きます。

win32diskimagerの場合、「Image File」にISOファイルを選択し、USBメモリを挿して選択して「Write」を押下すればOKです。

USBメモリは挿しっぱなしにしておきます。

#### 1.4 ライブ環境の起動

Arch Linuxのライブ環境を起動します。

:::note
Arch Linuxインストールイメージはセキュアブートに対応していないため、無効にする必要があります。
有効になっている場合、BIOSからSecure BootをDisabledにしてください。
:::

:::note
WindowsでBIOSを起動するには完全シャットダウンしてから起動する必要があります。
完全シャットダウンはShiftキーを押しながらシャットダウンを押下します。
:::

ThinkPad T480の場合、完全シャットダウンして再起動し、ロゴが表示されているときにEnterキーを押下するとメニューが表示されるので、そこでF1キーを押下することでBIOSが起動します。

BIOSでインストールメディアが含まれているデバイスから起動するよう指定します。
Startup > Boot で「1. USB HDD」「2. Windows Boot Manager」の順に並べます。3以降の順番は問いません。

![IMG_1730.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/810052de-a699-cf1e-fe10-82c999df97f5.jpeg)

F10キーを押下し、保存して再起動します。

ブートローダーのメニューが表示されたら、一番上の「Arch Linux install medium」を選択してEnterキーを押下します。

Rootユーザーでログインされ、Zshのシェルプロンプトが表示されたらライブ環境の起動に成功しています。

#### 1.5 コンソールのキーボードレイアウト

日本語配列のキーボードを使っている場合、キーボードレイアウトを日本語に設定します。

利用できるキーマップを確認します。

```shell-session
# ls /usr/share/kbd/keymaps/**/*.map.gz
```

`jp106` が存在する場合、それを指定します。

```shell-session
# loadkeys jp106
```

コンソールフォントが小さいと感じる場合、 `ter-132b` を指定します。

```shell-session
# setfont ter-132b
```

#### 1.6 起動モードの確認

起動モードを確認します。

```shell-session
# cat /sys/firmware/efi/fw_platform_size
64
```

`64` が出力された場合、システムはUEFIモードかつ64ビットで起動しています。

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

ライブ環境でインターネットへ接続します。

Wi-Fiの場合、 `iwctl` コマンドを使います。

https://wiki.archlinux.jp/index.php/Iwd#iwctl

```shell-session
# iwctl
```

デバイスの一覧を出力して確認します。

```shell-session
# device list
```

Wi-Fiへ接続します。

```shell-session
# station wlan0 scan
# station wlan0 get-networks
# station wlan0 connect {SSID}
```

接続したらCtrl-dで抜けます。

接続できたか `ping` コマンドで確認します。

```shell-session
# ping www.google.com
```

pingが返ってきたらネットワークの接続に成功しています。
Ctrl-cで抜けます。

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

タイムゾーンを設定します。
日本の場合は `Asia/Tokyo` を指定します。

```shell-session
# timedatectl set-timezone Asia/Tokyo
```

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

最初に確保した領域にパーティションを作成します。

パーティションを確認します。

```shell-session
# fdisk -l
```

私の場合、 `/dev/nvme0n1p3` のendと `/dev/nvme0n1p4` のstartの間の領域が飛んでいるので、そこにパーティションを作成します。

```shell-session
fdisk /dev/nvme0n1
```

mキーを押下するとヘルプが見れます。

Fキーを押下すると空いているスペースが見れます。

nキーを押下し、新しいパーティションを作成します。
基本的にはデフォルトで問題ないのでEnterキーを3回押下します。

すでに署名が含まれている場合は削除していいと思います。

```shell-session
Command (m for help): n
Partition number (5-128, default 5): 
First sector (229838848-500118158, default 229838848): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (229838848-500118158, default 500118158): 

Created a new partition 5 of type 'Linux filesystem' and of size 128 GiB.
Partition #5 contains ext4 signature.

Do you want to remove the signature? ([Y]es/[N]o): Y

The signature will be removed by a write command.
```

pキーを押下して新しいパーティションが作成されていることを確認します。

wキーを押下してテーブルをディスクに書き込んで終了します。

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

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

以下のコマンドを実行し、新しいパーティションのFSTYPEが空なことを確認します。

```shell-session
# lsblk -f
```

本記事ではext4ファイルシステムでフォーマットします。

```shell-session
# mkfs.ext4 /dev/nvme0n1p5
```

再度以下のコマンドを実行し、新しいパーティションのFSTYPEが `ext4` になっていることを確認します。

```shell-session
# lsblk -f
```

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

新しくパーティションを作成したボリュームを `/mnt` にマウントします。

```shell-session
# mount /dev/nvme0n1p5 /mnt
```

### 2 インストール

#### 2.1 ミラーの選択

ミラーリストのファイルを開き、 `asia.mirror.pkgbuild.com` がドメインのサーバーを一番上に移動して保存します。
他のドメインでも問題ありませんが、日本に近そうなドメインを選択するとインストールが早くなるかもしれません。

```shell-session
# vim /etc/pacman.d/mirrorlist
```

```diff:/etc/pacman.d/mirrorlist
+ Server = https://asia.mirror.pkgbuild.com/$repo/os/$arch
Server = https://repo.jing.rocks/archlinux/$repo/os/$arch
Server = https://arch.mirror.constant.com/$repo/os/$arch
- Server = https://asia.mirror.pkgbuild.com/$repo/os/$arch
```

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

必須パッケージをインストールします。

```shell-session
# pacstrap -K /mnt base linux linux-firmware
```

ネットワークにもよりますが、少し時間が掛かります。

これで指定したボリュームにArch Linuxがインストールされました。

### 3 システムの設定

#### 3.1 fstab の作成

fstabを作成します。

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

#### デーモンの再読み込み

fstabが更新されたので、デーモンを再読み込みします。

```shell-session
# systemctl daemon-reload
```

#### EFIシステムパーティションのマウント

EFIシステムパーティションをマウントします。

https://wiki.archlinux.org/title/EFI_system_partition

https://wiki.archlinux.jp/index.php/EFI_システムパーティション

以下のコマンドを実行し、EFIシステムパーティションがあるか確認します。

```shell-session
# fdisk -l
```

私は `/dev/nvme0n1p1` にEFIシステムパーティションがありました。Windows 10を使っていると基本的にはあるようです。
USBメモリにもEFIシステムパーティションがあるため、間違えないように注意です。私の場合は `/dev/sda2` や `/dev/sdb2` にあした。

`/dev/nvme0n1p1` を `/mnt/boot/esp` にマウントします。

```shell-session
# mkdir /mnt/boot/esp
# mount /dev/nvme0n1p1 /mnt/boot/esp
```

エラーメッセージが表示されなければ成功です。

#### 3.2 chroot

ルートを変更します。

```shell-session
# arch-chroot /mnt
```

これでUSBメモリに焼いたArch Linuxから、PCにインストールしたArch Linuxへ操作の対象が変わりました。

#### 3.3 タイムゾーン

タイムゾーンを `Asia/Tokyo` に設定します。

```shell-session
# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# hwclock --systohc
```

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

以下のパッケージをインストールします。

Arch Linuxは [pacman](https://wiki.archlinux.jp/index.php/Pacman) というパッケージマネージャーでパッケージを管理しており、 `-S` を付けてインストールします。
```shell-session
# pacman -Sy # ローカルパッケージリポジトリを更新する
# pacman -S vim # テキストファイルの編集に必要
# pacman -S iwd # インターネット接続に必要
# pacman -S dhcpcd # DHCPによるIPアドレスの自動割り当てに必要
# pacman -S terminus-font # ter-132bなどのフォント
```

`iwd` と `dhcpcd` は自動で起動するように設定します。

```shell-session
# systemctl enable iwd
# systemctl enable dhcpcd
```

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

`locale.gen` を編集します。

```shell-session
# vim /etc/locale.gen
```

`en_US.UTF-8 UTF-8` と `ja_JP.UTF-8 UTF-8` をコメントインして保存します。

```diff:locale.gen
- #en_US.UTF-8 UTF-8
+ en_US.UTF-8 UTF-8
...
- #ja_JP.UTF-8 UTF-8
+ ja_JP.UTF-8 UTF-8
```

`locale-gen` コマンドを実行してロケールを生成します。

```shell-session
# locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
```

ロケールの設定ファイルを作成します。

```shell-session
# vim /etc/locale.conf
```

`LANG` 環境変数を設定します。

```diff:/etc/locale.conf
+ LANG=en_US.UTF-8
```

`ja_JP.UTF-8` を指定すると文字化けするため、この段階で日本語化はしないほうがいいです。

コンソールキーマップを設定している場合、 `vconsole.conf` ファイルを作成して変更を永続化します。

```shell-session
# vim /etc/vconsole.conf
```

`KEYMAP` を設定して保存します。

```diff_conf:/etc/vconsole.conf
+ KEYMAP=jp106
```

フォントの変更を永続化したい場合、 `FONT` を設定します。

```diff_conf:/etc/vconsole.conf
KEYMAP=jp106
+ FONT=ter-132b
```

#### 3.5 ネットワーク設定

ホストネームファイルを作成し、ホスト名を入力して保存します。

```shell-session
# vim /etc/hostname
```

私は `uhoost` としました。

```diff:/etc/hostname
+ uhoost
```

#### 3.6 Initramfs

`initramfs` を再生成します。

```shell-session
# mkinitcpio -P
```

#### 3.7 Root パスワード

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

```shell-session
# passwd
New password:
Retype new password:
passwd: password updated successfully
```

#### 3.8 ブートローダー

適当なブートローダーを選択し、インストールします。

https://wiki.archlinux.org/title/Arch_boot_process#Boot_loader

https://wiki.archlinux.jp/index.php/Arch_ブートプロセス#.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.org/title/GRUB

https://wiki.archlinux.jp/index.php/GRUB

##### 2 UEFI システム

###### 2.1 インストール

`grub` と `efibootmgr` をインストールします。

```shell-session
# pacman -S grub
# pacman -S efibootmgr
```

GRUB EFIアプリケーションとモジュールをインストールします。

```shell-session
# grub-install --target=x86_64-efi --efi-directory=/boot/esp --bootloader-id=GRUB
Installing for x86_64-efi platform.
Installation finished. No error reported.
```

EFIシステムパーティションのUUIDを確認します。

```shell-session
# lsblk --fs
```

Windowsを検出するため、 `40_custom` を編集します。
`{UUID}` には先ほど確認した値を指定します。

```shell-session
# vim /etc/grub.d/40_custom
```

```diff:40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to ad after this comment. Be careful not to change
# the 'exec tail' line above.
+ if [ "${grub_platform}" == "efi" ]; then
+ 	menuentry "Microsoft Windows 10 UEFI/GPT" {
+ 		insmod part_gpt
+ 		insmod fat
+ 		insmod chain
+ 		search --no-floppy --fs-uuid --set=root {UUID}
+ 		chainloader /EFI/Microsoft/Boot/bootmgfw.efi
+ 	}
+ fi
```

`grub-mkconfig` コマンドを実行し、GRUBの設定ファイルを生成します。

```shell-session
# grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
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
```

`40_custom` にエラーがあると失敗するので注意です。

### 4 再起動

`exit` でPCにインストールされたArch Linuxを抜け、 `reboot` を実行して再起動します。

BIOSのStartup > Bootで1.がGRUBになっていることを確認します。

GRUBが起動し、一番上を選択してArch Linuxが起動したら成功です。
シャットダウンは `shutdown -h now` で行います。

## トラブルシューティング

エラーとその対応方法です。

### マウントポイントがなくてマウントに失敗する

マウントポイントを作成するだけです。

```shell-session
# mount /dev/nvme0n1p1 /mnt/boot/esp
mount: /mnt/boot/esp: mount point does not exist.
       dmesg(1) may have more information after failed monut system call.

# mkdir /mnt/boot/esp
```

### fstabが変更されていてマウントに失敗する

エラーメッセージの通りにコマンドを実行するだけです。

```shell-session
# mount /dev/nvme0n1p1 /mnt/boot/esp
mount: (hint) your fstab has been modified, but systemd still uses
       the old version; use 'systemctl daemon-reload' to reload.

# systemctl daemon-reload
```

## おわりに

これでArch Linuxがインストールされました。
慣れるとすぐにクリーンインストールできるようにもなります。

いろいろカスタマイズしたりして、最高のArch Linuxライフを送りましょう :relaxed:

## 参考リンク

- [Arch Linux Install Battle 2022 Summer](https://zenn.dev/23prime/articles/a120f9c00bf6db)