BBS:      TELESC.NET.BR
Assunto:  Re: How to wake up the WiFi on a Zero 2W (it was working but has stoppe
De:       Ian
Data:     Thu, 19 Mar 2026 10:00:02 +1100
-----------------------------------------------------------
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  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)

-----------------------------------------------------------
[Voltar]