Raspberry Piのセットアップ

自分がRaspberry Pi 5のセットアップした時の手順をメモしておく。

## Raspberry Pi Imager のインストール

https://www.raspberrypi.com/software/

Ubuntuで `sudo apt install rpi-imager`。`sudo rpi-imager`で実行。

## Raspberry Pi Imager の実行

64-bit Ubuntu Server 24.04 を入れた。

USBメモリに焼き込む前に、Edit Settings (Ctrl + Shift + X) から

* ログインユーザー
* ssh鍵
* Wi-Fiの設定 (使わなかった)
* タイムゾーンとキーボード配列

が設定できるので指定しておくと吉。

### SSDブート

MicroSDブートした後、MicroSDのラズパイ内で `rpi-imager` をいれて使うと、拡張ハットでPCIe接続しているSSDにイメージを焼ける。デフォルトでMicroSD > SSDという起動順になっているので、MicroSDを抜けばSSDブートが完成する。

## 起動

LANケーブルとHDMIと電源を接続する。systemd-resolvedが2分くらいかかった上でFAILEDになってしまうが、その後待っているとインターネットにつながる。

## ローカルIPの固定

ルータのBasic > Attached Devicesからラズパイを見つける。Device Nameはubuntuになっている。MACアドレスを控える。

Advanced > Setup > LAN SetupからそのMACアドレスにIPを割り当て、Applyを押す。LANケーブルを抜き差しするとIPが変わるので、それを使ってSSHするようにする。

## ログのtmpfs化
`sudo vi /etc/fstab` で以下の設定を足し、再起動する。

```
LABEL=writable  /       ext4    discard,errors=remount-ro       0 1
LABEL=system-boot       /boot/firmware  vfat    defaults        0 1
# ここから下を足す
tmpfs /tmp       tmpfs defaults,size=256m,noatime,mode=1777
tmpfs /run/log   tmpfs defaults,size=128m,noatime,mode=0755
tmpfs /var/tmp   tmpfs defaults,size=64,noatime,mode=1777
tmpfs /var/log   tmpfs defaults,size=128m,noatime,mode=0755
tmpfs /var/cache tmpfs defaults,size=512m,noatime,mode=0755
tmpfs /var/spool tmpfs defaults,size=128m,noatime,mode=0755
tmpfs /home/k0kubun/.cache tmpfs defaults,size=32m,noatime,mode=0755
```

Raspberry Pi OS (Debian Bookworm) だとjournaldが動かなくなるので、`/etc/systemd/system/systemd-journald.service.d/override.conf` (Ubuntuだと `/usr/lib/systemd/system/systemd-journald.service.d/override.conf`) を作って

```
[Unit]
RequiresMountsFor=/run/log
```

と書いておく。`/etc/systemd/journald.conf` で `Storage=volatile` と `RuntimeMaxUse=64M` をいれておく。

可能な限り `/tmp` にファイルを書き込むようにする。`/var/cache` はwireguard-installでも128MB以上使うので結構必要。

`~/.bashrc` に以下の設定も追加しておく。

```bash
export HISTFILE=/tmp/.bash_history
export LESSHISTFILE=-
```

また、`~/.vimrc` を作って以下の設定を足す。

```vim
set viminfofile=NONE
let g:netrw_dirhistmax = 0
```

`/root` にも同じことをしておく。

## systemd-networkd-wait-onlineを直す

デフォルトでは、 `/run/systemd/network/10-netplan-eth0.network` のせいで起動時に `systemd-networkd-wait-online` が失敗してしまう。一方、netplanの設定の削除およびcloud-initによるnetplanの実行自体を無効化を行なうと、今度はネットに繋らなくなる。

そのため、`/etc/netplan/50-cloud-init.yaml` (netplanの唯一の設定ファイル) で以下の部分を修正して、再起動しておくと良い。 (`sudo netplan generate` で設定をその場で変更)

```yml
network:
  ethernets:
    eth0:
      dhcp4: true
      # optional: true # ここをコメントアウト
  version: 2
```

Ubuntu 24.04では見てないのでもう関係ないかも?

## Bluetoothの無効化

使わないので消しておく。

```
sudo apt-get purge bluez -y
sudo apt-get autoremove -y
```

## ホストネームの変更

以下のようにすると再起動してもそのまま残る。

```
sudo hostnamectl set-hostname raspi
```

## ユーザーの追加
自分が使うユーザー以外にもユーザーを予備で用意しておきたかったので作っておく。

```
sudo useradd raspi
sudo passwd raspi
sudo mkdir /home/raspi
sudo chmod 750 /home/raspi
sudo chown raspi:raspi /home/raspi
sudo usermod -aG sudo raspi
sudo chsh -s /bin/bash raspi
```

## DDNSのセットアップ

```
sudo apt install ruby
sudo gem install aws-sdk-route53
```

手元の `/opt/local/ddns-update` と `~/.config/systemd/user/ddns-update.*` をコピーしてくる。`current` に今の設定を書き、`config.yml`のdomainを変更する。その後、

```
systemctl --user enable ddns-update.timer
sudo loginctl enable-linger k0kubun
```

をやっておく。なお、ログを見るために
```
sudo gpasswd -a k0kubun systemd-journal
```
もやっておくと良い。

## WireGuardのセットアップ

```sh
# クライアントの追加に wireguard-install.sh が必要なので、HOMEに置いちゃう
cd ~
git clone https://github.com/angristan/wireguard-install
cd wireguard-install
chmod +x ./wireguard-install.sh
sudo ./wireguard-install.sh
```

"IPv4 or IPv6 public address" ~~だけ一応実際のpublic IPに変えて始める (TODO: 後で変える必要ある?)~~ もそのままでやる。Server WireGuard Portはあらかじめ決めたポートにする。あとはデフォルト (Server WireGuard IPv4もデフォルトの適当な奴でいい)。

最後にクライアントを1つ追加するが、クライアントの設定もClient WireGuard IPv4はデフォルトの適当な奴でいい。クライアントを追加するときは `sudo ./wireguard-install.sh` をやり直す。なお、一度使ったクライアント設定を他のデバイスから使い回すと接続の問題が生じる可能性がある。

デバッグには `systemctl status wg-quick@wg0` など使う。`/etc/wireguard` に設定がある。HOMEに`wg0-client-xxx.conf`ができてそれが設定ファイル。FireTVにはWireless File Managerをインストールし、それ経由でこの設定ファイルを送る。ファイル名が長いとinvalid nameになるので、`raspi.conf` など適当に短くする。

~~`~/update-endpoint` というスクリプトでEndpointを修正しているのでそれを叩いた後~~ Endpointのドメインとポートを修正し、`qrencode -t ansiutf8 < wg0-client-xxx.conf` でQRにする。

## HTTPプロキシのセットアップ

https://github.com/ziozzang/SimpleSNIProxy

を適当に走らせ、クライアント側ではdnsmasqなどを使ってドメインごとにIPを差し替え、ポートは(必要なら)iptablesを使ってリダイレクトする。iptablesにはIPが変わるドメインを指定することもできるが、IPが変わったらiptablesを実行しなおす必要がある。