/usr
如上所述,“unix 系统资源”或目录的理由是什么这里,其中复制了根目录下的许多目录名/
?
我的目的:我已经无数次安装 Oracle JDK 了,这次/home/user
我决定将它放在下面,然后阅读一些内容来看看在单用户机器上安装它是否是个坏主意。
答案1
您的答案有简短版本和长版本......
历史
简洁版本:
正如你的链接所说,/usr
是一个地方全系统,只读文件。所以您安装的所有软件都会在那里。它不会重复/
除/bin
和之外的任何名称/lib
,但最初具有不同的用途:/bin
和/lib
仅适用于二进制文件和库启动所需,而/usr/bin
和/usr/lib
适用于所有其他可执行文件和库。(现在请不要问/sbin
,这是短的毕竟版本)
如今,启动所需和非所需之间的区别已经缩小,因为大多数现代发行版(包括 Ubuntu)如果没有几个文件就无法正常启动/usr
。这就是为什么有一个强大的走向合并 /usr/bin
和/bin
。从 Ubuntu 19.04 开始/bin
,/lib
(和/sbin
)只是符号链接到其/usr
对应方,从 Ubuntu 20.04 开始它们就不再存在了。
但也许你混淆/usr
了/usr/local
?因为是的,确实有(也应该有)一个很多重复的目录名称。稍后会详细介绍...
长版本:
早在 70 年代,在 Unix 中(是的,Unix,Linux 之前),磁盘空间很小(还没有硬盘!),并且在某个时间点,系统二进制文件的数量和大小增长过多,以至于它们无法容纳单个磁盘,开发人员必须将它们拆分到多个介质上,从而为它们创建新的挂载点。/bin
文件系统已满,因此他们将新的二进制文件安装在... /usr/bin
。/usr
当时,他们的...用户目录!
在发生这种几乎令人尴尬的分裂之后,他们开始创造人为的理由和标准来决定什么应该放在/bin
什么应该放在/usr/bin
。非正式规则是:“必要的”东西放在/bin
,“其余的”放在/usr/bin
。 也是一样/lib
。不久之后,它就/usr
变得拥挤不堪,与系统相关的目录和实际用户的家目录混在一起。因此,/home
诞生了,它用于保存所有与用户相关的目录,并/usr
只保留“系统内容”。
这远早于跳频存在。当它被创建时,它接受并正式化了当前的传统并保留了名称/usr
,尽管那时它已经与“用户”不再有任何关系。所以是的,像“乌尼克斯年代来源R存储库”或“乌尼克斯年代系統Resources” 都是虚构的名字,无论如何重命名都为时已晚。但是,正如我们所见,将/bin
、/lib
和/sbin
放入其中还不算太晚。/usr
现在主“系统”目录也是如此。
“好的,那怎么样/usr/sbin
?”,你问道。该死,我希望你忘记了。好吧……/usr/sbin
是用于只能由用户执行(或仅在由root
用户执行时才有意义的)的命令,例如mount
和fdisk
。
“但是这不是几乎和一样吗/bin
?”。是的,当然可以,但是……
“等等,那为什么还有一个/sbin
?这没有任何意义!”。嗯,那是因为……呃……嗯……等等……
看,你身后有一只三头猴子!
好的,希望你已经分心了。继续……
如果你认为我在作弊,是的,我确实在作弊。但“官方”答案也是如此:“只能由 root 执行的基本命令,并且必须在挂载之前可用/
。”什么?拜托!事实是:这条界线确实很模糊,有很多遗留的名称和路径“卡住了”,现在很难摆脱。
更多关于/usr
合并案例,来自systemd
文档:
/bin、/sbin 和 /lib 与 /usr 分离的历史理由如今已不再适用。它们被分离出来是为了将选定的工具放在更快的硬盘上(因为更贵,所以硬盘较小),并包含挂载较慢的 /usr 分区所需的所有工具。如今,单独的 /usr 分区在早期启动期间必须由 initramfs 挂载,因此分离的理由已毫无意义。此外,/bin 和 /sbin 中的许多工具在现状下已经失去了在没有预挂载 /usr 的情况下运行的能力。不再有理由将操作系统分散到多个层次结构中,它失去了其目的。
罗伯·兰德利 (Rob Landley) 撰写了一篇关于这次/usr
分裂及其原因的精彩文章:
了解 bin、sbin、usr/bin、usr/sbin 的划分
如今
目前,关于安装目录,最好的理解方式是这样思考的:
/usr
- 由操作系统安装(或提供)的所有系统范围的只读文件/usr/local
- 由本地管理员(通常是您)安装的系统范围的只读文件。这就是为什么大多数目录名称/usr
在这里重复的原因。/opt
- 针对系统范围的只读的暴行并且自给自足软件。也就是说,软件不会像行为良好的软件那样将文件拆分为bin
、lib
、share
。include
~/.local
- 的按用户对应项/usr/local
,即:由每个用户安装(并为每个用户安装)的软件。与 一样/usr
,它有自己的~/.local/share
、~/.local/bin
、~/.local/lib
。~/.local/opt
- 每个用户对应的/opt
那么在哪里安装软件呢?
上面的列表已经回答了你关于 Oracle JDK 问题的一半,至少它提供了一些线索。“我应该在哪里安装软件X?”经过:
它是否是完全独立的单目录软件,如 Eclipse IDE 和其他下载的 Java 应用程序,并且您希望它可供所有用户使用?那么请安装在
/opt
同上,但你不关心其他用户,我想为你的用户单独安装?那么安装在
~/.local/opt
它的文件分布在多个目录中,如
bin
和share
,就像使用 编译和安装的传统软件一样./configure && make && sudo make install
,并且应该可供所有用户使用?然后安装在/usr/local
与上面相同,但仅适用于您的用户?然后安装
~/.local
由操作系统或通过包管理器(如软件中心)安装的软件,最重要的是,当更新管理器将其升级到新版本时,任何本地修改都可能被覆盖? 它去
/usr
笔记:
这解释了为什么编译软件的默认安装前缀是,以及为什么在为自己的用户安装软件时
/usr/local
应该将其更改为./configure --prefix=$HOME/.local
你可能已经注意到了全部以上目录只读(当然,安装/删除软件时除外)。可写文件(如配置文件)通常位于
/etc
(系统范围的软件)和~/.config
(每个用户的设置)。尽管许多旧版软件(不幸的是,也有一些现代软件)仍在使用~/.<software-name>
,但您的主文件夹根目录却充斥着数十个隐藏目录和文件。~/.local
并且~/.config
不是 FHS 规范的一部分。FHS 不处理用户的主文件夹。它们是自由桌面/XDG,另一个面向桌面环境(如 Gnome、KDE 和 Unity)的标准组织,试图设定一些关于用户家庭结构的惯例. 并非所有软件都遵守此规定(例如,发行版最近才将其包含~/.local/bin
在用户的默认设置中$PATH
,并且仅当它存在时),并且没有用户被强迫遵守它,但如果他们遵守的话,双方都会获得许多互操作性方面的好处。
我希望这有助于澄清一些事情。请随意提问,以便我可以改进答案!
(并且我也希望纯粹主义者不会因为这种非常不正式的语言和解释而杀了我。这是故意的,并且肯定有很多不准确之处,但我确实相信这是让新手对安装目录原理有一个简要概述的好方法)