Apakah sistem saya fsck ketika saya reboot?

20

... dan bagaimana saya mengetahuinya?

Katakanlah saya akan me-reboot server. Saya ingin meminimalkan downtime, jadi pikirkan tentang membungkus reboot dalam alias yang mengatakan "tunggu teman, Anda akan menekan fsck saat boot".

Pertanyaan selanjutnya .. apa cara terbaik untuk mengatakan "mari kita lakukan lain kali?" atur tanggal cek terakhir?

Saya tahu tune2fs dapat mengatur banyak parameter, tetapi bagaimana saya mendapatkannya?

Tom Newton
sumber
OS mana yang Anda jalankan, dan sistem file apa?
Alan H
Good point - versi Linux (terutama deb & derivatif) dan ext2 atau ext3
Tom Newton

Jawaban:

19

Jika semua yang ingin Anda lakukan adalah menghindari fsck, menambahkan opsi -f ke shutdown akan membantu. shutdown -F untuk memaksa fsck.

tune2fs -l /dev/foo akan memberi tahu Anda sedikit informasi yang menarik.

Inilah awal dari mengekstraksi apa yang Anda butuhkan:

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

Jika tanggal "Pemeriksaan berikutnya setelah" di masa lalu, akan ada fsck.

Jika status filesystem tidak bersih, akan ada fsck. (ini juga bisa terjadi jika ada masalah dengan sistem selama reboot / shutdown yang mencegah unmount bersih)

Jika jumlah mount telah mencapai jumlah mount maksimum, akan ada fsck.

freiheit
sumber
Terima kasih - jika saya menggunakan shutdown -f, apakah reboot selanjutnya akan mendapatkan fsck?
Tom Newton
Dengan asumsi sistem Anda saat ini memenuhi salah satu kriteria untuk mendapatkan fsck, ya, reboot berikutnya akan mendapatkan fsck sebagai gantinya. "shutdown -f" membuat file yang memberitahu startup sistem untuk melewati fsck, tetapi startup sistem juga menghapus file itu.
freiheit
10

Menggunakan tune2fs -l /path/to/device:

  • Jika "Jumlah hitungan" akan lebih besar dari "Jumlah hitungan maksimum" maka gunakan -cuntuk mengubah maks atau -Cuntuk mengubah jumlah
  • Jika "Terakhir Diperiksa" tidak cukup baru untuk "Periksa interval" gunakan -iuntuk mengubah interval atau -Tuntuk mengubah yang terakhir diperiksa
brian-brazil
sumber
Ini memang mengasumsikan ext2 atau ext3, tetapi asumsi yang cukup baik.
David Pashley
David: pertanyaannya tidak menyebutkan tune2fs ...
: 288 freiheit
6

pilihan lainnya adalah Anda dapat secara manual melewatkan pemeriksaan fsck saat boot dengan memperbarui bidang ke-6 di / etc / fstab Anda:

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

Ini mirip dengan apa yang dimiliki sebagian besar fstab 1 artinya harus diperiksa dan merupakan sistem file root, 2 berarti harus diperiksa tetapi akan dilakukan secara paralel dengan sistem file lain dan 0 berarti melewatkan pemeriksaan

ini juga benar, tidak peduli sistem file

Brendan
sumber
1

Jika Anda tidak ingin menebak - lakukan ini:

sentuh / fastboot

dan Anda akan yakin untuk menghindari cek lambat (atau lebih buruk - total gagal jika cek gagal dan reboot berhenti)


sumber
1

Saya menggunakan skrip perl berikut untuk memeriksa kapan fsck berikutnya akan terjadi:

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

Saya telah menjalankannya di ~ / .bashrc saya jadi saya selalu tahu kapan filesystem saya akan diperiksa, meskipun saya menggunakan ext4 sekarang yang tidak mengalami perpanjangan waktu fsck, masih bagus untuk diketahui.

Output khas adalah sesuatu seperti:

Filesystem /dev/sda1, mounted on / will be checked in 5 mounts
user@localhost ~ $
RivieraKid
sumber
Rupanya, skrip Anda tidak mengevaluasi atribut "Pemeriksaan selanjutnya setelah:"!
xebeche
0

Saya secara teratur menggunakan tunef untuk mengatur ulang jumlah dan waktu boot sebelum melakukan reboot tengah hari, untuk mencegah fsck. Perbedaan waktu booting sangat menakjubkan. Kata penutup saya atur ulang untuk memungkinkan boot berikutnya ke fsck.

kmarsh
sumber
0

Saya berpikir tentang cara mendapatkan daftar sistem file yang lebih nyaman:

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

Saya kira itu bisa dilakukan lebih elegan tapi toh ini dia. Jika seseorang mem-pipe ini menjadi xargs -r df -hsatu juga bisa dengan cepat melihat seberapa besar filesystem-nya.

Perhatikan bahwa dalam kode di atas waktu "Pemeriksaan selanjutnya" dibandingkan dengan (SEKARANG + 120 detik) dengan asumsi perlu beberapa saat hingga sistem Anda bangkit kembali.

HTH

xebeche
sumber
0

Berikut ini adalah skrip yang memeriksa sistem file Anda untuk fsck ( sumber ):

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
sumber
1
Tolong jangan hanya mengirim tautan ke situs eksternal - salin informasi yang berguna dan berikan tautan untuk referensi.
Frederik Nielsen