【備忘録】外付けSSDにArchLinuxをインストールする

# 背景
ArchLinuxに興味を持ち、インストールしたくなったが、手持ちのUbuntuの入ったノートPCをデュアルブートさせるのが都合が悪かったため、外付けSSDにインストールすることにした。

# 手順
今回はブート方式を64bitUEFIとし、ブートローダはGRUBを利用する。
## インストールメディアの作成
archlinuxのisoファイルをddコマンドや専用ソフトを使ってUSBフラッシュメモリに焼いてもよいが、自分はVentoyというツールを用いて、マルチブートUSBを作成した。（導入にWindowsかLinuxの環境が必要なので注意）
Ventoyを用いるとダウンロードしたisoファイルをUSBフラッシュメモリにドラッグ&ドロップするだけで簡単にマルチブートUSBが作成できるので便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079058/6df42f59-0cc5-c06c-0a63-fc7d1dcfe216.png)
自分は32GBのUSBフラッシュメモリにUbuntuやArchlinux、VyOS、proxmoxなどを入れている。

## SSDへのインストール

ノートPCに作成したインストールメディアと外付けSSDを挿入した状態で、インストールメディアを起動する（BIOSセットアップからboot sequenceをUSB Keyが先頭になるように切り替えておく。また、セキュアブートも無効化にしておく。）

この状態で電源を入れるとVentoryの画面が表示されるので、archlinuxを選択し、「`Boot in grub2 mode`」を選択する。（多分`normal node`でも問題ない。）

### パーティション作成
今回は以下のようなパーティションにする。（SSDが`/dev/sda`であるとする）
- `/dev/sda1`：512MB、fat32、`/boot`ととして使う
- `/dev/sda2`：2G、linux-swap、スワップ領域ととして使う
- `/dev/sda3`：残り全て、ext4、`/`として使う

まずは外付けSSDがどのように認識されているかを確認する。
```
fdisk -l
```
どのDiskが外付けSSDに対応しているかはDisk Modelなどを見ることで確認できる。自分の場合は`ESD-EMB`となっていた。
ここで、初期状態ではDisklabel Typeはdosになっており、パーティションは作成されていないはずである。（Deviceから始まる表が存在しない）

SSDからGRUBを使って正常にブートされるためにはDisklabel Typeがgptとなり、/bootに

以下`parted`コマンドを利用してパーティションを作成する。
```
parted /dev/sda
(parted)mklabel gpt
(parted)mkpart
Partition name?  []?
File system type?  [ext2]? fat32
Start? 1MiB
End? 513MiB
(parted)set 1 esp on

(parted)mkpart
Partition name?  []?
File system type?  [ext2]? linux-swap
Start? 513MiB
End? 2513MiB

(parted)mkpart
Partition name?  []?
File system type?  [ext2]? ext4
Start? 2513MiB
End? 100%

(parted)q 
```
もう一度`fdisk -l`をしてパーティションがちゃんと作られていることを確認。

例
```
Disk /dev/sda: 465.76 GiB, 500107862016 bytes, 976773168 sectors
Disk model: ESD-EMB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 28DB6BF9-705D-4EEA-A959-741E11CA1294
Device       Start       End   Sectors   Size Type
/dev/sda1     2048   1050623   1048576   512M EFI System
/dev/sda2  1050624   5146623   4096000     2G Linux swap
/dev/sda3  5146624 976773119 971626496 463.3G Linux filesystem
```
### ファイルシステムの初期化
```
mkfs.vfat -F32 /dev/sda1
mkswap /dev/sda2
swapon /dev/sda2
mkfs.ext4 /dev/sda3
```
### マウント
```
mount /dev/sda3 /mnt
mkdir /mnt/boot
mount /dev/sda1 /mnt/boot
```

### 最低限必要なパッケージのインストール
```
pacstrap /mnt linux base base-devel linux-firmware dhcpcd
```

### fstabを作成
`/etc/fstab`ファイルはシステム起動時に必要なファイルであり、Archlinux Wikiでは以下のように説明されている。
> ディスクパーティションや様々なブロックデバイス、リモートファイルシステムをどうやってファイルシステムにマウントするかを記述します。

以下のコマンドで/mnt以下のマウントをファイルに書き出す。
```
genfstab -U /mnt >> /mnt/etc/fstab
```

### システムの設定
```
arch-chroot /mnt
```
`/dev/sda3`、つまり新しく作ったArchlinuxの中に入るイメージ。

必要に応じてロケールやキーマップなどの設定をする。
ここではインストール後でも行えるのでスキップする。

archlinuxを起動した時にloginユーザとパスワードを求められるので、ここで設定しておく必要がある。
```
passwd
```
これにより、ログイン時にrootと設定したパスワードでログインできる。

### GRUBのインストール
自分は有線でネットワークに繋いでいたが、無線を利用する場合は先に無線のセットアップをする必要がある。
```
pacman -S grub dosfstools efibootmgr
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=grub --recheck
mkdir /boot/EFI/boot
cp /boot/EFI/grub/grubx64.efi  /boot/EFI/boot/bootx64.efi
grub-mkconfig -o /boot/grub/grub.cfg
```

### 終了
```
exit
umount -R /mnt
reboot
```

再起動するので、BIOSセットアップからvboot sequenceを外付けSSDが一番上に設定し、インストールメディアは抜いておく。
GNU GRUBのメニューが表示されたら成功。
ArchLinuxを選択するか、数秒放置すればArchLinuxが起動し、ログインを求められる。


# 補足
一度SSDを抜いたらうまく起動しなくなったが、再度BIOSセットアップ画面に行ったらうまく動くようになった。