为什么我要把所有东西都移到/opt目录下?

每次我阅读有关安装SDK、IDE、某些扩展等的提示时,都会说我应该将它们解压到/opt文件夹中。为什么需要这样做呢?
当我安装Ubuntu时,我看到应该为/文件系统设置10-20 GiB的空间,剩余的空间则分配给/home。所以,我应该扩展根目录的空间,还是将所有东西留在/home?有什么区别吗?

1你在这里有两个问题。每个帖子只允许一个问题。请编辑您的帖子,如果您愿意,可以发布另一个关于大小或主文件夹的问题。 - Sergiy Kolodyazhnyy
请访问http://www.linuxjournal.com/magazine/pointcounterpoint-opt-vs-usrlocal。 - Panther
5个回答

首先,要明白任何不明确挂载为单独分区的目录(或该挂载点的子目录)都存储在根目录(/)分区上。因此,如果你有根目录(/)和/home,并且没有其他分区,那么你的/opt目录只是根目录(/)上的一个目录。同样,/tmp、/sbin和其他任何目录也是如此。因此,最初的问题基于错误的前提,即你需要为从根目录(/)开始的每个目录设置单独的分区,所以无法直接回答这个问题。
第二,/opt用于第三方软件,在Ubuntu的上下文中,这意味着通过Debian软件包未分发的预编译软件。偶尔你会看到官方程序文档提到/opt,但有可用的Debian软件包可以将这些文件放在其他地方。在这种情况下,当您使用Debian软件包时,应忽略官方文档,或者至少忽略其文件位置引用。此外,如果可以选择通过tarball或Debian软件包使用预编译软件包,通常最好使用Debian软件包。总之,如今使用/opt相当罕见。如果您仍然认为需要将文件放入/opt中,最好提供软件名称,因为这里的人们可能知道该软件是否有Debian软件包可用。
综合前面两点,Ubuntu安装很少将/opt分割为单独的分区,因为存储在那里的数据量很少。大多数Ubuntu软件都放在/usr和其他位置。曾经常将/usr分割为单独的分区,但这种做法如今已经相当罕见。如果您确实需要在/opt中安装大量软件,那么为其创建一个单独的分区可能是有意义的,但在许多情况下,这并不会真正有所帮助。单独的分区只有在需要以不同方式处理安全性、需要使用不同的文件系统功能、需要在多重引导配置中共享数据以及其他原因时才有意义。常规软件安装不太可能从单独的分区中受益;事实上,为/opt创建单独的分区可能会导致问题,如果存储在那里的软件消耗的空间发生变化,或者最初的大小估计错误。

2关于“现在很少使用/opt目录”的说法,你确定吗? - Pacerier
@Pacerier 由于某种原因,/opt似乎正在重新流行起来,在几年前的Ubuntu中,/usr/local显然更受欢迎。无论如何,在我看来,/opt和/usr/local是等效的。参见http://www.linuxjournal.com/magazine/pointcounterpoint-opt-vs-usrlocal和http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/usr.html "现在,'/usr/local'被广泛认为是存放自编译或第三方程序的好地方。" - Panther

你会吗?

事实是你不需要这样做。使用/opt只是一种约定俗成的做法。我建议你使用它,但并非必须。

来自Linux文件系统层次结构:第1章. Linux文件系统层次结构

