自分がRaspberry Pi 3B+のセットアップした時の手順をメモしておく。
Raspberry Pi Imager のインストール
Ubuntuで sudo apt install rpi-imager
。
Raspberry Pi Imager の実行
64-bit Ubuntu Server 22.04 を入れた。
USBメモリに焼き込む前に、Edit Settings (Ctrl + Shift + X) から
- ログインユーザー
- ssh鍵
- Wi-Fiの設定 (使わなかった)
- タイムゾーンとキーボード配列
が設定できるので指定しておくと吉。
起動
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
を作って
[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
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を実行しなおす必要がある。