====== 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 '''' '''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. === Symlink-Trick === 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 [[https://askubuntu.com/questions/343268/how-to-use-manual-partitioning-during-installation | 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 === Symlink-Trick === 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. [[https://yulistic.gitlab.io/2016/05/overlayroot-not-working-with-custom-kernel/ | Dieser Artikel]] zeigt eine mögliche Lösung, die aber auch nicht garantiert funktioniert === Installation === [[https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/|Ausführliche Anleitung]] - ''apt-get install overlayroot'' - ''sudo nano /etc/overlayroot.conf'' - Change ''overlayroot=""'' to ''overlayroot="tmpfs"'' - Reboot === Test === - ''mount'' - 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. - Reboot - Beim Grub Menu drücke 'e' um die Bootparameter zu ändern - 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) === - Temporär mounten wie oben beschrieben - ''sudo nano /etc/overlayroot.conf'' - Change ''overlayroot="tmpfs"'' to ''overlayroot=""''