古いWindows機をArch Linux機にしてみた

# はじめに
家に手頃なPCが眠っていたので、Windowsを消して前から気になっていたArch Linuxをインストールしてみることにしました。デュアルブートではないです。PC自体が６年前の代物で、CPU自体も第７世代のCORE i5とかなので、性能的に不安だったからです。あと家にWindows機が別途あったので特にWindows機が必要じゃなかったというのもあります。

Arch Linux自体については、[Arch Linuxのすゝめ](https://qiita.com/YTJVDCM/items/eea145c59662adb8ae2a)とか参考になります。

この記事の内容は、以下に基づいています（2023年3月20日アクセス）。この公式ガイドと突き合わせながらこの記事を使っていただくと一番いいかもしれません。

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#.E8.B5.B7.E5.8B.95.E3.83.A2.E3.83.BC.E3.83.89.E3.81.AE.E7.A2.BA.E8.AA.8D

# インストールメディアを作成する
以下を参考にUSBを使ってインストールメディア（ブータブルUSB）を作成しました。単にISOイメージをUSBに置くだけではダメですよ。

https://wiki.archlinux.jp/index.php/USB_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2

あと、インストールメディアを作成するとUSB内にあるファイルは全て消えるので注意してください。インストールメディアにしたUSBはUSBとして普通に使えなくなりますが、初期化すれば元に戻ります。僕のはバッファローのやつなので、バッファローの場合の初期化方法が説明された記事を置いときます。

https://www.buffalo.jp/support/faq/detail/16359.html

僕はmacユーザーなので、ここではmacでUSBを使ってインストールメディアを作成する方法を説明します。macにUSBを挿したら、以下の手順でインストールメディアを作成します。

まず、USBドライブが何という名前で認識されているのかを確認します。以下のコマンドを実行すると、USBデバイスは`/dev/disk5 (external, physical)`のように表示されます。僕の環境では`/dev/disk5`でしたが、`/dev/disk2`だったり他の数字になっていることもあるでしょう。

```zsh
diskutil list
```

次にUSBデバイスをアンマウントします。`/dev/disk5`の部分は適宜変えてください。

```zsh
diskutil unmountDisk /dev/disk5
```

最後にISOイメージファイルをUSBデバイスにコピーして完成です。ISOイメージファイルのパスは自分の環境に合わせて変えてください。また`disk5`の前に`r`を指定してrawモードを使うことで高速に転送できるようにしています。もちろんこの`rdisk5`も適宜変えてください。

```zsh
sudo dd if=path/to/archlinux-2023.03.01-x86_64.iso of=/dev/rdisk5 bs=1m
```

インストールメディアが完成するとUSBは普通のUSBとして使えなくなるので、画面上に「「セットしたディスクは、このコンピュータで読み取れないディスクでした。」と表示されますが、「無視」を押してください。

# BIOSの設定を一部変更してからブートする
次に生贄にするWindows機にUSBを挿してから、BIOSの設定を変更して、ブートします。

BIOSの開き方はメーカーによってまちまちだと思うので調べてください。僕のは電源を入れてから、メーカーのロゴが表示されているときにF2キーを連打することで開くことができました。

BIOSを開いたら、ブートする前にセキュアブートを無効化する必要があります。またBoot Device Priorityを変更して、USB HDDを一番先頭にし、HDDを２番目にします。

> ノート: Arch Linux インストールイメージはセキュアブートをサポートしません。インストールメディアから起動するには、セキュアブートを無効化 する必要があります。インストールが完了した後に セキュアブート をセットアップすることもできます。

最後に設定を保存してブートすればArch Linuxの初期画面が開きます。一応、僕のPCの場合の方法が書かれた記事を置いときます。

https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=021977

# 作業ログを作成する
作業前に、作業ログを取るようにしましょう。作業ログを取ることで、後から分析したり、質問したりするのに使うことができるので便利です。`script <ファイル名>`と実行することができます。単に`script`と実行すると、`typescript`というファイルが生成されます。

```zsh
script
```

`exit`を実行して、作業ログの記録を終了できます。`a`オプションをつけてあげることで、再度同じファイルに作業ログを追記できます。

```zsh
script -a
```

https://dev.classmethod.jp/articles/scriptcommand/

# キーボードレイアウトの設定
デフォルトのキーボードレイアウトはUSキーボードとのことなので、以下のコマンドを実行して日本語キーボードレイアウトに変更します。

```zsh
loadkeys jp106
```

# インターネットに接続する
## ネットワークインターフェースの確認
以下のコマンドでネットワークインターフェースが認識・有効化されていることを確認します。このとき、`state DOWN`となっていても問題ありません。`<BROADCAST,MULTICAST,UP,LOWER_UP>`などとなっている部分に`UP`があればそのネットワークインターフェースは有効化されています。一緒にネットワークインターフェースの名前も確認しておきましょう。一番上の`LOOPBACK`などと書かれている方ではないです。僕の場合は`wlan0`という名前でした。

```zsh
ip link
```

もしネットワークインターフェースがUPしてないようでしたら、以下のコマンドで有効化します。`wlan0`の部分は適宜変えてください。

```zsh
ip link set wlan0 up
```

## 無線カードの確認
また無線カードが`rfkill`によってブロックされているかを確認します。以下のコマンドを実行したとき、`Soft blocked: yes`または `Hard blocked: yes`のいずれかが表示された場合、無線カードが`rfkill`によってブロックされています。 `Soft blocked: yes`は、ソフトウェアによって無線カードがブロックされていることを示し、`Hard blocked: yes`は、物理的なスイッチまたはキーによって無線カードがブロックされていることを示します。

```zsh
rfkill list
```

無線カードがブロックされている場合は以下のコマンドを実行してブロックを解除してください。

```zsh
rfkill unblock all
```

## Wi-Fiに接続する
無線または有線でインターネットに接続します。ここでは無線の場合の手順を示します。

```zsh
$ iwctl
[iwd]# station wlan0 scan
[iwd]# station wlan0 get-networks
[iwd]# station wlan0 connect <任意のSSID>
[iwd]# known-networks list
```

## 接続確認
接続できたら、「Ctrl + C」で対話型シェルから抜けて、`ping archlinux.jp`で接続を確認しましょう。

# タイムゾーンの設定
インターネットに接続すると自動的に時刻が同期されますが、タイムゾーンはUTCになっているので、`Asia/Tokyo`に変更します。以下のコマンドで現在の日時設定を確認できます。

```zsh
timedatectl status
```

以下のコマンドを実行して、タイムゾーンを変更します。

```zsh
timedatectl set-timezone Asia/Tokyo
```

この記事を参考にしました。

https://qiita.com/j8takagi/items/cc63ee5e9cfcb20fd244

# パーティションの設定

## パーティションとは
パーティションについては以下の記事が参考になります。BIOS、UEFI、MBR、GPT、基本パーティション、拡張パーティション、論理パーティションという用語がわからない人も以下の記事を読んでおいてください。

https://eng-entrance.com/linux-partition

## 現在のパーティショニングの確認
現在のパーティショニングがどうなっているかを以下のコマンドで確認します。`rom`、`loop`、`airoot`などが名前に含まれるデバイスは無視してください。`sda`や`nvme0n1`、`mmcblk0`などのような名前が表示されていると思います。僕の場合は`sda`でした。また、`Disklabel type: gpt`と表示されていたら、パーティションスキームはGPTになっていることがわかります。

```zsh
fdisk -l
```

## バックアップ
ハードディスクに変更を加える前に、以下のコマンドを実行してドライブのパーティションテーブルとパーティションスキームをバックアップしておきます。`/dev/sda > sda.dump`は適宜自分の環境に合わせて変えてください。

```zsh
sfdisk -d /dev/sda > sda.dump
```

必要なら、以下のコマンドを実行すれば、バックアップからレイアウトを復元できます。

```zsh
sfdisk /dev/sda < sda.dump
```

## パーティションのレイアウト
インストールガイドのレイアウト例に則って、以下のようにパーティショニングします。EFIシステムパーティションのサイズは複数のカーネルをインストールする場合に最低限必要な1GiBとしています（複数カーネルをインストールする予定はありませんが念の為）。

スワップパーティションのサイズに関しては以下のように言及されているので、PCのRAMと同じ8GiBとしています。

> 歴史的に、スワップパーティションのサイズは物理 RAM のサイズの2倍にするという一般的なルールがありました。しかし、コンピュータがより多くのメモリを搭載するようになってから、このルールは時代遅れになりました。例えば、512 MiB の RAM を搭載する平均的なデスクトップマシンでは、通常「2倍ルール」は適切です。十分な量の RAM (1024 MiB 以上)が利用できる場合は、スワップパーティションを小さくしてもよいでしょう。
>
> ハイバネート(suspend to disk)する場合、RAM と同じサイズのスワップパーティションを作成することが推奨されます。カーネルは、スワップ領域に収まるように suspend-to-disk イメージを圧縮しようとしますが、スワップ領域のサイズが RAM よりも大幅に小さい場合にハイバネートが成功する保証はありません。詳細は [サスペンドとハイバネート#ハイバネーション](https://wiki.archlinux.jp/index.php/%E3%82%B5%E3%82%B9%E3%83%9A%E3%83%B3%E3%83%89%E3%81%A8%E3%83%8F%E3%82%A4%E3%83%90%E3%83%8D%E3%83%BC%E3%83%88#.E3.83.8F.E3.82.A4.E3.83.90.E3.83.8D.E3.83.BC.E3.82.B7.E3.83.A7.E3.83.B3) を見てください。 - [パーティショニング - ArchWiki](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)

`/home`は以下を参考にして、20GiBにしています。

https://wiki.archlinux.jp/index.php/Parted#UEFI.2FGPT_.E3.81.AE.E4.BE.8B


| マウントポイント | パーティション | タイプ | サイズ |
|:-:|:-:|:-:|:-:|
| `/mnt/boot`  | /dev/sda1  | EFIシステムパーティション  | 1GiB（最低300MiB必要）  |
| `[swap]`  | /dev/sda2  | Linux swap  | 8GiB（最低512MiB必要）  |
| `/mnt`  | /dev/sda3  | Linux x86-64 root (/)  | 20GB  |
| `/mnt/home`  | /dev/sda4  | home (/home)  | 残りデバイス容量全て  |

## パーティショニングツール
パーティショニングには以下のツールが使用できます。ここでは`parted`を使用します。

| 名称 | パッケージ | MBR | GPT | CLI | TUI | スクリプティングユーティリティ | GUI |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| fdisk  | util-linux  | Yes  | Yes  | fdisk  | cfdisk  | sfdisk  | partitionmanager  |
| GPT fdisk  | gptfdisk  | No  | Yes  | gdisk  | cgdisk  | sgdisk  | No  |
| Parted  | parted  | Yes  | Yes  | parted  | No  | parted  | gparted, gnome-disk-utility  |

## パーティショニング
以下のコマンドを実行し、対話型シェルに入ります。`/dev/sda`に関しては適宜自分の環境に合わせて変えてください。

```zsh
parted /dev/sda
```

`?`を入力するとコマンド一覧が表示されます。

`print`を入力すると、現在のパーティションを表示できます。

```zsh
(parted) print
Model: ATA SanDisk SD7SN6S2 (scsi)
Disk /dev/sda: 256GiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End    Size    File system  Name                          Flags
 1      1049kB  274MB  273MB   fat32        EFI system partition          boot, hidden, esp
 2      274MB   290MB  16.8MB               Microsoft reserved partition  msftres
 3      290MB   255GB  255GB   ntfs         Basic data partition          msftdata
 4      1049kB  274MB  273MB   fat32        Basic data partition          hidden, diag

```

僕のPCには、Windowsがすでにダウンロードされているので、EFIシステムパーティションはすでに存在しますが、Linux用のブートローダーがインストールされているわけではないので削除し、新しいEFIシステムパーティションを作ることにします。

```zsh
(parted) rm 1
(parted) rm 2
(parted) rm 3
(parted) rm 4
(parted) mkpart ESP fat32 1MiB 1GiB
(parted) set 1 esp on
(parted) print
Model: ATA SanDisk SD7SN6S2 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1074MB  1073MB  fat32        ESP      boot, esp
```

次にスワップパーティションを作成します。

```zsh
(parted) mkpart primary linux-swap 1GiB 9GiB
(parted) print
Model: ATA SanDisk SD7SN6S2 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  1074MB  1073MB  fat32           ESP      boot, esp
 2      1074MB  9664MB  8590MB  linux-swap(v1)  primary  swap
```

最後に`/`と`home`用のパーティションを作成します。

```zsh
(parted) mkpart primary ext4 9GiB 29GiB
(parted) mkpart primary ext4 29GiB 100%
(parted) print
Model: ATA SanDisk SD7SN6S2 (scsi)
Disk /dev/sda: 256GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name     Flags
 1      1049kB  1074MB  1073MB  fat32           ESP      boot, esp  
 2      1074MB  9664MB  8590MB  linux-swap(v1)  primary  swap
 3      9664MB  31.1GB  21.5GB  ext4            primary
 3      31.1GB  256GB   225GB   ext4            primary
```

「Ctrl + C」で対話型シェルを抜けます。

## マウント済みのファイルシステムをアンマウントする
以下のコマンドでどのデバイスがマウントされているかを確かめます。

```zsh
lsblk -f
```

もしも`MOUNTPOINTS`の項目に値がある場合はそのデバイスを以下のコマンドでアンマウントします。（`rom`、`loop`、`airoot`などが名前に含まれるデバイスは除く）

```zsh
umount /dev/sda2
```

## ファイルシステムを作成する

https://eng-entrance.com/linux-make-filesystem

EFIシステムパーティションにFAT32ファイルシステムを作成します。EFIシステムパーティションのファイルシステムはFAT32である必要があります。

```zsh
mkfs.fat -F 32 /dev/sda1
```

次に`/dev/sda2`にスワップパーティションを`mkswap`で初期化します。

```zsh
mkswap /dev/sda2
```

最後に`/`と`home`用のパーティションにext4ファイルシステムを作成します。

```zsh
mkfs.ext4 /dev/sda3
mkfs.ext4 /dev/sda4
```

## ファイルシステムをディレクトリにマウントする
`mount`コマンドでディレクトリにマウントします。マウントする前にマウントポイントを`mkdir`コマンドで作成しておく必要があります。スワップボリュームは`swapon`コマンドで有効化します。

```zsh
mkdir -p /mnt/boot
mount /dev/sda1 /mnt/boot
swapon /dev/sda2
mount /dev/sda3 /mnt
mkdir /mnt/home
mount /dev/sda4 /mnt/home
lsblk -f
```

# インストール
## ミラーリストを変更する
パッケージをインストールする際は、`/etc/pacman.d/mirrorlist`に書かれているミラーサーバーからパッケージがインストールされるのですが、デフォルトのミラーリストには世界中のサーバーが載っており、そのままだとダウンロードするのに時間がかかってしまいます。以下を実行してミラーリストに日本のサーバーを載せるように変更します。

```zsh
curl -s "https://archlinux.org/mirrorlist/?country=JP" | sed -e 's/^#Server/Server/' > /etc/pacman.d/mirrorlist
cat /etc/pacman.d/mirrorlist
```

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

```zsh
pacstrap -K /mnt base linux linux-firmware
```

# システムの設定
以下を実行して`fstab`を生成します。`U`オプションを指定するとUUIDが生成されますが、扱いづらいので`L`オプションを指定してラベルを使うことにします。

```zsh
genfstab -L /mnt > /mnt/etc/fstab
```

`fstab`の内容を確認して、きちんと設定されているか確かめます。`fstab`がきちんと作成されていないと後述する`gtub-install`コマンド等の実行時にエラーが起こってしまいます。きちんと全てのデバイス（僕の場合は、`/dev/sda1`、`/dev/sda2`、`/dev/sda3`）が書かれているかどうか、EFIシステムパーテーションのファイルシステムが`vfat`と表示されているかどうかなどを確認してください。

```zsh
cat /mnt/etc/fstab
```

載っていないデバイスがあったら再度マウントし、`fstab`を生成します。

```zsh
mount /dev/sda1 /mnt/boot
genfstab -L /mnt > /mnt/etc/fstab
```

以下を実行して新しくインストールしたシステムに`chroot`する。

```zsh
arch-chroot /mnt
```

以下を実行してタイムゾーンを設定します。

```zsh
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
cat /etc/localtime
hwclock --systohc
cat /etc/adjtime
```

以下を実行してローカリゼーションを行います。

```zsh
locale-gen
echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
echo KEYMAP=jp106 > /etc/vconsole.conf
```

以下を実行してネットワーク設定を行います。本当はNetworkManagerを使用したかったのですが、`systemd`のエラーが出て使えなかったので、代わりに`dhcpcd`を使います。下記に詳しく書いてありそうですが、僕はよく分かってません。

https://superuser.com/questions/688733/start-a-systemd-service-inside-chroot-from-a-non-systemd-based-rootfs

また、`wlan0`や`hostname`、`hostname.local`の部分は適当に変えてください。

```zsh
pacman -S dhcpcd
ip link
systemctl enable dhcpcd@wlan0
echo hostname > /etc/hostname
echo "127.0.0.1 localhost" > /etc/hosts
echo "::1 localhost" >> /etc/hosts
echo "127.0.1.1 hostname" >> /etc/hosts
```

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

https://linuc.org/study/knowledge/506/

以下を実行してrootユーザーと一般ユーザーの設定をします。`username`は適宜変えてください。

```zsh
passwd
echo $SHELL
useradd -m -G wheel -s /bin/bash username
pacman -S sudo
pacman -S vim
visudo
```

以下のように`/etc/sudoers`の内容を編集します。

```shell
~

## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL:ALL) ALL    # ここをコメントアウトする

~
```

以下を実行してブートローダーをインストールします。ここではsystemd-bootを使用します。他にもGRUBなどがブートローダーとしてよく使われていますが、[SlackのArch Linux JP](https://slack.archlinux.jp/)で質問したところ、「grubわけわからない感がすごいので使ってないな」、「bootのエントリー選択を凝った画面にしたいとかならgrub一択だけど、CUIでシンプルにして、起動スプラッシュは[OK]をいっぱい表示させたいとかならsystemd-bootは最適だと思ってる」などと、systemd-boot推しの人が多かった印象でした。

また、`systemctl enable systemd-boot-update.service`でsystemdに同梱されているsystemd-boot-update.serviceを有効にし、次回の起動時にブートローダーが自動で更新されるようにします。

加えて、IntelプロセッサかAMDプロセッサかに応じて、それぞれ`intel-ucode`または`amd-ucode`をインストールし、`/boot/loader/entries/arch.conf`に`initrd /intel-ucode.img`または`initrd /amd-ucode.img`の行を追記することで、マイクロコードのアップデートがインストールされるようにします。

https://wiki.archlinux.jp/index.php/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B3%E3%83%BC%E3%83%89

```zsh
bootctl --path=/boot install
systemctl is-enabled systemd-boot-update.service
systemctl enable systemd-boot-update.service
systemctl is-enabled systemd-boot-update.service
pacman -S intel-ucode
echo "default arch.conf" > /boot/loader/loader.conf
echo "timeout 10" >> /boot/loader/loader.conf
echo "editor no" >> /boot/loader/loader.conf
echo "console-mode max" >> /boot/loader/loader.conf
echo "title Arch Linux" > /boot/loader/entries/arch.conf
echo "linux /vmlinuz-linux" >> /boot/loader/entries/arch.conf
echo "initrd /intel-ucode.img" >> /boot/loader/entries/arch.conf
echo "initrd /initramfs-linux.img" >> /boot/loader/entries/arch.conf
echo "options root=/dev/sda3 rw" >> /boot/loader/entries/arch.conf
```

https://wiki.archlinux.jp/index.php/Systemd-boot

# 作業ログを保存する
`exit`でchrootを抜けてから、再度`exit`で作業記録を終了し、作業ログファイルをドライブにコピーします。

```zsh
exit
exit
cp typescript /mnt/root/worklog_archlinux-install_2023Mar21.log
```

# ブート

`reboot`でブートします。起動が開始する前までに、USBを取り外してください。

```zsh
reboot
```

# インストール後のセットアップ

https://zenn.dev/ytjvdcm/articles/0efb9112468de3#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%BE%8C%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97

https://qiita.com/j8takagi/items/235e4ae484e8c587ca92#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E5%BE%8C%E3%81%AE%E4%BD%9C%E6%A5%AD