Arch LinuxをUEFIブートかつRAID1(MDADM)でインストール

# はじめに
個人的に気に入っているLinuxディストリビュージョンであるArch LinuxをMDADMを用いた
Software RAID環境にUEFIブートでインストールしたので、そのメモを書いておきます。

# ハードウェア構成
Machine : NEC Mate MK32M/B-H
CPU : Intel Core i5 4570
M/B : Intel B85 Express Chipset
MEM : 20GB
Storage : WD Red WD10JFCX 1TB 2.5inch x2

# インストールの準備
光学ドライブは取り外してHDDエンクロージャを載せているので、USBメモリを利用してインストールします。
今回は部屋に落ちてたソニーの16GB USB3.0 USBメモリを使いました。

今回はddでブータブルUSBを作成するので、Linux環境で操作を行います。
まずはArchのisoをダウンロードします。
日本サーバーだとUTかJAISTからもらってきます。
詳しくは[公式](https://www.archlinuxjp.org/download/)をどうぞ

```bash:shell
wget %isoのアドレス%
```

ダウンロードが完了したら、```dd```で焼きこみます。

```bash:shell
dd bs=4M if=%isoファイル% of=/dev/sdb && sync
```

**注意:Windowsで焼きこむと何故かUEFIでブートしなかったりとろくなことになりません。
VMWareなどを用いてLinux環境でddすることをおすすめします。**

# UEFIの設定
次にUEFI側の設定を行います。この工程はマシンによって異なる為一概に説明できないのですが、とりあえず

* BIOSブートではなくUEFIブートを優先(もしくはBIOSブートをオフ)
* Secure Bootをオフ
* Compatibility Support Mode(CSM)をオフ
* USBからのブートを優先

くらいやっておけば大丈夫だと思います。ここはマザーボードやBIOSによって
異なる為いろいろと試してみてください。

# インストーラのブートと各種確認
先ほど焼きこんだUSBメモリを挿し、USBからブートします。起動したら以下のコマンドでEFIモードでのぶーとを確認します。

```bash:shell
ls /sys/firmware/ | grep efi
```

何も表示されなかった場合、EFIモードではなくBIOSモードでブートしています。
設定を見直し、EFIモードでブートしてください。

EFIモードでのブートが確認できたら、次の手順へ進みます。

# ソフトウェアRAIDの構築(mdadm)
mdadmを用いて、ソフトウェアRAID(RAID1)を構築します。今回、RAIDに用いるHDDはそれぞれ
```sda```と```sdb```として認識されている物とします。

とりあえず、```sda```にパーティション構造を作成していきます。
UEFIブートを用いるので、まずはEFIパーティションを作成します。
Archでは様々なパーティション作成方法が用意されているので、公式Wikiなどを見ながら
512MBのEFIパーティションを作成してください。HEXフラグは```EF02```です。

[パーティショニング - ArchWiki](https://wiki.archlinuxjp.org/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)

なお、今回私は全てのマウントポイントを```/```に設定する為、以下の様な構造となりました。
メモリ容量的にもSWAPは必要ない気がするので、SWAPパーティションはなしです。

|デバイスノード|容量|マウントポイント|
|-------------|-----|---------------|
|sda1         |512MB|/boot          |
|sda2         |(MAX-100MB)|/|

次に、このパーティション構成を```sdb```にコピーします。
容量や仕様の違うHDDを組み合わせて使う場合はこの方法は使えないので
その場合は手動でパーティショニングを行ってください。

```bash:shell
sgdisk --backup=table /dev/sda
sgdisk --load-backup=table /dev/sdb
```

次に```mdadm```を用いてRAID1を構成します。台数などにもよるので各自対応してください。
ここら辺は普段mdadmを使っていれば特に問題ないかと思います。

```bash:shell
mdadm --create /dev/md0 --metadata 1.0 --raid-devices=2 --level=1 /dev/sd[ab]1
mdadm --create /dev/md1 --raid-devices=2 --level=1 /dev/sd[ab]2
```

構成が完了すれば、```/dev/md0```および```/dev/md1```が確認できます。

# Arch Linuxのインストール
まずはパーティションのフォーマットを行います。

* EFIパーティション

```bash:shell
mkfs.fat -F32 /dev/md0
```

* メインパーティション(今回はXFSを使います)

```bash:shell
mkfs.xfs /dev/md1
```

フォーマットが完了したら、マウントを行います。
```md0```を```/boot```にマウントするために、```md1```を```/mnt```にマウントした後に
```mkdir```にて```boot```ディレクトリを作成しています。

```bash:shell
mount /dev/md1 /mnt
mkdir /mnt/boot
mount /dev/md0 /mnt/boot
```

あとは通常通り```pacstrap```にてArch Linuxを```/mnt```にインストールしていきます。

```bash:shell
pacstrap -i /mnt base base-devel
```

インストールが完了したら、```mdadm```によるRAIDの情報をインストール先に書き込みます。


```bash:shell
mdadm --detail --scan >> /mnt/etc/mdadm.conf
genfstab -U -p /mnt >> /mnt/etc/fstab
```

# 設定とUEFIブートローダの構築

通常通り```arch-chroot```を使って```/mnt```へインストールされたシステムに入ります。

```bash:shell
arch-chroot /mnt /bin/bash
```

この後、[ビギナーズガイド - ArchWiki](https://wiki.archlinuxjp.org/index.php/%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89#Chroot_.E3.81.A8.E3.83.99.E3.83.BC.E3.82.B9.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.AE.E8.A8.AD.E5.AE.9A)に従ってロケール、タイムゾーン、HWClockなどの設定を行ってください。ここまでは通常のインストールと共通です。

設定が完了したら、UEFIブートローダの構築を行います。
今回はsystemd-boot(旧gummiboot)を用います。

```bash:shell
mkdir -P /boot/EFI/systemd
mkdir -p /boot/EFI/Boot
cd /usr/lib/systemd/boot/efi
cp systemd-bootx64.efi /boot/EFI/systemd/
cp systemd-bootx64.efi /boot/EFI/Boot/bootx64.efi
efibootmgr -c -d /dev/sda -p 1 -L Arch\ Linux\ 1 -l \\EFI\\systemd\\systemd-bootx64.efi
efibootmgr -c -d /dev/sdb -p 1 -L Arch\ Linux\ 2 -l \\EFI\\systemd\\systemd-bootx64.efi
```

終わったら、```efibootmgr```コマンドでブートプライオリティを確認し、必要があれば修正します。

```bash:shell
efibootmgr
efibootmgr -o %HEX値%,%HEX値%,...
```

次に、```systemd-boot```のブートエントリを作成します。

```bash:shell
mkdir -p /boot/loader/entries
nano /boot/loader/entries/arch1.conf
```

中身はこんな感じで

```
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=/dev/md1 rw
```

最後に```mdadm_udev```をHOOKSに追加して```mkinitcpio```を再構成します。

```bash:shell
nano /etc/mkinitcpio.conf
```

```
～省略～
HOOKS="base udev autodetect modconf block mdadm_udev filesystems keyboard fsck"
～省略～
```

```bash:shell
mkinitcpio -p linux
```

後は再起動すれば、普通にブートしてくれるかと思います。お疲れ様でした。

# 参考
[[SOLVED] gummiboot + mdadm RAID 1? / Installation / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=177722)