Linux
存在的目錄上的 ENOENT 錯誤
背景:我正在使用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 可解決此問題。