Here's a procedure I've come up with to fully upgrade a diskless setup of Alpine Linux on a running Raspberry Pi. It's not pretty, but seems gets the job done, based on the tests I did.
I tested this procedure on each version from 3.3 to to 3.12. The system I tested on had a working setup of Apache2 with PHP, as well as Samba. Here's the result of the testing.
- Started with v3.3.
- Confirmed 3.3 to 3.4. Package "php-apache2" package had disappeared and had to be manually replaced by "php5-apache2".
- Confirmed 3.4 to 3.5.
- Confirmed 3.5 to 3.6.
- Confirmed 3.6 to 3.7.
- Confirmed 3.7 to 3.8.
- Could not boot after upgrading from 3.8 to 3.9. But a fresh installation of 3.9 was also unbootable, so assuming 3.9 is broken. Seems to be a known issue.
- Confirmed 3.8 to 3.10. Package "php5-apache2" package had disappeared and had to be manually replaced by "php7-apache2".
The process I came up with can be summarized to:
- Remount the SD card in read-write mode.
- Move all files in the SD card FAT32 root to a subdirectory such as old/2020-06-23T04_22_54.
- Download a fresh alpine-rpi-x.y.z-armhf.tar.gz file and untar it to the SD card root. This will give you Alpine Linux's newest Raspberry compatible Linux kernel image.
- Remount the SD card back to read-only mode.
- Update the /etc/apk/repositories (in the in-memory file system) to point to the target version.
- Do an "apk upgrade --available" to download the updated versions of the packages you used, so they will be ready on the device after rebooting.
- Reboot into the new setup.
If anything goes wrong, you can put the SD card in another PC, delete the broken setup, and copy your old working setup back out from the "old" directory.
Here are the commands. As I don't know if this process will keep working in future versions, I recommend running them one line at a time and ensuring the line does what you expect.
targetVersion=v3.12 # Move everything to a safe place as it is now. mount -oremount,rw /media/mmcblk0p1 cd /media/mmcblk0p1 olddir=/media/mmcblk0p1/old/$(date --utc "+%Y-%m-%dT%H_%M_%S") mkdir -p $olddir mv * $olddir # This will give a warning that it cannot move old into old. That's ok. mv .* $olddir # This will give a warning that it cannot move . and .. . That's ok. # Download fresh Alpine Linux image and replace existing. newImgFile=$(curl http://dl-cdn.alpinelinux.org/alpine/$targetVersion/releases/armhf/latest-releases.yaml --silent | grep "file: alpine-rpi-" | sed "s/ *file: //g") echo $newImgFile mount -oremount,rw /media/mmcblk0p1 wget http://dl-cdn.alpinelinux.org/alpine/$targetVersion/releases/armhf/$newImgFile wget http://dl-cdn.alpinelinux.org/alpine/$targetVersion/releases/armhf/${newImgFile}.sha512 sha512sum -c ${newImgFile}.sha512 # Ensure it says OK tar -xzf $newImgFile rm ${newImgFile}* cp $olddir/usercfg.txt . mount -oremount,ro /media/mmcblk0p1 # Update packages to the target distro. cat > /etc/apk/repositories <<EOF /media/mmcblk0p1/apks http://dl-cdn.alpinelinux.org/alpine/$targetVersion/main http://dl-cdn.alpinelinux.org/alpine/$targetVersion/community EOF setup-apkcache /media/mmcblk0p1/cache apk update apk upgrade --available apk add apk cache download apk -v cache clean lbu commit -d reboot # After reboot, ensure there aren't packages that no longer exist in this version. apk add