it-swarm.cn

/ opt和/ usr / local有什么区别?

根据 文件系统层次结构标准/opt用于“附加应用程序软件包的安装”。 /usr/local是“供系统管理员在本地安装软件时使用”。这些用例看起来非常相似。通常,默认情况下,通常将发行版中未附带的软件配置为安装在/usr/local 要么 /opt,没有特别的押韵或选择理由。

我是否缺少某些区别,或者两者都做同样的事情,但是出于历史原因而存在?

440
Patches

虽然两者都旨在包含不属于操作系统的文件,但是/opt/usr/local并不旨在包含同一组文件。

/usr/local是安装管理员通常通过使用make命令(例如./configure; make; make install)构建的文件的地方。这样做的目的是避免与操作系统中的文件发生冲突,否则文件可能会被覆盖或覆盖本地文件(例如,/usr/bin/foo是操作系统的一部分,而/usr/local/bin/foo是本地替代文件) )。

/usr下的所有文件都可以在OS实例之间共享,尽管在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

393
jlliagre

基本区别是/usr/local用于不是由系统打包程序管理的软件,但仍遵循标准的UNIX部署规则。

这就是为什么您有/usr/local/bin,_/usr/local/sbin _ /usr/local/include等...

/opt是针对不遵循此要求并以整体方式部署的软件。这通常包括以“ Windows”样式打包的商业和/或跨平台软件。

89
Šimon Tóth

它们确实非常相似,并且使用其中一个更是一种见解。 Linux期刊上有关于这个确切主题 这里 的观点/非观点讨论。

18
philfr

就我个人而言,这就是比尔在@philfr的链接中所说的话:

在开发系统或沙箱上,拥有一个/ opt目录,您可以在其中扔东西并查看它们是否正常工作,这是很有意义的。我知道我不会自己打包东西来尝试它们。如果该应用程序无法正常运行,您可以简单地rm/opt/mytestapp目录,并且该应用程序为历史记录。当您运行大型部署时(有时我打包应用程序时),打包可能很有意义,但是很多时候,最好在/ opt中扔东西。

不幸的是,大多数make install脚本将文件推入/usr/local而不是仅在此处建立符号链接:-/

13
pepoluan

首先,我认为没有严格的答案;根据背景,不同的管理员会有不同的意见。从历史上来说,/usr/local是第一位;这是IIRC伯克利的公约。在系统V的开发过程中的某个时刻,如果我没记错的话(这是很久以前的事,而且我没有做笔记),那么就决定或希望能够安装/usr只读,这意味着您无法向其中添加新软件;可能就是发明/opt的原因。碰巧的是,确实有太多的现有软件确实写入/usr,以至于这个想法从未真正付诸实践。

我个人的喜好是/opt,每个产品都有一个单独的子目录;这使得删除产品成为rm -fr的简单情况。但是,如果您所有的软件都是通过良好的软件包管理器安装的,则没关系,并且如果您安装的软件没有严格遵守这些约定,并且在/usr下的某个位置写了配置等,就没有关系。两者都无关紧要,尽管出于相反的原因。

12
James Kanze

对于这个问题,我的看法略有不同。
虽然 jlliagreanswer 中的所有内容都是正确的,但在集群中部署软件时,对我而言的实际应用归结为默认环境变量和默认库的重用。

简单地说-_/usr/local_及其所有子目录都在适当的环境变量中,例如PATHMANPATH,而_/usr/local/lib{,64}_在ldconfig的(_/etc/ld.so.conf.d/_ )。

_/opt/_ OTOH不是-这在要求多个版本或有冲突的程序包共存于系统中时非常有利,但是需要某种环境管理(例如 environment-modules 或- 软件集合 ),缺点是它可能通过复制共享库来“浪费”存储空间,因为_/opt_中的每个安装都可以完全独立。

为了使_/usr/local_的共享性质起作用,假设例如二进制文件直接安装到_/usr/local/bin_(并且手册页安装到适当的_/usr/local/share/man/..._)而不是_/usr/local/app/{bin,share/man,...}_等。

10
Dani_l

总而言之,我的直觉答案...

从2.2.6版本开始使用FreeBSD,从9版本开始使用Red Hat Linux。

/usr/local == Old School Conventions
/opt       == New School Conventions

在UNIX/Linux文件系统上,事物的安排更多地与约定和传统有关,而不是绝对逻辑。

否则,我大多数都同意其他人的观点。 :-)

该规则总是有一些例外。在一天结束时,您将决定什么是最适合您的设置的(尽可能)。

0
Anthony Rutledge