1.13. /opt
此目录保留给所有不属于默认安装的软件和附加包。例如,StarOffice、Kylix、Netscape Communicator和WordPerfect包通常可以在这里找到。为了符合FSSTND的规定,所有第三方应用程序都应该安装在此目录中。要在此处安装的任何包必须将其静态文件(即额外的字体、剪贴画、数据库文件)放置在单独的/opt/'package'或/opt/'provider'目录树中(类似于Windows将新软件安装到自己的目录树C:\Windows\Progam Files\"Program Name"的方式),其中'package'是描述软件包的名称,'provider'是提供者的LANANA注册名称。
尽管大多数发行版忽略了创建/opt/bin、/opt/doc、/opt/include、/opt/info、/opt/lib和/opt/man目录,但它们是为本地系统管理员使用而保留的。包可以提供“前端”文件,系统管理员可以将其放置在(通过链接或复制)这些保留目录中,但在没有这些保留目录的情况下必须正常运行。用户调用的程序位于目录/opt/'package'/bin中。如果软件包包含UNIX手册页,则它们位于/opt/'package'/man目录中,并且必须使用与/usr/share/man相同的子结构。可变的包文件必须安装在/var/opt中。特定主机的配置文件安装在/etc/opt中。
除了那些必须位于文件系统树中特定位置才能正常运行的软件包文件外,其他软件包文件绝不能存在于/opt、/var/opt和/etc/opt层次结构之外。例如,/var/lock中的设备锁文件和/dev中的设备。发行版可以在/opt中安装软件,但在没有本地系统管理员的同意下,不得修改或删除由本地系统管理员安装的软件。
在UNIX社区中,使用/opt作为附加软件的目录是一种成熟的做法。基于System V接口定义(第三版)和Intel二进制兼容性标准v.2(iBCS2)的System V应用程序二进制接口[AT&T 1990]提供了一个与此处定义的/opt结构非常相似的结构。
通常,在系统上支持一个软件包所需的所有数据都必须存在于/opt/'package'中,包括要复制到/etc/opt/'package'和/var/opt/'package'中的文件,以及/opt中的保留目录。对于使用/opt的发行版来说,这些次要限制是必要的,因为在某些二进制软件中可能存在分布式安装和本地安装软件之间的冲突,特别是固定路径名的情况。
/opt/'provider'目录下方的目录结构由软件的打包者决定,尽管建议将软件安装在/opt/'provider'/'package'中,并遵循与/opt/package的指南类似的结构。偏离这种结构的一个有效理由是支持包,它们可能在/opt/'provider'/lib或/opt/'provider'/bin中安装文件。

这很奇怪,因为大多数人都建议将一小部分空间分配给根目录,我以为这样做不会有太大变化。看来我需要提醒那些建议者遵循惯例了吗? - Praytic
3@Praytic 不完全是这样。在过去,/opt通常是一个独立的驱动器。它用于安装专有软件,由于捆绑了所有所需的库和其他资源,这些软件通常需要大量的磁盘空间。现代驱动器如此之大,以至于只使用单个驱动器上的单个根目录更为可行和简便。 - bain
@Torrien,关于/opt在“不同”的Linux系统之间共享的问题怎么样?这意味着它们真的是不同的,即不同于MX Linux和Ubuntu,因为它们只是Debian。 - itil memek cantik

/opt用于(有时是专有的)外部应用程序,这些应用程序不被视为Linux发行版的一部分。这些应用程序可能具有硬编码的路径,因此只有在安装到/opt时才能正确运行 - 但如果没有硬编码的路径,则可以将它们安装到任何路径。在/opt中安装的程序应该是自包含的。

使用/opt的主要原因是提供一个常见的标准路径,可以在不干扰已安装系统的情况下安装外部软件。 /opt不会出现在标准编译器或链接器路径(如gcc -print-search-dirs/etc/ld.so.conf等)中,因此在那里安装的头文件和库与主系统有一定的隔离,并且不应干扰已安装的程序。

使用/opt的方式由文件系统层次结构标准/opt指定,该标准指出/opt最初来自Unix。

