我的 Ubuntu 每次启动时都会运行 fsck

我的 Ubuntu 每次启动时都会运行 fsck

每次启动时都是相同的:

/dev/sda1: clean, 908443/38690816 files, 44176803/154733312 blocks

这是 Ubuntu 用来确保文件系统一致性的某种选项吗,还是我的硬盘有问题?fsck启动时最多需要 30 秒,因此大约是所需时间的三倍。

完整输出(部分德语):

Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... done.
Begin: Running /scripts/local-bottom ... done.
done.
Begin: Running /scripts/init-bottom ... done.
fsck von util-linux 2.20.1
/dev/sda1: sauber, 908443/38690816 Dateien, 44176803/154733312 Blöcke
udevd[623]: unknown key 'SYSFS{idVendor}' in /lib/udev/rules.d/45-libticables.rules:6

udevd[623]: invalid rule '/lib/udev/rules.d/45-libticables.rules:6'

 * Starting mDNS/DNS-SD daemon                                                 [ OK ]
 * Starting Reload cups, upon starting avahi-daemon to make sure remote queues are populated                                                                   [ OK ]
 * Starting configure network device security                                  [ OK ]
 * Starting bluetooth daemon                                                   [ OK ]
 ####* Starting all other stuff

答案1

/dev/sda1:干净,908443/38690816 个文件,44176803/154733312 个块

产生该消息的线路是

/* Print the summary message when we're skipping a full check */
log_out(ctx, _("%s: clean, %u/%u files, %llu/%llu blocks"),

它跳过了“全面检查”,但只是确保对日志的一些快速测试是干净的并且没有孤立的 inode:

cat /var/log/boot.log 
fsck from util-linux 2.20.1
fsck from util-linux 2.20.1
/dev/sda1: clean, 260598/771552 files, 1684682/3080192 blocks
/dev/sdb10: recovering journal
/dev/sdb10: Clearing orphaned inode 142568 (uid=1000, gid=1000, mode=0100664, size=32768)
/dev/sdb10: Clearing orphaned inode 138527 (uid=1000, gid=1000, mode=0100600, size=9580)
/dev/sdb10: clean, 54957/991232 files, 3498365/3958006 blocks

这是正常且意料之中的。如果是一次真正的彻底检查,则需要更多时间,但通常只需一秒钟或更短时间。Systemdsystemd-fsck(8)手册页列出了触发全面检查的条件:

systemd-fsck-root.service 负责对根文件系统进行文件系统检查,但前提是根文件系统未在 initramfs 中检查。 [电子邮件保护]用于所有其他文件系统以及 initramfs 中的根文件系统。

如果文件系统的 /etc/fstab 中的 passno 设置为大于零的值,则这些服务将在启动时启动。根文件系统的检查先于其他文件系统执行。其他文件系统可能会同时进行检查,除非它们位于同一旋转磁盘上。

systemd-fsck 不知道有关特定文件系统的任何详细信息,而只是执行特定于每种文件系统类型的文件系统检查器(/sbin/fsck.*)。该助手将根据自上次检查以来的时间、挂载次数、未干净卸载等来决定是否应该实际检查文件系统。

您可以简单地检查测试是否几乎不花费任何时间运行(如果您使用 systemd):

sudo systemd-analyze blame | grep fsck
          1.608s systemd-fsck@dev-disk-by\x2duuid-408535fe\x2d28e6\x2d4d82\x2dbb59\x2d9810ead089a3.service
            87ms systemd-fsck@dev-mapper-vlhome\x2dlvhome.service

答案2

您确定是 fsck 花了 30 秒,而不仅仅是与 udevd 相关的下一条控制台消息花了 30 秒吗?换句话说,也许 udevd 在显示控制台消息之前花了 30 秒处理 libticables 超时?

尝试移除(或暂时移至其他地方)

/lib/udev/rules.d/45-libticables.rules

看看是否有帮助。

答案3

由于时钟故障,每次启动时都会发生此 fsck。看来 systemd-fsck@ 在 systemd-timesyncd 之前运行,并且没有电池支持的 RTC,因此在运行 fsck 时系统时间是错误的。

我确认这确实是触发完整检查的原因(而不是让 fsck 快速退出),方法是禁用 systemd-timesynd,将时钟设置为 journalctl 中的预同步值,然后运行 ​​fsck。一旦检测到最后一次超级块写入时间在未来,e2fsck 就会继续进行完整检查:

fsck from util-linux 2.29.2
e2fsck 1.43.4 (31-Jan-2017)
Superblock last write time (Mon Jun 19 00:48:11 2017,
    now = Tue Jan 31 20:09:28 2017) is in the future.
Fix<y>? yes
Pass 1: Checking inodes, blocks, and sizes
...

dumpe2fs -h请注意,此完整检查的触发器与此处其他答案中提到的最大挂载数和自上次检查以来的时间间隔的其他触发器无关。

请注意,如果不设置时钟(即让 timesyncd 同步它),fsck 将不会进行完整检查,但会快速退出并显示“文件系统清理”消息。

作为一种解决方法,我通过将“pass”字段设置为 0 来禁用 /etc/fstab 中的 fsck。最终,我将为该设备购买一个电池供电的 RTC。

答案4

我的搜索让我得出结论,Ubuntu 默认最大挂载数设置为 -1。这意味着无论挂载了多少次,fsck 都不会在任何启动时运行。您可以使用命令检查您的启动 -

sudo dumpe2fs -h /dev/sda8 | grep -i 'mount count'

你可以使用 来增加它tune2fs。典型示例如下 -

sudo tune2fs -c 30 -i 1w /dev/sda8

根据您的意愿进行定制。

相关内容