我正在尝试为我的主目录创建一个自定义mlocate
数据库。运行时updatedb
它抱怨无法打开临时文件。
55;~/>uname -a
Linux yoga 4.12.14-lp151.28.59-default #1 SMP Wed Aug 5 10:58:34 UTC 2020 (337e42e) x86_64 x86_64 x86_64 GNU/Linux
56;~/>updatedb --version
updatedb (mlocate) 0.26
...
57;~/>updatedb -l 0 -o ~/.home-mlocate.db -U ~/
updatedb: can not open a temporary file for `/home/<user>/.home-mlocate.db'
前置或以 rootupdatedb
身份sudo
运行不会改变结果。不带任何参数的简单运行sudo updatedb
会成功。
更一般的除非数据库是默认的,否则updatedb
无法创建临时文件:
yoga:~ # /usr/bin/whoami
root
yoga:~ # /usr/bin/updatedb ; echo $?
0
yoga:~ # /usr/bin/updatedb -o /var/lib/mlocate/mlocate.db ; echo $?
0
yoga:~ # /usr/bin/updatedb -o /var/lib/mlocate/custom-mlocate.db ; echo $?
/usr/bin/updatedb: can not open a temporary file for `/var/lib/mlocate/custom-mlocate.db'
1
yoga:~ # /usr/bin/strace /usr/bin/updatedb -o /var/lib/mlocate/custom-mlocate.db 2>&1 1>\dev\null | grep "openat.*custom-mlocate.db"
openat(AT_FDCWD, "/var/lib/mlocate/custom-mlocate.db", O_RDWR) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/var/lib/mlocate/custom-mlocate.db.6JiH9O", O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied)
yoga:~ #
我的操作系统是 openSUSE Leap 15.1,我的/home
目录位于 ext4 文件系统上。
问题是什么以及如何解决?
答案1
正如 @fra-san 所建议的,问题是由安全策略引起的。解决办法是
- 确保您已运行并
audit2allow
安装了审核守护程序。对于 opensuse 审计守护进程位于软件包中audit
,并且audit2allow
位于policycoreutils
.如果不存在则安装并以 root 身份启动守护进程
systemctl start auditd
updatedb -o ~/custom-mlocate.db -U ~/
例如,以普通用户身份运行有问题的程序。其余的应该以 root 身份登录(坏)或在每行前面添加sudo
(好)来执行。检查最后几行
/var/log/audit/audit.log
tail -n 20 /var/log/audit/audit.log | grep -i denied
您感兴趣的是以
type=AVC
违规命令名称开头的行。有两种可能:
- 该行包含
avc: denied
.您的系统使用 SELinux。 - 该行包含
apparmor="DENIED"
.这意味着您的系统使用 AppArmor 来确保安全。
如果是AppArmor,请查阅AppArmor手册。例如 https://doc.opensuse.org/documentation/leap/security/html/book.security/part-apparmor.html 对于 OpenSuse。
对于 SELinux:
- 将您在步骤 3 中标识的行复制到单独的文件中。例如
检查是否正常tail -n 20 /var/log/audit/audit.log | grep -i "denied.*updatedb" > /var/log/audit/audit-partial-tmp.log
和cat /var/log/audit/audit-partial-tmp.log
audit2allow -w -i /var/log/audit/audit-partial-tmp.log
- 创建 SELinux 模块
audit2allow -i /var/log/audit/audit-partial-tmp.log -M custom-selinux-module
- 激活新政策
semodule -i custom-selinux-module.pp
- 以普通用户运行程序,检查是否正常。例如
updatedb -o ~/custom-mlocate.db -U ~/
- 清理
rm /var/log/audit/audit-partial-tmp.log custom-selinux-module.pp
答案2
如果您对数据库文件有写权限,但对创建它的目录没有写权限,则可以通过将数据库写入您有目录写权限的其他位置,然后将其复制到最终文件位置来解决此问题例如
updatedb -o /myhomedir/mydb.db
cp /myhomedir/mydb.db /somespeciallocation/mydb.db