----------------------------------------------------------------------------------
@MSGID: 3:633/10 6f058c35
@REPLY: 3:633/10 2bfedf80
@PID: PyGate 1.5.13
@TID: PyGate/Linux 1.5.13
@CHRS: ASCII 1
@TZUTC: 1100
${send-direct-email-to-news1021-at-jusme-dot-com-if-you-must}@jusme.com
n>
@REPLYTO: 3:633/10 UUCP
send-direct-email-to-news1021-at-jusme-dot-com-i@vm46.home.ju
sme.com>
Subject: Re: How to wake up the WiFi on a Zero 2W (it was
working but has stopped)
On 2026-03-18, The Natural Philosopher <tnp@invalid.invalid> wrote:
> Somewhere in my documentation is what I did to my pi zero in order to
> avoid any SD card writes at all
>
> Basically I created a ram disk and mounted it on /var/log. And disabled
> systemd as much as possible.
>
> Then ensure the SD card is mounted with noatime etc.
If you replace /sbin/init (usually symlinked to /lib/systemd/systemd) with a
bash script you get to run in a truly read-only environment (root filesystem
still mounted ro). Of course nothing in userland works at that point, so
your script has to do some initialisation - setting up a ramdisk for a copuple
of directories, as you said, mounting procfs, creating some device nodes,
configuring IP, loading kernel modules if you need them (e.g. for wifi).
Useful for small applications (forget running a GUI, obv.).
Brutal, but effective. Here`s an example:
----------------------------------------------------------------------------
# cat init-ro
#!/bin/bash
clear
echo "Running ${0}..."
#
# Config...
#
source /etc/ro-config
export OUR_BC="${OUR_IP%.*}.255"
export OUR_GW="${OUR_IP%.*}.1"
#
# Need to set these so we can prime PS1 for bash...
# (see nonsense in /etc/bash.bashrc)...
#
export SUDO_USER=0
export SUDO_PS1="-"
#
# Mount tmpfs filesystems on /run and /tmp,
# as these need to be rw...
#
mount -t tmpfs -o size=256m tmpfs /run
mount -t tmpfs -o size=10m tmpfs /tmp
mkdir /run/lock
mkdir /run/log
#
# Need /dev/pts for ssh...
#
mkdir /dev/pts
mount -t devpts devpts /dev/pts
#
# Need loopback...
#
ifconfig lo up
#
# Need /proc...
#
mount -t proc none /proc
#
# Set host name and domain name...
#
hostname "${OUR_HOSTNAME}"
domainname "${OUR_HOSTNAME#*.}"
#
# If wifi, set up the wireless interface...
#
[ "${WIRED}" != "1" ] && /ro/init-wifi
#
# Wait for interface to appear before
# configuring it...
#
while [ ! -d "/proc/sys/net/ipv4/conf/${OUR_IF}/" ]
do
echo "Waiting for interface "${OUR_IF}"..."
sleep 1
done
#
# Bring the interface up...
#
ip link set "${OUR_IF}" up
#
# Check if the MAC address matches the config. If not, don`t
# bring up the network, just pop up a shell to allow the config
# to be updated (allows cloning of the image)...
#
real_eth="$(ip addr list ${OUR_IF} | awk `/link/ether/ {print $2}`)"
if [ "${real_eth^^}" != "${OUR_ETH^^}" ]
then
echo "This MAC address (${real_eth^^}) doesn`t match config (${OUR_ETH^^})"
echo ""
echo "Please edit config and reboot..."
echo ""
cd /ro
mount -o remount,rw /dev/root /
PS1="RW-SHELL \\h:\\w# " /bin/bash
reboot -f
fi
#
# Set the IP address and default route...
#
echo "Setting IP address for ${OUR_IF}: ${OUR_IP}/24, gw: ${OUR_GW}"
ip addr add "${OUR_IP}/24" brd "${OUR_BC}" dev "${OUR_IF}"
ip route add 0/0 via "${OUR_GW}"
#
# Wait for network, check by pinging our default gateway...
#
while ! ping -c 1 -q -w 1 "${OUR_GW}" > /dev/null 2>&1
do
echo "Waiting for network, ping gw (${OUR_GW})..."
sleep 1
done
#
# Start ntpd to get the time...
#
echo "Starting ntpd..."
/usr/sbin/ntpd -g
echo "Waiting for time sync..."
ntp-wait -n 30 -s 1
date
#
# Start sshd
#
echo "Starting sshd..."
mkdir /run/sshd
/usr/sbin/sshd
#
# Now start application screen sessions...
#
echo "Starting applications..."
cd /ro
./start-screens
#
# Shell for testing...
#
while true
do
PS1="RO-SHELL \\h:\\w# " /bin/bash
done
#
# We can`t exit from init (causes kernel panic), so force a reboot
if we get here...
#
reboot -f
----------------------------------------------------------------------------
--
Ian
"Tamahome!!!" - "Miaka!!!"
--- PyGate Linux v1.5.13
* Origin: Dragon`s Lair, PyGate NNTP<>Fido Gate (3:633/10)
SEEN-BY: 19/10 50/109 153/757 218/840 840 220/70
221/1 6 360 226/17 100
SEEN-BY: 229/426 240/1120 267/800 301/1 113 812
310/31 335/364 341/66 463/68
SEEN-BY: 633/10 280 414 416 418 420 422 509 2744
712/848 770/1 3 100 340 350
SEEN-BY: 772/210 220 230 5019/40 5020/715 848 1042
4441 12000 5030/49 722
SEEN-BY: 5030/1081 1474 5053/55 5061/133 5075/128
@PATH: 633/10 280 770/1 218/840 221/6 301/1
5020/1042 4441