Raspi4でArchLinuxをインストールして使う

# TL;DR
https://archlinuxarm.org/platforms/armv8/broadcom/raspberry-pi-4

# Raspi4の入手
日本ではまだ技適が取れていないので買えませんが、世界的にはもう販売されているので輸入すれば入手可能です。

> 技適がないと対象の機器から電波を飛ばすのが違法なのであって、電波を飛ばさない限りは合法です。
> 輸入して使う際は、Wi-FiとBluetoothをオフにし、市販のWi-Fiアダプタ等を使いましょう。
　

国際便になるので送料がちょっといきますが、関連する諸々を買えばそこまでの金額ではありません。

参考までに、私は以下のサイトから購入し輸入しました。日本語が使えるので楽です。
* Banggood(https://jp.banggood.com/)

## 購入が必要な物

* Raspberry Pi 4 Model B
    * 当たり前だよなぁ？
* USB TypeCケーブル(5V 3A対応) 
    * 地味にハマりどころです。通常のUSB TypeCでの給電では電力がたりず正常に動作しません(データ破損とかします)。
    * ケーブルが対応しててもポートが対応していない可能性が高いのでAC接続の物を買ったほうがいいと思います。
    * 国内だとあまり流行っていないので入手が面倒なので、同時に輸入推奨です。(Nintendo SwitchのAC接続とかならちゃんと動きます)
* MicroHDMI-HDMIケーブル
    * 地味に入手が面倒なので同時に輸入したほうが良いと思います。
* 何らかのケース
    * 無くてもなんとかなりますが、RasberryPi3+よりも温まるので冷却手段は必要です。
* MicroSDカード
    * 何でもいいですが早ければ早いほどシステム性能も上がります。
    * 現状のボトルネックなので一番いいのを買ったほうがいいです。

# はじめに
## EEPROMの修復

現状のRasberryPI4は結構な確率でEEPROMが破損しており、そもそも起動できません。
SDカードにブートレコードを作成し、Raspiから提供されているちゃんと動くEEPROMを入手する必要があります。

https://static.raspberrypi.org/files/rpi-boot-eeprom-recovery-2019-09-10.zip

fdiskとかで書けばちゃんと動きますが、初期不良の可能性もあり面倒なので、RaspbianをSDカードに焼いたほうが楽だと思います。

https://www.raspberrypi.org/downloads/raspbian/

どれでもいいのでダウンロードして、以下のソフトで書き込みます。Desktopありバージョンのほうがやってる感は出ますが、イメージのダウンロードが死ぬほど遅いので注意ください。

https://www.balena.io/etcher/

わかる人は勝手にdd if ofしてください。

## EEPROMの配置

Raspbianを書き込んだら、SDカードのBootパーティションにちゃんと動く方のEEPROMを配置します。

https://static.raspberrypi.org/files/rpi-boot-eeprom-recovery-2019-09-10.zip
* pieeprom.bin
* recovery.bin

## EEPROMの更新

SDカードの準備が終わったら、SDカードを差し込みRaspi4を起動します。給電が始まると勝手に動き始めてしまうので、最後にUSB typeCケーブルを接続します。

正常に動作すると、画面になにも表示されず、赤いランプ(給電ランプ)の隣にある、緑のランプが点滅しはじめます。
最低でも10秒くらい待ってUSB TypeCケーブルを取り外します。

## 動作確認
SDカードを再度編集し、先程配置した「pieeprom.bin」「recovery.bin」のみを削除し、再度SDカードを入れて電源を投入します。
正常に処理が行われていれば、Raspbianが起動されます。

# ArchLinuxの用意
## OSの入手
以下のURLからダウンロード可能です。

http://sg.mirror.archlinuxarm.org/os/

今回はRaspi4なので、以下のファイルをダウンロードします。

* ArchLinuxARM-rpi-4-latest.tar.gz

## SDカードへの書き込み

今回はfdiskで書き込みます。理論上はRaspbianの中身置き換えで行けると思いますがやったことはありません。

まずはOSで認識しているSDカードのデバイスにfdiskで操作をします。
名前はudevくんの気分次第なので、頑張って探してください。

fdiskの操作はroot権限が必要です。

```
fdisk /dev/sdX
```

以下のようなパーティションを作成します。

| /(root) | | | 
|:--|:--|:--| 
| - boot | 128M | FAT32 |
| - system | 残り全て | ext4 |

具体的な操作は以下のとおりです。

```
＃ fdisk /dev/sda
コマンド (m でヘルプ): o　　　　　　　　　　　　　　　　　(既存のパーティションの削除）
新しい DOS ディスクラベルを作成しました。識別子は 0x51331ac8 です。
コマンド (m でヘルプ): n　　　　　　　　　　　　　　　　　(新規パーティションの作成)
パーティションタイプ
   p   基本パーティション (0 プライマリ, 0 拡張, 4 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p　　　　　　　　　　　　　　　　　　　　(基本パーティションの作成)
パーティション番号 (1-4, 既定値 1):  　　　　　　　　　　(1つめのパーティションの作成)
最初のセクタ (2048-493895679, 既定値 2048): 　　　　　(パーティションの開始セクタ（先頭）)
最終セクタ, +/-セクタ番号 または +/-サイズ{K,M,G,T,P} 
(2048-493895679, 既定値 493895679): +128M　　　　　　(パーティションの終了セクタ 128MB後)

新しいパーティション 1 をタイプ Linux、サイズ 128 MiB で作成しました。

コマンド (m でヘルプ): t　　　　　　　　　　　　　　　　　(パーティションタイプの変更)
パーティション 1 を選択
16 進数コード (L で利用可能なコードを一覧表示します): c　(FAT32に変更)
パーティションのタイプを 'Linux' から 'W95 FAT32 (LBA)' に変更しました。
コマンド (m でヘルプ): n                            (新規パーティションの作成)
パーティションタイプ
   p   基本パーティション (1 プライマリ, 0 拡張, 3 空き)
   e   拡張領域 (論理パーティションが入ります)
選択 (既定値 p): p                                 (基本パーティションの作成)
パーティション番号 (2-4, 既定値 2):                   (2つめのパーティションの作成)
最初のセクタ (264192-493895679, 既定値 264192):      (パーティションの開始セクタ（先頭）)
最終セクタ, +/-セクタ番号 または +/-サイズ{K,M,G,T,P} 
(264192-493895679, 既定値 493895679):              (パーティションの終了セクタ（終端）)

新しいパーティション 2 をタイプ Linux、サイズ 235.4 GiB で作成しました。
コマンド (m でヘルプ): w                             (ディスクに書き込み)
パーティション情報が変更されました。
ディスクを同期しています。
```

パーティションの書き込み後は、実際にパーティションをフォーマットします。

> 実行後はそのまま使えるはずですが、私の環境ではうまく動かなかったので、SDカードを一旦取り外し、再度差し込みパーティションが意図したとおり作られたか確認しました。

```
mkfs.vfat /dev/sda1
mkfs.ext4 /dev/sda2
```

フォーマットが終わったら、パーティションをOS上にマウントします。

```
mkdir {boot,root}
mount /dev/sda1 boot
mount /dev/sda2 root
```

実際にファイル群を配置します。

```
＃ ls 
ArchLinuxARM-rpi-4-latest.tar.gz boot root
```

```
bsdtar -xpf ArchLinuxARM-rpi-4-latest.tar.gz -C root
sync
```

bootパーティション用のファイルもrootパーティションに展開されるため、移動させます。
FAT32で所有者を変更しようとしたエラーが出ますが、FAT32には所有権などという概念はないので無視します。

```
mv root/boot/* boot
```

マウントを解除し、SDカードをRasberryPIに刺し起動します。

> 私はめちゃくちゃハマったので、書き込みの完了後PCにSDカードを再挿入して、ちゃんとデータが書き込まれているか確認したほうが良いと思います。
> 環境のせいかパーティションテーブルが壊れる事が多かったです。

```
umount root boot
```

## 動作確認
うまく動作していれば差し込むとコンソールの画面が起動されます。
（systemd-udevが反応しまくって結構うざいです）

alarm/alarmまたは、root/rootでログインできるため、ログインします。

## インストール直後の状態

インストール直後では以下のようにほどんど何も動いておらず、スッキリした環境を楽しめます。

```
＃ systemctl status
● alarmpi
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: Thu 1970-01-01 00:00:05 UTC; 49 years 9 months ago
   CGroup: /
           ├─user.slice
           │ └─user-0.slice
           │  ├─user@0.service
           │  │ └─init.scope
           │  │   ├─6700 /usr/lib/systemd/systemd --user
           │  │   └─6701 (sd-pam)
           │  └─session-1.scope
           │    ├─  297 login -- root
           │    ├─ 6706 -bash
           │    └─16256 gpg-agent --homedir /etc/pacman.d/gnupg --use-standard-socket --daemon
           ├─init.scope
           │ └─1 /sbin/init
           └─system.slice
             ├─lvm2-lvmetad.service
             │ └─224 /usr/bin/lvmetad -f
             ├─systemd-timesyncd.service
             │ └─289 /usr/lib/systemd/systemd-timesyncd
             ├─dbus.service
             │ └─293 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
             ├─systemd-logind.service
             │ └─298 /usr/lib/systemd/systemd-logind
             ├─systemd-resolved.service
             │ └─288 /usr/lib/systemd/systemd-resolved
             ├─systemd-udevd.service
             │ └─234 /usr/lib/systemd/systemd-udevd
             ├─systemd-journald.service
             │ └─233 /usr/lib/systemd/systemd-journald
             ├─haveged.service
             │ └─232 /usr/sbin/haveged -w 1024 -v 1 --Foreground
             └─systemd-networkd.service
               └─238 /usr/lib/systemd/systemd-networkd
```



## pacman keyringの更新
pacmanを使えるようにするため、pacman-keyringを初期化します。

```
pacman-key --init
pacman-key --populate archlinuxarm
```

初期状態ではvimが入っておらずつらいので、vimをインストールします。

```
pacman -S vim-minimal
```

ついでに諸々のパッケージを更新します。

```
pacman -Syyu
```

初期状態ではNTPも動作していないので、NTPサービスを動作させます。

```
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
timedatectl set-ntp true
```

また、初期状態ではロケールの設定がなく、一部のコマンドでロケール情報が入手できずバグります。
明らかにロケール情報がないほうが異常事態なので、おとなしく作ります。


```
＃ vim /etc/locale.gen
en_US.UTF-8     (←コメントアウト)
ja_JP.UTF-8     (←コメントアウト)
```

```
locale-gen
echo LANG=en_US.UTF-8 > /etc/locale.conf
```

## sshでつなげるようにする

デフォルトではopensshもインストールされていないため、opensshを入れSSH接続できるようにします。

```
pacman -S openssh
```

```
systemctl start sshd.service
systemctl enable sshd.service
```


## 人間向けにする

※2019/11/12追記※

現状まともにGUIはうごかないので、GUIインストールはやめといたほうが良いと思います。