各个 StackExchange 站点上的各种答案涵盖了该主题的部分内容,但我没有看到与该场景完全匹配的内容。如何识别每个已安装的标准文件系统,并遍历所有文件和目录以预热内核 inode 缓存?假设这些约束:
- 不影响正常启动
- 不延长正常启动过程
- 仅使用默认或非常流行的实用程序
我将自己的专业知识与其他答案的想法结合起来,创建了这个单行线,但我确信其他贝壳高尔夫球手可以对此进行改进,因为它并不完全安全,不会遇到各种问题,例如带有不寻常字符的安装目标:
findmnt --list --real --fstab --noheadings --output TARGET | egrep '^/' | xargs -P 0 -i bash -c 'find "{}" -xdev -type f,d,l -printf "" &>/dev/null &'
此版本执行以下步骤,并注明了一些注意事项:
- 查找fstab中所有具有真实FS类型的挂载;显示没有树格式或标题。这排除了虚拟 FS,这些虚拟 FS 在遍历过程中可能会出现异常行为,或者位于 RAM 中并且遍历毫无意义。
- 笔记:我找不到一种干净的方法来跳过
none
目标 fstab 条目,例如交换分区,而无需使用egrep。一次findmnt
调用不能混合包含和排除过滤器(与更常见的find
and which 可以做到这一点不同),并且据我所知,rsync
没有一种好方法可以在多个调用之间拆分过滤。findmnt
- 对每个挂载目标中的所有目录、文件或符号链接执行无限数量的并行
find
遍历,而不遍历其他挂载目标,并在后台抑制和忽略所有可能的输出,以避免控制台噪音或延迟启动。xargs ... bash ...
用于针对某些(但可能不是全部)异常字符的安全。 - 将命令放入
/etc/rc.local
.即使最近的systemd
发行版默认情况下没有rc.local
,rc-local.service
也会运行它(如果它存在并且可执行)。这看起来比使用更多的配置文件和脚本文件来完成这样的琐碎操作更干净,但也许有更好的方法?