Newer posts are loading.
You are at the newest post.
Click here to check if anything new just came in.
09:33

Ext Filesystem Checks vorhersagen

Kernel Updates am Server seiner Wahl einspielen und dann…warten. Warten auf die erlösenden ICMP Antworten. Oder bootet die Kiste doch nicht? Alles dauert verdächtig lange. Auch nach 10 Minuten noch nichts. Gerade wenn man die Zugangsdaten fürs DRAC/ILO rausgekramt hat zeigt sich: Filesystem Check.

Extended Filesystems machen an den folgenden 2 Punkten fest wann fsck’s passieren:

  • Maximale Anzahl von Mounts
  • Zeitliche Abstände zwischen den Routine Checks

Die Informationen stehen im Superblock einer Parition. Das Tool dumpe2fs stellt diese zur Verfügung:

$ dumpe2fs -h /dev/sda1 

Das ganze hab ich dann verskriptet. Es “scanned” alle gemounteten ext Parititonen und warnt einen, falls die maximalen Mounts oder die zyklischen Checks anstehen.

#!/bin/bash
# ext-verify: Verfiy if max mount count or cyclic fsck 
# on ext2,ext3,ext4 filesystems has been reached. 
# Copyright: (C) 2011 Florian Baumann <florian.baumann@noris.net>
# License: GPL-3 <http://www.gnu.org/licenses/gpl-3.0.txt>
# Date: Tuesday 2012-05-04

# Configuration
DUMPE2FS=$(which dumpe2fs)
DUMPOPTS="-h"
WARNC=0

# Security 
if [ -z "$DUMPE2FS" ]; then
    if [ ! -x $DUMPE2FS ]; then
        echo "ERR: Could not find your dumpe2fs"
        echo "ERR: Are you root?"
        exit 1
    fi
fi

# Parsing functions
function get_value () {
    LANG=C $DUMPE2FS $DUMPOPTS $HDD 2>/dev/null | grep "$1" | sed "s#$1s*##" | tail -1
    if [ $? -gt 0 ]; then echo "ERR: Could not find value $1" ; fi
}
function convert_date () {
    if [ -n "$1" ]; then
        date -d "$1" "+%s"
    fi
}

# Scan Mode
if [ -z "$*" ]; then
    for x in $(mount | grep ext | awk '{print $1}'); do
        HDD=$x
        MOUNTED=$(get_value "Mount count:")
        MAXMOUNT=$(get_value "Maximum mount count:")
        NEXT=$(get_value "Next check after:")
        DATENOW="$(date +%s)"
        DATENEXT=$(convert_date "$NEXT")

        if [ ! "$MAXMOUNT" == "-1" ]; then
                if [ $MOUNTED -ge $MAXMOUNT ]; then
                        echo "WARNING: Max mount count on $HDD has been reached. ($MOUNTED/$MAXMOUNT)"  
                        ((WARNC++))
                fi
        fi

        if [ -n "$DATENEXT" ]; then
                if [ $DATENOW -ge $DATENEXT ]; then
                        echo "WARNING: $HDD has reached the next periodically filesystemcheck. ($NEXT)"
                        ((WARNC++))
                fi
        fi

        if [ $WARNC -gt 0 ]; then
            echo "RESULT: A fsck will be executed at the next reboot for $HDD."  
        else
            echo "RESULT: Everything's fine on $HDD."
        fi
    done
fi

exit $WARNC

Das sieht dann unter Umständen so aus:

1
2
3
WARNING: Max mount count on /dev/sda1 has been reached. (29/29)
WARNING: /dev/sda1 has reached the next periodically filesystemcheck. (Sa Apr 7 13:37:58 2012)
RESULT: A fsck will be executed at the next reboot for /dev/sda1.

Natürlich für jede gefundene Partition. Um das jetzt noch am besten irgendwie zu automatisieren hab ich mich entschieden das in apt zu integrieren.

1
2
$ vim /etc/apt/apt.conf.d/09extverfiy
DPkg::Pre-Install-Pkgs   { "if [ -x /usr/local/bin/ext-verify.sh ]; then echo 'Verifying ext Filesystems' ; /usr/local/bin/ext-verify.sh ; fi"; };

Bei jedem apt-get/aptitude wird das nun ausgeführt.

1
2
3
4
5
6
7
8
9
10
11
12
$ aptitude install whois
Die folgenden NEUEN Pakete werden zusätzlich installiert:
  whois
0 Pakete aktualisiert, 1 zusätzlich installiert, 0 werden entfernt und 0 nicht aktualisiert.
Muss 0 B/64,9 kB an Archiven herunterladen. Nach dem Entpacken werden 406 kB zusätzlich belegt sein.
Verifying ext Filesystems
RESULT: Everything's fine on /dev/sda1.
Vormals abgewähltes Paket whois wird gewählt.
(Lese Datenbank ... 48680 Dateien und Verzeichnisse sind derzeit installiert.)
Entpacken von whois (aus .../whois_5.0.10_amd64.deb) ...
Trigger für man-db werden verarbeitet ...
whois (5.0.10) wird eingerichtet ...

Don't be the product, buy the product!

Schweinderl