/opt:附加应用软件包 目的 /opt 保留用于安装附加应用软件包。
要在 /opt 中安装的软件包必须将其静态文件放置在单独的 /opt/ 或 /opt/ 目录树中,其中 是描述软件包的名称, 是提供者的 LANANA 注册名称。 要求 目录 /opt/bin、/opt/doc、/opt/include、/opt/info、/opt/lib 和 /opt/man 保留供本地系统管理员使用。软件包可以提供“前端”文件,预期由本地系统管理员放置在(通过链接或复制)这些保留目录中,但必须在没有这些保留目录的情况下正常运行。
用户调用的程序必须位于目录 /opt//bin 或 /opt/ 层次结构下。如果软件包包含 UNIX 手册页,则必须将它们放置在 /opt//share/man 或 /opt/ 层次结构下,并且必须使用与 /usr/share/man 相同的子结构。
在正常操作中会发生变化的可变(variable)软件包文件必须安装在 /var/opt 中。有关更多信息,请参阅关于 /var/opt 的部分。
特定主机配置文件必须安装在 /etc/opt 中。有关更多信息,请参阅关于 /etc 的部分。
除了那些必须位于文件系统树中特定位置以正常运行的软件包文件之外,不得存在其他软件包文件在 /opt、/var/opt 和 /etc/opt 层次结构之外。例如,设备锁文件必须放置在 /var/lock 中,设备必须位于 /dev 中。
发行版可以在 /opt 中安装软件,但不能在没有本地系统管理员同意的情况下修改或删除由本地系统管理员安装的软件。 原因 在 UNIX 社区中,将 /opt 用于附加软件是一种成熟的做法。基于 System V 接口定义(第三版)的 System V 应用程序二进制接口 [AT&T 1990] 在这里定义了与此处定义的非常相似的 /opt 结构。
Intel 二进制兼容性标准 v.2(iBCS2)也为 /opt 提供了类似的结构。
通常,支持系统上的软件包所需的所有数据都必须存在于 /opt/ 中,包括预期要复制到 /etc/opt/ 和 /var/opt/ 中的文件,以及 /opt 中的保留目录。
对于使用 /opt 的发行版施加轻微限制是必要的,因为在某些二进制软件中可能存在分布式安装和本地安装软件之间的冲突,特别是固定路径名的情况。
在 /opt/ 下面的目录结构由软件打包者自行决定,尽管建议将软件包安装在 /opt// 中,并遵循与 /opt/package 的指南类似的结构。偏离此结构的一个有效理由是支持软件包可能在 /opt//lib 或 /opt//bin 中安装文件。

关于/opt并没有什么神圣的地方,将预编译软件放在这个目录下只是一种常见做法,以便让系统中的所有用户都能够访问。如果你是系统的唯一用户,在你的主目录下提取软件也没有任何问题。即使系统上有多个需要访问该软件的用户,但你想要使用/home分区的空间,创建一个公共可访问的/home/softwarename目录并在其中提取软件也没有问题(唯一的注意事项是,如果你恰好有一个名为softwarename的用户,你将无法在该用户的主目录下使用它)。


详细的答案非常好,但是(除了软件可能在其中硬编码了绝对路径 - 这不是最佳的编程实践),主要观点是非系统/非分发软件不应与常规系统文件混合存储。
将东西放在/opt或/usr/local中可以保持整洁和安全。
特别是,您的软件搜索路径($PATH)确定查找特定名称的程序以执行时搜索位置的顺序。通常,像/opt和/usr/local这样的地方位于列表的末尾。
如果您安装了一个包含名为cp的程序的软件包,默认的搜索顺序会找到正常的那个,因为它所存储的目录在像/opt这样的位置之前被搜索。
如果不是这样工作的话,谁知道在您认为只是尝试复制一些文件时,运行了一个做其他事情的名为cp的程序会导致什么问题或打开一个安全漏洞呢?
如果发生这样的情况,可能需要一段时间才会有人想到运行像type cp这样的命令(甚至可能不足以显示出问题),以找出正在运行的不是你认为的那个程序。在那之前,你只能陷入“除了它不工作这个小细节外,一切都正常!”的困境。
基本上,这有助于防止意外事件发生,并避免系统更新可能会删除或替换部分或全部“自定义”安装的软件包的情况。或者相反,某些“自定义”程序可能会覆盖其他许多程序或脚本所依赖的系统提供的程序。
从管理角度来看,在同一位置混合放置“系统”和“可选”程序/文件会使您的系统处于“未定义”或至少“模糊”的状态。
如果您的系统或程序出现问题并需要帮助,第一个被问到的问题之一就是“您做了什么改变?”和“我们可以暂时禁用其中一些或所有这些更改,以便确定我们正在查看真正的问题而不仅仅是其他问题的症状。”
通过将它们放置在不同的位置,这些更改可以迅速被识别出来,而您只需(至少对于程序本身)暂时从路径中删除它们的目录即可。