如何使 fsck 在启动时以非交互方式运行?

如何使 fsck 在启动时以非交互方式运行?

我在 1500 英里外的数据中心有一台无头的 Ubuntu 12.04 服务器。现在系统在重新启动时两次决定必须进行 fsck。不幸的是,Ubuntu 以交互模式运行 fsck,所以我不得不请数据中心的某个人过去,插入控制台,然后按下 Y 键。我该如何设置它,以便 fsck 在启动时使用或-y-p又名-a)标志以非交互模式运行?

如果我正确理解了 Ubuntu 的启动过程,init 会调用芒塔尔这反过来又调用了 fsck。但是我看不出有任何方法可以配置如何调用 fsck。这可能吗?

(为了避免一个建议;我知道我可以使用它tune2fs -i 0 -c 0来防止定期的 fsck。这可能会有所帮助,但我需要系统尝试重新启动,即使它有真正需要 fsck 的原因,比如在断电之后。)

为了回答后续问题,以下是我的 /etc/fstab 的相关详细信息。我认为我没有对 Ubuntu 放在那里的内容进行任何编辑。

UUID=3515461e-d425-4525-a07d-da986d2d7e04 /               ext4    errors=remount-ro 0       1
UUID=90908358-b147-42e2-8235-38c8119f15a6 /boot           ext4    defaults        0       2
UUID=01f67147-9117-4229-9b98-e97fa526bfc0 none            swap    sw              0       0

答案1

我正在寻找的设置是/etc/default/rcSFSCKFIX=yes。这意味着“在启动过程中自动修复不一致的文件系统”,并使 fsck 使用该标志运行。在我的两个 Ubuntu 系统中都-y将其设置为。no

即使设置为no,启动时 fsck 仍然有点非交互性。 mountall 使用 ( 的-a同义词)运行 fsck,-p这意味着“自动修复任何可以安全修复而无需人工干预的文件系统问题”。 显然,-p如果有不安全的修复需要进行,则会进入交互模式。 要完全自动运行,您需要-yFSCKFIX=yes

以下是 mountall.c 中的相关代码

if (fsck_fix || mnt->fsck_fix) {
  NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-y"));
} else {
  NIH_MUST (nih_str_array_add (&args, NULL, &args_len, "-a"));
}

答案2

对于 Ubuntu 15、16、17+,FSCKFIX 值设置位于 lib/init/vars.sh

可以使用命令grep -r FSCKFIX * 2>/dev/null来找到它。

答案3

确保 fstab 中没有任何可能导致此问题的标志,然后检查您的 init 脚本。(尝试在您的 init 脚本中 grep 'fsck' 以查找其使用位置)我的系统以非交互方式运行 fsck,因此这里是我的 fstab 的副本和我的 /etc/init/mountall 脚本的一部分,供您比较

$ cat /etc/fstab
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
UUID=acbe3514-33a3-4170-b1be-df7b8460a49a /               ext4    errors=remount-ro 0       1
UUID=d361f696-7abc-11e1-9043-5711de71ade6 /home           ext4    defaults        0       2
UUID=213e032c-fce9-4e1b-9d64-0779f0db4208 none            swap    sw              0       0

/etc/init/mountall 的片段

script
    . /etc/default/rcS
    [ -f /forcefsck ] && force_fsck="--force-fsck"
    [ "$FSCKFIX" = "yes" ] && fsck_fix="--fsck-fix"

    # set $LANG so that messages appearing in plymouth are translated
    if [ -r /etc/default/locale ]; then
        . /etc/default/locale
        export LANG LANGUAGE LC_MESSAGES LC_ALL
    fi

    exec mountall --daemon $force_fsck $fsck_fix
end script

相关内容