自分がRaspberry Pi 5のセットアップした時の手順をメモしておく。
Raspberry Pi Imager のインストール
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 に以下の設定も追加しておく。
export HISTFILE=/tmp/.bash_history
export LESSHISTFILE=-
また、~/.vimrc を作って以下の設定を足す。
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 で設定をその場で変更)
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のセットアップ
# クライアントの追加に 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 など適当に短くする。
Endpointのドメインとポートを修正し、~/update-endpoint というスクリプトでEndpointを修正しているのでそれを叩いた後qrencode -t ansiutf8 < wg0-client-xxx.conf でQRにする。
HTTPプロキシのセットアップ
を適当に走らせ、クライアント側ではdnsmasqなどを使ってドメインごとにIPを差し替え、ポートは(必要なら)iptablesを使ってリダイレクトする。iptablesにはIPが変わるドメインを指定することもできるが、IPが変わったらiptablesを実行しなおす必要がある。