Skip to content

๐Ÿฆ‡ 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), s suffix for rev 1.0
  • cyfmac43430 โ€” Debian's firmware-brcm80211 filename 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 โ€‹

ObjectRole
/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.tgzThe boot-firmware tarball. Started as a stale extraction from raspberrypi/firmware, eventually regenerated from the apt-installed /boot/firmware/.
captured.imgThe 3GB ext4 capture of the SD card's root partition, dd'd back to the Mac for diagnosis.
diagnostic-latest.logThe 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