在日常的系統管理工作中,有時我們需要對系統中的各種文件進行搜索,比如查找某個文件的位置、搜索符合某種條件的文件等。對於較小的文件系統來說,文件搜索速度相對較快,但對於龐大的文件系統來說,搜索效率會比較低下。這時,我們可以使用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等方法來進行優化。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/194773.html