Ist die Verwendung eines schreibgeschützten Root-Dateisystems eine gute Idee für das Embedded-Setup?

15

Ich wurde beauftragt, Linux als Betriebssystem auf einem eingebetteten Gerät auszuführen.

Das Ziel verfügt über einen x86-Prozessor und ein 8-GB-CompactFlash-Gerät zum Speichern.

Ich habe es geschafft, Buildroot zu verwenden, um das Kernel-Image und die Cross-Compilation-Tools zu erstellen. Ich habe das CF-Gerät in eine kleine FAT-Partition partitioniert, in der sich das Kernel-Image sowie die syslinuxBoot-Konfiguration befinden, und in ein ext3Dateisystem, in dem ich das von buildroot generierte Root-Dateisystem dekomprimiert habe.

Das System wird erfolgreich gestartet, syslinuxindem das Stammverzeichnis auf die CF ext3-Partition festgelegt wird, auf der sich mein Buildroot-Dateisystem befindet.

Meine Frage dreht sich um das Erfordernis der Robustheit angesichts eines sofortigen (und häufigen) Stromausfalls, da es für einen erfolgreichen Start des Geräts nach einem Stromausfall von entscheidender Bedeutung ist. Ich habe gelesen, dass das Mounten des Root-Dateisystems als schreibgeschützt ein Weg ist, die Datenintegrität sicherzustellen. Ist das für mich eine vernünftige Vorgehensweise?

Ich habe auch über die Möglichkeit gelesen, das Root-Dateisystem in den Arbeitsspeicher zu laden, um dasselbe zu erreichen, weiß aber noch nicht, wie das geht.

Gibt es einen bevorzugten Weg, um dieses Ziel zu erreichen, und wenn ja, wie gehe ich am besten vor?

Mathematiker1975
quelle

Antworten:

11

Neue Antwort (22.03.2015)

( Anmerkung: . Die Antwort ist einfacher als zuvor, jedoch nicht sicherer Meine erste Antwort stärker ist , weil Sie Dateien behalten können schreibgeschützt durch fs Mount - Optionen vor . Berechtigungs - Flags So zwingt ein Datei ohne Erlaubnis zu schreiben , schreiben wird nicht funktionieren überhaupt.)

Ja, unter Debian gibt es ein Paket: fsprotect ( Homepage ).

Es verwendet aufs(standardmäßig, könnte aber ein anderes unionfsTool verwenden), um Änderungen an der Live-Sitzung zuzulassen, jedoch standardmäßig im RAM, sodass beim Neustart alles vergessen wird.

Sie können sie einfach installieren, indem Sie Folgendes ausführen:

apt-get install fsprotect

Einmal erledigt, aus dem Online-Dokument:

Danach:

  • Bearbeiten Sie /boot/grub/menu.lstoder /etc/default/grub2oder /etc/lilo.confund fügen Sie " fsprotect=1G" den Kernel-Parametern hinzu.
  • Ändern Sie 1G nach Bedarf.
  • Änderungen übernehmen (dh ausführen update-grub)
  • Bearbeiten /etc/default/fsprotectSie, wenn Sie andere Dateisysteme als schützen möchten /.
  • neustarten

Möglicherweise möchten Sie auch den Bootloader von Grub mit einem Kennwort schützen oder Änderungen daran verbieten.

Von dort, wenn eine Datei gegen Änderungen geschützt ist, zum Beispiel durch

chmod ugo-w myfile

Wenn Sie als Beispiel verwenden vi myfileund versuchen, mit dem Befehl darauf zu schreiben :w!, funktioniert dies und Ihr myfilewurde geändert. Sie können einen Neustart durchführen, um die nicht geänderten Daten abzurufen myfile.

Das ist mit meiner folgenden ersten Lösung nicht einmal möglich:

Alte (erste) Antwort:

Ja, es ist eine starke Lösung, aber leistungsstark!

R / O nutzbar machen

Sie haben einige Verzeichnisse in montieren rw , wie /var, /etcund vielleicht /home. Dies könnte mit aufs oder unionfs geschehen . Ich mag das anders , mit /dev/shmund mount --bind:

cp -a /var /dev/shm/
mount --bind /dev/shm/var /var

Sie könnten vorher alle Verzeichnisse, die sich im normalen Betrieb nicht ändern müssen, in ein verschieben static-var, als Symlinks in / var anzulegen:

mkdir /static-var
mkdir /static-var/cache
mkdir /static-var/lib
mv /var/lib/dpkg /static-var/lib/dpkg
ln -s /static-var/lib/dpkg /var/lib/dpkg
mv /var/cache/apt /static-var/cache/apt
ln -s /static-var/cache/apt /var/cache/apt
... # an so on

Wenn Sie in ro erneut einhängen, nimmt das Kopieren /varin /dev/shmnicht zu viel Platz /static-varin Anspruch, da die meisten Dateien in diesen Ordner verschoben werden und nur Symlinks in den RAM- Speicher kopiert werden sollen.

