Mon système fonctionnera-t-il lorsque je redémarrerai?


20

... et comment le savoir?

Supposons que je suis sur le point de redémarrer un serveur. Je voudrais minimiser les temps d'arrêt, donc penser à encapsuler le redémarrage dans un alias qui dit "accrochez-vous, vous allez frapper un fsck au démarrage".

Question suivante .. quelle est la meilleure façon de dire "laisse faire la prochaine fois?" définir la dernière date de vérification?

Je sais que tune2fs peut définir un tas de paramètres, mais comment pourrais-je les obtenir?


Quel système d'exploitation utilisez-vous et quel système de fichiers?
Alan H

Bon point - versions de Linux (principalement deb et dérivés) et ext2 ou ext3
Tom Newton

Réponses:


19

Si tout ce que vous voulez faire est d'éviter un fsck, l'ajout de l'option -f à l'arrêt devrait vous aider. shutdown -F pour forcer fsck.

tune2fs -l /dev/foo vous dira les informations intéressantes.

Voici un début pour extraire exactement ce dont vous avez besoin:

mount -l -t ext3,ext2 | cut -d' ' -f1 | xargs -n1 tune2fs -l | egrep -i 'state|mount|check'

Si la date "Prochaine vérification après" est passée, il y aura un fsck.

Si l'état du système de fichiers n'est pas propre, il y aura un fsck. (cela peut également se produire en cas de problème avec le système lors du redémarrage / arrêt qui empêche un démontage propre)

Si le nombre de montages a atteint le nombre de montages maximum, il y aura un fsck.


Merci - si j'utilise un arrêt -f, le prochain redémarrage obtiendra-t-il le fsck à la place?
Tom Newton

En supposant que votre système remplit actuellement l'un des critères pour obtenir un fsck, oui, le prochain redémarrage obtiendrait le fsck à la place. "shutdown -f" crée un fichier qui indique au démarrage du système d'ignorer fsck, mais le démarrage du système supprime également ce fichier.
freiheit

10

En utilisant tune2fs -l /path/to/device:

  • Si "Nombre de montages" sera supérieur à "Nombre de montages maximum", utilisez-le -cpour modifier le nombre maximal ou -Cpour modifier le nombre.
  • Si "Dernière vérification" n'est pas assez récent pour "Intervalle de vérification", utilisez -ipour modifier l'intervalle ou -Tpour modifier la dernière vérification.

Cela suppose ext2 ou ext3, mais c'est une assez bonne hypothèse.
David Pashley

David: la question mentionne tune2fs ...
freiheit

6

l'autre option est que vous pouvez manuellement faire sauter les vérifications fsck au démarrage en mettant à jour le 6ème champ dans votre / etc / fstab:

/dev/sda2  /  ext3  defaults,errors=remount-ro 0       1

Ceci est similaire à ce que la plupart des fstabs auront 1 signifie qu'il doit être vérifié et est un système de fichiers racine, 2 signifie qu'il doit être vérifié mais se fera en parallèle avec d'autres systèmes de fichiers et 0 signifie ignorer la vérification

cela est également vrai quel que soit le système de fichiers


1

Si vous ne voulez pas deviner - faites ceci:

touch / fastboot

et vous serez certain d'éviter les vérifications lentes (ou pire - un échec total si une vérification échoue et que le redémarrage s'arrête)


1

J'utilise le script perl suivant pour vérifier quand le prochain fsck aura lieu:

#!/usr/bin/perl -w

use strict;

my $mountcount = 0;
my $maxmount = 0;
my $dev;
my $mountpoint;
my $fstype;
my $debug = 0;

my $cmd = "mount";

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;
    printf "Found device %s\n", $dev if ( $debug > 0 );

    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;
                printf "Mount count = %s\n", $mountcount if ( $debug > 0 );
            }
            if ( /^Maximum mount count:/ ) {
                ( undef, $maxmount ) = split /:/;
                $maxmount =~ s/\s*//g;
                printf "Maximum mount count = %s\n", $maxmount if ( $debug > 0 );
            }
        }
        close DUMPE2FS;

        printf "Filesystem %s, mounted on %s will be checked in %s mounts\n", $dev, $mountpoint, $maxmount - $mountcount;
    }
}
close MOUNT;

