Closed39

Raspberry Pi 4Bをセットアップした時のメモ

astkastk

記事にまとめたので今後は 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

迷った点は別スレで深掘りしていきます。

astkastk

raspi2からどれくらい性能が上がったか気になったのでデスクトップ版をインストールした。

https://www.raspberrypi.org/software/ の通りRaspberry Pi Imagerで32bit版のデスクトップありを選んでmicro SDに書き込む。30分くらいかかる。64bit版はベータ版らしい。

astkastk

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の設定を適当に修正する。

astkastk

ディスプレイを使わなくても結構熱くなるのでやっぱりヒートシンクはあった方がいい。CPUの温度は以下のコマンドで確認できる。

/opt/vc/bin/vcgencmd measure_temp
# temp=50.1'C
astkastk

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
astkastk

大体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:~ $
astkastk

色々入れた後だけれどディスク容量はこんな感じ。イメージサイズは正味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
astkastk

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

無事通常ユーザで実行できた。手順が整っていてとても良い。

astkastk

せっかくなのでwifiの設定を行いたい。cliで設定した経験はまだない。

astkastk

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"
}
astkastk

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で繋がってきた。

astkastk
  • p2p-dev-wlan0 って何
  • WPAのパスフレーズを暗号化できる仕組み、復号の仕組み
astkastk

prometheusとか何かでモニタリングしてみたい

astkastk

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あたりが気になる。

astkastk

まずは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 でメトリクスが取得できるようになる。

astkastk

node_exporterはどう動かすのが一般的なのかな。systemdでルートのスタートアップでデーモンにする感じとかかな。

astkastk

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
astkastk

あ、いや。prometheus本体はdockerで動かすんだった。ただsystemdで起動するようにした方が便利そうなのでそれはする。ちなみにnode_exporterはdockerで動くのかな。

docker run --rm bash cat /proc/cpuinfo

これでcpuinfoが表示されたのでコンテナ内でも取れる情報は色々ありそう。

astkastk

探したら公式の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

とりあえずオプションの意味は置いておいて、問題なく動いた。

astkastk

しまった、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

何このアドレス。

astkastk

とりあえずprometheus本体からmDNSの解決ができればいいので、それだけ直接ホスト上で動かそうかな。

astkastk
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']

https://github.com/prometheus/prometheus/issues/2537

astkastk

なんやかんやでGrafanaでPrometheusで取得したハードウェア温度を表示できるようになった。

astkastk

普通に動いた。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
astkastk

次はprocess-exporterを使ってみたい。dockerイメージはarmに対応していないみたい。
https://hub.docker.com/r/ncabatoff/process-exporter/tags

releaseのバイナリを落として使うことにする。arm7は無いようなのでarm6を使う。
https://github.com/ncabatoff/process-exporter/releases/download/v0.7.5/process-exporter-0.7.5.linux-armv6.tar.gz

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
astkastk

デスクトップ版ではなくLiteを入れたらディスクの作成は5分くらいで終わった

astkastk

ついでにこのままsshなどをセットアップしておきたい。

astkastk

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というものでブロックされている様子。
https://unix.stackexchange.com/questions/45338/iwlist-interface-doesnt-support-scanning-ubuntu-lts-10-04

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
このスクラップは2021/06/05にクローズされました