[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: periodisches fschk beim Server? (zweiter Versuch)



Am Freitag, 3. Juni 2011 schrieb Sven Hartge:
> Jan Kappler <public@jan-kappler.de> wrote:
[...]
> > Ich habe gelesen, prinzipiell könnte man das mit CRON realisieren.
> > Ich habe keine Erfahrung mit CRON, das wäre aber sicher nicht das
> > Problem. Allerdings geht fschk nur bei nicht gemounteten
> > Dateisystemen, zumindest interpretiere ich das so, also wird die
> > Sache viel komplizierter.
> 
> Man kann e2fsck mit "-n" aufrufen, damit er die Checks nur read-only
> macht. Dies wird aber, da sich das Dateisystem ja dennoch ändert, viele
> false-positives liefern, ist also keine sichere Aussage, ob ein Problem
> besteht oder nicht.
> 
> Und selbst, wenn man vorher einen Snapshot mittels LVM macht, ist das
> Dateisystem dirty, wird also auch wieder mindestens eine Meldung
> diesbezüglich liefern.

Auch nach

- mount -o remount,ro /mountpunkt

?

Eigentlich müsste das Dateisystem dann alle noch ungeschriebenen Daten auf 
die Platte schreiben. Allerdings weiß ich nicht, ob das auch für das 
Journal zutrifft. Da gibts aber zumindest bei Ext auch eine Möglichkeit:

- mount -o remount,commit=2 /mountpunkt
- sleep 5
- mount -o remount,ro /mountpunkt
- mount -o remount,commit=<was immer cat /proc/mounts da vorher zeigte> 
/mountpunkt

Nun, allerdings würde ich schon erwarten, dass das Dateisystem bei einem 
Read only-Remount einen konsistenten Zustand herstellt.

Ein kleiner Test zeigt, wie es gehen kann.

Keiner schreibt auf /boot:

merkaba:~> fsck -n /dev/sda3
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
boot: sauber, 304/73440 Dateien, 53513/292864 Blöcke

merkaba:~> fsck -fn /dev/sda3
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
boot: 304/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke

Nun schreibt

merkaba:~> while true ; do touch /boot/test ; sleep 0.2 ; done

auf /boot:

merkaba:~> fsck -fn /dev/sda3
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73136, gezählt=73135).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 304/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~#4> fsck -fn /dev/sda3
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73136, gezählt=73135).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 304/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke


Und jetzt mit Read Only Remount:

merkaba:~#4> mount -o remount,ro /boot
merkaba:~> fsck -fn /dev/sda3       
fsck from util-linux-ng 2.17.2
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
boot: 305/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~> mount -o remount,rw /boot


Allerdings:

merkaba:~> while true ; do touch /boot/test ; sleep 0.2 ; done
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
touch: kann „/boot/test“ nicht berühren: Das Dateisystem ist nur lesbar
^C#   


Wer das Risiko eingehen kann und möchte, dass Dienste / Anwendungen ihre 
Daten nicht schreiben können, der kann, so wie es hier aussieht, zumindest 
ein Ext-Dateisystem auch dann prüfen, wenn es noch gemountet ist.

Eine andere, durchaus auch riskante Möglichkeite wäre, Schreibzugriffe auf 
das Dateisystem so lange zu unterbinden, wie das Prüfen dauert. Riskant, 
weil der Kernel dann Hauptspeicher-technisch in Bedrängnis geraten kann.

Okay, auch das nochmal mit einem verläßlicheren Schreibtest:

I=0; while true ; let I=I+1 ; do touch /boot/test$I ; sleep 0.2 ; done

Das Anlegen nur einer Datei triggert nur am Anfang, wenn Ext irgendwann 
die Datei mal geschrieben hat, nicht mehr unbedingt.



merkaba:~> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73134, gezählt=73116).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 306/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~#4> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73134, gezählt=73110).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 306/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~#4> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73134, gezählt=73104).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 306/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~#4> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73134, gezählt=73099).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 306/73440 Dateien (1.3% nicht zusammenhängend), 53513/292864 Blöcke
merkaba:~#4> fsfreeze -f /boot                                                     
merkaba:~> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
boot: 370/73440 Dateien (1.4% nicht zusammenhängend), 53515/292864 Blöcke
merkaba:~> fsfreeze -u /boot      
merkaba:~> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Warnung: Überspringe Journal-Wiederherstellung, da das Dateisystem im Nur-
Lesen-Modus ist.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
Die Anzahl freier Inodes ist falsch (73070, gezählt=73064).
Repariere? nein


