Read-only Filesystem

Read-only Filesystem = RO-FS

Überblick

Ein RO-FS ist robuster gegenüber ungewollten Veränderungen und Korruptionens des Dateisystems.

Linux-Systeme, welche für eine Robotersteuerung oder in einem anderen embedded Bereich genutzt werden, werden oft mit einem RO-FS betrieben. Das stellt sicher, dass die Software des Systems in einem definierten Bereich eingefroren wird.

Mit einem RO-FS muss das System auch nicht mehr heruntergefahren werden.

Implementierungen

Partition temporär RO oder RW mounten

Mit dieser Methode kann eine Partition zur Laufzeit neu gemounted werden. Das kann nützlich sein, wenn man bei einem permanenten RO-System etwas verändern will. Nach einem Neustart werden die Partitionen wieder so gemounted, wie im /etc/fstab definiert.

Mit lsblk können alle gemounteten Partitionen aufgelisted werden.

Read-only mounten:

sudo mount -o remount,ro /partition/identifier /mount/point

Read-write mounten:

sudo mount -o remount,rw /partition/identifier /mount/point

Man kann diese Befehle einfach in Shell-Scripts (remount_RW.sh / remount_RO.sh) speichern.

Vollständiges RO System

Das ganze System wird RO gemountet. Keine Logs werden geschrieben. Daten können auch nicht temporär gespeichert werden. Das ist nur für einfache (Buildroot) Systeme praktikabel.

Um die Partition des Systems dauerhaft in RO zu mounten siehe Kapitel Partition permanent RO mounten

Ein Teil des Systems RW mounten

Oft ist es notwendig, dass das Teile des FS Schreibrechte besitzen.

Einige Beispiele:

  • /var/log : Ubuntu, und auch viele andere Linux Distributionen, schreiben Logs in diesen Ordner.
  • /var/lib/urandom : Hier werden Seeds für den Zufallsgenerator (/dev/urandom) gespeichert. Wenn keine Seeds gespeichert werden können, dann funktioniert der Zufallsgenerator nicht mehr zuverlässig.
  • /etc/dropbear : Keys für SSH-Daemon Dropbear
  • /var/lib/dropbear : Ebenfalls Keys für SSH-Daemon Dropbear

Die Ordner können so gemounted werden, dass die Daten nach einem Neustart erhalten bleiben (dauerhaft) oder dass sie nach einem Neustart wieder gelöscht werden (temporär).

Im Kapitel Eingeschränkte RW-Möglichkeiten für bestimmte Funktionen wird beschrieben, wie ein Teil des Systems RW gemountet werden kann.

Partition permanent RO mounten

In der Datei /etc/fstab wird konfiguriert, wie die diversen Partitionen beim Start des Systems gemountet werden. Abhängig von System wird eine oder mehrere Partitionen gemountet.

Um die Partition im read-only Modus zu mounten, muss bei den <options> 'ro' übergeben werden.

Beispiel vorher:

/dev/sda1  /  ext4 nosuid,nodev,nofail,x-gvfs-show 0 0

Beispiel read-only:

/dev/sda1  /  ext4 ro,nosuid,nodev,nofail,x-gvfs-show 0 0

Eingeschränkte RW-Möglichkeinen für bestimmte Funktionen

Um zusätzliche RW-Funktionalität zum RO-FS zur Verfügung zu stellen, gibt es zwei Möglichkeiten

  • Ein oder mehrere Ordner in einem tmpfs mounten → Daten gehen nach Neustart verloren; RAM wird benötigt
  • Eine zusätzliche RW-Partition verwenden → Daten bleiben nach Neustart erhalten; benötigt Platz auf Massenspeicher
  • Mit dem Symlink-Trick können mehrere Ordner an verschiedenen Pfaden in einer RW-Partition verwendet werden

tmpfs

Ein tmpfs oder Temporäres Filesystem ist im Arbeitsspeicher (RAM) gemountet. Es belegt Platz im Arbeitsspeicher und nicht auf einem Massenspeicher. Dadurch kann sehr schnell darauf geschrieben und davon gelesen werden, die Daten sind nach einem Neustart aber verloren.

In diesem Beispiel wird ein Order im tmpfs gemountet. Mit dem 'Symlink-Trick' können aber auch diverse verschiedene Ordner in einer tmpfs-Partition verwendet werden.

tmpfs-Partition erstellen

Im /etc/fstab/ eine tmpfs-Partition mounten:

tmpfs   /var/log    tmpfs    defaults,noatime,nosuid,mode=0755,size=512M 0 0
  • In diesem Beispiel ist das tmpfs 512MByte gross.
  • Die System-Logs werden nach dem nächsten Neustart ins tmpfs geschrieben. Die Logs werden gelöscht, sobald der Rechner herunterfährt.
  • Wenn mehrere verschiedene Ordner im tmpfs gemounted werden sollen, dann muss für jeden Ordner eine neue Zeile hinzugefügt werden. Jeder Ordner erhält den zugewiesenen (size=512M) Speicherplatz.
  • Mit dem 'Symlink-Trick' können auch mehrere verschiedene Ordner in einer tmpfs Partition gemountet werden.