Der bessere Weg, dies zu erledigen, besteht darin, einen vollständigen Aus- und Wiedereinschaltvorgang durchzuführen, einen Tag voller Arbeit, und einen Befehl auszuführen, der wie folgt lautet:

find / -type f -o -type f -mtime -1

Sie sehen also, welche Dateien sich auf der Lese- / Schreibpartition befinden müssen.

Protokollierung

Da auf diesem Host kein beschreibbarer statischer Speicher vorhanden ist, müssen Sie zum Speichern des Verlaufs und anderer Protokolle einen Remote- syslogServer konfigurieren .

echo >/etc/syslog.conf '*.* @mySyslogServer.localdomain'

Wenn Ihr System aus irgendeinem Grund ausfällt, wird auf diese Weise alles vorher protokolliert.

Upgrade durchführen

Wenn Sie mount --bindein solches Upgrade ausführen, während das System verwendet wird (ohne dass es ausgeführt werden muss init 1, um die Ausfallzeit zu verringern), ist es einfacher, ein sauberes Stammverzeichnis neu zu erstellen , das das Upgrade ausführen kann :

Nach dem erneuten Einhängen von '/' im Lese- / Schreibmodus :

mount -o remount,rw /

for mpnt in /{,proc,sys,dev{,/pts}};do
    mount --bind $mnpt /$mnt$mpnt;
    done

chroot /mnt

apt-get update && apt-get dist-upgrade

exit

umount /mnt/{dev{/pts,},proc,sys,}

sync
mount -o remount,ro /

Und nun:

shutdown -r now
F. Hauri
quelle
Danke für deine Antwort. Ich verstehe es nicht ganz, da meine Linux-Kenntnisse im Moment nicht großartig sind. Es ist jedoch immer noch sehr hilfreich und gibt mir weitere Forschungsbereiche.
Mathematiker1975
Antwort bearbeitet! Neue Lösung und erklärte Unterschiede!
F. Hauri
Dies beantwortet die Frage nicht, es ist eine großartige Antwort für ein Debian-basiertes System, aber Buildroot basiert nicht auf Debian.
LovesTha
@LovesTha Schauen Sie sich die alte (erste) Antwort an ! Dies ist weniger Debian-basiert und U könnte das Prinzip und den Mechanismus für jede Art von Distribution / Installation verstehen. (auch wenn Upgrade Abschnitt Debian Kommandos zeigen, könnte U für die manuelle Aktualisierung oder jede andere distrib basierten Upgrade gleiche tun.)
F. Hauri
Ihre alte Antwort wäre eine großartige Antwort auf eine allgemeine Frage zum Einrichten von schreibgeschützten Linux-Systemen. Nachdem ich meine Erkundung abgeschlossen habe, ob unsere Buildroots schreibgeschützt sind, hoffe ich, dass ich zurückkehren und hier eine großartige detaillierte Antwort auf die spezifische Frage geben kann. Buildroot hat bereits die temporären Bits von / var mit / tmp verknüpft, was ein tempf ist. / etc sollte nicht als Arbeitsbereich für Programme verwendet werden, daher sollte es nicht speziell behandelt werden müssen.
LovesTha
3

Ich habe nur Erfahrung mit einem neueren Buildroot (2014-02). In dieser Version können Sie 'Remount-Root-Dateisystem beim Booten mit Lese- und Schreibzugriff deaktivieren' in der Konfigurationsdatei mit:

BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW ist nicht gesetzt

Ich habe es geschafft, ein Image zu erstellen, das nur seine ext4 / -Partition als schreibgeschützt verwendet, damit das Herausziehen des Stroms aus dem System überhaupt keinen Schaden anrichtet. Es funktioniert großartig, wenn Sie also nicht in Ihr Dateisystem schreiben müssen, ist dies möglicherweise eine viel einfachere Lösung als die oben erwähnte (die mehr oder weniger auf ein Debian-System anwendbar zu sein scheint, da es sich auf apt-get bezieht).

stacksake
quelle
Vielen Dank für die Antwort - aber am Ende habe ich mich für ein initramfs-Setup entschieden, bei dem nur ein paar Verzeichnisse mit Synchronisierungsoption auf dem CF-Laufwerk bereitgestellt wurden, um die Datenbeständigkeit zu gewährleisten. Das hat mir vorerst recht gut getan.
Mathematiker1975
Um dies hinzuzufügen: Verwenden Sie ältere Buildroot-Versionen, und prüfen Sie, /etc/inittabob das erneute Einbinden von /dort erfolgt. Wenn ja, ändern Sie es an Ihre Bedürfnisse.
Evnu
Diese Antwort ist ein wichtiges Stück der "Baumwurzel", um es zu tun. Ein Großteil der Ratschläge in der akzeptierten Antwort wird benötigt, damit komplexere Systeme funktionieren. Es besteht jedoch die Möglichkeit, dass nur ein paar zusätzliche Symlinks zu / tmp (tempfs) eingerichtet werden müssen und alles funktioniert.
LovesTha