如何设置崩溃后systemd
自动强制fsck
磁盘(硬关机)?
当我sysvinit
(在 Arch Linux 中)使用/sbin/init
hack 时:在rc.local
我创建/forcefsck
文件中;在rc.local.shutdown
我删除它。启动时rc.sysinit
启用强制 fsck(如果/forcefsck
存在)。
如何做同样的事systemd
?也许它有内置的fsck
破碎后自动装置?
答案1
您可以fsck
在启动时通过传递fsck.mode=force
(auto
默认设置,skip
可用于完全跳过检查)作为强制内核命令行参数(从systemd
v.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