Postsync: /etc/fstab in linuxclient patchen

Hallo Klaus @garblixa,

endlich komme ich dazu diesen Bug Client starts with root partition mounted readonly after installation · Issue #12 · linuxmuster/linuxmuster-client-servertools · GitHub versuchen zu verstehen.

Danke für die Rückmeldung.

lies mal post 3 zuerst…

Vollkommen richtig, dass der sed-Befehl schief laufen kann. Ich lagere dieses Problem mal in einen eigenen Thread hier aus, damit wir das klären können.

ähnliche Posts:

Historie:
Irgendwie sah das automatische fixen der fstab früher so aus:

#!/bin/sh
if [ -e /mnt/etc/fstab ]; then
    echo " - fixing fstab"
    swap_part=$(fdisk -l | grep swap | awk '{print $1}')
    swap_fstab=$(grep swap /mnt/etc/fstab | awk '{print $1}')
    if [ $swap_part != $swap_fstab ]; then
            echo "      Swap:          $swap_part"
            echo "      Swap in fstab: $swap_fstab"
            sed -i "s|^\(.*\)\(none\s*swap\)\(.*\)|${swap_part} \2 \3|" /mnt/etc/fstab
    fi
    for i in $(grep ^/dev /mnt/etc/fstab | awk '{print $1}'); do
        if [ ! -b $i ]; then
                dev=$(echo $i | awk -F/ '{print $3}')
                sed -i "/$dev/d" /mnt/etc/fstab
        fi
    done
    echo "      - done"
fi

Da wurde die SWAP partition richtig gesetzt und alle anderen Partitionen, gelöscht. Ich weiß nicht genau, wie dass dann im 6.x-er System auf dem client aussah, ob dann ROOT gar nicht mehr in /etc/fstab drin war, oder eben nicht über postsync gepatcht.
Ist ja auch egal. Jedenfalls weiß ich nicht, wer sich das SED-Skript:


STARTCONF=/start.conf
FSTAB=/mnt/etc/fstab

if [ -e $FSTAB ]; then
    echo -n " - fixing fstab: "
    ROOT=$(sed ':a;N;$!ba;s/\n/;UMBRUCH;/g' $STARTCONF | sed 's/ //g'|sed 's/\[Partition\]/\n/g' | grep -i 'fstype=ext4' | sed 's/;UMBRUCH;/\n/g' | grep -i 'dev=/' | cut -d'=' -f2 | head -c20 | cut -d"#" -f1)
    echo -n "root: $ROOT, "
    sed -i "s#\#dummyroot#$ROOT#g" $FSTAB
    SWAP=$(sed ':a;N;$!ba;s/\n/;UMBRUCH;/g' $STARTCONF | sed 's/ //g'|sed 's/\[Partition\]/\n/g' | grep -i 'fstype=swap' | sed 's/;UMBRUCH;/\n/g' | grep -i 'dev=/' | cut -d'=' -f2 | head -c20 | cut -d"#" -f1)
    echo -n "swap: $SWAP, "
    sed -i "s#\#dummyswap#$SWAP#g" $FSTAB

    echo "done"
fi

ausgedacht hat.

Dein Problem:

Ja, weitere Probleme könnten sein, dass die Partitionen gar nicht mit ext4 formatiert worden sind, sondern ext2, ext3, btrfs, zfs, usw. aber lassen wir die außen vor, muss nur dokumentiert werden.

Das halte ich momentan auch für sehr schlau. Ich weiß auch gar nicht, warum wir das nicht so gemacht haben bisher. Evtl. gibt es da auch Haken.

Es wäre nett, wenn wir mit deiner Hilfe hier eine Lösung finden könnten, die richtige Sektion [OS] zu parsen und dann das richtige „Root=“ Device herauszufinden.
Ist das eine allgemein gültige Lösung? Ich kenne die Label-Diskussion nicht wirklich, aber davon ist das hier nicht abhängig, ob man labels für paritionen vergeben hat oder nicht, oder?

Um die richtige [OS] Sektion zu erhalten, wäre es gut, wenn LINBO postsync uns verraten könnte, welches OS denn gerade gesynct wird. Hm, ich suche mal danach.

