Czy mój system fsck po ponownym uruchomieniu?


20

... i jak się dowiem?

Powiedz, że mam zamiar zrestartować serwer. Chciałbym zminimalizować czas przestoju, więc myślę o zawinięciu ponownego uruchomienia w aliasie, który mówi „poczekaj, kolego, włączysz fsck podczas rozruchu”.

Następne pytanie… Jak najlepiej powiedzieć „Zróbmy to następnym razem?” ustawić datę ostatniej kontroli?

Wiem, że tune2fs może ustawić wiele parametrów, ale jak je zdobyć?


Z jakiego systemu operacyjnego korzystasz i jaki system plików?
Alan H

Dobra uwaga - wersje Linuksa (głównie deb i pochodne) oraz ext2 lub ext3
Tom Newton

Odpowiedzi:


19

Jeśli wszystko, co chcesz zrobić, to uniknąć fsck, dodanie opcji -f do zamykania powinno w tym pomóc. zamknij -F, aby wymusić fsck.

tune2fs -l /dev/foo przekaże ci interesujące informacje.

Oto początek wydobywania tylko tego, czego potrzebujesz:

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

Jeśli data „Następna kontrola po” już minęła, pojawi się fsck.

Jeśli stan systemu plików nie jest czysty, pojawi się fsck. (może się to również zdarzyć, jeśli wystąpi problem z systemem podczas ponownego uruchamiania / zamykania, który uniemożliwia czyste odmontowanie)

Jeśli liczba montowań osiągnęła maksymalną liczbę montowań, pojawi się fsck.


Dzięki - jeśli uruchomię polecenie shutdown -f, czy następne uruchomienie uruchomi fsck?
Tom Newton,

Zakładając, że twój system obecnie spełnia jedno z kryteriów uzyskania fsck, tak, następne ponowne uruchomienie dostanie fsck. „shutdown -f” tworzy plik, który mówi uruchamianiu systemu o pominięciu fsck, ale uruchomienie systemu usuwa również ten plik.
freiheit

10

Używanie tune2fs -l /path/to/device:

  • Jeśli „Liczba montowań” będzie większa niż „Maksymalna liczba montowań”, użyj przycisku, -caby zmienić maksimum lub -Czmienić liczbę
  • Jeśli „Ostatnia kontrola” nie jest wystarczająco aktualna, aby „Sprawdź interwał” użyj, -iaby zmienić interwał lub -Tzmienić ostatnio sprawdzony

Zakłada się, że ext2 lub ext3, ale jest to całkiem dobre przypuszczenie.
David Pashley,

David: pytanie wspomina tune2fs ...
freiheit

6

drugą opcją jest to, że możesz ręcznie zmusić go do pominięcia kontroli fsck podczas rozruchu, aktualizując szóste pole w / etc / fstab:

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

Jest to podobne do tego, co większość plików fstab ma 1 oznacza, że ​​należy to sprawdzić i jest to główny system plików, 2 oznacza, że ​​należy to sprawdzić, ale zostanie to wykonane równolegle z innymi systemami plików, a 0 oznacza sprawdzenie pominięcia

dotyczy to również systemu plików


1

Jeśli nie chcesz zgadywać - zrób to:

touch / fastboot

a na pewno unikniesz powolnych kontroli (lub gorzej - całkowity błąd, jeśli kontrola się nie powiedzie, a ponowne uruchomienie się zatrzyma)


1

Używam następującego skryptu perla, aby sprawdzić, kiedy nastąpi następne fsck:

#!/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;

Mam go uruchomiony w moim ~ / .bashrc, więc zawsze wiem, kiedy moje systemy plików zostaną sprawdzone, chociaż teraz używam ext4, który nie cierpi z powodu dłuższych czasów fsck, nadal dobrze jest wiedzieć.

Typowe wyjście to:

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

Najwyraźniej twój skrypt nie ocenia atrybutów „Następna kontrola po:”!
xebeche

0

Regularnie używam tunefs do resetowania liczników rozruchu i czasu przed ponownym uruchomieniem w połowie dnia, aby zapobiec fsck. Różnica w czasie uruchamiania jest oszałamiająca. Aftermords resetuję je, aby umożliwić następny rozruch fsck.


0

Pomyślałem o tym, jak uzyskać listę systemów plików wygodniej:

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;
  }
'

Myślę, że można to zrobić bardziej elegancko, ale i tak jest. Jeśli jeden potokuje to do xargs -r df -hdrugiego, może również szybko zobaczyć, jak duże są systemy plików.

Zauważ, że w powyższym kodzie czas „Następnej kontroli” jest porównywany z (TERAZ + 120 sekund), zakładając, że minie trochę czasu, zanim twój system ponownie wstanie.

HTH


0

Oto skrypt sprawdzający twoje systemy plików pod kątem fsck ( źródło ):

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
Nie zamieszczaj tylko linków do zewnętrznych stron - skopiuj przydatne informacje i podaj link w celach informacyjnych.
Frederik Nielsen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.