#!/bin/bash # This script will mount the root filesystem read-only and overlay it with a temporary tempfs # Install: # copy this script to /sbin/overlayRoot.sh and add "init=/sbin/overlayRoot.sh" to the cmdline.txt # file in the raspbian image's boot partition. # Execute the following commands as root: # sudo dphys-swapfile swapoff # sudo dphys-swapfile uninstall # sudo update-rc.d dphys-swapfile remove # # To install software, run upgrades and do other changes to the raspberry setup, simply remove the init=/sbin/overlayRoot.sh # entry from the cmdline.txt file and reboot, make the changes, add the init= entry and reboot once more. set -e sleep 10 fail() { echo -e "$1" >&2 exit 1 } # Prüfen und Modul laden modprobe overlay || fail "ERROR: OverlayFS-Modul nicht geladen." # /proc einbinden mountpoint -q /proc || mount -t proc proc /proc # Temporäres Dateisystem für Overlay erstellen mount -t tmpfs tmpfs /mnt || fail "ERROR: tmpfs konnte nicht gemountet werden." mkdir -p /mnt/lower /mnt/rw/upper /mnt/rw/work /mnt/newroot # Root-Dateisystem schreibgeschützt einbinden rootDev=$(awk '$2 == "/" {print $1}' /proc/mounts) rootMountOpt=$(awk '$2 == "/" {print $4}' /proc/mounts) rootFsType=$(awk '$2 == "/" {print $3}' /proc/mounts) mount -t "${rootFsType}" -o "${rootMountOpt},ro" "${rootDev}" /mnt/lower || \ fail "ERROR: Ursprüngliches Root-Dateisystem konnte nicht schreibgeschützt eingebunden werden." # OverlayFS einbinden mount -t overlay \ -o lowerdir=/mnt/lower,upperdir=/mnt/rw/upper,workdir=/mnt/rw/work \ overlay /mnt/newroot || fail "ERROR: OverlayFS konnte nicht gemountet werden." # Neue Root-Overlay-Verzeichnisse erstellen mkdir -p /mnt/newroot/ro /mnt/newroot/rw # Originale fstab modifizieren grep -v "$rootDev" /mnt/lower/etc/fstab > /mnt/newroot/etc/fstab cat <> /mnt/newroot/etc/fstab # Das originale Root-Dateisystem wurde durch overlayRoot.sh entfernt. # Diese Änderung ist temporär. Die originale fstab ist in /ro/etc/fstab verfügbar. EOF # Root wechseln und alte Root aufräumen cd /mnt/newroot pivot_root . mnt || fail "ERROR: pivot_root fehlgeschlagen." exec chroot . /bin/bash -c " mount --move /mnt/mnt/lower /ro || fail 'ERROR: /ro konnte nicht verschoben werden.' mount --move /mnt/mnt/rw /rw || fail 'ERROR: /rw konnte nicht verschoben werden.' umount /mnt/mnt || true umount /mnt/proc || true umount -l -f /mnt/dev || true umount -l -f /mnt || true exec /sbin/init "