我已经使用 Linux 服务器多年了,但文件系统层次标准总是让我感到困惑。通常情况下,我可以忍受这种困惑。但现在我正在为 Linux 开发自己的软件,我需要了解包管理器应该把它安装在哪里。
我非常确信 /opt 是我应用程序的最佳位置。但在研究了我的 Debian 文件系统后,我不再确定了:很多软件实际上都安装在 /usr/lib 中!举几个例子:MySQL、MySQLWorkbench、Nautilus、Rythmbox……
根据 FHS,/usr/lib 应该包含“用于编程和软件包的库”并且“包含不打算由用户或 shell 脚本直接执行的目标文件、库和内部二进制文件”(看这里)。
我的 debian 服务器的 /usr/lib 中的许多软件不是库或内部二进制文件,而是成熟的用户可执行软件!
我仍按计划将应用程序安装在 /opt 中。但我真的很想了解这是否正确,最重要的是,为什么。
提前感谢您的好意建议,
埃里克。
答案1
理解文件系统层次标准真正的关键在于知道它是专为网络文件系统而设计的。
对于具有相同操作系统、版本和架构的每台机器,您都可以通过 NFS 共享 /usr 并挂载它。
网络堆栈初始化后,将重新挂载 /usr。
/var <-- local, r/w optimized
/usr <-- can be mounted over network, possibly even read-only!
/opt <-- local, read mostly
/etc <-- local, read mostly
/srv <-- local, r/w optimized
/home <-- either/or
答案2
不同之处在于它/usr
用于保存已安装的软件包作为系统的一部分。您从 Debian/Ubuntu 存储库、PPA 等获取的软件包都放在这里。虽然/opt
是用于非捆绑的第三者未通过发行版的包分发过程分发的应用程序。
如果您分发 .deb 或 .rpm 软件包,并着眼于最终将您的软件纳入官方存储库,则应安装到/usr
。否则,请安装到/opt
。无论哪种情况,您的应用程序都应该能够编译以在任意位置运行(例如,在 GNU autotools 的帮助下)。
答案3
您可以在 中安装库<prefix>/lib
,在 中安装二进制文件<prefix>/bin
,在 中安装头文件<prefix>/include
,在 中安装手册页prefix/[share/]man
,在 中安装 pkgconfig 文件,<prefix>/lib/pkgconfig
或者<prefix/share/pkgconfig
在 中安装 cmake .m4 文件<prefix>/share/aclocal
然后让包管理器决定前缀。如果您自己分发 rpm/deb,则/usr
前缀是一个不错的选择。
./configure --prefix=~/.local/
应该仍然可以工作,所以请不要在任何地方对你的路径进行硬编码!
一些库被包装到其他工具中,使得它们也可以执行并可作为库使用,但它们仍然是库,而不在您的 $PATH 中,因此我猜将它们放在 /lib 中是可以的。
答案4
请将其安装在 /opt 中。
太多的 Linux 应用程序与 Windows 开发人员在 90 年代所做的一样。
让我们将内容安装在 C:\windows 中,这样就可以轻松找到(并且速度会更快)。然后是 15 年的 DLL 地狱,因为不同的软件包需要相同库的不同版本(Windows 中没有库的版本控制)。
除非您正在编写实际的系统软件,否则请将其放在 /opt 中,以便人们可以更好地跟踪谁安装了什么。