根据文件系统层次结构标准,/opt
用于“附加应用程序软件包的安装”。 /usr/local
是“供系统管理员在本地安装软件时使用”。这些用例看起来非常相似。软件不包含的分布通常是默认配置为在安装/usr/local
或/opt
没有特别无缘无故为他们选择。
我是否缺少某些区别,或者两者都做同样的事情,但是出于历史原因而存在?
根据文件系统层次结构标准,/opt
用于“附加应用程序软件包的安装”。 /usr/local
是“供系统管理员在本地安装软件时使用”。这些用例看起来非常相似。软件不包含的分布通常是默认配置为在安装/usr/local
或/opt
没有特别无缘无故为他们选择。
我是否缺少某些区别,或者两者都做同样的事情,但是出于历史原因而存在?
Answers:
虽然两者都旨在包含不属于操作系统的文件,/opt
并且/usr/local
不打算包含同一组文件。
/usr/local
是安装管理员通常通过使用make
命令(例如./configure; make; make install
)构建的文件的地方。这样做的目的是避免与属于操作系统一部分的文件发生冲突,否则这些文件可能会被覆盖或覆盖本地文件(例如,/usr/bin/foo
属于操作系统的一部分,但/usr/local/bin/foo
可以作为本地替代文件)。
/usr
操作系统实例之间可以共享以下所有文件,尽管Linux很少这样做。这是FHS有点自相矛盾的部分/usr
(定义为只读),但是/usr/local/bin
需要读写才能使本地软件成功安装。SVR4文件系统标准是FHS的主要灵感来源,建议避免/usr/local
使用/opt/local
该标准来克服此问题。
/usr/local
是原始BSD的遗产。当时,/usr/bin
OS命令的源代码位于/usr/src/bin
和中/usr/src/usr.bin
,而本地开发的命令的源位于中/usr/local/src
,其二进制文件在中/usr/local/bin
。没有包装的概念(压缩包之外)。
另一方面,/opt
是一个目录,用于安装未捆绑的软件包(即,软件包不是操作系统发行版的一部分,而是由独立的源提供),每个目录都位于其自己的子目录中。它们已经由独立的第三方软件发行商提供了完整的软件包。与/usr/local
包不同,这些包遵循目录约定(或至少应遵循)。例如,someapp
将安装在中/opt/someapp
,使用命令之一/opt/someapp/bin/foo
,将其配置文件安装在中/etc/opt/someapp/foo.conf
,并将日志文件安装在中/var/opt/someapp/logs/foo.access
。
基本区别在于/usr/local
不是由系统打包程序管理,而是仍遵循标准的UNIX部署规则的软件。
这就是为什么你有/usr/local/bin
,/usr/local/sbin
/usr/local/include
等...
/opt
另一方面是针对不遵循此要求并以整体方式部署的软件。这通常包括以“ Windows”样式打包的商业和/或跨平台软件。
对我而言,这就是比尔在@philfr的链接中所说的话:
在开发系统或沙箱上,拥有一个/ opt目录,您可以在其中扔东西并查看它们是否正常工作。我知道我不会自己打包东西来尝试它们。如果该应用程序无法正常运行,您可以简单地rm / opt / mytestapp目录,并且该应用程序为历史记录。当您运行大型部署时(有时候我打包应用程序时),打包可能很有意义,但是很多时候,最好将/ opt中的内容扔掉。
不幸的是,大多数make install
脚本将文件推送到其中,/usr/local
而不仅仅是在其中建立符号链接:-/
make install
将文件推送到目标上进行评论/usr/local
; 可以通过将--prefix=
命令行参数传递给./configure
脚本来轻松更改此功能,或者,如果没有./configure
脚本,则可以将参数传递给make
目标,如下所示:make --prefix=/usr install
。
/opt/foo-1.1
和中有两个版本的'foo' /opt/foo-1.2
。当我升级时,foo
symlink /usr/local/bin
指向foo-1.2。如果出于某种原因需要回滚,则只需将符号链接替换为指向foo-1.1的符号链接。如果几周后1.2仍然可以,请rm -rf /opt/foo-1.1
快速,干净地删除旧版本。
首先,我认为没有严格的答案;根据他们的背景,不同的管理员会有不同的意见。从历史上看,它/usr/local
排在第一位。这是IIRC伯克利的公约。在系统V的开发过程中的某个时刻,如果我没记错的话(这是很久以前的事了,而且我没有做笔记),那么就有一个决定或愿望是可以挂载/usr
只读的,这意味着您无法向其中添加新软件;那可能就是为什么/opt
发明的原因。碰巧的是,确实有很多现成的软件确实为/usr
这种想法所写,但从未真正起步。
我个人的喜好是/opt
,每个产品都有单独的子目录;这使得移除产品成为的简单案例
rm -fr
。但是,如果您所有的软件都是通过良好的软件包管理器安装的,则没关系,并且如果您安装的软件没有严格遵守这些约定,并且在的某处写入配置等/usr
也没有关系,尽管出于相反的原因。
对于这个问题,我的看法略有不同。
尽管一切都在jlliagre的答案是正确的,对我的实际应用,在群集中部署软件时,归结为默认的环境变量和库的默认重用。
简而言之,- /usr/local
及其所有子目录都位于相应的环境变量中,例如PATH
和MANPATH
,并/usr/local/lib{,64}
位于ldconfig的(/etc/ld.so.conf.d/
)中。
/opt/
OTOH不是-这在要求多个版本或有冲突的软件包共存于系统中时既有利,又需要某种环境管理(例如,环境模块或软件集合),这是不利的,因为它可能会“浪费”通过复制共享库来存储空间,因为其中的每个安装/opt
都可以完全独立完成。
为了使/usr/local
工作具有共享性,假定例如将二进制文件直接安装到/usr/local/bin
(以及相应的手册页/usr/local/share/man/...
),而不是/usr/local/app/{bin,share/man,...}
etc。
/usr/local
是/usr
文件系统的本地版本,而/opt
杂项则是占位符。