在偶然的一次日常集群维护中,有一次系统根盘突然出现打满的情况,通过 du -hx --maxdepth=1 一步步排查,发现是 /var/lib/mlocate/ 目录下的 mlocate.db 文件过大所致,整个文件有19.8G,这是个什么文件,为什么会这么大?
locate
locate 命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb主要用来更新数据库,通过crontab自动完成的/usr/bin/locate查询文件位置/etc/updatedb.confupdatedb的配置文件/var/lib/mlocate/mlocate.db存放文件信息的文件
mlocate.db
在 Linux 系统中,/var/lib/mlocate/mlocate.db 是由 mlocate 工具生成的用于存储文件名称和路径的数据库文件。该工具使用定期更新来保持与文件系统同步,以便快速搜索和查找文件。
mlocate 工具本质上是一个基于命令行的文件查找工具,它比 find 命令更快、更精确,并且支持正则表达式和其他高级搜索选项。当您在终端输入 locate 命令时,它会立即从 mlocate.db 数据库中返回匹配的文件路径。
执行sudo updatedb,将触发 mlocate 工具重新扫描文件系统并更新 mlocate.db 文件。如果您对某些文件系统进行了更改,或者发现 locate 命令没有返回最新的结果,则可以尝试使用该命令更新数据库。
/etc/updatedb.conf
updatedb的配置文件/etc/updatedb.conf
[root@]# cat /etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
PRUNENAMES = ".git .hg .svn"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache /var/spool/cups /var/spool/squid /var/tmp"
PRUNEFS以空格分隔的文件系统类型列表(如 /etc/mtab 中使用的),updatedb 不应扫描该列表。文件系统类型匹配不区分大小写。默认情况下,不跳过任何文件系统类型。 当跳过扫描文件系统时,挂载在子树中的所有文件系统也会被跳过,即使它们的类型与 PRUNEFS 中的任何条目都不匹配。PRUNENAMES以空格分隔的目录名称列表(不带路径)不应被 updateb 扫描。默认情况下,不跳过任何目录名称。 请注意,只能指定目录,并且不使用模式机制(例如通配符)。PRUNEPATHS以空格分隔的目录路径名列表,updatedb 不应扫描这些目录。每个路径名必须与locate 报告目录的形式完全相同。 默认情况下,不跳过任何路径。PRUNE_BIND_MOUNTS字符串 0、no、1 或 yes 之一。如果PRUNE_BIND_MOUNTS 为1 或 yes,updatedb 不会扫描bind mount目录。挂载在bind mount的子树中的所有文件系统也会被跳过,即使它们不是bind mount。作为例外,不会跳过目录自身的bind mount。 默认情况下,不会跳过bind mount目录。
mlocate.db文件为什么会过大
系统挂载较多节点,或者产生海量的碎片文件,到locate一直在检索,mlocate.db文件越来越大。特别是,系统中挂载了大量的外部文件,例如本文的机器中,挂载有大量cephfs文件存储,并且cephfs已用容量过多时,mlocate.db文件越来越大。
找到根源之后,根治方案有两个,1)是将mount目录排除掉,在PRUNEPATHS中加入mount目录;2)cephfs如果是使用ceph-fuse进行挂载的,可以将fuse.ceph文件系统类型加入到PRUNEFS中进行排查
设置完上述conf文件,手动执行updatedb,可以看到mlocate.db文件变成50M左右(正常mlocate.db文件几十兆大小)