Raspberry Pi 4Bをセットアップした時のメモ
記事にまとめたので今後は https://zenn.dev/asataka/articles/b92cd770a48d74 を更新していきます。
macOSからRaspberry Pi OS (DN: pi4a.local)をセットアップします。バージョン情報は以下。
asa-taka@tailmoon ~ % sw_vers
ProductName: macOS
ProductVersion: 11.3.1
BuildVersion: 20E241
pi@pi4a:~ $ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
pi@pi4a:~ $ uname -a
Linux pi4a 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux
迷った点は別スレで深掘りしていきます。
raspi2からどれくらい性能が上がったか気になったのでデスクトップ版をインストールした。
https://www.raspberrypi.org/software/ の通りRaspberry Pi Imagerで32bit版のデスクトップありを選んでmicro SDに書き込む。30分くらいかかる。64bit版はベータ版らしい。
LANケーブルとマウスとキーボードを接続して起動する。ちょっと面倒なので次に試す場合は初めからSSHが使えてホスト名が設定されているイメージを作ってみたい。
sshを有効にしてホスト名を設定して再起動する。
sudo -i
systemctl enable ssh
systemctl start ssh
vi /etc/hostname
vi /etc/hosts
reboot
mDNSを提供するavahi-daemonが初めから有効になっているのでローカルネットワークからは <host-name>.local
でアクセスできる。
pi@pi4a:~ $ systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-05-08 18:29:41 JST; 15min ago
鍵をコピーする。
ssh-copy-id -i ~/.ssh/id_pi4a pi@pi4a.local
ssh -i ~/.ssh/id_pi4a pi@pi4a.local
鍵を登録したらsshの設定を適当に修正する。
ディスプレイを使わなくても結構熱くなるのでやっぱりヒートシンクはあった方がいい。CPUの温度は以下のコマンドで確認できる。
/opt/vc/bin/vcgencmd measure_temp
# temp=50.1'C
wifiを設定する。公式のガイド https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md がそのまま参考になる。
# wlanのSOFTがblockedだと使えないのでunblockする。
rfkill
rfkill unblock <number>
wpa_passphrase yourSSID $(systemd-ask-password) | grep -v '#' >> /etc/wpa_supplicant/wpa_supplicant.conf
# hidden network の場合は `network={}` の中に scan_ssid=1 を書き加えるといいらしい。
wpa_cli -i wlan0 reconfigure
# 繋がらなかったのでデーモンを再起動したら繋がった
systemctl reload-or-restart wpa_supplicant
wpa_cli -i wlan0 status | grep state
# wpa_state=COMPLETED と出たらOK
ip -br link show wlan0
# wlan0 UP dc:a6:32:63:ff:25 <BROADCAST,MULTICAST,UP,LOWER_UP>
ここまでで再起動しても無線で復帰してくるようになる想定。無線の速度はギガビットとは行かずとも結構早い。自宅回線が200Mbpsなのでインターネット接続のボトルネックにはならなさそう。でもクラスタを組むなら有線が良さそう。
iwconfig wlan0 | grep Rate
# Bit Rate=433.3 Mb/s Tx-Power=31 dBm
大体25秒くらいで名前解決と共に無線で復帰してくる。早い。
pi@pi4a:~ $ Connection to pi4a.local closed by remote host.
Connection to pi4a.local closed.
Sun May 9 03:17:29 JST 2021
asa-taka@tailmoon ~ % until ssh -o ConnectTimeout=1 pi4a; do date; sleep 1; done
ssh: Could not resolve host "pi4a"
Sun May 9 03:17:39 JST 2021
ssh: Could not resolve host "pi4a"
Sun May 9 03:17:45 JST 2021
ssh: Could not resolve host "pi4a"
Sun May 9 03:17:52 JST 2021
Linux pi4a 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun May 9 03:17:40 2021
pi@pi4a:~ $
色々入れた後だけれどディスク容量はこんな感じ。イメージサイズは正味3.5Gくらい。
pi@pi4a:~ $ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 3.8G 25G 14% /
devtmpfs 1.8G 0 1.8G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 9.6M 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 49M 204M 20% /boot
tmpfs 383M 0 383M 0% /run/user/1000
Dockerをインストールする。RaspbianはDebianの手順を使えないようなので https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script で入れる。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user も行う。
sudo groupadd docker
sudo usermod -aG docker $USER # join 'docker' as a supplementary group
newgrp
docker run hello-world
無事通常ユーザで実行できた。手順が整っていてとても良い。
せっかくなのでwifiの設定を行いたい。cliで設定した経験はまだない。
適当に参考になりそうなサイトメモ:
https://wiki.archlinux.org/title/wpa_supplicant の wpa_cli
の方法を使ってみたけど繋がらない。
https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md を見て設定する。
せっかく systemd-ask-password
が利用できるので、以下のようにするとヒストリにもスクリーンのセッションログにもパスフレーズが残らないが意味があるかは知らない。コメントアウトで生のパスフレーズが表示されるのでそれを削除している。
root@pi4a:~# wpa_passphrase yourSSID $(systemd-ask-password) | grep -v '#'
network={
ssid="yourSSID"
psk="xxxxxxxxxxxxxxxxxx"
}
ついでにこのままリダイレクトして設定ファイルに追記してしまおう。上書きしないように注意。
wpa_passphrase yourSSID $(systemd-ask-password) | grep -v '#' >> /etc/wpa_supplicant/wpa_supplicant.conf
wifiをhiddenにしている場合は scan_ssid=1
を指定すると良いらしい。
network={
ssid="yourHiddenSSID"
scan_ssid=1
psk="Your_wireless_network_password"
}
でも接続できない。なんでだろう。
systemctl reload-or-restart wpa_supplicant
を実行したら接続できた。
それとは直接関係なさそうな気づきとして wpa_cli
はデフォルトでは wlan0
ではなく p2p-dev-wlan0
を見るようで以下のような表示になっていた。
root@pi4a:~# wpa_cli
wpa_cli v2.8-devel
Selected interface 'p2p-dev-wlan0'
Interactive mode
> status
wpa_state=DISCONNECTED
p2p_device_address=xxxx
address=xxxx
uuid=xxxx
wlan0 を指定してやるといい感じのステータスが表示される。
root@pi4a:~# wpa_cli -i wlan0
wpa_cli v2.8-devel
Interactive mode
> status
bssid=xx:xx:...
freq=2462
ssid=XXXXXX
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=10.0.1.11
p2p_device_address=xx:xx:...
ip links
でもUPになっていた。reboot しても問題なくwifiで繋がってきた。
-
p2p-dev-wlan0
って何 - WPAのパスフレーズを暗号化できる仕組み、復号の仕組み
prometheusとか何かでモニタリングしてみたい
dockerをインストールしたので https://prometheus.io/docs/prometheus/latest/installation/ に従って進めてみる。とりあえず設定ファイルなしの状態で動作確認。
docker run -d --name prom1 -p 9090:9090 prom/prometheus
無事起動した。http://pi4a.local:9090/ でウェブUIも表示できた。
exporterはどうしよう。とりあえず apt search
して気になったものを挙げてみる。
cadvisor/stable 0.27.1+dfsg2-4 armhf
analyze resource usage and performance characteristics of running containers
collectd-core/stable 5.8.1-1.3 armhf
statistics collection and monitoring daemon (core system)
netdata/stable 1.12.0-1+deb10u1 all
real-time performance monitoring (metapackage)
prometheus-node-exporter/stable 0.17.0+ds-3 armhf
Prometheus exporter for machine metrics
prometheus-process-exporter/stable 0.4.0+ds-1 armhf
Prometheus exporter that exposes process metrics from procfs
特にサービスを動かしているわけではないので、素朴なところでnode-exporterとprocess-exporterあたりが気になる。
まずはnode-exporterを導入してみる。https://prometheus.io/docs/guides/node-exporter/#monitoring-linux-host-metrics-with-the-node-exporter に従う。
$ cat /proc/cpuinfo | grep model
model name : ARMv7 Processor rev 3 (v7l)
raspi4はARMv7だったので https://prometheus.io/download/#node_exporter からarm7向けのビルドをダウンロードする。ちなみにARMv6のraspi2BではARMv7の実行ファイルは動作しなかったのできちんと環境にあったものを選んだ方が良い。
wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-armv7.tar.gz
tar xvfz node_exporter-1.1.2.linux-armv7.tar.gz
cp node_exporter-1.1.2.linux-armv7/node_exporter /usr/local/bin
node_exporter
これで http://pi4a.local:9100/metrics でメトリクスが取得できるようになる。
node_exporterはどう動かすのが一般的なのかな。systemdでルートのスタートアップでデーモンにする感じとかかな。
https://sysadmins.co.za/setup-prometheus-and-node-exporter-on-linux-for-epic-monitoring/ を参考にしてsystemdでnode_exporterを動かしてみる。
useradd --no-create-home --shell /bin/false prometheus
mkdir /etc/prometheus
mkdir /var/lib/prometheus
chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/prometheus
ls -al /usr/local/bin/node_exporter
# -rwxr-xr-x 1 root root 16444347 May 9 17:05 /usr/local/bin/node_exporter
cat << EOF > /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter
https://sysadmins.co.za/setup-prometheus-and-node-exporter-on-linux-for-epic-monitoring/ を参考にしてsystemdでprometheus本体も動かしてみる。安易にnode_exporterのユーザ名をprometheusにしてしまったけど分けた方が良かったかもしれない。
あ、いや。prometheus本体はdockerで動かすんだった。ただsystemdで起動するようにした方が便利そうなのでそれはする。ちなみにnode_exporterはdockerで動くのかな。
docker run --rm bash cat /proc/cpuinfo
これでcpuinfoが表示されたのでコンテナ内でも取れる情報は色々ありそう。
探したら公式のdockerイメージ https://github.com/prometheus/node_exporter が見つかったので動かしてみたい。
docker run -d --name node-exporter \
--net=host --pid=host -v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter --path.rootfs=/host
とりあえずオプションの意味は置いておいて、問題なく動いた。
しまった、docker の中で動かすとmDNSの名前解決ができない😇なんということだ
docker --dns
オプションでDNSを指定できるようなのでavahiを通常のDNSとして扱えるようなオプションはないかな…
https://linux.die.net/man/8/avahi-dnsconfd はネットワーク内のDNSサーバの参加・脱退をホストのDNS設定に反映させるためのもので、特に関係ない。
digを利用してmDNS Lookupができるらしいのでavahiは普通にDNSとしても指定できるんだろうか。
https://www.gabriel.urdhr.fr/2019/04/02/llmnr-mdns-cli-lookup/ を流し読みしてdig帰ってこないなと試行錯誤していたら 224.0.0.251
というよくわからないアドレスで成功した。ここもコピペでよかったのか。
dig -p 5353 @224.0.0.251 pi2a.local
何このアドレス。
とりあえずprometheus本体からmDNSの解決ができればいいので、それだけ直接ホスト上で動かそうかな。
wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-armv7.tar.gz
tar xvfz prometheus-2.26.0.linux-armv7.tar.gz
cd prometheus-2.26.0.linux-armv7/
cp prometheus /usr/local/bin/
cp promtool /usr/local/bin
cp -r consoles /etc/prometheus/
cp -r console_libraries/ /etc/prometheus/
cat << EOF > /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['pi4a.local:9090']
- job_name: 'node_exporter_pi4a'
scrape_interval: 5s
static_configs:
- targets: ['pi4a.local:9100']
EOF
prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries/
これで動いたが pi4a.local:9090 をDNSで引けないと言われた。PrometheusはmDNSを引けない…?
scrape_configs:
- job_name: 'node_exporter_pi4a'
scrape_interval: 5s
static_configs:
- targets: ['pi4a.local:9100']
もうシンプルにDNSを運用した方がいい気がしてきた😇 .local
はmDNS用に予約されているみたいなので .home
辺りで登録しようかな。
PrometheusのUIを表示できた。
UIがシンプルで寂しいのでGrafanaも使ってみよう。
なんやかんやでGrafanaでPrometheusで取得したハードウェア温度を表示できるようになった。
cadvisor を導入してみたい。公式だとまだdockerでもバイナリでもサポートされていないみたい。
有志の方が提供しているイメージがあるので利用する。
普通に動いた。systemd で動かすようにする。
cat << EOF > /etc/systemd/system/cadvisor.service
[Unit]
Description=Container metrics exporter
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
Type=simple
ExecStart=docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
budry/cadvisor-arm:latest
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload cadvisor
systemctl start cadvisor
# Confirmation
systemctl status cadvisor
curl localhost:8080/metrics
systemctl enable cadvisor
systemctl reload-or-restart prometheus
次はprocess-exporterを使ってみたい。dockerイメージはarmに対応していないみたい。
releaseのバイナリを落として使うことにする。arm7は無いようなのでarm6を使う。
curl -LO https://github.com/ncabatoff/process-exporter/releases/download/v0.7.5/process-exporter-0.7.5.linux-armv6.tar.gz
tar xvfz process-exporter-0.7.5.linux-armv6.tar.gz
cp process-exporter-0.7.5.linux-armv6/process-exporter /usr/local/bin
cat << EOF > /etc/systemd/system/process-exporter.service
[Unit]
Description=Prometheus Process Metrics Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/process-exporter \
-config.path /etc/prometheus/process-exporter.yml
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload process-exporter
systemctl restart process-exporter
# Confirmation
systemctl status process-exporter
curl localhost:9256/metrics
systemctl enable process-exporter
systemctl reload-or-restart prometheus
ansibleも導入してみたい。
デスクトップ版ではなくLiteを入れたらディスクの作成は5分くらいで終わった
ついでにこのままsshなどをセットアップしておきたい。
これが参考になりそう。raspi zeroも同時購入したのでそちらでも使えそう。
Raspberry Pi OS Liteを選択したら無線が使えない。scanも行えない。無線モジュールの故障かな…と不安になった。
root@pi4b:~# wpa_cli -i wlan0 status
wpa_state=INTERFACE_DISABLED
p2p_device_address=de:a6:32:fa:61:76
address=dc:a6:32:fa:61:76
uuid=fe771d80-e254-5320-9834-70ec1887018f
root@pi4b:~# wpa_cli -i wlan0 scan
FAIL
調べたらrfkill - tool for enabling and disabling wireless devicesというものでブロックされている様子。
wlanのSOFTがblockedになっていたのでunblockしたら無事繋がった。
root@pi4b:~# rfkill
ID TYPE DEVICE SOFT HARD
0 wlan phy0 blocked unblocked
1 bluetooth hci0 unblocked unblocked
root@pi4b:~# rfkill unblock 0
root@pi4b:~# rfkill
ID TYPE DEVICE SOFT HARD
0 wlan phy0 unblocked unblocked
1 bluetooth hci0 unblocked unblocked
root@pi4b:~# ip -br addr show dev wlan0
wlan0 UP 10.0.1.14/24