The workaround I came up with, is to use an overlay file system to make the kernel modules directory writable.
Here's the workaround:
# Remount the kernel module directory /.modloop as an overlay, to allow writing
modprobe overlay
mkdir -p /.modloop.lower /.modloop.upper /.modloop.workdir
mount /dev/loop0 /.modloop.lower
umount /.modloop/
mount -t overlay -o lowerdir=/.modloop.lower,upperdir=/.modloop.upper,workdir=/.modloop.workdir none /.modloop
lbu include /.modloop.upper
lbu commit -d
# Manually get the Wireguard kernel module to avoid installing the wireguard-rpi2 which does not work with diskless systems
cd /tmp
pkgname=$(apk list | grep wireguard-rpi2 | cut -d " " -f 1)
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/community/armhf/$pkgname.apk
mkdir /tmp/$pkgname
tar -xzf $pkgname.apk -C /tmp/$pkgname
mkdir -p /lib/modules/$(uname -r)/extra/
cp /tmp/$pkgname/lib/modules/$(uname -r)/extra/wireguard.ko /lib/modules/$(uname -r)/extra/
rm -fr /tmp/$pkgname /tmp/$pkgname.apk
depmod
# Create an init script to remount the /.modloop overlay on next boot
cat > /etc/init.d/modloopoverlay <<EOF
#!/sbin/openrc-run
depend() {
before networking
need modules
}
start() {
ebegin "Starting modloop overlay"
modprobe overlay
mkdir -p /.modloop.lower /.modloop.upper /.modloop.workdir
if [ ! -d /.modloop.lower/modules ]; then
mount /dev/loop0 /.modloop.lower
fi
umount /.modloop
mount -t overlay -o lowerdir=/.modloop.lower,upperdir=/.modloop.upper,workdir=/.modloop.workdir none /.modloop
eend 0
}
EOF
chmod +x /etc/init.d/modloopoverlay
/etc/init.d/modloopoverlay restart
rc-update add modloopoverlay boot
lbu include /etc/init.d/modloopoverlay
apk add wireguard-tools
# Create an init script to start wg0
cat > /etc/init.d/wg0 <<EOF
#!/sbin/openrc-run
depend() {
need networking ntpd modloopoverlay
}
start() {
ebegin "Starting Wireguard tunnel wg0"
ntpd -n -q -p pool.ntp.org
date
wg-quick up wg0
eend $?
}
stop() {
ebegin "Stopping Wireguard tunnel wg0"
wg-quick down wg0
eend 0
}
EOF
chmod +x /etc/init.d/wg0
/etc/init.d/wg0 restart
rc-update add wg0 default
lbu include /etc/init.d/wg0
lbu commit -d
# inspect the overlay file
tar -tvf /media/mmcblk0p1/localhost.apkovl.tar.gz
I am facing this issue too (Alpine in diskless mode, but not rPI) and trying to decide how to deal with it. How does your approach compare with what's in the Alpine wiki https://wiki.alpinelinux.org/wiki/Configure_a_Wireguard_interface_(wg) in "Running with modloop" section?
ReplyDeleteamazing!!!
ReplyDelete