blog.bartlweb - a technologist's external brain

Filesystem-Checks fsck unter Linux händeln

Wer kennt das Problem nicht: Immer dann wenn der Server-Reboot schnell gehen muss wird wieder eine automatische Überprüfung des Dateisystems durchgeführt - und das kann dauern.

Parameter für den Neustart

Darum gibt es die Möglichkeit über den Shutdown-Befehl die Überprüfung beim Reboot expliziet zu verhindern oder zu erzwingen.

Filesystem-Check verhindern

shutdown -f -r now

Filesystem-Check erzwingen

shutdown -F -r now

Überprüfungsintervall auslesen und anpassen

Die wichtigsten Parameter im Zusammenhang mit der automatischen Überprüfung sind: mount count, maximum mount count, last checked, check interval, next check after. Diese lassen Sich für jede Partition über den folgenden Befehl abrufen:

tune2fs -l /path/to/device

Über diesen Befehl lassen sich die Voreinstellungen der einzelnen Parameter auch ändern.

Skript für den schnellen Überblick

Das folgende Skript liest die wichtigsten Parameter (Anzahl der Mounts, Zeit und Mount-Anzahl bis zum nächsten fsck, etc.) für alle Partitionen aus und stellt diese übersichtlich dar.

#!/usr/bin/perl -w
 
use strict;
 
my $mountcount = 0;
my $maxmount = 0;
my $nextmount = 0;
my $nextmount_str = "";
my $dev;
my $mountpoint = "";
my $fstype = "";
my $lastcheck = "";
my $nextcheck = "";
my $checkinterval = 0;
my $view = "";
 
my $cmd = "mount";
 
if($ARGV[0]){
    $view = $ARGV[0];
}
 
if($view eq '-h') {
    printf "fsck (file system check) status for mounted devices\n";
    printf "\n";
    printf "-l   list more details\n";
    exit;
}
 
open MOUNT, sprintf ( "%s |", $cmd ) or die sprintf ( "ERROR: Cannot execute %s - %s\n", $cmd, $! );
while ( <MOUNT> ) {
    chomp;
    ( $dev, undef, $mountpoint, undef, $fstype, undef ) = split;
 
    if ( $fstype =~ /^ext/i ) {
        $cmd = sprintf "dumpe2fs -h %s 2>&1", $dev;
        open DUMPE2FS, sprintf ( "%s |", $cmd ) or die sprintf ( "ERROR: Unable to execute %s - %s\n", $cmd, $! );
        while ( <DUMPE2FS> ) {
            chomp;
            if ( /^Mount count:/ ) {
                ( undef, $mountcount ) = split /:/;
                $mountcount =~ s/\s*//g;
            }
            if ( /^Maximum mount count:/ ) {
                ( undef, $maxmount ) = split /:/;
                $maxmount =~ s/\s*//g;
            }
            if ( /^Last mount time:/ ) {
                ( undef, $lastcheck ) = split /Last mount time:/;
                $lastcheck =~ s/^\s*//g;
            }
            if ( /^Next check after:/ ) {
                ( undef, $nextcheck ) = split /Next check after:/;
                $nextcheck =~ s/^\s*//g;
            }
            if ( /^Check interval:/ ) {
                ( undef, $checkinterval ) = split /Check interval:/;
                $checkinterval =~ s/^\s*//g;
            }
        }
        close DUMPE2FS;
 
        $nextmount = $maxmount - $mountcount;
 
        if($view eq '-l') {
            printf "----------------------------------------------------------------\n";
            printf $dev . " (" . $mountpoint . ")\n";
            printf "----------------------------------------------------------------\n";
            printf "device:                      " . $dev . "\n";
            printf "filesystem:                  " . $fstype . "\n";
            printf "mountpoint:                  " . $mountpoint . "\n";
            printf "last checked:                " . $lastcheck . "\n";
            printf "check interval:              " . $checkinterval . "\n";
            printf "actual mounts without check: " . $mountcount . "\n";
            printf "check every x mounts:        " . $maxmount . "\n";
            printf "\n";
            printf "next check after:            " . $nextcheck . "\n";
            printf "check after mounts:          " . $nextmount . "\n";
            printf "\n\n";
        } else {
            if($nextmount < 10) {
                $nextmount_str = " " . $nextmount;
            } else {
                $nextmount_str = $nextmount;
            }
 
            printf "%s will be checked in %s mounts or at least after %s (%s, %s)\n", $dev, $nextmount_str, $nextcheck, $fstype, $mountpoint;
        }
    }
}
close MOUNT;

Dieser Artikel hat Dir deinen Tag gerettet?

... und mühevolles Probieren, Recherchieren und damit Stunden an Zeit gespart? Oder einfach nur Dein Problem gelöst?

Dann würde ich mich freuen, wenn Du meine Zeit für die Erstellung dieses Blogartikels mit einer kleinen Anerkennung honorierst:

Zahlung mit PayPal oder Kreditkarte.

Hinweis zur Verwendung

Die Übermittlung einer Zahlung ist eine persönliche Anerkennung Ihrerseits an den Entwickler (Christian Bartl, Privatperson). Eine Zahlung ist nicht zweckgebunden und es ist keine Gegenleistung zu erwarten. Bitte beachten Sie, dass für eine übermittelte Zahlung keine Quittung ausgestellt werden kann.

Über den Autor

Christian Bartl

Christian Bartl Requirements Engineer
& Solution Architect für Online und Mobile

Als Technologie-Enthusiast und begeisterter Programmierer entwickle ich in meiner Freizeit Websites, Software und IT-Lösungen, die mir selbst und anderen den Alltag vereinfachen.

mehr auf christian.bartl.me

Kommentare

Noch kein Kommentar vorhanden.
Sei der Erste! - Ich freue mich über deine Anmerkung, Kritik oder Frage.

Kommentar schreiben

Der hier angegebene Name wird gemeinsam mit deinem Kommentar auf der Website veröffentlicht.

Deine E-Mail-Adresse wird zur einmaligen Benachrichtigung bei Veröffentlichung des Kommentars genutzt.

Benachrichtigung per E-Mail über Antworten auf meinen Kommentar erhalten.

Bitte tippe die Zahlenkombination "5937" ein, nur dann kann ich deinen Kommentar entgegennehmen.

Bitte fülle dieses Feld nicht aus, nur dann kann ich deinen Kommentar entgegennehmen.