Probleme mit Read-Only FS

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo, ich habe hier eine headless-Variante des Rpi am laufen (dietpi). Ich möchte damit zunächst nichts anderes laufen haben als die Programme Pyload und Syncthing.

    Im Normalfall alles auch kein Problem. Da mir aber schon die eine oder andere SD-Karte durch Schreibprozesse während des Abschaltens/Stromausfall etc. über den Jordan gegangen ist suchte ich nach einer Lösung. Die sieht so aus, daß man das Betriebssystem im Normalfall als Read-Only startet und bei Bedarf temporär auf RW setzt. Es gibt da ein paar Hürden in Bezug auf Logdateien etc. (Darf ich hier externe Links posten?)

    Jetzt zum eigentlichen Problem: Syncthing läuft unter /etc/syncthing, das zugehörige Autostart-Script liegt in /etc/init.d. Ist das System im Normalfall also im Zustand Read-Only (RO), funktioniert Syncthing leider nicht. Ich habe noch nicht herausfinden können, was es ist. Pyload habe ich in dieser Umgebung noch nicht probiert, schätze aber dass hier die gleichen Probleme auftauchen könnten. Wäre um jeden Hinweis dankbar.

  • Hallo,

    ich kann ehrlich gesagt dein Problem nicht nachvollziehen...

    Wenn der Storm ausfällt und der OS gerade Daten schreibt, ist im schlimmsten Fall alles kaputt. Ok.

    Dabei spielt es aber so überhaupt _keine_ Rolle, ob das OS temporär auf RW schaltet - Schreiben + Stromausfall = Daten kaputt. Ob das passiert, wenn das OS temporär auf RW ist oder permanent ist dafür doch total Latte.

    Die Lösung wäre wohl eher ein USV für den Rechner.

  • Hi, dann formuliere ich meine Fragestellung mal so um, dass wir nicht über den Sinn oder Unsinn von RO in fstab diskutieren müssen: wie kann ich es anstellen daß ein Daemon (in diesem Fall Syncthing) in einer Read-Only Umgebung funkioniert bzw. wie finde ich heraus, wo ein Programm oder Dienst seine Daten schreibt bzw. wie könnte ich Programm/Dienst XY z.B. in /tmp schicken? Recht schönen Dank.

  • Hallo,

    die Antwort ist einfach: RTFM ;)

    Wo der Speicherort von Daten liegt sollte in der Doku stehen, ebenso wie man den Speicherort ändert (wenn es änderbar ist).

    Normalerweise schreibt ein Programm im laufenden Betrieb auch keine Daten nach `/etc`, da liegen in der Regel nur die Konfigurationsdaten. D.h. sofern du da im laufenden Betrieb aus dem Programm heraus die Konfiguration nicht änderst, sollte hier RO passen.

    Gruß, noisefloor

  • Hi, RTFM sagt mir jetzt nichts. Die Frage ist nicht, wo das Programm sich befindet, sondern ob bzw. wo es Daten speichert. Syncthing ist bei mir unter /etc/syncthing installiert. Die ausführende Datei heißt syncthing.
    whereis syncthing
    syncthing: /usr/bin/syncthing /etc/syncthing
    Das Daemon-Script befindet sich in /etc/init.d, welches die /etc/syncthing/syncthing aufruft.
    Es gibt eine Konfigurationsdatei unter: ~/.config/syncthing/config.xml. Evtl. ist sie es die rw sein müßte? Vielen Dank.

  • Gut, dann fasse ich die hier postulierten Empfehlungen zur, wie ich finde sachlich formulierten Frage aus #1 einmal zusammen:
    1. WTF are you doing, and why?
    2. RTMF
    3. LMGTFY or better GIYS
    Danke, das war wieder sehr hilfreich. Eigentlich braucht man keine Foren, wegen 2. und 3.

  • ..Damit wäre Syncthing installiert..

    Wie der Dokumentation zu entnehmen ist, versucht dieses Programm beim ersten Start einige Dateien zu erzeugen, und zwar in ~/.config/syncthing/. Wenn das Verzeichnis aber schreibgeschützt ist geht das natürlich nicht... Die Standard Einstellung sieht zudem vor das /root/Sync/ verwendet wird.
    Zu allem anderen können Wir Hier aber nichts sagen da Wir nicht Deine Konfiguration kennen.

  • Hallo,

    was grundsätzlich auch geht, wenn das Datei RW braucht, du aber eigentlich RO willst, ist, ein Overlay-FS darüber zu legen. Den Weg gehen z.B. auch die Linux Live-Distros, die von CD booten.

    Da gibt's mehrere Möglichkeiten und auch diverser Overlay-FSs. Ganz trivial zu konfigurieren zu das ganze aber nicht.

    Gruß, noisefloor

  • Hallo meigrafd, ich installiere Syncthing mit diesem Script, welches auf einem Beitrag von Jan Karres basiert: (darf man ext. Links hier hereinstellen?)

    Hier wäre das Start-Script:
    https://gist.github.com/arudmin/5a13e9105814c3f568ec

    Leider reichen meine Linux-Kenntnisse nicht aus, dieses so umzubiegen, dass z.B. die Konfig-Datei ~/.config/syncthing/config.xml sich nicht im Home-Ordner des Users, sondern bswp. auf einem Usb-Stick (sda1) befinden könnte, wo natürlich RW vorgesehen wäre im Gegensatz zu /root bzw. /boot.

    Prinzipiell scheint Syncthing laut Manual auch andere Konfigurationsordner zu akzeptieren: http://docs.syncthing.net/users/syncthing.html

    Vielleicht ist es ja ganz einfach. Ich bringe die Einzelteile jedenfalls nicht selbständig zusammen.

    Worin unterscheidet sich im Ergebnis der von dir vorgeschlagene Weg?
    Welche Fragen wären denn offen zu meiner Konfiguration?

    noisefloor
    Könntest du das bitte am konkreten Beispiel darstellen, was ein Overlay-FS ist?

  • Hallo,


    noisefloor
    Könntest du das bitte am konkreten Beispiel darstellen, was ein Overlay-FS ist?

    Im Wikipedia-Artikel zu aufs ist das IMHO ziemlich anschaulich erklärt.

    Selber rumgespielt habe ich mal mit UnionFS, dass ist aber Jahre her. Von daher kann ich dir da - leider - keine konkreten Tipps geben. Grundsätzlich sollte aber nach erfolgreicher Installation von aufs eine Zeile in der `fstab` reichen. Da müsstest du mal die man-Page von aufs konsultieren, da ist das erklärt.

    Gruß, noisefloor

  • Bevor sich ein offensichtlich blutiger Linux-Anfänger an solch ein Elefant wie AUFs o.ä. setzt würd ich erst mal trivial probieren einfach ein Verzeichnis auf einen externen Datenträger wie einen USB-Stick auszulagern.
    Also USB-Stick mit ext3 formatieren, mounten, Ordner anlegen, Inhalt aus /etc/syncthing/ auf den USB-Stick in den Ordner kopieren und diesen Ordner vom USB-Stick dann über /etc/syncthing/ drüber mounten (einfach dort hin mit RW mounten). Fertig. AUFs macht sozusagen auch nichts anderes, man muss für sowas auch nicht immer extra irgendwas installieren...

    Das is eigentlich keine große Sache und ginge auch recht schnell, um erst mal zu prüfen ob es daran überhaupt liegt.

    Wenn das auch nach einem Reboot funktionieren soll wäre wichtig das der USB-Stick (oder HDD, whatever) immer über das selbe Device ansprechbar ist, was man mit UDEV ereichen kann - oder das der USB-Stick zumindest immer ins selbe Verzeichnis gemountet wird..

    USB-Stick einstecken, mit 'dmesg' prüfen als welches Device dieser erkannt wurde, Linux Dateisystem mit 'mkfs.ext3 /dev/sda1' o.ä. erstellen (formatieren), ein Verzeichnis erstellen wohin der Stick gemountet werden kann 'mkdir /mnt/usbstick', stick mit 'mount /dev/sda1 /mnt/usbstick' mounten, Dateien so kopieren das die Berechtungen etc erhalten bleiben:
    cp -Rup /etc/syncthing /mnt/usbstick
    cp -Rup /home/pi/.config /mnt/usbstick
    Und nun die Ordner über die anderen drüber mounten:
    mount -o bind,rw /mnt/usbstick/syncthing /etc/syncthing
    mount -o bind,rw /mnt/usbstick/.config /home/pi/.config


    Das init.d Script ist fehlerhaft. Führ das mal manuell aus, dann sollte es eigentlich eine Fehlermeldung geben...

    Es wird die Variable $config aufgerufen welche aber nirgends gesetzt wurde. Dabei wird geprüft ob der Inhalt der Variable $config existiert, also eine Datei, und falls nicht kommt eine "Couldn't start syncthing..." Meldung.

    Davon abgesehen wird über dieses Script versucht syncthing als Benutzer pi auszuführen. Du musst also beim installieren auf jeden Fall den Befehl "syncthing" ohne sudo davor ausführen da sonst die config.xml nicht im HOME von pi angelegt wird.
    Sowas immer manuell prüfen (ausführen) und wenn es da bereits nicht geht, kann es auch nicht beim Booten funktionieren.

  • Bezüglich RO-System möchte ich hinweisen auf: Auf Read-Only umstellen
    Dort werden die Bereiche, auf die Raspbian üblicherweise Schreibzugriffe erlaubt haben will, per unionfs mit RAM hinterlegt.
    Verzeichnisse, in die ein spezielles Programm schreiben will, müssen entweder auf einen USB-Stick ausgelagert oder auch mit RAM hinterlegt werden.

    Marcus

  • Hi, ich habe die Tage noch zwei Sachen zum Thema gefunden. Zum einen ein auf RO schon von vornherein abgestimmtes OS.

    http://nutcom.hu/ipe-r1-vs-r2/

    Für den Anfänger wie mich ist sicherlich IPE V1 zu empfehlen. Ich teste das heute mal aus.

    Das andere wäre ein Posting aus einem Fremdforum. Ich zitiere:
    https://raspberrypi.stackexchange.com/questions/7978…rupted-so-often

    Question

    I get an I/O error at boot and then get this 'error': (I am running the latest version of Raspbian)

    Entering kdb (current=0xca82ac80, pid 1) due to keyboard entry
    kdb> _

    And I have seen it before, and was explained that my SD card got corrupted since I did not shutdown correctly. One week later, I didn't deal with this error, until the power flickered on/off thrice and now I can't boot again. It seems like I am re-preparing my SD card ever day!!! I don't like this, not to mention I love my Pi's capabilities. But this 'breakpoint' is driving me crazy! Is there some way I can prevent this or strengthen something so it doesn't happen if the power goes out? Any suggestions? Thanks!

    P.S. My zip file was not corrupted and my extraction service is Win32DiskImager

    Answer

    I'm not going to write about checking your HW and compatible SD card lists, because you most probably have already checked all these. What I'm about to write is the permanent solution, that allows to nip the problem in the bud, and permanently fix the issue.

    If you don't want your SD card to get broken when you flip the power switch, you have to use it in a read-only mode. If there's nothing being written to your SD card, it won't get damaged no matter what you do.

    Obvious (but non-working) solution would be an attempt to flip "read-only" switch on the side of the SD card, unfortunately this does not work because the schematics shows this switch is routed nowhere and its position is generally ignored.

    Another, more subtle (but working) approach would be modifying your /etc/fstab to mount all your partitions read-only. The drawback of this approach is your logs have to be written somewhere else (USB stick, RAM drive?) and in case of RAM drive the logs won't persist during reboot. To do this:

    Copy an RPi image to your SD card using any method you like.
    Boot from SD and raspi-config will start automatically. Do not "Expand filesystem", just set up your time zone and international settings.

    Run sudo fdisk /dev/mmcblk0, press 'p' to print the current partition table. Then enter the following commands:

    n Create a new partition
    [enter] Make a primary partition
    [enter] Use the default number
    [#] 1 greater than the end of mmcblk0p2
    [enter] Expand to the end of the SD card
    w Write the partition table and exit

    Edit /etc/fstab. It should look something like the following:

    proc /proc proc defaults 0 0
    /dev/mmcblk0p1 /boot vfat ro 0 0
    /dev/mmcblk0p2 / ext4 ro 0 0
    /dev/mmcblk0p3 /home ext4 defaults,errors=remount-ro 0 1
    none /var/run ramfs size=1M 0 0
    none /var/log ramfs size=1M 0 0

    Run sudo partprobe to recognize the new partition.
    Format your new partition with sudo mkfs --type ext4 /dev/mmcblk0p3.
    Reboot.

    If for some reason you need to make changes to your system, you can remount the read-only partitions with write access:

    sudo mount -o remount,rw /dev/mmcblk0p2

    Welche Methode würdet ihr bevorzugen?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!