VG, Tobias

Achso, ich vergaß: dein fix/workaround spuckt bei manchen von meinen start.confs auch mehrere /dev/sda1 usw. aus.
Vermutlich weil ich da dualboot systeme drin habe. Deswegen wäre es erstrebenswert es richtig zu machen mit einem OS-abhängigen patch.

Hi nochmal.
Bei meiner Recherche stoße ich darauf, dass es eine Funktion patch_fstab in linbo gibt, das:

# tschmitt
# patch fstab with root partition and root fstype: patch_fstab rootdev
patch_fstab(){
 echo -n "patch_fstab " ;  printargs "$@"
...

macht. Ich checke das nochmal. Dann wäre das ROOT-Device im postsync zu patchen völlig veraltet und überflüssig.
Vg, Tobias

Hm,

auch wieder falsch: LINBO macht beim linuxclient:
a.) führt update_grub im chroot aus
b.) patched den .ssh/authorized_keys
c.) patched den hostname
d.) patched die fstab für $rootdev

was dann aber folgt ist der postsync und selbst wenn LINBO die fstab schon richtig gesetzt hat, so wird sie wieder beim postsync überschrieben, weil es dort ein fstab gibt (und auch ein .ssh/authorized_keys)
Jetzt bin ich auch ratlos: wenn es noch die SWAP-PArtition in linboschaffen könnte, dann brauchen wir dieses Patchen der fstab gar nicht mehr.

vG, Tobias

Hallo @thomas ,
Ich habe das Verhalten von LINBO bezüglich eines Linuxclients mal hier: https://github.com/linuxmuster/linuxmuster-linbo/wiki/Synchronisation dokumentiert. Ich konnte und musste das direkt tun, weil es für wiki in github keine PR-Möglichkeit gibt, soviel ich sehe.
Ich hoffe, das ist ok so.

Viele Grüße, Tobias

Hi @garblixa,

ich denke, ich habe jetzt eine andere Lösung gefunden. „rootdev“ wird als Variable in postsync exportiert. Damit lässt sich ohne großes grep/sed und anderer schweinerei ganz einfach die fstab fixen.

ICh schlage den fix jetzt so vor:

  • im generischen postsyncscript:
export ROOTDEV=$rootdev

hinzufügen
und jetzt in 03-lcst-fix-fstab die Ersetzung entsprechend durch $ROOTDEV machen:

STARTCONF=/start.conf
FSTAB=/mnt/etc/fstab

if [ -e $FSTAB ]; then
    echo -n " - fixing fstab: "
    echo -n "root: $ROOTDEV, "
    sed -i "s#\#dummyroot#$ROOTDEV#g" $FSTAB
    SWAP=$(sed ':a;N;$!ba;s/\n/;UMBRUCH;/g' $STARTCONF | sed 's/ //g'|sed 's/\[Partition\]/\n/g' | grep -i 'fstype=swap' | sed 's/;UMBRUCH;/\n/g' | grep -i 'dev=/' | cut -d'=' -f2 | head -c20 | cut -d"#" -f1)
    echo -n "swap: $SWAP, "
    sed -i "s#\#dummyswap#$SWAP#g" $FSTAB

    echo "done"
fi

Aber noch besser wäre es doch, man würde /etc/fstab überhaupt nicht im postsync als vorlage brauchen und dann in 03-lcst-fix-fstab gleich automatisch swap + root ersetzen.
Dass das sicher geht, glaube ich schon. Ich hab bloß keinen Nerv, das zu testen :frowning:
VG, Tobias

Ok. Der Thread ist generisch genug.
Ich habe die Idee, gleich auch die Labels mit einzubeziehen, dann würde

a.) man die reguläre fstab aus der Grundinstallation nehmen oder eine ähnliche auf dem Masterclient funktionierende
b.) LINBO hat die funktion patch_fstab(), welche das Root-device richtig auf /dev/sda1 / ext4 ...usw setzt
c.) das generische Postsync script reicht alle funktionen von LINBO weiter
d.) das postsync-script 03-lcst-fix-fstab schreibt: labels, wenn welche in der start.conf definiert wurden, korrigiert mit Hilfe von patch_fstab() das root-device und korrigiert dann noch das swapdevice, wenn eines definiert ist.

