我在 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/rcS,FSCKFIX=yes
。这意味着“在启动过程中自动修复不一致的文件系统”,并使 fsck 使用该标志运行。在我的两个 Ubuntu 系统中都-y
将其设置为。no
即使设置为no
,启动时 fsck 仍然有点非交互性。 mountall 使用 ( 的-a
同义词)运行 fsck,-p
这意味着“自动修复任何可以安全修复而无需人工干预的文件系统问题”。 显然,-p
如果有不安全的修复需要进行,则会进入交互模式。 要完全自动运行,您需要-y
或FSCKFIX=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