Чи буде моя система fsck при перезавантаженні?


20

... і як я це дізнаюся?

Скажіть, я збираюся перезавантажити сервер. Я хотів би мінімізувати час простою, тому замислюючись про завершення перезавантаження в псевдонімі, який говорить "повісь на приятеля, ти збираєшся натиснути Fsck на завантаження".

Наступне питання .. який найкращий спосіб сказати "давайте це робити наступного разу?" встановити останню дату перевірки?

Я знаю, що tune2fs може встановити купу параметрів, але як би їх отримати?


Яку ОС ви використовуєте, а яку файлову систему?
Алан Х

Добрий момент - версії Linux (в основному деб та похідні) та 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.


Дякую - якщо я скасувати відключення -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 означає пропустити перевірку

це також справедливо незалежно від файлової системи


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 ~ $

Мабуть, ваш сценарій не оцінює атрибути "Наступна перевірка після:"!
xebeche

0

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


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 секунд), припускаючи, що пройде деякий час, поки ваша система знову не встане.

HTH


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

1
Будь ласка, не публікуйте посилання на зовнішні сайти - скопіюйте корисну інформацію та надайте посилання для довідки.
Фредерік Нільсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.