Linux mlocate.db文件过大问题

1,026 阅读4分钟

在偶然的一次日常集群维护中,有一次系统根盘突然出现打满的情况,通过 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.conf updatedb的配置文件
  • /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文件几十兆大小)

参考