本地文件信息采集工具包-mlocate


mlocate包提供的locate命令在单纯进行路径名名查找时有着显著的效率优势,因为是预先对磁盘文件进行扫描并存储到一个数据库文件中,查找时只需要检索数据库而即可。mlocate工具数据库的updatedb更新指令进程发起。mlocate是通过执行updatedb命令来建立/更新数据库的,除了手动执行外,操作系统会每日进行更新,但在各用户的crontab里是看不到的,因为updatedb的定时执行使用了anacron实现。updatedb的执行定义在/etc/cron.daily/mlocate里面。总的来说,mlocate基于对目录的mtime和ctime是否发生了变更的判断,来决定是否要进入目录内进一步索引内容。这是一个setuid程序。
mlocate is a locate/updatedb implementation. The 'm' stands for "merging": updatedb reuses the existing database to avoid rereading most of the file system, which makes updatedb faster and does not trash the system caches as much. The locate(1) utility is intended to be completely compatible to slocate. It also attempts to be compatible to GNU locate, when it does not conflict with slocate compatibility.
locate命令用来查找文件或目录,它比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息,系统会自动创建这个数据库,并且每天自动更新一次,因此在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件却无法查找到,原因就是该数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb:主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate:查询文件位置
/etc/updatedb.conf:updatedb的配置文件
/var/lib/mlocate/mlocate.db:存放文件信息的文件
updatedb就是按acsii字符序深度优先遍历整个磁盘,建立了一个顺序表,并定时更新。updatedb不是在旧数据库的基础上更新,而是重建数据库,只是对于未修改目录利用旧数据库里的信息节省了部分磁盘扫描时间。另外值得注意的是,updatedb的扫描并不会影响文件和目录的atime,因为其对文件使用了C函数lstat,对目录实现了opendir_noatime。

在使用locate指令查找文件时,同样会有权限限制,如果是 root 账户,是可以查询到其他人账户下的文件的。
mlocate.db文件过大解决办法
系统挂在较多节点,或者有海量的小文件,导致locate一直在检索,mlocate.db文件也会越来越大。
解决方案:修改/etc/updatedb.conf,如上述的示例,在PRUNEPATHS参数后面增加不需要进行locate的目录,修改完成后关闭老的updatedb进程(如果还没有执行完成),再手动执行updatedb指令进程,则mlocate.db的大小会明显减少。
禁用mlocate的updatedb
1、直接粗暴
对系统中运行中进程直接进行关停,对服务进行禁止启动,甚至卸载相关的软件包。
killall updatedb.mlocate
sudo kill -9 <PID>
apt remove locate mlocate
yum remove mlocate
2、临时停用
在计划任务(crontab)中取消其任务脚本的执行权限
chmod -x /etc/cron.daily/mlocate
重新开启
chmod +x /etc/cron.daily/mlocate
或者改为周执行
mv -v /etc/cron.daily/mlocate /etc/cron.weekly/
3、修改其配置来调整其行为
配置文件:/etc/updatedb.conf中定义了哪些挂载点目录、文件系统格式、文件或目录类型不要被mlocate所收录。
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs 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"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /freeoa"
第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。
第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。
第三行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索,不同后缀之间用空格隔开。
第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索;updatedb之后使用locate仍然找不到想要文件,可以检查挂载的目录是否被忽略了。
这里特别说一下 PURNE_BIND_MOUNTS,大部分文章只说这是限制搜索,没说具体意思,其实PURNE_BIND_MOUNTS=yes会跳过bind mount,至于什么是bind mount,使用过docker的应该知道一个容器通常会产生一个挂载卷,在df -h中可以看到,这就是一个bind mount,它是对本地目录的重复挂载,因此没有必要多索引一次,所以 PURNE_BIND_MOUNTS 保留为yes就好。
项目主页:https://fedorahosted.org/mlocate/
mlocate is a locate/updatedb implementation. The 'm' stands for "merging": updatedb reuses the existing database to avoid rereading most of the file system, which makes updatedb faster and does not trash the system caches as much. The locate(1) utility is intended to be completely compatible to slocate. It also attempts to be compatible to GNU locate, when it does not conflict with slocate compatibility.
locate命令用来查找文件或目录,它比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。这个数据库中含有本地所有文件信息,系统会自动创建这个数据库,并且每天自动更新一次,因此在用whereis和locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件却无法查找到,原因就是该数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。整个locate工作其实是由四部分组成的:
/usr/bin/updatedb:主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate:查询文件位置
/etc/updatedb.conf:updatedb的配置文件
/var/lib/mlocate/mlocate.db:存放文件信息的文件
updatedb就是按acsii字符序深度优先遍历整个磁盘,建立了一个顺序表,并定时更新。updatedb不是在旧数据库的基础上更新,而是重建数据库,只是对于未修改目录利用旧数据库里的信息节省了部分磁盘扫描时间。另外值得注意的是,updatedb的扫描并不会影响文件和目录的atime,因为其对文件使用了C函数lstat,对目录实现了opendir_noatime。
在使用locate指令查找文件时,同样会有权限限制,如果是 root 账户,是可以查询到其他人账户下的文件的。
mlocate.db文件过大解决办法
系统挂在较多节点,或者有海量的小文件,导致locate一直在检索,mlocate.db文件也会越来越大。
解决方案:修改/etc/updatedb.conf,如上述的示例,在PRUNEPATHS参数后面增加不需要进行locate的目录,修改完成后关闭老的updatedb进程(如果还没有执行完成),再手动执行updatedb指令进程,则mlocate.db的大小会明显减少。
禁用mlocate的updatedb
1、直接粗暴
对系统中运行中进程直接进行关停,对服务进行禁止启动,甚至卸载相关的软件包。
killall updatedb.mlocate
sudo kill -9 <PID>
apt remove locate mlocate
yum remove mlocate
2、临时停用
在计划任务(crontab)中取消其任务脚本的执行权限
chmod -x /etc/cron.daily/mlocate
重新开启
chmod +x /etc/cron.daily/mlocate
或者改为周执行
mv -v /etc/cron.daily/mlocate /etc/cron.weekly/
3、修改其配置来调整其行为
配置文件:/etc/updatedb.conf中定义了哪些挂载点目录、文件系统格式、文件或目录类型不要被mlocate所收录。
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs 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"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /freeoa"
第一行PRUNE_BIND_MOUNTS="yes"的意思是:是否进行限制搜索。
第二行是排除检索的文件系统类型,即列出的文件系统类型不进行检索。
第三行表示对哪些后缀的文件排除检索,也就是列在这里面的后缀的文件跳过不进行检索,不同后缀之间用空格隔开。
第四行是排除检索的路径,即列出的路径下的文件和子文件夹均跳过不进行检索;updatedb之后使用locate仍然找不到想要文件,可以检查挂载的目录是否被忽略了。
这里特别说一下 PURNE_BIND_MOUNTS,大部分文章只说这是限制搜索,没说具体意思,其实PURNE_BIND_MOUNTS=yes会跳过bind mount,至于什么是bind mount,使用过docker的应该知道一个容器通常会产生一个挂载卷,在df -h中可以看到,这就是一个bind mount,它是对本地目录的重复挂载,因此没有必要多索引一次,所以 PURNE_BIND_MOUNTS 保留为yes就好。
项目主页:https://fedorahosted.org/mlocate/