Linux

存在的目錄上的 ENOENT 錯誤

  • September 6, 2017

背景:我正在使用redmine DMSF 外掛執行 redmine 伺服器,該外掛使用 xapian 提供全文搜尋。Redmine 在由 Nginx 託管的Passenger 上執行。乘客程序作為使用者“redmine”和組“nginx”執行。乘客和 Nginx 禁用 Apparmor。

redmine 日誌顯示找不到 xapian 索引:

REDMAIN_XAPIAN ERROR: Xapian database is not properly set, initiated or it's corrupted.
DatabaseOpeningError: Couldn't stat '/var/tmp/dmsf-index/english'

對正在執行的乘客流程的 strace 顯示以下內容:

[pid  1013] stat("/var/tmp/dmsf-index/english", 0x7fa3bd112f00) = -1 ENOENT (No such file or directory)
[pid  1013] write(8, "REDMAIN_XAPIAN ERROR: Xapian dat"..., 88) = 88
[pid  1013] write(8, "DatabaseOpeningError: Couldn't s"..., 66) = 66

以 root 身份列出的文件:

775# ls -ahl /var/tmp/dmsf-index/english/
total 340K
drwxr-x--- 2 redmine nginx 4.0K Sep  5 13:04 .
drwxr-x--- 3 redmine nginx 4.0K Sep  5 13:04 ..
-rw-r----- 1 redmine nginx    0 Sep  5 14:00 flintlock
-rw-r----- 1 redmine nginx   28 Sep  5 13:04 iamchert
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 position.baseA
-rw-r----- 1 redmine nginx   16 Sep  5 13:04 position.baseB
-rw-r----- 1 redmine nginx  80K Sep  5 13:04 position.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 postlist.baseA
-rw-r----- 1 redmine nginx   17 Sep  5 13:04 postlist.baseB
-rw-r----- 1 redmine nginx 176K Sep  5 13:04 postlist.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 record.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 record.baseB
-rw-r----- 1 redmine nginx 8.0K Sep  5 13:04 record.DB
-rw-r----- 1 redmine nginx   13 Sep  5 13:04 termlist.baseA
-rw-r----- 1 redmine nginx   14 Sep  5 13:04 termlist.baseB
-rw-r----- 1 redmine nginx  32K Sep  5 13:04 termlist.DB

幾個命令通過 sudo -i 以使用者“redmine”和組“nginx”執行:

redmine@redmine:/var/tmp/dmsf-index/english$ pwd
/var/tmp/dmsf-index/english
redmine@redmine:/var/tmp/dmsf-index/english$ file .
.: directory
redmine@redmine:/var/tmp/dmsf-index/english$ ls
flintlock  iamchert  position.baseA  position.baseB  position.DB  postlist.baseA  postlist.baseB  postlist.DB  record.baseA  record.baseB  record.DB  termlist.baseA  termlist.baseB  termlist.DB
redmine@redmine:/var/tmp/dmsf-index/english$ file record.DB 
record.DB: data
redmine@redmine:/var/tmp/dmsf-index/english$ whoami
redmine
redmine@redmine:/var/tmp/dmsf-index/english$

據我所知,沒有權限錯誤(通常用 EACCES 表示)。我讀過 NFS 或 CIFS 可以在不明確的情況下返回 ENOENT,但這是安裝在 / 的本地 ext4 分區

我什至嘗試將 dmsf-index 的權限遞歸設置為 777,但我得到了同樣的錯誤。

所以我的問題是,為什麼Passenger/Redmine 找不到目錄,而以同一使用者身份執行的shell 可以?

因此,事實證明 Kusalananda 在 chroot 方面走在了正確的軌道上。

這台機器上的 nginx systemd 單元文件設置PrivateTmp=true,根據文件執行以下操作:

接受一個布爾參數。如果為 true,則為已執行的程序設置一個新的文件系統命名空間,並在其中掛載私有 /tmp 和 /var/tmp 目錄,該目錄不被命名空間外的程序共享。這對於保護對程序臨時文件的訪問很有用,但無法通過 /tmp 或 /var/tmp 在程序之間進行共享。

將此選項切換為 false 可解決此問題。

引用自:https://unix.stackexchange.com/questions/390465