…我怎么知道?
说我即将重新启动服务器。 我想最大限度地减less停机时间,所以想着重新包装一个别名,说:“挂在哥们,你会打开fsck启动”。
下一个问题..最好的方式是什么“下一次做吧?” 设置最后一次检查date?
我知道tune2fs可以设置一堆参数,但是我怎样才能得到em?
如果你所要做的只是避免fsck,那么添加-f选项来closures应该会有帮助。 关机-F强制fsck。
tune2fs -l /dev/foo
会告诉你一些有趣的信息。
这里开始提取你需要的东西:
mount -l -t ext3,ext2 | cut -d' ' -f1 | xargs -n1 tune2fs -l | egrep -i 'state|mount|check'
如果“下一次检查”date过去,将会有一个fsck。
如果文件系统状态不干净,将会出现fsck。 (如果在重新启动/closures期间系统出现问题,也会发生这种情况,导致系统无法正常卸载)
如果安装次数达到最大安装次数,将会有一个fsck。
使用tune2fs -l /path/to/device
:
-c
更改最大值或-C
更改计数 -i
更改间隔或-T
更改上次检查 另一种select是通过更新/ etc / fstab中的第6个字段,手动使其在启动时跳过fsck检查:
/dev/sda2 / ext3 defaults,errors=remount-ro 0 1
这与大多数fstab具有类似1意味着它应该被检查并且是一个根文件系统,2意味着它应该被检查,但是将与其他文件系统并行地完成并且0意味着跳过检查
无论文件系统如何,也是如此
如果你不想猜 – 这样做:
touch / fastboot
你一定要避免缓慢的检查(或者更糟 – 如果检查失败并且重新启动停止,则总失败)
我使用下面的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中运行了,所以我总是知道什么时候我的文件系统将被检查,尽pipe我现在使用的ext4不会受到扩展fsck时间的影响,但仍然很高兴知道。
典型的输出是这样的:
Filesystem /dev/sda1, mounted on / will be checked in 5 mounts user@localhost ~ $
我经常使用tunefs重置启动次数和时间,然后再重新开机,以防止fsck。 开机时间的差异令人惊叹。 后话我重置他们让下一次启动fsck。
我想过如何更舒适地获取文件系统列表:
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( 源 ):
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 ij; 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