๐ฆ Cast โ
Heroes โ
Pi Foundation โ
Power: Curates archive.raspberrypi.com/debian โ a single apt repo where kernel, modules, firmware, and dtbs all match. Backstory: We ignored them for two episodes. They were patient. When we finally asked for help, they handed over the working triple in 90 seconds.
debugfs โ
Power: Reads ext4 filesystems without mounting. Works on macOS via Multipass VM. Signature move: debugfs -R "cat /var/lib/dpkg/status" image.img โ pulls the dpkg state from a powered-down SD card.
journalctl -D โ
Power: Replays a captured systemd journal from a different machine. Signature move: journalctl -D /mnt/captured/var/log/journal -b 0 -p err โ shows you what the driver said before it died.
peebles/rpi3-wifi-station-ap (GitHub) โ
Power: The reference recipe for STA+AP simultaneously on one wifi radio via the uap0 virtual-interface trick. Cameo: Set up to appear in S01E15 (mgmt AP bake-in).
Kali ARM (in absentia) โ
Power: Built the Pi distro architecture we eventually adopted (apt-based, not tarball-based). Reference: raspberry-pi-zero-2-w.sh. Sin: We didn't read it carefully until Arc 8.
Villains โ
debootstrap --variant=minbase โ
Crime: Strips Priority: important packages including systemd, dbus, openssh-server. Leaves you with no init, no networking, no remote access. Sentence: Add the essentials back to --include. Pardoned for use cases that really want minimal.
The Naming Hydra โ
Crime: The Pi Zero 2 W's wifi chip has FOUR official names depending on who you ask:
- BCM43436 โ Pi Foundation marketing
- BCM43430 โ brcmfmac driver source (chip family)
- CYW43436s โ Cypress (silicon vendor),
ssuffix for rev 1.0 - cyfmac43430 โ Debian's
firmware-brcm80211filename Sentence: Use the apt-managed firmware-brcm80211 from Pi's repo. It picks the right one for you.
rfkill (the soft-block at boot) โ
Crime: The Pi kernel boots with wifi rfkill soft-blocked by default (regulatory protection). Even with country code set in wpa_supplicant.conf, the radio can't transmit. dhclient returns "Network is down" forever. Sentence: Drop a oneshot systemd-rfkill-unblock.service that runs rfkill unblock all early in boot. Pi OS does this via raspi-config do_wifi_country; minbase doesn't, so we wrote our own.
dtoverlay=dwc2 (the red herring) โ
Crime: Spent half an arc suspecting this caused wifi failure. It didn't. dwc2 only switches USB controller mode. Sentence: Cleared of all charges. Currently dropped from config.txt while we focus on wifi; may return when we want USB OTG.
gpu_mem=16 (the other red herring) โ
Crime: Looked guilty for "too aggressive memory restriction." Wasn't. Sentence: Cleared. Currently dropped from config.txt; default is fine.
txcap_blob: -2 (the alarm bell that wasn't) โ
Crime: Spends 8 lines of dmesg looking alarming, but is purely cosmetic. Documented in raspberrypi/linux#6317. Sentence: Ignore.
NPCs (non-player characters) โ
PINN (Pi Imager NOOBS Next-generation) โ
Role: Provided the empirical proof that the Pi Zero 2 W was alive. Cameo: S01E12 โ the user flashed PINN to demonstrate the Pi worked. Our scripts didn't.
Multipass (Canonical's lightweight VM) โ
Role: The arm64 build environment. Runs debootstrap, debugfs, journalctl, e2fsck. Lives between flashes. Quirk: Wall-clock drift across day boundaries breaks apt date checks. Fixed via systemctl restart systemd-timesyncd in build-rootfs.sh.
macOS diskutil โ
Role: Partitions the SD card. Mounts and unmounts FAT. Quirk: Doesn't format ext4 natively. We have to format as FAT32 then dd the ext4 image over.
The mask-ROM (BCM2837 silicon) โ
Role: Reads bootcode.bin from the SD's FAT root. Cameo: S01E13 โ the silent judge. No bootcode.bin at root, no boot. No appeals.
iPhone Personal Hotspot (172.20.10.0/28) โ
Role: Initially suspected as the network the Pi joined. Cameo: S01E14 final arc โ wrong-network detour. Turned out the Pi joined the home wifi (192.168.0.0/24). Proxy-ARP on the iPhone hotspot made our subnet scan return false positives.
Inanimate co-stars โ
| Object | Role |
|---|---|
/dev/disk4 (then /dev/disk5, then /dev/disk6) | The SD card. macOS reassigns the diskN ordinal on every re-attach, hence the device-path-as-env-var pattern. |
boot.tgz | The boot-firmware tarball. Started as a stale extraction from raspberrypi/firmware, eventually regenerated from the apt-installed /boot/firmware/. |
captured.img | The 3GB ext4 capture of the SD card's root partition, dd'd back to the Mac for diagnosis. |
diagnostic-latest.log | The output of diagnose-sd.sh. The detective's notebook. |
Final scene โ
Episode end: all parties at peace. Pi running. SSH working. Bugs filed. Memory entries written. The frontrat sleeps.
โ Bestiary ยท Credits ยท Saga index