作为一名正在康复的长期 Windows 用户,我一直在尝试澄清我对在 Linux 中放置东西的“正确”位置的理解(我猜 UNIX 也一样,但我很少在非 OS X UNIX 上工作,而 Mac OS X 几乎不是“正确”的)。我更希望让这个问题与发行版保持相当独立,但如果正确答案取决于特定风格,那么也可以。我的目标是能够让其他人在我设置的系统中工作,并能够逻辑地遵循组织。
1.当谈到系统管理员的角色(而不是用户角色)时,人们普遍认为哪里最适合安装服务器二进制文件,如 Web 服务器、数据库等?从我一段时间以来收集的信息来看,这两种说法似乎都是正确的:
/opt/<package>
/usr/local/bin/<package>
这文件系统层次标准似乎没有明显的区别。两者相比,是否有优势或劣势,或者这只是偏好?
2.我也经常看到这种事情:
/usr/local/bin/foo-bar-3.2.1-baz
/usr/local/bar -> /usr/local/bin/foo-bar-3.2.1-baz
其中版本特定包是实际位置,然后添加符号链接以方便输入/升级。这很通用吗?
3.那么下一个合乎逻辑的问题是,它们的二进制数据去了哪里?这似乎很常见:
/var/lib/<package>
有没有更好的位置?
答案1
如今,我认为“文件 X 放在哪里?”这个问题没有一个明确的答案。当然,有一些惯例,其中很多都是由局部差分协议。但是,许多发行版对于事物的去向都有自己的约定。
一般而言,我会选择这个:
/opt
:大型应用程序,它们位于自己的目录、二进制文件、库、配置等中。我看到很多 Java 应用程序都驻留在其中,但这可能是我工作的环境
/usr/local
:我编写的任何脚本/程序,如果没有打包到 deb/rpm 中,都应该对用户是只读的,这样用户就不能(轻易地)去覆盖它
/var
:顾名思义,变量数据存放在这里。持久数据存储。许多应用程序使用它/var/lib
来存储应用程序数据,以及诸如/var/run
PID 文件和套接字之类的东西。不过,这将根据发行版而有所不同。
答案2
当我第一次接触 Linux 时,我也发现这一点令人困惑,但随着时间的推移,我学到了这一点。
规则 1:尽可能使用发行版的包管理器进行安装(大多数基于 RPM 的发行版使用 yum,大多数基于 Debian 的发行版使用 apt-get。Slackware 和 Gentoo 有自己的包管理器)。使用包管理器时,包将安装在它们所属的位置以及其他应用程序希望找到它们的位置。将二进制文件从包管理器目标位置移出会导致以后出现问题,因此请将它们保留在原处。
规则 2:如果您在包管理器中找不到所需的包,那么您可能必须从源代码编译和安装。这种情况可能会让人感到困惑。您正在编译的应用程序通常会附带一个 make 文件,该文件告诉 make 在调用 make install 时将文件安装到哪里。通常,这时您会发现文件安装在 /opt 或 /usr/local 中。这些是从源代码安装的应用程序的常见位置。更具体地说,在我看来,我通常会发现闭源二进制文件最终位于 /opt 中,而开源二进制文件最终位于 /usr/local 中
关于您看到的符号链接,您说得对。在大多数情况下,当您看到像您所说的符号链接情况时,这是由安装过程完成的,目的是促进升级/向后兼容/或其他已知问题。
关于数据 - 如果您谈论的是 conf 文件,您通常会在 /etc 目录中找到它们。各种 lib 目录提供系统上其他应用程序使用的库。
多年来,LSB(Linux 标准库)项目一直在尝试标准化此类内容和 init 脚本位置。它取得了一些进展,但并没有达到他们的预期,主要是因为较旧的发行版在其业务方式上根深蒂固,并且看不到改变其他方法的价值。
希望有所帮助。
答案3
您可能需要查看文件系统层次结构标准 (v2.3)http://www.pathname.com/fhs/。
Linux 标准核心基础规范 (v3.1) 第 16 章对此进行了引用。