ระบบของฉันจะ fsck เมื่อฉันรีบูต?


20

... และฉันจะรู้ได้อย่างไร?

สมมติว่าฉันกำลังจะรีบูตเซิร์ฟเวอร์ ฉันต้องการลดเวลาหยุดทำงานดังนั้นให้นึกถึงการห่อรีบูตในนามแฝงที่ระบุว่า "แขวนกับเพื่อนคุณกำลังจะกด fsck เมื่อบูต"

คำถามถัดไป .. วิธีที่ดีที่สุดในการพูดว่า "ช่วยให้ทำในครั้งต่อไปคืออะไร" กำหนดวันที่ตรวจสอบล่าสุด?

ฉันรู้ว่า tune2fs สามารถตั้งค่าพารามิเตอร์จำนวนมาก แต่ฉันจะได้รับ em ได้อย่างไร


คุณใช้ระบบปฏิบัติการใดอยู่และระบบไฟล์ใดอยู่
อลัน H

ข้อดี - รุ่นของ Linux (ส่วนใหญ่เป็น deb & Derivatives) และ ext2 หรือ ext3
Tom Newton

คำตอบ:


19

หากสิ่งที่คุณต้องการทำคือหลีกเลี่ยงการ fsck การเพิ่มตัวเลือก -f ในการปิดเครื่องควรช่วยด้วย ปิด -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 แทนหรือไม่
Tom Newton

สมมติว่าระบบของคุณเป็นไปตามเกณฑ์หนึ่งในการรับ fsck ใช่การรีบูตครั้งต่อไปจะได้รับ fsck แทน "shutdown -f" สร้างไฟล์ที่บอกให้การเริ่มต้นระบบข้าม fsck แต่การเริ่มต้นระบบก็ลบไฟล์นั้นด้วย
Freiheit

10

การใช้tune2fs -l /path/to/device:

  • หาก "Mount count" จะมากกว่า "Maximum mounts counts" -cให้ใช้เพื่อเปลี่ยนค่าสูงสุดหรือ-Cเปลี่ยนจำนวน
  • หาก "การตรวจสอบล่าสุด" ไม่เร็วพอสำหรับ "การตรวจสอบช่วงเวลา" ใช้-iเพื่อเปลี่ยนช่วงเวลาหรือ-Tการเปลี่ยนแปลงการตรวจสอบล่าสุด

สิ่งนี้จะถือว่าเป็น ext2 หรือ ext3 แต่เป็นการโจมตีที่ค่อนข้างดี
David Pashley

เดวิด: คำถามที่ไม่ tune2fs เอ่ยถึง ...
Freiheit

6

ตัวเลือกอื่น ๆ คือคุณสามารถข้ามการตรวจสอบ fsck ด้วยตนเองเมื่อทำการบู๊ตด้วยตนเองโดยอัพเดทฟิลด์ที่ 6 ใน / etc / fstab ของคุณ:

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

นี่คล้ายกับสิ่งที่ fstabs ส่วนใหญ่จะมี 1 หมายความว่าควรตรวจสอบและเป็นระบบไฟล์รูท 2 หมายถึงควรตรวจสอบ แต่จะทำควบคู่กับระบบไฟล์อื่น ๆ และ 0 หมายถึงข้ามการตรวจสอบ

สิ่งนี้ก็เป็นจริงเช่นกันไม่ว่าระบบไฟล์จะเป็นเช่นไร


1

หากคุณไม่ต้องการที่จะคาดเดา - ทำสิ่งนี้:

สัมผัส / 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

ฉันใช้ tunefs เป็นประจำเพื่อรีเซ็ตจำนวนการบู๊ตและเวลาก่อนที่จะทำการรีบูตในช่วงกลางวันเพื่อป้องกัน 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
โปรดอย่าเพิ่งโพสต์ลิงก์ไปยังเว็บไซต์ภายนอก - คัดลอกข้อมูลที่เป็นประโยชน์และให้ลิงค์สำหรับการอ้างอิง
Frederik Nielsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.