Falls das hier jemand liest: verwendet jemand Labels und bearbeitet sie mit Hilfe von postsync-skripten?

VG, Tobias

Hallo Tobias,

die Swap-Pattition sollte man gar nicht in die fstab aufnehmen. Beim Booten werden dann automatisch alle vorhandenen Swap-Partitionen eingerichtet.

Beste Grüße

Jörg

1 „Gefällt mir“

Hallo Jörg,

danke für den Input. Ich kann das an meinem Ubuntu testen und dort auch mal proaktiv jegliche swap-Partitionen löschen, wenn sie in der /etc/fstab auftauchen. Wenn du meinst, dass das gerade als Standard, sagen wir ab 16.04 funktioniert, wäre das schon ein Dilemma weniger.
Vg, Tobias

Hi Jörg,
also zumindest in meinem ubuntu 18.04 Mate bedeutet ein Entfernen von /dev/vda3 , die als SWAP formatierte Partition nicht automatisch eingebunden wird.
k.A. das Mate ist aber auch hochgewachsen. Möglich, dass es bei neuinstallation anders wäre.
Ich würde also vorsichtshalber SWAP noch drin lassen.

Vg, Tobias

Hallo Tobias,

vielen Dank für Deine Recherche nach einer Lösung!
Der Vorschlag in meinem Bugreport ist ganz sicher nur eine Krücke.

Ich habe mir Deine Postings durchgelesen und finde die Möglichkeit die aus linbo_cmd bereits existierende Variable $rootdev zu verwenden genial.

Also so:

sed -i "s#\#dummyroot#$rootdev#g" $FSTAB
echo -n "root: $rootdev, "

Ein weiterer Export der Variable ist anscheinend nicht nötig.

Allerdings frage ich mich, warum die /etc/fstab des Clients nicht durch linbo_cmd bereits richtig geschrieben wird. Denn wenn ich 03-lcst-fix-fstab weglasse, dann wird die /etc/fstab nicht angepasst. Es scheint so, als ob patch_fstab() in linbo_cmd nicht ausgeführt wird. Ich habe es nur noch nicht geschafft, das zu debuggen.
Generell wäre es doch klasse, wenn man die swap Partition auch gleich durch linbo_cmd schreiben lassen würde - also vorausgesetzt das würde auch für $rootdev funktionieren.

Zum Thema swap:
Einen Eintrag in /etc/fstab braucht es auch in aktuellen Ubuntu Versionen, also z.B. Mint 20.

Viele Grüße
Klaus

Also patch_fstab() wird in linbo_cmd doch ausgeführt und es wird auch eine richtige fstab unter /mnt/etc/fstab mit korrektem $rootdev geschrieben.
Allerdings weiß ich zuwenig über die Abläufe in linbo um einschätzen zu können, warum diese fstab nicht am Client ankommt.

Viele Grüße
Klaus

Hallo,

Zum Thema swap:
Einen Eintrag in /etc/fstab braucht es auch in aktuellen Ubuntu
Versionen, also z.B. Mint 20.

die Annahme kam vielelicht daher, dass ein neueres ubuntu auch ohne swap
Partition installeirt werden kann: es verwendet dann eine swapdatei die
keinen Eintrag benötigt.

LG

Holger

Hallo Klaus,

Also |patch_fstab()| wird in linbo_cmd doch ausgeführt und es wird auch
eine richtige fstab unter /mnt/etc/fstab mit korrektem $rootdev geschrieben.
Allerdings weiß ich zuwenig über die Abläufe in linbo um einschätzen zu
können, warum diese fstab nicht am Client ankommt.

hast du möglicherweise vergessen die fstab aus dem
/srv/linbo/linuxmuster-client/bionic/common/etc/ Verzeichnis raus zu nehmen?
Und/oder den Eintrag in der postsyncdatei selbst?

LG

Holger

Hallo Holger,

Ja natürlich, danke für den Hinweis!
/srv/linbo/linuxmuster-client/bionic/common/etc/fstab war noch da.

