在日常的系统管理工作中,有时我们需要对系统中的各种文件进行搜索,比如查找某个文件的位置、搜索符合某种条件的文件等。对于较小的文件系统来说,文件搜索速度相对较快,但对于庞大的文件系统来说,搜索效率会比较低下。这时,我们可以使用updatedb指令来生成文件数据库,以提高搜索效率。
一、updatedb指令的作用
updatedb是Linux系统中提供的一个命令行工具,它的作用是遍历整个文件系统,并将文件名和所在路径等信息存储在一个数据库文件中。这个数据库文件存储在/etc/updatedb.conf中配置的路径中,默认情况下是/var/lib/mlocate/mlocate.db。
当我们在进行文件搜索时,可以通过其他指令(比如locate)来读取这个数据库文件,从而快速地找到符合条件的文件。
二、如何安装updatedb
updatedb包含在mlocate软件包中,默认情况下已经安装在大部分的Linux系统中。可以使用下面的指令检查是否已安装:
$ which updatedb /usr/bin/updatedb
如果没有安装,可以通过以下指令来进行安装:
$ yum install mlocate # CentOS/RHEL系列系统 $ apt-get install mlocate # Debian/Ubuntu系列系统
三、如何使用updatedb指令
1. 默认方式
我们可以直接执行updatedb指令,使用默认方式生成文件数据库。这个过程需要遍历整个文件系统,因此需要一定的时间。
$ sudo updatedb
执行过程中,我们可以看到类似下面的内容:
Building database ... Printed paths:
表示正在遍历文件系统,输出的是已经扫描过的文件路径。
2. 将输出定向
如果我们不想在终端中看到输出,可以将输出定向到文件中,比如:
$ sudo updatedb > /tmp/updatedb.out
这样,执行结果将被写入到/tmp/updatedb.out文件中。
3. 配置updatedb参数
updatedb包含一些可配置的参数,在我们需要优化文件搜索效率时,我们可以根据需要修改这些参数来达到更好的效果。
updatedb的参数配置文件是/etc/updatedb.conf,下面是常用的参数配置:
# PRUNE_BIND_MOUNTS:指定需要排除的挂载点,多个挂载点用空格分隔 PRUNE_BIND_MOUNTS="/dev /proc /sys" # PRUNE_FILE_SYSTEMS:指定需要排除的文件系统,多个文件系统用空格分隔 PRUNE_FILE_SYSTEMS="nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs" # PRUNE_NAMES:指定需要排除的文件或目录,多个名字用空格分隔 PRUNE_NAMES=".git .svn CVS .bzr .hg .metadata node_modules tmp" # disable locate db update by default, for which systemd's timer will be an # important generator, even if we are configured to update via cron. DISABLE_UPDATEDB="no" # set update interval (number of hours) # replaced by systemd timer by default if systemd installed PRUNENAMES=.git .hg* .svn* CVS .bzr # directories to index # filesystems to exclude from indexing # filesystem types to exclude from indexing
其中,PRUNE_BIND_MOUNTS、PRUNE_FILE_SYSTEMS、PRUNE_NAMES分别指定需要排除的挂载点、文件系统、文件名或目录。我们可以根据需求修改这些参数。
四、如何使用locate进行文件搜索
updatedb指令执行完毕后,我们可以使用locate指令来快速搜索文件。locate指令通过读取updatedb生成的文件数据库来查找符合条件的文件,因此速度非常快。
使用locate可以直接指定要搜索的关键词,比如:
$ locate myscript.py
表示搜索文件名中包含myscript.py的文件。
还可以使用正则表达式进行搜索,比如:
$ locate \*.py$
表示搜索所有以.py结尾的文件。
locate指令还有一些其他的选项,可以通过man locate来查看详细的帮助。
五、如何优化文件搜索效率
下面是一些可以用来优化文件搜索效率的方法:
1. 控制被索引的目录
我们可以在updatedb配置文件/etc/updatedb.conf中指定需要被索引的目录,以避免不必要的扫描。可以在PRUNEPATHS中添加需要排除的路径。
PRUNEPATHS="/var/cache /var/lib/nfs /var/lib/samba /usr/bin /usr/share/man /usr/share/doc /usr/share/games /usr/share/locale /usr/share/mysql /usr/share/mime /usr/share/ssl /usr/share/terminfo /usr/share/gnome/help"
2. 排除一些文件类型
有些文件类型没有实际的搜索意义,比如二进制文件、压缩文件等。我们可以在/etc/updatedb.conf中的PRUNENAMES中指定需要排除的文件类型。
PRUNENAMES=".git .hg* .svn* CVS .bzr *.o *.a *.so *.tmp *.bak *.swp *~ core.????? *.gif *.jpg *.jpeg *.png *.tif *.bmp *xcf *.mp3 *.ogg *.flac *.mpc *.mpeg *.avi *.mov *.qt *.wmv *.asf *.ogg *.flv *.swf *.nes *.gb *.gba *.nds *.smc *.sms *.gg"
3. 调整updatedb的运行计划
updatedb是一个独立的进程,它会占用一定的CPU和IO资源。我们可以通过修改/etc/cron.daily/mlocate来调整updatedb的运行计划,以避免系统在高峰期出现压力。
# At the start of the script, set the nice value to something with lower priority. nice ionice -c3 updatedb --output=/var/log/updatedb.log -n 10
4. 使用ssd提高效率
如果你的系统使用了固态硬盘(SSD),可以将updatedb的数据文件存储在SSD上,以提高数据库的读取速度。在/etc/updatedb.conf中,可以将PRUNEPATHS设置为空,将PRUNEFS中需要排除的文件系统改为只包含SSD所在的文件系统,然后将DBPATH指定到SSD上的某个目录即可。
PRUNEPATHS="" PRUNEFS="fuse.nfs nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs auto" DBPATH=/mnt/ssd/updatedb
总结:
updatedb是Linux系统中一个非常实用的命令行工具,它可以帮助我们快速地搜索文件。通过优化updatedb的配置,可以进一步提高文件搜索效率。我们可以通过控制被索引的目录、排除不必要的文件类型、调整updatedb的运行计划和使用SSD等方法来进行优化。