업데이트된 데이터베이스는 사용자 정의 데이터베이스 파일에 대한 임시 파일을 생성할 수 없습니다.

업데이트된 데이터베이스는 사용자 정의 데이터베이스 파일에 대한 임시 파일을 생성할 수 없습니다.

내 홈 디렉토리에 대한 사용자 정의 데이터베이스를 만들려고 합니다 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이 제안한 것처럼 문제는 보안 정책으로 인해 발생합니다. 해결책은

  1. 감사 데몬이 실행 중이고 audit2allow 설치되어 있는지 확인하세요. opensuse의 경우 감사 데몬은 패키지에 audit있으며 audit2allow에 있습니다 policycoreutils. 존재하지 않으면 설치하고 루트로 데몬을 시작합니다.
systemctl start auditd
  1. updatedb -o ~/custom-mlocate.db -U ~/ 예를 들어 일반 사용자로 해당 프로그램을 실행해 보세요. 나머지는 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 오픈수세용.

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

관련 정보