...そしてどうやって見つけるのですか?
サーバーを再起動しようとしているとしましょう。ダウンタイムを最小限に抑えたいので、「hang on buddy、you's going to a fsck on boot」というエイリアスでリブートをラップすることを考えます。
次の質問..「次回はやろう」と言う最良の方法は何ですか?最終チェック日を設定しますか?
Tune2fsが一連のパラメーターを設定できることは知っていますが、どうすればそれらを取得できますか?
Fsckを回避したいだけの場合は、shutdownに-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が発生します。
tune2fs -l /path/to/device
の使用:
-c
を使用して最大数を変更するか、-C
を使用して数を変更します-i
を使用して間隔を変更するか、-T
を使用して最後にチェックしたものを変更しますもう1つのオプションは、/ etc/fstabの6番目のフィールドを更新することで、ブート時にfsckチェックを手動でスキップできるようにすることです。
/dev/sda2 / ext3 defaults,errors=remount-ro 0 1
これは、ほとんどのfstabにあるものと似ています。1はチェックする必要があり、ルートファイルシステムであることを意味します。2はチェックする必要がありますが、他のファイルシステムと並行して実行され、0はチェックをスキップすることを意味します
これは、ファイルシステムに関係なく当てはまります
次の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 ~ $
推測したくない場合は、次のようにします。
/ fastbootをタッチします
また、遅いチェック(またはさらに悪いことに、チェックが失敗して再起動が停止した場合の完全な失敗)を確実に回避できます。
ファイルシステムのリストをより快適に取得する方法を考えました:
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
にパイプすると、ファイルシステムのサイズをすばやく確認することもできます。
上記のコードでは、「次のチェック」の時間は(NOW + 120秒)と比較されていることに注意してください。
HTH
次に、ファイルシステムのfsck( source )を確認するスクリプトを示します。
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
私は定期的にtunefsを使用して、日中のリブートを行う前にブートカウントと時間をリセットして、fsckを防ぎます。起動時間の違いは驚くべきものです。あとがき次はfsckを起動できるようにリセットしました。