Florian hatte es ja auch schon in Post 4 geschrieben, aber ich hatte es nicht verstanden:

Heißt also jetzt, wenn man in linbo_cmd einbauen könnte, daß auch Swap Partitionen in die fstab geschrieben werden, dann bräuchte man /srv/linbo/linuxmuster-client//common/etc/fstab nicht mehr und auch nicht /srv/linbo/linuxmuster-client//common/postsync.03-lcst-fix-fstab

Viele Grüße
Klaus

Hallo Holger,

Aber irgendwo muß auch die Swapdatei definiert werden. Entweder in /etc/fstab, oder mit anderen Skripten/Tools und swapon/swapoff

Viele Grüße
Klaus

Ja, man könnte sicher in linbo auch noch einbauen, dass eine SWAP-partition korrekt in /etc/fstab eingetragen wird. Dann ist die ganze Sache in den externen postsync skripten hinfällig.
Sobald aber jemand noch anderes in /etc/fstab bringen will, muss er sich selbst um a.) das kopieren der /etc/fstab und b.) das korrekte patchen der fstab auf Grundlage der jeweiligen Partition kümmern.

  • Wenn es keine Swappartition gibt, dann legt mein Ubuntu Mate im Laufenden System, also beim Booten auch keine swapdatei an. Wie gesagt, vllt. liegt es an meinem gewachsenen System.
  • Wer allerdings neu installiert, bei dem wird ja evtl. eine swapdatei angelegt - z.B. wer mit einem linuxclient von scratch anfängt. Eine swap-datei, die in einem CLOOP-image landet ist natürlich hirnrissig.
  • Es ist also sowohl für bereitgestellt wie neu installierte Linuxclients weiterhin sinnvoll swappartitionen zu erstellen und einzubinden. Allerdings hab ich weiterhin keine eigene Erfahrung, dass bestehende swappartitionen automatisch eingebunden werden würden, also ohne /etc/fstab
    Eintrag.

Folglich: @klaus ,willst du versuchen, im Stil von patch_fstab in die Funktion noch einen swappartitions-eintrag zu programmieren? Dann stellen wir einen PR für linuxmuster-linbo und dann wird das im postsync und allen linuxclients obsolet.
Vg, Tobias

Das habe ich nicht ganz verstanden. Es könnte auch eine Lösung des Problems sein, denn ab 18.04 wird glaube ich gar keine Swappartition mehr angelegt, sondern eine Datei verwendet. Wenn man sie direkt mit im Cloop hat, muss man nur noch die Rootpartition patchen.

Oder stehe ich auf dem Schlauch?

vG Stephan

Hallo Stephan,
nein, eher ich stehe auf dem Schlauch. Sowohl du als auch Jörg haben sich eindeutig geäußert, dass wohl keine partition mehr standardmäßig angelegt wird und beim booten automatisch eine swapdatei erzeugt wird.
Ich habe bloß angemerkt, dass das bei meinem ubuntu mate 18.04 nicht passiert. Evtl. also auch bei anderen Systemen nicht.

So, und jetzt ist die Frage, ob man eine 2GB oder größer swapdatei im Cloop haben will, da werden doch unnötig non-zero random bytes komprimiert, durchs Netzwerk geschoben und dekomprimiert. Das würde ich nicht zum Standard erheben wollen, oder?
Mit standard meine ich, dass das in den bei download.linuxmuster.net hochgeladenen cloops ja besser mit einer swappartition gemacht werden sollte.

Oder man macht sich die Mühe, swapdateien vor der Image-erstellung immer zu löschen.

Sagen wir es mal so: es wäre nicht falsch, würde LINBO direkt oder beim postsync checken, ob es eine swappartition gibt und die in /etc/fstab patchen. Nur wenn dann ubuntu noch zusätzlich eine swap-datei beim Booten anlegen will, ist es Zeit/Ressourcenverschwendung des PCs beim Booten.

VG, Tobias

Die Swapdatei kann man vor Imageerstellung leeren.

Muss es nicht, denn sie ist ja im Image (z.B. /swapfile). Siehe auch hier: Swap › Wiki › ubuntuusers.de

vG Stephan