当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

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

如果我正确理解了 Ubuntu 的启动过程,init 会调用 mountall,而 mountall 又会调用 fsck。但是我看不到任何配置如何调用 fsck 的方法。这可能吗?

(阻止一个建议;我知道我可以使用 tune2fs -i 0 -c 0 来防止周期性 fscks。这可能会有所帮助,但我需要系统尝试恢复,即使它有真正的理由进行 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

最佳办法

我正在寻找的设置在 /etc/default/rcSFSCKFIX=yes 。这意味着“在引导期间自动修复存在不一致的文件系统”并导致 fsck 使用 -y 标志运行。在我的两个 Ubuntu 系统中,它都设置为 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"));
}

次佳办法

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13009.html,未经允许,请勿转载。