
내 홈 디렉토리에 대한 사용자 정의 데이터베이스를 만들려고 합니다 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'
프런트로딩하거나 루트로 실행해도 결과는 변경 updatedb
되지 않습니다. 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
. 존재하지 않으면 설치하고 루트로 데몬을 시작합니다.
systemctl start auditd
updatedb -o ~/custom-mlocate.db -U ~/
예를 들어 일반 사용자로 해당 프로그램을 실행해 보세요. 나머지는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 오픈수세용.
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