Je l'ai exécuté dans mon ~ / .bashrc, donc je sais toujours quand mes systèmes de fichiers seront vérifiés, bien que j'utilise maintenant ext4 qui ne souffre pas de temps fsck étendus, c'est toujours agréable à savoir.

La sortie typique est quelque chose comme:

Filesystem /dev/sda1, mounted on / will be checked in 5 mounts
user@localhost ~ $

Apparemment, votre script n'évalue pas les attributs "Prochaine vérification après:"!
xebeche

0

J'utilise régulièrement tunefs pour réinitialiser le nombre de démarrages et le temps avant de faire un redémarrage en milieu de journée, pour éviter fsck. La différence de temps de démarrage est stupéfiante. Afterwords je les réinitialise pour permettre le prochain démarrage de fsck.


0

J'ai réfléchi à la façon d'obtenir une liste de systèmes de fichiers plus facilement:

for D in $(mount -l -t ext3,ext2 | cut -d' ' -f1 ) ; do \
echo --- $D; tune2fs -l $D | egrep -i 'mount (count|time)|check' ; done \
| awk '
  /^--- / { mydev=$2; checked=0 }
  /^Mount count:/ { mycnt=$3 }
  /^Maximum mount count:/ { if (mycnt >= $3) checked=1 }
  /^Next check after:/ {
    cmd=("date +%s -d\"" $4 FS $5 FS $6 FS $7 FS $8"\"");
    cmd | getline mydate; close(cmd);
    if ((mydate <= (systime()+120)) || (checked == 1)) print mydev;
  }
'

Je suppose que cela pourrait être fait avec plus d'élégance, mais de toute façon ça y est. Si l'on canalise cela en xargs -r df -hun, on pourrait également voir rapidement la taille des systèmes de fichiers.

Notez que dans le code ci-dessus, l'heure de "Prochaine vérification" est comparée à (MAINTENANT + 120 secondes) en supposant qu'il faut un certain temps avant que votre système ne se relève.

HTH


0

Voici un script qui vérifie vos systèmes de fichiers pour fsck ( source ):

for x in $(df -t ext4 -t ext3 -t ext2 | tr -s ' ' | cut -d " " -f1 | grep -v "^$" | tail -n +2); do mmc=$(tune2fs -l $x | grep 'mount count' | tr -s ' ' | cut -d ' ' -f4) ; mc=$(tune2fs -l $x | grep 'Mount count' | tr -s ' ' | cut -d ' ' -f3) ; if [ `expr $mmc - $mc` -le 0 ] ; then fsck="0" ; else fsck="1"; fi ; CT=`date +%s` ; LCT=`date -d "\`tune2fs -l $x | grep "Last checked" | tr -s ' '| cut -d" " -f3-\`" +%s` ; CI=`tune2fs -l $x | grep "Check interval"| tr -s ' '| cut -d" " -f3` ; if [ `let $CT-$LCT` -gt `let $CI*3600*24` ] && [ $CI -gt 0 ] || [ $fsck -eq 1 ];  then echo "There will be forced fsck for $x"; else echo "There will be no fsck for $x" ; fi ; done
# Alternative script from friend with sed
# mount -t ext2,ext3,ext4|while read i j; do tune2fs -l $i|sed -n '/[Mm]ount count/{s/.*: *//;p}'|(read c; read m; [ $m -gt 0 -a $m -le $c ] && echofsck,count,$i); c="$(tune2fs -l $i|sed -n '/Next check/{s/.*r: *//;p}')"; [ -z "$c" ] || ([ `date +%s` -ge `date -d"$c" +%s` ] && echo fsck,time,$i); done

1
Veuillez ne pas simplement publier des liens vers des sites externes - copiez les informations utiles et fournissez le lien pour référence.
Frederik Nielsen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.