Siehe RW-Partition → Symlink-Trick

RW-Partition

Es kann eine zusätzliche Partition erstellt werden, die beim Systemstart mit RW-Rechten gemountet wird. Die Partition kann sich auch auf einem externen Speicher befinden.

Die Partition kann bereits bei der Installation der Linuxdistribution erzeugt werden (ähnlich wie in dieser Anleitung für Ubuntu). Alternativ können auch bei einem bereits bestehenden System die Partitionen verändert werden. Dazu muss Ubuntu oder ein ähnliches System von einem USB-Stick gebootet werden. Im Anschluss kann Gparted verwendet werden, um eine bestehende Partition zu verkleiner und eine neue Partition im Freien Platz zu erzeugen.

Eine neue erstellte Partition wird standardmässig immer RW gemountet. In der Datei /etc/fstab kann definiert werden, welcher Ordne in dieser Partition gemountet werden soll:

/dev/sda2  /var/log  ext4 nosuid,nodev,nofail,x-gvfs-show 0 0

Mit diesem Trick können mehrere verschiedene Ordner in einer RW Partition gespeichert werden.

sudo mkdir /data
sudo chown user:user /data
mkdir /data/var
sudo mv /var/log /data/var/
sudo ln -s  /data/var/log /var/log

Der /data Ordner kann wahlweise in einem tmpfs oder in einer RW Partition gemountet werden.

Zu beachten

  • Beim ersten Bootvorgang sollte das System als RW gemounted werden:
    • Dropbear schreibt SSH Schlüssel nach /etc/dropbear
    • Andere ähnliche Konfigurationsvorgänge beim ersten Bootvorgang

fscheck

Der fscheck überprüft in regelmässigen Abständen (nach einer gewissen Anzahl Bootvorgängen oder nach einer gewissen Zeit) das Dateisystem beim Boot. Normalerweise dauert dieser Vorgang nur einige Minuten und ist empfehlenswert. Dadurch können Dateien wiederhergestellt werden, deren Schreibvorgang durch einen Systemabsturz oder plötzlichen Stromverlust unterbrochen wurden.

In einem reinen RO-System bringt dieser Check aber keinen Nutzen. Der sporadisch verlängerte Bootvorgang kann sogar sehr störend sein.

fscheck deaktivieren

Eine Partition wird nur Überprüft, wenn die letzte Zahl im /etc/fstab keine 0 ist.

Bsp. für Partition, welche überprüft wird:

/dev/sda1  /  ext4 nosuid,nodev,nofail,x-gvfs-show 0 1

Bsp. für Partition, welche nicht überprüft wird:

/dev/sda1  /  ext4 nosuid,nodev,nofail,x-gvfs-show 0 0

Manueller fscheck

sudo touch /forcefsck 
sudo reboot

Der wird beim nächsten Neustart einmal durchgeführt.

Ubuntu RO-FS

Overlayroot

Mit Overlayroot kann einfach ein RO-FS bei einem Ubuntusystem eingerichtet werden

Probleme

Bei custom Linux-Kernel scheint dies aber nicht richtig zu funktionieren. Nach der Installation bootet Ubuntu ohne Fehlermeldung direkt in den normalen RW-Modus. Dieser Artikel zeigt eine mögliche Lösung, die aber auch nicht garantiert funktioniert

Installation

Ausführliche Anleitung

  1. apt-get install overlayroot
  2. sudo nano /etc/overlayroot.conf
  3. Change overlayroot=„“ to overlayroot=„tmpfs“
  4. Reboot

Test

  1. mount
  2. Wenn die Ausgabe mit overlayroot on / type overlayfs … beginnt, dan funktioniert Overlayroot
overlayroot on / type overlayfs (rw,lowerdir=/media/root-ro/,upperdir=/media/root-rw)
proc on /proc type proc (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
...

Wieder RW mounten (temporär)

Der PC wird nur einmal ohne overlayroot starten. Für eine permanente Deaktivierung siehe nächstes Kapitel.

  1. Reboot
  2. Beim Grub Menu drücke 'e' um die Bootparameter zu ändern
  3. Den Parameter overlayroot=disabled bei der Zeile hinzufügen, die mit linux beginnt.
menuentry 'Ubuntu, with Linux 3.5.0-54-generic (Writable)' --class ubuntu --class gnu-linux --class gnu --class os {
	recordfail
	gfxmode $linux_gfx_mode
	insmod gzio
	insmod part_msdos
	insmod ext2
	set root='(hd0,msdos1)'
	search --no-floppy --fs-uuid --set=root 28adfe9d-c122-479a-ab81-de57d16516dc
	linux	/vmlinuz-3.5.0-54-generic root=/dev/mapper/faramir-root ro overlayroot=disabled
	initrd	/initrd.img-3.5.0-54-generic
}

Wieder RW mounten (permanent)

  1. Temporär mounten wie oben beschrieben
  2. sudo nano /etc/overlayroot.conf
  3. Change overlayroot=„tmpfs“ to overlayroot=„“