为什么软件会自动将其安装在/ usr / lib中?


11

我使用Linux服务器已有多年了,我一直对Filesystem Hierarchy Standard感到困惑。通常,我可以忍受困惑。但是,既然我正在为Linux开发自己的软件,那么我需要了解软件包管理器应该将其安装在何处。

我非常相信/ opt是我的应用程序的理想位置。但是在研究了我的Debian文件系统之后,我不再确定:/ usr / lib中实际上安装了许多软件!仅举几例:MySQL,MySQLWorkbench,Nautilus,Rythmbox ...

根据FHS的说法,/ usr / lib应该包含“用于编程和打包的库”和“包括不希望由用户或shell脚本直接执行的目标文件,库和内部二进制文件”(请参见此处)。

我的debian服务器的/ usr / lib中的许多软件不是库或内部二进制文件,而是成熟的用户可执行软件!

我仍然可以在/ opt中安装我的应用程序。但是我真的很想知道这是否正确,最重要的是为什么

在此先感谢您的建议,

埃里克


2
我可以告诉MySQLWorkbench进行现场检查,它仅在/ usr / lib下安装库。是什么让您认为/ usr / lib中存在“成熟的用户可执行软件”?
Mark Wagner

如果我没记错的话,“应用程序”菜单中的实际快捷方式指向/ usr / lib中的二进制文件。
Eric MORAND

您似乎对列出的软件的安装位置感到困惑。如果是用于MySQL和Nautilus的文件,则这些链接到清单。请注意,文件在/ etc,/ usr / bin,/ usr / lib等文件中分割,就像FHS所说的那样。packages.debian.org/wheezy/i386/mysql-server-5.5/filelist packages.debian.org/wheezy/i386/nautilus/filelist
松鼠

Answers:


6

了解文件系统层次结构标准的真正关键是要知道它是为网络文件系统而设计的。

对于具有相同OS,发行版和体系结构的每台计算机,您都可以通过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

您介意提供本地/远程和r-r / w标准的链接吗?
长颈鹿队长

这是否意味着网络中的每个Linux服务器或工作站都可以有一个/ usr“存储库”?
Eric MORAND

1
这需要一些工作,但是可以。当硬盘价格昂贵时,这是任何大规模部署的标准。
丹·加思韦特

@ eric-morand从FHS:“ / usr是文件系统的第二个主要部分。/usr是可共享的只读数据。这意味着/ usr应该在各种符合FHS的主机之间共享,并且不能写入。任何特定于主机或随时间变化的信息都存储在其他位置。” pathname.com/fhs/pub/fhs-2.3.html#THEUSRHIERARCHY
Dan Garthwaite

哎呀 上面的评论适用于@CaptainGiraffe
Dan Garthwaite

12

不同之处在于,它们/usr要保留作为系统一部分安装的软件包。从Debian / Ubuntu仓库,PPA等获得的软件包,请转至此处。虽然/opt是指未捆绑的第三方应用程序,这些应用程序未通过分发包的分发过程进行分发。

如果您分发.deb或.rpm软件包,并且希望最终将您的软件包含在官方存储库中,则应安装到/usr。否则安装到/opt。无论哪种情况,您的应用程序都应该能够被编译为可以在任意位置运行(例如,借助GNU自动工具)。


谢谢。目前,我还没有计划将我的应用程序包含在官方存储库中。
Eric MORAND

那么/ usr / local呢?或者是离散的
亚伦·科普利

@AaronCopley /usr/local不在此问题范围内。但这是针对本地管理员编译和安装的第三方软件。
迈克尔·汉普顿

这就是为什么我问是否将其视为离散的原因。
亚伦·科普利2013年

2

您安装图书馆<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中。


1

我建议避免在/ opt下安装您的应用程序。原因1:某些发行版默认情况下没有/ opt原因2:/ usr / lib是库的标准路径{如果其他应用程序需要使用您的库,则需要手动将库路径添加到/ etc / ldconfig} / opt当您拥有手动安装的独立应用程序并且想知道它们的位置时,此功能更加方便

成熟的可执行文件位于/ usr / lib下的原因之一可能是它们是从其他脚本中使用的。{例如,bash脚本不能直接使用API​​。因此,一个常见的技巧是在此api周围构建一个“包装器”,然后将参数作为脚本的参数推送}


2
我不同意。如果他想安装在/ opt中,则程序包管理器将创建目录,因此这不是问题。同样,在/ usr / lib中安装二进制文件也不是一个好主意。
Walter

谢谢@Nikolaidis Fotis。但就我而言,我的应用程序不包含公共库,其他应用程序也不会使用。
Eric MORAND

0

请安装在/ opt中。

太多的Linux应用程序与90年代Windows开发人员的制造方式相同。

让我们将我们的东西安装在C:\ windows中,以使其易于查找(并且速度稍快)。随之而来的是DLL地狱15年,因为不同的软件包需要相同库的不同版本(Windows中没有库的版本控制)。

除非您正在编写实际的系统软件,否则请将其放在/ opt中,以便人们可以更好地跟踪谁安装了什么软件。


4
这不是Windows。我们有工作的软件包管理器,这实际上不是什么大问题。
迈克尔·汉普顿

如果您真的担心所有内容都在同一棵树中,请查看Nix软件包管理器。如果你问我,两全其美。
TheSola10 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.