软件供应商必须创建一个Linux 文件系统层次结构标准 (FHS)兼容的 Debian 软件包。二进制文件必须使用哪个安装目录?
系统升级中放置的软件/bin
或/usr/bin
可能被系统升级覆盖的软件。可以在该目录中安装二进制文件吗?或者这个目录是为基本系统分发者保留的?
/usr/local/bin
用于系统管理员安装的软件。以下所有内容/usr/local
不得因系统升级而修改。如果供应商提供的 Debian 软件包是从软件包存储库下载的,并且该存储库已注册到apt-add-repository
.因此,我猜测:不会吧?
/opt/<vendor>/bin
似乎还好。但是这个目录不是必须在某个地方注册以避免与其他供应商发生冲突吗?以及如何以符合 FHS 的方式集成此目录以使其$PATH
工作?
答案1
我们来咨询一下Debian 如何概述 /opt:
/opt/ 附加应用程序软件包 预编译的非“.deb”二进制发行版(tar'ed..)位于此处。
/opt/bin/ :与顶级层次结构相同
/opt/include/ :与顶级层次结构相同
/opt/lib/ :与顶级层次结构相同
/opt/sbin/ :与顶级层次结构相同
/opt/share/ :与顶级层次结构相同
.deb
在实践中,我也看到过在那里安装软件包的应用程序。理想情况下,/bin
和/usr/bin
应该被保留,特别是/bin
因为它被定义为
适用于所有用户的基本命令可执行文件(二进制文件)(例如,cat、ls、cp)(特别是引导或救援系统所需的文件)
在实践中,经常会看到来自第 3 方的 debian 软件包安装到 /usr/bin
基于 Debian 的系统上,可能是因为它/usr/bin
通常是变量的一部分PATH
,因此可以通过命令行轻松启动。您提到过:“放置在 /bin 或 /usr/bin 中的软件可能会被系统升级覆盖”。升级的目标是删除 中的特定文件/usr/bin
,所以是的,它可能会被覆盖,但除非某些.deb
包明确指定删除您的文件(例如,我遇到过一个小程序包,它删除了我使用的旧版本的扩展坞)。如果您的软件依赖于特定的二进制文件,升级可能会很危险版本出现在/usr/bin
.
我见过的另一个常见的事情是符号链接:输入/usr/bin
是到另一个位置的符号链接。$PATH
正如您在问题中提到的那样,这可能是将二进制文件集成到其中的可行选择。此外,这与 Debian 的有关 FHS 的包装手册状态:
4.4. /usr/bin :大多数用户命令
4.4.1.目的
这是系统上可执行命令的主目录
。4.4.2.要求
/usr/bin 中不能有子目录。
因此,如果您的应用程序需要子目录(例如带有子模块目录的 Python 模块),最佳实践可能是将应用程序放在其他地方(如果是Python,即/usr/lib/python*/dist-packages
目录)以及子目录,并创建一个符号链接/usr/bin/my_binary
$PATH
我看到一些供应商所做的另一个集成是编辑用户的$PATH
变量并将其附加到~/.bashrc
. (是的,这是一种糟糕的做法,我不鼓励这样做 - 只是陈述我所看到的事实)。
“但是这个目录不是必须在某个地方注册以避免与其他供应商发生冲突吗?”提到的 Debian 文档没有提到任何关于注册目录的内容,所以答案是它不必,但如果您确实想避免冲突,您可以遵循该模式/opt/vendor/package-v-1.2/bin
- 即指定包和发布版本,也可能是一年。
答案2
您可以将软件安装到/usr/local
目录层次结构中,就像安装/usr
. “由系统管理员安装”简单地说就是管理员(或者对于单用户桌面系统,用户)决定不使用系统的包管理并直接安装。当查找文件时(这适用于$PATH
查找以及库查找等),/usr/local
优先于/usr
.
有关使用示例,请参阅某些构建系统的默认设置,例如 GNU Autotools、CMake 或 Meson。所有这些都默认安装到/usr/local
.但操作系统发行商应该配置它们来使用/usr
。管理员无需修改任何内容。
通常,安装到/usr/local
意味着应用程序是从源代码构建的,安装到/opt
意味着应用程序是在其他人的计算机上编译的二进制文件。
每个用户的家中还可以有隐藏目录.local
,其中可以包含自己的程序集。它的用法就像/usr/local
– 可以有等等~/.local/bin
。~/.local/share
从档案安装应用程序的多种常见做法之一是将档案内容转储到适当的/opt
子目录(例如/opt/graalvm-ce-java11-22.0.0.2
),并建立到此处文件和应用程序文件/usr/local/bin
下其他目录的符号链接。/usr/local
示例如下。
/usr/local/bin/java -> /opt/graalvm/bin/java
/opt
通过将版本信息添加到其目录名称(例如/opt/graalvm-ce-java11-22.0.0.2
)并创建到该目录的符号链接(例如) ,可以更轻松地切换安装的应用程序的多个版本,这也是很常见的/opt/grallvm
。