如何在“systemd”崩溃后自动强制 fsck 磁盘?

如何在“systemd”崩溃后自动强制 fsck 磁盘?

如何设置崩溃后systemd自动强制fsck磁盘(硬关机)?

当我sysvinit(在 Arch Linux 中)使用/sbin/inithack 时:在rc.local我创建/forcefsck文件中;在rc.local.shutdown我删除它。启动时rc.sysinit启用强制 fsck(如果/forcefsck存在)。

如何做同样的事systemd?也许它有内置的fsck破碎后自动装置?

答案1

您可以fsck在启动时通过传递fsck.mode=forceauto默认设置,skip可用于完全跳过检查)作为强制内核命令行参数(从systemdv.213,还有第二个参数:fsck.repair- 控制fsck启动时如何处理不干净的文件系统;可能的值是:preen修复可以安全修复的内容,yes对所有问题回答“是”并且no为默认值)。


注意systemd-fsck 不知道有关特定文件系统的任何详细信息,并且仅执行特定于每种文件系统类型的文件系统检查器(/sbin/fsck.*
现在,如果您的文件系统是xfs或 ,btrfs它将分别执行/sbin/fsck.xfs/sbin/fsck.btrfs。如果这似乎不起作用,也许您应该分别检查fsck.xfs或的手册页fsck.btrfs,并检查 中所述文件的内容/sbin

答案2

检查 BTRFS 系统的唯一方法是使用它自己的工具btrfs check,您必须卸载根卷,因此唯一的选择是真正从 livecd 启动。

任何最终导致调用的建议fsck.btrfs都是错误的,这只是一个打印出消息的存根,什么也不做。这还包括fsck.mode内核命令行选项或文件的答案。.forcefsck

[root@nuc ~]# cat /usr/sbin/fsck.btrfs
#!/usr/bin/sh -f
AUTO=false
while getopts ":aApy" c
do
    case $c in
    a|A|p|y)    AUTO=true;;
    esac
done
shift $(($OPTIND - 1))
eval DEV=\${$#}
if [ ! -e $DEV ]; then
    echo "$0: $DEV does not exist"
    exit 8
fi
if ! $AUTO; then
    echo "If you wish to check the consistency of a BTRFS filesystem or"
    echo "repair a damaged filesystem, see btrfs(8) subcommand 'check'."
fi
exit 0

但是,如果您不确定断电或类似情况后一切是否正常,btrfs check可以对已安装的文件系统执行只读检查:

[root@nuc ~]# btrfs check --readonly --force /dev/sda5
Opening filesystem to check...
WARNING: filesystem mounted, continuing because of --force
Checking filesystem on /dev/sda5
UUID: 8c44de9c-c91b-4ac4-857b-da191dc62274
[1/7] checking root items
[2/7] checking extents
[3/7] checking free space cache
[4/7] checking fs roots
[5/7] checking only csums items (without verifying data)
[6/7] checking root refs
[7/7] checking quota groups skipped (not enabled on this FS)
found 3628683264 bytes used, no error found
total csum bytes: 3093864
total tree bytes: 136937472
total fs tree bytes: 126074880
total extent tree bytes: 6455296
btree space waste bytes: 23047273
file data blocks allocated: 5676253184
 referenced 4705763328

相关内容