Debian 系统上基于文件的套接字的惯用位置

rec*_*nja 14 debian directory-structure socket daemon

我正在为C使用Unix Domain Socket的 Debian 系统编写守护进程。

如果守护进程的工作目录是根目录,那么是否有一个惯用的目录来将套接字放置在文件系统上?

gol*_*cks 17

它们通常位于/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提出的,您至少应该为此提供一个配置选项,回到您选择的默认值。

  • `/run` 或 `/var/run` 也经常用于 root 进程。 (2认同)
  • `/tmp` 和 `/run` 之间的另一个关键区别是,只有 root 对 `/run` 具有写权限。 (2认同)