目前我正在尝试从 迁移mlocate
到plocate
.
我mlocate
在我的脚本中使用(注意:locate
别名为mlocate
或 ,plocate
具体取决于我安装的那个)。
成功搜索主目录mlocate
以下是运行后的前 10 个输出locate home
(locate 的别名为mlocate
):
/home
/etc/apparmor.d/tunables/home
/etc/apparmor.d/tunables/home.d
/etc/apparmor.d/tunables/home.d/site.local
/etc/systemd/homed.conf
/home/username
/home/username/.bash_history
/home/username/.bash_profile
/home/username/.bashrc
/home/username/.cache
/home/username/.cargo
正如您所看到的,我可以成功地在我的主目录中找到带有mlocate
.
未能成功搜索主目录plocate
:
但是,安装后,我得到了来自等plocate
的结果,而我得到的只是一个:/etc/
/usr/
/home
运行后locate home
(locate
别名为plocate
):
/home
/etc/apparmor.d/tunables/home
/etc/apparmor.d/tunables/home.d
/etc/apparmor.d/tunables/home.d/site.local
/etc/systemd/homed.conf
/usr/bin/addgnupghome
/usr/bin/homectl
如您所见,plocate
在我的主目录中找不到文件和目录。
我尝试过的
1.作者的评论plocate
这个 manjaro 线程如何使用定位?作者plocate
评论如下:
首先,检查数据库最近是否已更新。大多数用户会想要使用 plocate 的 updatedb;自 plocate 1.1.0 以来,plocate-build(从 mlocate 的数据库转换)通常不是您想要的。 [...]
不显示文件的另一个原因通常是权限。检查您是否可以以 root 身份找到这些文件(sudo plocate test);如果可以的话,问题很可能是您没有从根目录一直到目录的访问权限。 plocate 应该找到任何找到 / -name 的内容测试确实如此,但仅此而已。
我跑了sudo updatedb
。
我的主目录访问权限:
/
➜ ll
drwxr-xr-x - root 17 Jul 2022 home/
drwxr-xr-x - root 16 Apr 21:44 usr/
/home
➜ ll
drwxr-xr-x - username 16 Apr 21:51 username/
看起来确实plocate
无法访问我的主目录下的文件和目录,但它具有与usr
.我不明白为什么plocate
可以看到usr
但看不到 下的文件和目录home
。
2.运行时结果不同sudo
plocate
当我运行时,结果是不同的sudo
。
下面是常规的locate
:
➜ locate ranger
/usr/bin/ranger
/usr/lib/python3.10/site-packages/ranger
/usr/lib/python3.10/site-packages/ranger_fm-1.9.3-py3.10.egg-info
/usr/lib/python3.10/site-packages/ranger/__init__.py
/usr/lib/python3.10/site-packages/ranger/__pycache__
下面运行为sudo
:
➜ sudo locate ranger
/root/.config/ranger
/root/.local/share/ranger
/root/.local/share/ranger/bookmarks
/root/.local/share/ranger/history
/root/.local/share/ranger/tagged
/usr/bin/ranger
/usr/lib/python3.10/site-packages/ranger
/usr/lib/python3.10/site-packages/ranger_fm-1.9.3-py3.10.egg-info
我可以在我的主目录中看到结果(即前 5 个结果)。
我想要的是
我希望能够像plocate
使用mlocate
.换句话说,我期望使用时来自主目录的结果plocate
:
$ locate home
/home
/etc/apparmor.d/tunables/home
/etc/apparmor.d/tunables/home.d
/etc/apparmor.d/tunables/home.d/site.local
/etc/systemd/homed.conf
/home/username
/home/username/.bash_history
/home/username/.bash_profile
/home/username/.bashrc
/home/username/.cache
/home/username/.cargo
答案1
TL:DR:如果您使用的是btrfs
,请执行以下操作:
- 编辑
/etc/updatedb.conf
PRUNE_BIND_MOUNTS = "yes"
用。。。来代替PRUNE_BIND_MOUNTS = "no"
- 保存文件
- 更新数据库
sudo updatedb
- 再次测试以
locate home
查看目录中的任何输出home
。
解释
我联系了plocate
作者,他善意地将我带到了正确的方向,并回复如下:
其中 90% 的问题似乎是 btrfs 配置错误。您没有说明您正在运行哪个文件系统,但如果是这样,请参阅 PRUNE_BIND_MOUNTS 下的 Updatedb.conf 手册页并检查您的 fstab。
我确实正在使用btrfs
(来检查lsblk -f
:)。
咨询man updatedb.conf
给出以下内容:
PRUNE_BIND_MOUNTS
字符串 0、no、1 或 yes 之一。如果 PRUNE_BIND_MOUNTS 为 1 或 yes,updatedb(8) 不会扫描绑定安装。挂载在绑定挂载的子树中的所有文件系统也会被跳过,即使它们不是绑定挂载。作为例外,不会跳过目录自身的绑定安装。请注意,Btrfs 子卷挂载在内核中作为绑定挂载进行内部处理(请参阅 btrfs-subvolume(8)),因此,如果您还挂载了文件系统根本身,则可能会被跳过。为了解决这个问题,请将您的根目录也设为 Btrfs 子卷。
默认情况下,不会跳过绑定安装。
解决方案请参见上面的TL;DR。