boot: ********** WARNUNG: Noch Fehler im Dateisystem  **********

boot: 370/73440 Dateien (1.4% nicht zusammenhängend), 53515/292864 Blöcke
merkaba:~#4> fsfreeze -f /boot      
merkaba:~> fsck.ext4 -fn /dev/sda3
e2fsck 1.41.12 (17-May-2010)
Warnung!  /dev/sda3 ist eingehängt.
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
boot: 400/73440 Dateien (1.3% nicht zusammenhängend), 53515/292864 Blöcke
merkaba:~>


Der entscheidende Unterschied während des fs_freeze:

merkaba:~> I=0; while true ; let I=I+1 ; do touch /boot/test$I ; sleep 0.2 
; done
^C#                                                                                                              
merkaba:~#130> rm /boot/test*

Also keine Fehler in der Anwendung. Das Dateisystem schreibt die Dateien 
nach dem Unfreeze.

Erforderlich hierfür ist entweder

merkaba:~> apt-show-versions | grep util-linux
util-linux/experimental uptodate 2.19.1-1

oder

merkaba:~> dpkg -S $(which xfs_freeze) 
xfsprogs: /usr/sbin/xfs_freeze

Wobei xfs_freeze möglicherweise auch nur mit XFS-Dateisystemen 
funktioniert.

Und ich würde es vor dem Praxis-Einsatz immer erstmal wie oben geschehen 
mit dem Dateisystem meiner Wahl *testen*.

Besonders schön ist die Freeze-Geschichte dann natürlich mit Snapshots:

- /etc/init.d/mysql stop - oder besser "Mach mal konsistent"-Anweisung via 
MySQL-Client
- sync; fsfreeze -f /mountpount
- merkaba:~> btrfs subvolume snapshot / /schnappschnuss-2011-06-04 
Create a snapshot of '/' in '//schnappschnuss-2011-06-04'
merkaba:~>
- Ganz wichtig immer: fsfreeze -u /mountpunkt
- MySQL mach weiter


Dabei kommt es jedoch drauf an, genau zu verstehen, was da vor sich geht.
Bislang für mich ungeklärte Fragen:

1) Ist der Sync vor dem fsfreeze erforderlich, um zu garantieren, dass die 
MySQL-Datenbank in ihrem konsistenten Zustand auf der Platte gelandet ist? 
Wenn ja, wie vermeide ich das kurze Zeitfenster zwischen sync und freeze? 
Ich verstehe

       -f, --freeze
              This  option requests the specified a filesystem
              to be frozen from new modifications.  When  this
              is  selected,  all  ongoing  transactions in the
              filesystem are allowed to  complete,  new  write
              system  calls are halted, other calls which mod‐
              ify the filesystem are  halted,  and  all  dirty
              data,  metadata, and log information are written
              to disk.  Any process attempting to write to the
              frozen  filesystem  will  block  waiting for the
              filesystem to be unfrozen.

              Note  that  even  after  freezing,  the  on-disk
              filesystem can contain information on files that
              are still in the process  of  unlinking.   These
              files  will not be unlinked until the filesystem
              is unfrozen or a clean mount of the snapshot  is
              complete.

aus der fsfreeze-Manpage ja so, dass es im Grunde einen Sync macht...

2) Ist überhaupt das fsfreeze erforderlich oder macht btrfs subvolume 
snapshot das implizit?

Solange ich das nicht besser weiß würde ich aber sync, fsfreeze und 
snapshot kurz aufeinanderfolgend machen - und hoffen, damit weg zu kommen.

Ciao,
-- 
Martin 'Helios' Steigerwald - http://www.Lichtvoll.de
GPG: 03B0 0D6C 0040 0710 4AFA  B82F 991B EAAC A599 84C7

Attachment: signature.asc
Description: This is a digitally signed message part.


Reply to: