Updatedb 无法为自定义数据库文件创建临时文件

Updatedb 无法为自定义数据库文件创建临时文件

我正在尝试为我的主目录创建一个自定义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 所建议的,问题是由安全策略引起的。解决办法是

  1. 确保您已运行并audit2allow 安装了审核守护程序。对于 opensuse 审计守护进程位于软件包中audit,并且audit2allow位于policycoreutils.如果不存在则安装并以 root 身份启动守护进程
systemctl start auditd
  1. updatedb -o ~/custom-mlocate.db -U ~/ 例如,以普通用户身份运行有问题的程序。其余的应该以 root 身份登录(坏)或在每行前面添加sudo(好)来执行。

  2. 检查最后几行/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:

  1. 将您在步骤 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
    
  2. 创建 SELinux 模块
    audit2allow -i /var/log/audit/audit-partial-tmp.log -M custom-selinux-module
    
  3. 激活新政策
    semodule -i custom-selinux-module.pp
    
  4. 以普通用户运行程序,检查是否正常。例如
    updatedb -o ~/custom-mlocate.db -U ~/
    
  5. 清理
    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

相关内容