私のホームディレクトリ用のカスタムデータベースを作成しようとしています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
。存在しない場合は、インストールしてrootとしてデーモンを起動します。
systemctl start auditd
updatedb -o ~/custom-mlocate.db -U ~/
たとえば、一般ユーザーとしてそのプログラムを実行します。残りはsudo
rootとしてログインするか(悪い)、各行の接頭辞を付けて実行する必要があります(良い)。最後の数行を確認してください
/var/log/audit/audit.log
tail -n 20 /var/log/audit/audit.log | grep -i denied
あなたが興味を持っているのは、
type=AVC
問題のあるコマンドの名前で始まる行です。 2つの可能性があります。
- この行には、
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