Debian 系統上基於文件的套接字的慣用位置
我正在為
C
使用Unix Domain Socket的 Debian 系統編寫守護程序。如果守護程序的工作目錄是根目錄,是否有一個慣用的目錄可以將套接字放置在文件系統上?
它們通常位於
/tmp
其中或其子目錄中。請注意,其中的所有內容都會/tmp
在關機時被擦除——不一定會被擦除,只是要注意它可以被擦除,所以如果你使用它,請檢查是否每次都必須創建子目錄。如果您想通過權限限制訪問,您將需要使用子目錄,因為/tmp
它是世界可讀的。
/run
和/var/run
(可能符號連結在一起)以類似的方式使用,但它們通常作為 tmpfs 文件系統掛載——這意味著它們是在啟動時創建並駐留在記憶體中,而不是在磁碟上(所以不要將其用作轉儲的地方海量數據)。對於執行時套接字,它可能是一個不錯的選擇。請注意,
/run
這裡提到的所有其他目錄除了/tmp
,都只能由 root 寫入。對於系統程序,這很好,但如果應用程序可能由非特權使用者執行,您要麼想在/tmp
某處使用或創建一個永久目錄並設置權限,要麼使用使用者 $HOME 中的位置。
/usr/share
在安裝過程中可以在(或/usr/local/share
)中創建目錄。那裡的目錄和內容不會像在/tmp
或/run
. 但是,正如jordanm在評論中指出的那樣,/usr
可能以只讀方式掛載,linux 文件系統層次結構指南反映了這一點。當然,在安裝應用程序時它不能是只讀的,所以如果你願意在那裡創建一個套接字,你可以留下它並稍後使用它(你仍然可以寫入套接字,即使文件是只讀的)。如果您希望在某個不會以只讀方式安裝的引導中持久存在,這
/etc
是一個相當安全的選擇,因為這通常用於系統範圍的配置和重新配置。OTOH,可能有系統,其中整個根文件系統的底層設備是只讀的(例如,嵌入式系統), /tmp 和 /run 在另一個設備上(可能:記憶體中的 tmpfs)。因此,兩個最強大的策略似乎是:
- 安裝應用程序時,將套接字安裝到永久位置。
/run
在執行時或執行時創建一個目錄/var/run
並將套接字放在那裡。- 只在
/tmp
.第一個的優點是無論如何,一旦安裝了應用程序,您將有一個可以使用的套接字。第二個的優點是它可能更有利於理智的程式。第三個的優點是它不需要超級使用者權限。如果您以後改變主意,應該很容易從一種實現切換到另一種實現。
最後,正如BatchyX提出的那樣,您至少應該為此提供一個配置選項,回到您選擇的預設值。