#!/bin/bash # Dieses Skript wird das Root-Dateisystem schreibgeschützt einbinden und es mit einem temporären tmpfs-Overlay versehen. # # Installation: # Kopiere dieses Skript nach /sbin/overlayRoot.sh und füge "init=/sbin/overlayRoot.sh" zur cmdline.txt-Datei # in der Boot-Partition des Raspbian-Images hinzu. # # Führe die folgenden Befehle als root aus: # sudo dphys-swapfile swapoff # sudo dphys-swapfile uninstall # sudo update-rc.d dphys-swapfile remove # # Um Software zu installieren, Upgrades durchzuführen und andere Änderungen an der Raspberry-Konfiguration vorzunehmen, # entferne einfach den Eintrag "init=/sbin/overlayRoot.sh" aus der cmdline.txt-Datei und starte das System neu. # Nimm die gewünschten Änderungen vor, füge den init= Eintrag wieder hinzu und starte erneut neu. set -e 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 /overlay || fail "ERROR: tmpfs konnte nicht gemountet werden." mkdir -p /overlay/lower /overlay/rw/upper /overlay/rw/work /overlay/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}" /overlay/lower || \ fail "ERROR: Ursprüngliches Root-Dateisystem konnte nicht schreibgeschützt eingebunden werden." # OverlayFS einbinden mount -t overlay \ -o lowerdir=/overlay/lower,upperdir=/overlay/rw/upper,workdir=/overlay/rw/work \ overlay /overlay/newroot || fail "ERROR: OverlayFS konnte nicht gemountet werden." # Neue Root-Overlay-Verzeichnisse erstellen mkdir -p /overlay/newroot/overlay/ro /overlay/newroot/overlay/rw # Originale fstab modifizieren grep -v "$rootDev" /overlay/lower/etc/fstab > /overlay/newroot/etc/fstab cat <> /overlay/newroot/etc/fstab # Das originale Root-Dateisystem wurde durch overlayRoot.sh entfernt. # Diese änderung ist temporär. Die originale fstab ist in /overlay/ro/etc/fstab verfügbar. EOF # Root wechseln und alte Root aufräumen cd /overlay/newroot pivot_root . overlay || fail "ERROR: pivot_root fehlgeschlagen." exec chroot . /bin/bash -c " mount --move /overlay/overlay/lower /overlay/ro || fail 'ERROR: /ro konnte nicht verschoben werden.' mount --move /overlay/overlay/rw /overlay/rw || fail 'ERROR: /rw konnte nicht verschoben werden.' umount /overlay/overlay || true umount /overlay/proc || true umount -l -f /overlay/dev || true umount -l -f /overlay || true exec /sbin/init "