我注意到基本上所有文件/usr/bin
都是独立的可执行文件,而不是包含可执行文件以及可执行文件可能需要的其他文件(例如配置文件、数据文件等)的目录
如果我开发一个由多个文件组成的应用程序,它应该保存在哪里?我的第一反应是将应用程序的目录保存在 中/opt
,并在 中创建指向可执行文件的软链接/usr/bin
。然而,Google Chrome 是我的计算机上唯一执行此操作的应用程序,这让我认为有一种更标准的方法。
答案1
有两种主要方式来组织已安装软件中的文件:按包或按类型。
Unix 系统倾向于按类型组织程序文件: 中的可执行文件/usr/bin
、 中的仅对系统管理员有用的可执行文件/usr/sbin
、 中的代码库和其他依赖于处理器架构的文件/usr/lib
、 中的不依赖于处理器类型的数据文件/usr/share
、 手册中的页面/usr/man
、杂项文档/usr/doc
等(这不是一个详尽的列表,并且存在许多变体。)我使用了前缀/usr
,但实际上通常有三个这样的扇出: at/
用于启动时需要的程序(有时会合并) ,因为/usr
区别并不总是相关),at/usr
表示操作系统附带的程序,at/usr/local
表示由系统管理员手动安装的程序。
/usr
在大多数 Linux 系统上,和之间的区别/usr/local
是/usr
( 和/
) 由包管理器管理,而/usr/local
不是。因此,如果您的应用程序是使用按类型结构安装的,则/usr
当作为包(rpm、deb 等)分发时,它应该位于下面;/usr/local
当不作为包分发时,它应该位于下面(例如,如果它作为要手动解压的存档分发) 。
配置文件通常全部放入,/etc
因为它们要由系统管理员修改。如果可能,请让您的应用程序从/etc
和 或 中读取配置数据(视情况而定),并使用 中的设置覆盖 或 中的设置/usr/etc
。将配置数据与或下的其他数据合并在一起是很常见的,因此您会发现许多系统没有或。/usr/local/etc
/etc/
/usr/etc
/usr/local/etc
/usr/share
/usr/local/share
/usr/etc
/usr/local/etc
按类型组织的优点是文件放置在将要使用的位置。所有可执行文件都位于可执行文件搜索路径 ( $PATH
) 的目录中,所有库都位于库搜索路径中,所有手册页都位于手册页搜索路径中,等等。这种组织的一个限制是它需要包管理器来跟踪每个包安装了哪些文件。由于 Linux 上的大多数软件都是通过包管理器分发的,因此大多数软件最终都会在/usr
.
另一种组织文件的方法是按包,其标准位置是/opt
.它通常被组织为、等,有时还具有附加级别等。不过,应用程序可以自由地管理其目录;但是;有些直接将杂项文件放入.这使得包管理变得微不足道(只需在正确的位置解压,用于列出已安装的软件,用于卸载),但使软件的使用变得更加困难:管理员或用户需要添加适当的位置来搜索路径,或者使用完整路径,或创建符号链接。/opt/APPLICATION/bin
/opt/APPLICATION/lib
/opt/AUTHOR/APPLICATION/bin
/opt/APPLICATION
ls
rm -r
下的文件/opt
通常是手动管理的(这是该组织的要点),但那里可能有由包管理器管理的包。例如 Chrome 的 deb 包将其放在/opt
.这样做的一个好处是/opt/google/chrome
,无论安装方式如何,Chrome 始终处于可用状态。这可能会让跨发行版支持变得更容易一些。
如果您想了解应用程序和发行版应如何在 Linux 上组织文件的详细信息,请阅读FHS。
简而言之:
- 构建软件包(deb、rpm 等)时,
/usr
请使用发行版选择的目录(例如/usr/man
vs/usr/share/man
、/usr/lib
vs/usr/libexec
、/usr/lib
vs/usr/lib64
等)安装在 下。 - 直接安装时(例如
make install
),默认安装在/usr/local
(默认子目录:可执行文件在 中/usr/local/bin
,数据文件在 中等),并且支持系统管理员可能做出的其他选择。请注意,安装期间复制文件的目录可能与使用文件的目录不同,例如由于使用/usr/local/share/APPLICATION
存放(看跟踪程序)。
/opt
这两种情况都是可能的,但是您会给系统管理员带来更多负担。
答案2
如果您正在制作一个软件包,它确实在某种程度上取决于您所针对的发行版。您可以按照文件系统层次结构标准。 Debian 遵循 FHS,一些例外。本质上:
/etc
:主机特定的系统配置/usr/bin
:大多数用户命令/usr/lib
:用于编程和包的库/usr/share
:与架构无关的数据
在基于 Debian 的支持多种架构的软件包系统上,独立于架构的数据通常会被分割成一个单独的软件包。
例如,请参阅如何apache2
,apache2-bin
,apache2-data
和apache2-doc
Ubuntu 上的软件包是有组织的。