重新启动时,系统会出现fsck吗?


20

...以及如何找出?

说我要重新启动服务器。我想最大程度地减少停机时间,因此考虑将重新启动包装为别名“挂在伙伴上,您将在启动时遇到fsck”。

下一个问题..说“下次再做”的最好方法是什么?设置最后检查日期?

我知道tune2fs可以设置一堆参数,但是我将如何获得em?


您正在运行哪个操作系统,以及哪个文件系统?
艾伦H

好点-Linux版本(主要是deb和派生版本)和ext2或ext3
Tom Newton

Answers:


19

如果您只想避免fsck,则将-f选项添加到shutdown应该可以帮助您。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。


谢谢-如果我使用shutdown -f,下次重新启动时会得到fsck吗?
汤姆·牛顿2009年

假设您的系统当前满足获取fsck的条件之一,是的,下次重新启动将获取fsck。“ shutdown -f”创建一个文件,该文件告诉系统启动程序跳过fsck,但是系统启动程序也会删除该文件。
freiheit

10

使用tune2fs -l /path/to/device

  • 如果“安装数量”大于“最大安装数量”,请使用-c更改最大数量或-C更改数量
  • 如果“ Last Checked”最近的时间不足以用于“ Check interval”,请使用-i更改间隔或-T更改最后检查的时间

确实假设ext2或ext3,但这是一个很好的假设。
David Pashley 2009年

大卫:这个问题确实提到tune2fs ...
自由报

6

另一个选择是您可以通过更新/ etc / fstab中的第6个字段来手动使其在引导时跳过fsck检查:

/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 2011年

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秒)进行比较,假设您的系统再次启动需要一些时间。

高温超导


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
请不要仅仅发布指向外部站点的链接-复制有用的信息并提供链接以供参考。
弗雷德里克·尼尔森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.