カメラ付き Raspberry Pi Zero WH を作る方法 (OS 編)
前書き
前回の投稿 ではカメラ付きラズパイゼロを作る方法のハードウェア編を書きました。本投稿では OS 編を書いていきます。
大きな流れとしては、ラズパイ公式サイトから OS を取ってきて、それを MicroSD カードに何らかの方法で焼く形になります。この時に必要になるカードリーダーや MicroSD カードを写真に撮ったのが ↑ の画像です。
そこまでできたら、ラズパイゼロが Wi-Fi に接続できるようにすることと ssh ログインできるように設定します。
今回の作業は僕の愛用パソコンである Lenovo の Chromebook (新品 30,000 円で購入) で行います。
OS (Raspberry Pi OS Lite) をダウンロードする
ラズパイゼロにインストールする OS は Raspberry Pi OS Lite (以降、ラズパイ OS と書く) にします。
他にもラズパイゼロにインストールできる OS は探せばあるんでしょうけどオーソドックスな方法で行きます。
ラズパイドットコムのこのページ から、ラズパイ OS をダウンロードします。
そうすると,以下のファイルがダウンロードできました。
$ cd $ cd Downloads $ ls -l 2022-09-22-raspios-bullseye-armhf-lite.img.xz -rw-r--r--. 1 chronos chronos 354404132 Dec 4 13:07 2022-09-22-raspios-bullseye-armhf-lite.img.xz $
xz の形式で圧縮されています。ファイルサイズは 350 MB 程度。xz コマンドで解凍します。
$ xz -d 2022-09-22-raspios-bullseye-armhf-lite.img.xz $ ls -l 2022-09-22-raspios* -rw-r--r--. 1 chronos chronos 1874853888 Dec 4 13:07 2022-09-22-raspios-bullseye-armhf-lite.img $
回答すると、1.87 GB くらいのファイルになりました。
OS (Raspberry Pi OS Lite) を MicroSD カードに焼く
続いて解凍した img ファイルを MicroSD カードに焼いていきます。これは dd コマンドを使います。
chromebook はノートパソコンに過ぎないので MicroSD カードを差し込める箇所はありません。このため Chromebook にカードリーダーを接続します。
僕が使っているカードリーダーはエレコムの MR3-A006 です。これを Chromebook の USB ポートに接続しますが、その前に lsusb コマンドを実行しておきます。
$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0aaa Intel Corp.
Bus 001 Device 002: ID 04f2:b6ba Chicony Electronics Co., Ltd EasyCamera
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$
ここでカードリーダーを Chromebook に接続してもう一回 lsusb です。
$ lsusb Bus 002 Device 003: ID 056e:8009 Elecom Co., Ltd USB Reader Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 8087:0aaa Intel Corp. Bus 001 Device 002: ID 04f2:b6ba Chicony Electronics Co., Ltd EasyCamera Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub $
青字のところに注目していただくと Elecom なになに USB Reader の文字が見えます。これは、カードリーダーが Chromebook に無事認識されたことを意味します。
ここで df コマンドを実行し、現在 Chromebook がマウントしている状況を確認しておきます。これはこのあとの作業に関わってきます。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 2.8G 2.4G 343M 88% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 109M 1.8G 6% /dev/shm
tmpfs 1.9G 60M 1.9G 4% /tmp
tmpfs 1.9G 776K 1.9G 1% /run
/dev/loop0 384K 384K 0 100% /run/chromeos-config/private
/dev/mmcblk0p1 20G 16G 3.2G 84% /mnt/stateful_partition
/dev/mmcblk0p8 12M 24K 12M 1% /usr/share/oem
/dev/mapper/encstateful 5.9G 524M 5.4G 9% /mnt/stateful_partition/encrypted
media 1.9G 0 1.9G 0% /media
none 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/loop2 98M 98M 0 100% /usr/share/chromeos-assets/speech_synthesis/patts
imageloader 1.9G 0 1.9G 0% /run/imageloader
/dev/loop3 10M 10M 0 100% /usr/share/chromeos-assets/quickoffice/_platform_specific
/dev/loop4 7.0M 7.0M 0 100% /usr/share/cros-camera/libfs
tmpfs 1.9G 0 1.9G 0% /run/arc/sdcard
drivefs://D6CADCC8E33D3C80CA1C012C846D8545 1.0E 18G 1.0E 1% /media/fuse/drivefs-d84269b07085c4817f90fc644e9c03d5
passthrough 20G 16G 3.2G 84% /run/arc/sdcard/write/emulated
$
そしてカードリーダーに MicroSD カードを差し込みます。(僕の使っているカードリーダーに直接 MicroSD カードを差し込むと MicroSD が認識されないことが多いです。このため、SD カードアダプターに MicroSD カードを差し込んで、SD カードアダプターをカードリーダーに差し込んでいます)
SD カードアダプター (以降 MicroSD カードと書くことにします) をカードリーダーに差し込むと、Chromebook の右下に以下のメッセージが表示されました。
こういうのは、大体が OS (この場合 Chromebook) が MicroSD カードを自動マウントした時に表示されるメッセージです。
再度 df コマンドでマウント状況を確認します。
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 2.8G 2.4G 343M 88% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 106M 1.8G 6% /dev/shm tmpfs 1.9G 59M 1.9G 4% /tmp tmpfs 1.9G 784K 1.9G 1% /run /dev/loop0 384K 384K 0 100% /run/chromeos-config/private /dev/mmcblk0p1 20G 16G 3.2G 84% /mnt/stateful_partition /dev/mmcblk0p8 12M 24K 12M 1% /usr/share/oem /dev/mapper/encstateful 5.9G 524M 5.4G 9% /mnt/stateful_partition/encrypted media 1.9G 0 1.9G 0% /media none 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/loop2 98M 98M 0 100% /usr/share/chromeos-assets/speech_synthesis/patts imageloader 1.9G 0 1.9G 0% /run/imageloader /dev/loop3 10M 10M 0 100% /usr/share/chromeos-assets/quickoffice/_platform_specific /dev/loop4 7.0M 7.0M 0 100% /usr/share/cros-camera/libfs tmpfs 1.9G 0 1.9G 0% /run/arc/sdcard drivefs://D6CADCC8E33D3C80CA1C012C846D8545 1.0E 18G 1.0E 1% /media/fuse/drivefs-d84269b07085c4817f90fc644e9c03d5 passthrough 20G 16G 3.2G 84% /run/arc/sdcard/write/emulated /dev/sda1 253M 55M 198M 22% /media/removable/boot /dev/sda2 14G 2.0G 12G 15% /media/removable/rootfs $
青字の 2 行が追加されています。MicroSD カードを差し込んだときにこの 2 つ自動マウントされたわけです。MicroSD カードは Chromebook に /dev/sda で認識されていることもわかります。
dd を実行する前にこの 2 つをアンマウントします。
$ sudo umount /dev/sda1 umount: /media/removable/boot: target is busy. $ sudo umount /dev/sda2 umount: /media/removable/rootfs: target is busy. $
target is busy と表示されました。何かのプロセスが触っているようです。
lsof コマンドでプロセスを特定します。
$ sudo lsof /dev/sda1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mount-pas 19155 chronos 6r DIR 8,1 4096 1 /media/removable/boot $ sudo lsof /dev/sda2 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mount-pas 19155 chronos 308r DIR 8,2 4096 2 /media/removable/rootfs $
プロセス ID 19155 が何かやっているようです。
$ ps -ef | grep 19155 | grep -v grep
chronos 19155 19149 0 12:50 ? 00:00:00 /usr/bin/mount-passthrough --source=/media/removable --dest=/run/arcvm/media/removable --fuse_umask=007 --fuse_uid=10058 --fuse_gid=1077 --android_app_access_type=full
$
mount-passthrough というコマンドが何なのかわかりませんが kill します。
$ kill -9 19155 $ ps -ef | grep 19155 | grep -v grep $
プロセスがなくなりました。再度アンマウントしてみます。
$ sudo umount /dev/sda1 $ sudo umount /dev/sda2 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 2.8G 2.4G 343M 88% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 119M 1.8G 7% /dev/shm tmpfs 1.9G 60M 1.9G 4% /tmp tmpfs 1.9G 788K 1.9G 1% /run /dev/loop0 384K 384K 0 100% /run/chromeos-config/private /dev/mmcblk0p1 20G 16G 3.2G 84% /mnt/stateful_partition /dev/mmcblk0p8 12M 24K 12M 1% /usr/share/oem /dev/mapper/encstateful 5.9G 525M 5.4G 9% /mnt/stateful_partition/encrypted media 1.9G 0 1.9G 0% /media none 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/loop2 98M 98M 0 100% /usr/share/chromeos-assets/speech_synthesis/patts imageloader 1.9G 0 1.9G 0% /run/imageloader /dev/loop3 10M 10M 0 100% /usr/share/chromeos-assets/quickoffice/_platform_specific /dev/loop4 7.0M 7.0M 0 100% /usr/share/cros-camera/libfs tmpfs 1.9G 0 1.9G 0% /run/arc/sdcard drivefs://D6CADCC8E33D3C80CA1C012C846D8545 1.0E 18G 1.0E 1% /media/fuse/drivefs-d84269b07085c4817f90fc644e9c03d5 passthrough 20G 16G 3.2G 84% /run/arc/sdcard/write/emulated $
アンマウントされました。やっと dd を実行できる準備が整いました。
$ sudo dd if=./2022-09-22-raspios-bullseye-armhf-lite.img of=/dev/sda bs=128k
14304+0 records in
14304+0 records out
1874853888 bytes (1.9 GB, 1.7 GiB) copied, 134.047 s, 14.0 MB/s
$
134 s と書いてあるので 2 分ほどで dd できたことになります。
dd コマンド終了と同時に Chromebook 右下にポップアップメッセージで「リムーバブルデバイスが検出されました」のメッセージが表示されました。「また自動マウントされたな」と思いました。df で見てみると、
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/root 2.8G 2.4G 343M 88% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 107M 1.8G 6% /dev/shm tmpfs 1.9G 57M 1.9G 3% /tmp tmpfs 1.9G 788K 1.9G 1% /run /dev/loop0 384K 384K 0 100% /run/chromeos-config/private /dev/mmcblk0p1 20G 16G 3.2G 84% /mnt/stateful_partition /dev/mmcblk0p8 12M 24K 12M 1% /usr/share/oem /dev/mapper/encstateful 5.9G 525M 5.4G 9% /mnt/stateful_partition/encrypted media 1.9G 0 1.9G 0% /media none 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/loop2 98M 98M 0 100% /usr/share/chromeos-assets/speech_synthesis/patts imageloader 1.9G 0 1.9G 0% /run/imageloader /dev/loop3 10M 10M 0 100% /usr/share/chromeos-assets/quickoffice/_platform_specific /dev/loop4 7.0M 7.0M 0 100% /usr/share/cros-camera/libfs tmpfs 1.9G 0 1.9G 0% /run/arc/sdcard drivefs://D6CADCC8E33D3C80CA1C012C846D8545 1.0E 18G 1.0E 1% /media/fuse/drivefs-d84269b07085c4817f90fc644e9c03d5 passthrough 20G 16G 3.2G 84% /run/arc/sdcard/write/emulated /dev/sda2 1.5G 1.1G 279M 80% /media/removable/rootfs /dev/sda1 255M 50M 206M 20% /media/removable/boot $
マウントされていました。これは好都合なのでこのままにして次の作業に進みます。
ラズパイ OS の SSH 設定
ラズパイゼロで SSH を有効にするための設定は ssh という名前の空ファイルを置くだけです。
この ssh ファイルですが、置く場所は boot ディレクトリの中になります。具体的なパスは df コマンドから特定していきます。
$ df -h | fgrep /dev/sda
/dev/sda2 1.5G 1.1G 279M 80% /media/removable/rootfs
/dev/sda1 255M 50M 206M 20% /media/removable/boot
$
/media/removable/boot ディレクトリに ssh ファイルを作れば良いです。
$ ls -l /media/removable/boot total 49868 -rwxr-xr-x. 1 chronos chronos-access 18693 Aug 30 10:43 COPYING.linux -rwxr-xr-x. 1 chronos chronos-access 1594 Aug 30 10:43 LICENCE.broadcom -rwxr-xr-x. 1 chronos chronos-access 28367 Aug 30 10:43 bcm2708-rpi-b-plus.dtb -rwxr-xr-x. 1 chronos chronos-access 27739 Aug 30 10:43 bcm2708-rpi-b-rev1.dtb -rwxr-xr-x. 1 chronos chronos-access 28060 Aug 30 10:43 bcm2708-rpi-b.dtb -rwxr-xr-x. 1 chronos chronos-access 27981 Aug 30 10:43 bcm2708-rpi-cm.dtb -rwxr-xr-x. 1 chronos chronos-access 29216 Aug 30 10:43 bcm2708-rpi-zero-w.dtb -rwxr-xr-x. 1 chronos chronos-access 27805 Aug 30 10:43 bcm2708-rpi-zero.dtb -rwxr-xr-x. 1 chronos chronos-access 29254 Aug 30 10:43 bcm2709-rpi-2-b.dtb -rwxr-xr-x. 1 chronos chronos-access 29253 Aug 30 10:43 bcm2709-rpi-cm2.dtb -rwxr-xr-x. 1 chronos chronos-access 30119 Aug 30 10:43 bcm2710-rpi-2-b.dtb -rwxr-xr-x. 1 chronos chronos-access 32482 Aug 30 10:43 bcm2710-rpi-3-b-plus.dtb -rwxr-xr-x. 1 chronos chronos-access 31871 Aug 30 10:43 bcm2710-rpi-3-b.dtb -rwxr-xr-x. 1 chronos chronos-access 30106 Aug 30 10:43 bcm2710-rpi-cm3.dtb -rwxr-xr-x. 1 chronos chronos-access 31179 Aug 30 10:43 bcm2710-rpi-zero-2-w.dtb -rwxr-xr-x. 1 chronos chronos-access 31179 Aug 30 10:43 bcm2710-rpi-zero-2.dtb -rwxr-xr-x. 1 chronos chronos-access 51955 Aug 30 10:43 bcm2711-rpi-4-b.dtb -rwxr-xr-x. 1 chronos chronos-access 52087 Aug 30 10:43 bcm2711-rpi-400.dtb -rwxr-xr-x. 1 chronos chronos-access 52540 Aug 30 10:43 bcm2711-rpi-cm4.dtb -rwxr-xr-x. 1 chronos chronos-access 49870 Aug 30 10:43 bcm2711-rpi-cm4s.dtb -rwxr-xr-x. 1 chronos chronos-access 52460 Aug 30 10:43 bootcode.bin -rwxr-xr-x. 1 chronos chronos-access 154 Sep 22 00:23 cmdline.txt -rwxr-xr-x. 1 chronos chronos-access 2075 Sep 22 00:04 config.txt -rwxr-xr-x. 1 chronos chronos-access 7262 Aug 30 10:43 fixup.dat -rwxr-xr-x. 1 chronos chronos-access 5399 Aug 30 10:43 fixup4.dat -rwxr-xr-x. 1 chronos chronos-access 3170 Aug 30 10:43 fixup4cd.dat -rwxr-xr-x. 1 chronos chronos-access 8379 Aug 30 10:43 fixup4db.dat -rwxr-xr-x. 1 chronos chronos-access 8379 Aug 30 10:43 fixup4x.dat -rwxr-xr-x. 1 chronos chronos-access 3170 Aug 30 10:43 fixup_cd.dat -rwxr-xr-x. 1 chronos chronos-access 10228 Aug 30 10:43 fixup_db.dat -rwxr-xr-x. 1 chronos chronos-access 10226 Aug 30 10:43 fixup_x.dat -rwxr-xr-x. 1 chronos chronos-access 145 Sep 22 00:23 issue.txt -rwxr-xr-x. 1 chronos chronos-access 6269408 Aug 30 10:43 kernel.img -rwxr-xr-x. 1 chronos chronos-access 6629712 Aug 30 10:43 kernel7.img -rwxr-xr-x. 1 chronos chronos-access 7040160 Aug 30 10:43 kernel7l.img -rwxr-xr-x. 1 chronos chronos-access 8192917 Aug 30 10:43 kernel8.img drwxr-xr-x. 2 chronos chronos-access 24576 Sep 22 00:04 overlays -rwxr-xr-x. 1 chronos chronos-access 2973536 Aug 30 10:43 start.elf -rwxr-xr-x. 1 chronos chronos-access 2249280 Aug 30 10:43 start4.elf -rwxr-xr-x. 1 chronos chronos-access 803964 Aug 30 10:43 start4cd.elf -rwxr-xr-x. 1 chronos chronos-access 3744808 Aug 30 10:43 start4db.elf -rwxr-xr-x. 1 chronos chronos-access 2996680 Aug 30 10:43 start4x.elf -rwxr-xr-x. 1 chronos chronos-access 803964 Aug 30 10:43 start_cd.elf -rwxr-xr-x. 1 chronos chronos-access 4816712 Aug 30 10:43 start_db.elf -rwxr-xr-x. 1 chronos chronos-access 3720360 Aug 30 10:43 start_x.elf $ touch /media/removable/boot/ssh $ ls -l !$ ls -l /media/removable/boot/ssh -rwxr-xr-x. 1 chronos chronos-access 0 Dec 4 15:47 /media/removable/boot/ssh $
0 バイトの ssh ファイルの作成ができました。
ラズパイ OS の Wi-Fi 設定
次が wpa_supplicant.conf です。同じく boot ディレクトリに保管するのですが、Wi-Fi 設定を定義する必要があります。
必要な情報は、Wi-Fi の SSID とパスワードです。注意点としてはラズパイゼロは 2.4GHz の Wi-Fi にしか対応していないので 2.4GHz の SSID とパスワードが必要です。
$ cd /media/removable/boot/ $ vi wpa_supplicant.conf (vi の操作は割愛) $ cat wpa_supplicant.conf ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="your_wifi_network_name" psk="your_wifi_network_password" key_mgmt=WPA-PSK }
wpa_supplicant.conf 内の ssid と psk のところに、接続させたい Wi-Fi の SSID とパスワードを記載して保存すればオーケーです。
以上で、ラズパイ OS の設定は完了です。MicroSD カードをアンマウントします。
$ cd $ df -h | fgrep /dev/sda /dev/sda2 1.5G 1.1G 279M 80% /media/removable/rootfs /dev/sda1 255M 50M 206M 20% /media/removable/boot $ sudo umount /dev/sda1 $ sudo umount /dev/sda2 $ df -h | fgrep /dev/sda $
ラズパイゼロの起動確認
MicroSD カードをカードリーダーから取り出してラズパイゼロにセットします。
電源ケーブル (USB ケーブル) をラズパイゼロに接続すると給電されるためラズパイ OS が起動してきます。