[20260626]locate的使用问题.txt

[20260626]locate的使用问题.txt

--//最近安装centos 9,遗漏一些rpm包,经常需要补充安装,经常需要查询那些rpm包在iso映像里面,快速查询需要使用locate命令,
--//遇到一些问题,做一个记录。

--//mount iso映像
# mkdir -p /mnt/cdrom/
# mount /dev/sr0 /mnt/cdrom/ -o ro

--//更新为locate命令的使用。
# updatedb
# locate bash-completion | grep cdrom

# find /mnt/cdrom -name "bash-completion*" -print
/mnt/cdrom/BaseOS/Packages/bash-completion-2.11-5.el9.noarch.rpm

--//很明显使用locate命令并不能查询到mount iso映像中的信息。
--//检查updatedb配置文件/etc/updatedb.conf:
# grep PRUNEPATHS /etc/updatedb.conf
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/lib/dnf/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph /var/lib/mock /sysroot/ostree/deploy"

--//可以发现/mnt目录排除在扫描记录范围之内,很容易联想即使mount在其他扫描目录,如果某时候没有mount映像,执行了updatedb命
--//令,也会导致locate无法查询到信息的情况。

--//需要一个方法永久记录这些信息,看了一些文档发现缺省执行updatedb后记录在/var/lib/mlocate/mlocate.db。
# ls -l /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 6937148 2026-06-26 15:02:20 /var/lib/mlocate/mlocate.db

--//可以单独执行updatedb命令,将iso的信息记录在单独的文件/var/lib/mlocate/mlocate_cdrom.db。
# updatedb -l 0 -o /var/lib/mlocate/mlocate_cdrom.db  -U /mnt/cdrom

# ls -l /var/lib/mlocate/
total 7092
-rw-r--r--. 1 root root     321140 2026-06-26 15:12:45 mlocate_cdrom.db
-rw-r-----. 1 root slocate 6937148 2026-06-26 15:02:20 mlocate.db

# locate bash-completion | grep cdrom
--//直接执行locate还是没有找到对应信息。查看文档,发现通过参数-d指定记录文件:

# locate -d /var/lib/mlocate/mlocate_cdrom.db bash-completion
/mnt/cdrom/AppStream/Packages/libguestfs-bash-completion-1.54.0-11.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/libnbd-bash-completion-1.20.3-4.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/nbdkit-bash-completion-1.38.5-12.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/virt-v2v-bash-completion-2.7.1-19.el9.noarch.rpm
/mnt/cdrom/BaseOS/Packages/bash-completion-2.11-5.el9.noarch.rpm

--//现在可以查询到相应信息。每次输入命令有点长,可能记不住/var/lib/mlocate/mlocate_cdrom.db文件名,可以建立一个别名。
--//我喜欢定义别名放在/etc/profile.d/alias.sh文件里面。

# grep locate /etc/profile.d/alias.sh
alias locate-cdrom='locate  -d /var/lib/mlocate/mlocate_cdrom.db '

# locate-cdrom bash-completion
/mnt/cdrom/AppStream/Packages/libguestfs-bash-completion-1.54.0-11.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/libnbd-bash-completion-1.20.3-4.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/nbdkit-bash-completion-1.38.5-12.el9.noarch.rpm
/mnt/cdrom/AppStream/Packages/virt-v2v-bash-completion-2.7.1-19.el9.noarch.rpm
/mnt/cdrom/BaseOS/Packages/bash-completion-2.11-5.el9.noarch.rpm

# locate-cdrom smem
--//很明显安装iso映像里面没有smem的rpm包。

--//在测试时还遇到一个问题,普通用户无法查询。
# su - oracle
$ locate-cdrom smem
locate: can not open `/var/lib/mlocate/mlocate_cdrom.db': Permission denied

# ls -l /var/lib/mlocate/
total 7092
-rw-r--r--. 1 root root     321140 2026-06-26 15:12:45 mlocate_cdrom.db
-rw-r-----. 1 root slocate 6937148 2026-06-26 15:02:20 mlocate.db
--//普通用户应该可以读取该文件mlocate_cdrom.db。而mlocate.db文件普通用户也能够通过locate访问。

--//仔细查看locate的执行权限:
# ls -l $(which locate)
-rwx--s--x. 1 root slocate 40368 2026-03-10 22:41:12 /usr/bin/locate

--//locate命令非常特殊,存在s权限在group用户上。修改如下:
# chgrp slocate /var/lib/mlocate/mlocate_cdrom.db
# chmod 640  /var/lib/mlocate/mlocate_cdrom.db

# ll /var/lib/mlocate
total 7092
-rw-r-----. 1 root slocate  321140 2026-06-26 15:12:45 mlocate_cdrom.db
-rw-r-----. 1 root slocate 6937148 2026-06-26 15:02:20 mlocate.db

# umount /mnt/cdrom
# su - oracle
$ locate-cdrom smem
$ locate-cdrom openssl | head -2
/mnt/cdrom/AppStream/Packages/apr-util-openssl-1.6.1-23.el9.x86_64.rpm
/mnt/cdrom/AppStream/Packages/compat-openssl11-1.1.1k-5.el9.1.i686.rpm

--//参数-r支持正则表达式。
$ locate-cdrom -r /mnt/cdrom/BaseOS/Packages/openssl-[0-9]
/mnt/cdrom/BaseOS/Packages/openssl-3.5.5-1.el9.x86_64.rpm

$ locate-cdrom -r /openssl-[0-9]
/mnt/cdrom/BaseOS/Packages/openssl-3.5.5-1.el9.x86_64.rpm

--//这样以后查询需要从iso光盘上有那些rpm包,很快能查询到,而且不需要安装光盘映像。


posted @ 2026-06-30 21:51  lfree  阅读(1)  评论(0)    收藏  举报