Hệ thống của tôi sẽ fsck khi tôi khởi động lại?


20

... và làm thế nào để tôi tìm ra?

Nói rằng tôi sắp khởi động lại một máy chủ. Tôi muốn giảm thiểu thời gian chết, vì vậy, hãy suy nghĩ về việc khởi động lại trong một bí danh có nội dung "treo lên bạn thân, bạn sẽ đạt được một fsck khi khởi động".

Câu hỏi tiếp theo .. cách tốt nhất để nói "hãy làm điều đó lần sau?" Đặt ngày kiểm tra cuối cùng?

Tôi biết Tune2fs có thể thiết lập một loạt các tham số, nhưng làm thế nào tôi có được em?


Bạn đang chạy hệ điều hành nào, và hệ thống tập tin nào?
Alan H

Điểm hay - phiên bản của Linux (chủ yếu là deb & dẫn xuất) và ext2 hoặc ext3
Tom Newton

Câu trả lời:


19

Nếu tất cả những gì bạn muốn làm là tránh một fsck, việc thêm tùy chọn -f vào tắt máy sẽ giúp ích cho điều đó. tắt máy -F để buộc fsck.

tune2fs -l /dev/foo sẽ cho bạn biết những thông tin thú vị

Đây là một khởi đầu để giải nén những gì bạn cần:

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

Nếu ngày "Kiểm tra tiếp theo sau" là quá khứ, sẽ có một fsck.

Nếu trạng thái hệ thống tập tin không sạch, sẽ có một fsck. (điều này cũng có thể xảy ra nếu có sự cố với hệ thống trong quá trình khởi động lại / tắt máy mà ngăn chặn việc ngắt kết nối sạch)

Nếu số lần gắn kết đã đạt đến số lần gắn kết tối đa, sẽ có một fsck.


Cảm ơn - nếu tôi sử dụng tắt máy -f, lần khởi động lại tiếp theo sẽ nhận được fsck chứ?
Tom Newton

Giả sử hệ thống của bạn hiện đáp ứng một trong những tiêu chí để nhận được một fsck, vâng, lần khởi động lại tiếp theo sẽ nhận được fsck thay thế. "shutdown -f" tạo một tệp thông báo khởi động hệ thống bỏ qua fsck, nhưng khởi động hệ thống cũng xóa tệp đó.
freiheit

10

Sử dụng tune2fs -l /path/to/device:

  • Nếu "Số lượng gắn kết" sẽ lớn hơn "Số lượng gắn kết tối đa" thì hãy sử dụng -cđể thay đổi mức tối đa hoặc -Cđể thay đổi số lượng
  • Nếu "Đã kiểm tra lần cuối" không đủ gần đây để sử dụng "Kiểm tra khoảng thời gian" -iđể thay đổi khoảng thời gian hoặc -Tthay đổi lần kiểm tra cuối cùng

Điều này không giả sử ext2 hoặc ext3, nhưng là một giả định khá tốt.
David Pashley

David: câu hỏi có đề cập đến Tune2fs ...
freiheit

6

tùy chọn khác là bạn có thể tự làm cho nó bỏ qua kiểm tra fsck khi khởi động bằng cách cập nhật trường thứ 6 trong / etc / fstab của bạn:

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

Điều này tương tự với hầu hết các fstabs sẽ có 1 nghĩa là nó cần được kiểm tra và là một hệ thống tệp gốc, 2 có nghĩa là nó cần được kiểm tra nhưng sẽ được thực hiện song song với các hệ thống tệp khác và 0 có nghĩa là bỏ qua kiểm tra

Điều này cũng đúng cho dù hệ thống tập tin


1

Nếu bạn không muốn đoán - hãy làm điều này:

chạm / fastboot

và bạn chắc chắn sẽ tránh kiểm tra chậm (hoặc tệ hơn - hoàn toàn thất bại nếu kiểm tra thất bại và quá trình khởi động lại tạm dừng)


1

Tôi sử dụng tập lệnh perl sau đây để kiểm tra khi fsck tiếp theo sẽ xảy ra:

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

Tôi có nó chạy trong ~ / .bashrc vì vậy tôi luôn biết khi nào hệ thống tập tin của mình sẽ được kiểm tra, mặc dù bây giờ tôi sử dụng ext4 mà không bị thời gian fsck kéo dài, vẫn rất tốt để biết.

Đầu ra điển hình là một cái gì đó như:

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

Rõ ràng, tập lệnh của bạn không đánh giá các thuộc tính "Kiểm tra tiếp theo sau:"!
xebeche

0

Tôi thường xuyên sử dụng tunefs để thiết lập lại số lần khởi động và thời gian trước khi thực hiện khởi động lại vào giữa ngày, để ngăn chặn fsck. Sự khác biệt về thời gian khởi động là tuyệt đẹp. Afterwords tôi đặt lại chúng để cho phép khởi động tiếp theo vào fsck.


0

Tôi nghĩ về cách để có được một danh sách các hệ thống tập tin thoải mái hơn:

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

Tôi đoán nó có thể được thực hiện thanh lịch hơn nhưng dù sao nó ở đây. Nếu một ống này thành xargs -r df -hmột cũng có thể nhanh chóng thấy các hệ thống tập tin lớn như thế nào.

Lưu ý rằng trong đoạn mã trên thời gian "Kiểm tra tiếp theo" được so sánh với (NOW + 120 giây) giả sử rằng phải mất một thời gian cho đến khi hệ thống của bạn hoạt động trở lại.

HTH


0

Đây là một kịch bản kiểm tra các hệ thống tập tin của bạn cho fsck ( nguồn ):

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
Xin vui lòng không chỉ đăng liên kết đến các trang web bên ngoài - sao chép thông tin hữu ích và cung cấp liên kết để tham khảo.
Frederik Nielsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.