Будет ли моя система fsck при перезагрузке?

20

... и как мне узнать?

Скажем, я собираюсь перезагрузить сервер. Я хотел бы свести к минимуму время простоя, так что подумайте о переносе перезагрузки в псевдоним, который говорит: «Подожди, приятель, ты получишь fsck при загрузке».

Следующий вопрос ... как лучше сказать "давайте сделаем это в следующий раз?" установить дату последней проверки?

Я знаю, что tune2fs может установить кучу параметров, но как мне их получить?

Том Ньютон
источник
Какая ОС у вас работает, и какая файловая система?
Алан Х
Хороший вопрос - версии Linux (в основном deb и производные) и ext2 или ext3
Том Ньютон

Ответы:

19

Если все, что вы хотите сделать, это избежать fsck, то добавление опции -f в shutdown должно помочь в этом. выключение -F, чтобы заставить fsck.

tune2fs -l /dev/foo расскажет вам интересные биты информации.

Вот начало извлечения того, что вам нужно:

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

Если дата «Следующая проверка после» уже в прошлом, будет fsck.

Если состояние файловой системы не чистое, будет fsck. (это также может произойти, если во время перезагрузки / выключения возникает проблема с системой, которая препятствует чистому размонтированию)

Если счетчик монтирования достиг максимального количества монтирования, будет fsck.

Freiheit
источник
Спасибо - если я использую shutdown -f, получит ли fsck следующая перезагрузка?
Том Ньютон
Предполагая, что ваша система в настоящее время соответствует одному из критериев для получения fsck, да, следующая перезагрузка получит вместо этого fsck. «shutdown -f» создает файл, который указывает при запуске системы пропускать fsck, но при запуске системы этот файл также удаляется.
Freiheit
10

Использование tune2fs -l /path/to/device:

  • Если «Количество монтировок» будет больше, чем «Максимальное количество монтирований», используйте -cдля изменения максимума или -Cдля изменения количества
  • Если «Последняя проверка» недостаточно свежая, чтобы использовать «Интервал проверки», используйте -iдля изменения интервала или -Tдля изменения последней проверенной
Брайен-бразилия
источник
Это предполагает ext2 или ext3, но это довольно хорошее предположение.
Дэвид Пашли
Дэвид: вопрос упоминает tune2fs ...
freiheit
6

другой вариант - вы можете вручную пропустить проверки fsck при загрузке, обновив 6-е поле в вашем / etc / fstab:

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

Это похоже на то, что большинство fstabs будет иметь 1, означает, что он должен быть проверен и является корневой файловой системой, 2 означает, что он должен быть проверен, но будет выполняться параллельно с другими файловыми системами, а 0 означает, что пропустить проверку

это также верно независимо от файловой системы

Brendan
источник
1

Если вы не хотите угадывать - сделайте это:

touch / fastboot

и вы обязательно будете избегать медленных проверок (или, что еще хуже, полного сбоя, если проверка завершится неудачно и перезагрузка остановится)


источник
1

Я использую следующий Perl-скрипт, чтобы проверить, когда произойдет следующий 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;

Я запустил его в моем ~ / .bashrc, так что я всегда знаю, когда будут проверяться мои файловые системы, хотя сейчас я использую ext4, который не страдает от увеличенного времени fsck, все равно приятно знать.

Типичный вывод выглядит примерно так:

Filesystem /dev/sda1, mounted on / will be checked in 5 mounts
user@localhost ~ $
RivieraKid
источник
Видимо, ваш скрипт не оценивает атрибуты «Следующая проверка после:»!
xebeche
0

Я регулярно использую tunefs для сброса количества загрузок и времени перед перезагрузкой в ​​середине дня, чтобы предотвратить fsck. Разница во времени загрузки потрясающая. После слов я сбрасываю их, чтобы позволить следующей загрузке fsck.

kmarsh
источник
0

Я думал о том, как получить список файловых систем более комфортно:

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

Я думаю, это можно сделать более элегантно, но в любом случае вот оно. Если кто-то направит это в xargs -r df -hдругое, он также сможет быстро увидеть, насколько велики файловые системы.

Обратите внимание, что в приведенном выше коде время «Следующая проверка» сравнивается с (СЕЙЧАС + 120 секунд), если предположить, что до того, как ваша система снова включится, потребуется некоторое время.

НТН

xebeche
источник
0

Вот скрипт, который проверяет ваши файловые системы на наличие fsck ( источник ):

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
Avyd
источник
1
Пожалуйста, не размещайте ссылки на внешние сайты - скопируйте полезную информацию и предоставьте ссылку для справки.
Фредерик Нильсен