如何在“systemd”崩溃后自动强制 fsck 磁盘?- 没有任何意义。
设置fsck_y_enable="YES"
和background_fsck="NO"
in/etc/rc.conf
不执行任何操作。
我的根文件系统不干净并且有很多错误(由于停电 - 意外关闭,而不是因为硬盘驱动器或硬件损坏)。
fsck
显示错误:
root@host2:/usr/home/alex # fsck
** /dev/mirror/gm0p2 (NO WRITE)
** Last Mounted on /
** Root file system
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3 - Check Connectivity
** Phase 4 - Check Reference Counts
UNREF FILE I=8268305 OWNER=root MODE=140777
SIZE=0 MTIME=Jun 6 21:58 2014
CLEAR? no
[跳过 100 多行]
我没有对服务器的物理或 KVM 访问权限。这是gmirror
ed 驱动器
FreeBSD host2.domain.tld 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Thu Sep 26 22:50:31 UTC 2013 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0p2 / ufs rw 1 1
/dev/mirror/gm0p3 none swap sw 0 0
答案1
FreeBSD 具有正常工作的强制卸载功能,因此您实际上不需要在启动时执行此操作。只需登录(远程),将 rootfs 重新挂载为只读 ( mount -fur /
),手动执行 fsck ( fsck -y /
),然后重新启动计算机。
答案2
如果您需要在启动过程的早期运行命令(仍处于单用户模式),请将它们添加到 shell 脚本中/etc/rc.early
添加到该文件中之类的内容fsck -fy /
将强制它进行扫描并对所有提示回答“是”。
rc.early
完成后不要忘记将其删除,否则它会在每次启动时运行
答案3
/etc/rc.initial.reboot
使用nextboot
命令重新启动运行fsck
5 次:
/sbin/nextboot -e "pfsense.fsck.force=5"
您可以手动运行它或将其添加到任何脚本中以fsck
在下次启动时触发。
我在2.5.0版本中对此进行了测试。
答案4
从 FreeBSD 10.3 开始,您可以通过临时修改/etc/rc.d/root
为 run 来实现此目的/sbin/fsck -fy /
。
这是当前的脚本,经过修改以包含注释掉的命令;取消注释以执行 fsck。
#!/bin/sh
#
# $FreeBSD: stable/10/etc/rc.d/root 177062 2008-03-11 17:21:14Z delphij $
#
# PROVIDE: root
# REQUIRE: fsck
# KEYWORD: nojail
. /etc/rc.subr
name="root"
start_cmd="root_start"
stop_cmd=":"
root_start()
{
# root normally must be read/write, but if this is a BOOTP NFS
# diskless boot it does not have to be.
#
case ${root_rw_mount} in
[Nn][Oo] | '')
;;
*)
# Uncomment the below line to run fsck on root during boot:
#/sbin/fsck -fy /
if ! mount -uw /; then
echo 'Mounting root filesystem rw failed, startup aborted'
stop_boot true
fi
;;
esac
umount -a >/dev/null 2>&1
# If we booted a special kernel remove the record
# so we will boot the default kernel next time.
if [ -x /sbin/nextboot ]; then
/sbin/nextboot -D > /dev/null 2>&1
fi
}
load_rc_config $name
run_rc_command "$1"