2025年2月2日日曜日

raspberry pi zero 2wの初期設定メモ

1.初期設定:
1.1.初期イメージ作成:
以下からPiImagerをダウンロードし、PCにインストール
https://www.raspberrypi.com/software/
PiImagerで、以下を設定しmicrosdカードに書き込む
・RASPBERRY PI ZERO 2 W,RASPBERRY PI OS(64-BIT),SDカードストレージを選択し、
・カスタマイズ設定で編集を選択し、
 ・一般タブで、ホスト名、ユーザ名、WIFI設定、ロケール設定を設定し
 ・サービスでSSHを有効にし、パスワード認証を使うを選択
イメージを書き込んだSDカードをraspberrypizero2wに刺して、raspberrypizero2wのマイクロUSBに通電。
・PCのコマンドプロンプトから、さっき設定したユーザ名とホスト名を使って"ssh [ユーザ名]@[ホスト名]"で接続。パスワードで接続。
sudo apt update
sudo apt full-upgrade
sudo rpi-update
sudo reboot

PCから"ssh [ユーザ名]@[ホスト名]"で接続。
sudo raspi-config を実行し、3 Interface Option から I2CとSPIを有効にしてリブート。

1.2.dockerインストール
http://docker.jp/PDF/docker-getting-started-guide-for-linux.pdf
と、
https://www.cqpub.co.jp/interface/download/2025/2/IF2502T2%E3%83%AA%E3%82%B9%E3%83%88.zip
のS3_list.txtを見ながら実施。

PCから"ssh [ユーザ名]@[ホスト名]"で接続。
curl -fsSL https://get.docker.com/ | sh


sudo usermod -aG docker $USER
exit でいったんログオフし、もう一度PCから"ssh [ユーザ名]@[ホスト名]"で接続。

id でdockerグループに所属を確認。

インストール結果確認。以下コマンドで「Hello from Docker!」が表示されることを確認。
docker run hello-world

メモリが少なくてchromiumもfirefoxも起動できないのであまり意味がないかもしれないけど、VNCサーバを起動するとするなら、
sudo raspi-config を実行し、3 Interface Option から VNCを有効にする。

そのほか、ssh接続にパスワードじゃなくて鍵を使うとすると、キーペアを作って公開キーをraspberry pi側に、秘密鍵をPC側に置いておく
キー作成
ssh-keygen -f keypair
公開鍵登録
umask 0077
mkdir ~/.ssh
cat keypair.pub >> ~/.ssh/authorized_keys
umask 0022
rm keypair.pub
PCから、"sftp [ユーザ名]@[ホスト名]"で接続。
以下のsftpコマンドで秘密鍵を取得
get keypair
rm keypair
exit

getした秘密鍵(keypair)をPCの%USERPROFILE%\.sshフォルダ(無ければ作る)にファイル移動。
%USERPROFILE%\.ssh\config ファイルに以下を追記
===
Host [raspberrypizero2wのホスト名]
    HostName [raspberrypizero2wのホスト名]
    User [raspberrypizero2wの接続ユーザー名]
    IdentityFile "[%USERPROFILE%を展開したフォルダ名]\.ssh\keypair"
===



インタフェース2月号によると、コンテナからGPIOなどを使うには、
1.ホスト側でGPIOを使っているユーザのID、グループIDを合わせる必要があることと
2.コンテナの/devをホスト側の/devにアクセスできるようにマウントする必要があることと
3.サービスの権限をつける必要がある
ようです。

1.は、Dockerfileで、イメージを作る時にイメージ側にgroupadd,useradd,をして、
  ホスト側のpiユーザである、ユーザID:1000,グループID:1000を設定して、
   USER命令で実行ユーザをUID,GIDが共に1000のユーザで起動するようにすること
2.は、compose.ymlで、services:(サービス名):の下のvolumes:で配列の一つに/dev:/devを指定すること
3.は、compose.ymlで、services:(サービス名):の下でprivileged: true を指定する必要があることです。

確かに、これをやってP.37のリスト3のDockerfile(ただしADDの行を除く)とリスト4のcompose.ymlを作成し、
[touch .env_file-develop]した後、docker compose up -d を実行して、
docker exec -it [コンテナハッシュ] /bin/bash
で入ると、プロンプトでログインユーザ名がrootではなくDockerfileでUSERで指定したユーザとなっていて、
pip install gpiozero
pip install Rpi
pip install lgpio
pip install pigpio
をやった後、以下のpythonスクリプトを実行したらGPIO18に接続したLEDが点滅した
===
from gpiozero import LED
from time import sleep

led = LED(18)

while True:
    led.on()
    sleep(0.5)
    led.off()
    sleep(0.5)
===



追記:imageにPI OS Liteを使っても同じように設定できた。
PI OS はrunlevel 5 (X環境)で動いているけど、PI OS Liteはrunlevel 3 (CUIのマルチユーザーモード)で動いているので、
Liteの方が消費リソースが少なくていい感じかも。