/usr 目录的基本原理是什么?

H2O*_*aCl 135 filesystem history-of-ubuntu

此处所述的“unix 系统资源”或/usr目录与根目录下的许多目录名称重复的基本原理是什么?/

我的目的:我无数次安装 Oracle JDK 并决定这次将它放在下面/home/user,我只是阅读了一下,看看它在单用户机器上是否是一个坏主意。

Mes*_*ion 223

你的答案有短版和长版...

历史

精简版:

由于您的链接已经说过,/usr是一个地方的全系统只读文件。所以你安装的所有软件都放在那里。它不重复任何名称/except/bin/lib,但最初具有不同的目的:/binand/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只为“系统内容”保持清洁。

这是早在FHS存在之前。当它创建时,它接受并正式化了当前的传统并保留了名称/usr,尽管当时它已经与“用户”无关。所以,是的,像“好听的名字ü NIX小号乌尔斯河- [R epository”或“ ü NIX小号ystem [R物资跟不上”都是虚构的名字,这是为时已晚无论如何将其重命名。但是,正如我们已经看到了它,为时未晚折腾/bin/lib/sbin进去。所以/usr现在主要的“系统”目录。

“好的,那怎么/usr/sbin办?” , 你问。该死的,我希望你忘记了。好的.../usr/sbin适用于只能(或仅当)由root用户执行的命令,例如mountfdisk

“但那不是几乎一样/bin吗?” . 是的,当然,但是...

“等等,那为什么还有一个/sbin?那没有任何意义!” . 嗯,那是因为……呃……嗯……等等……

看,你身后有一只三头猴!

好吧,希望你分心了。继续...

如果你认为我在作弊,是的,我确实是。但“官方”答案也是如此: “只能由 root 执行并且必须在您挂载之前可用的基本命令/。” 什么?来吧!事实是:这条线确实很模糊,而且有很多遗留名称和路径只是“卡住”了,现在很难摆脱。

更多关于合并案例的信息/usr,来自systemd文档:

将 /bin、/sbin 和 /lib 与 /usr 分开的历史理由今天不再适用。它们被拆分为在更快的硬盘上选择工具(它很小,因为它更贵)并包含挂载较慢的 /usr 分区所需的所有工具。今天,initramfs 必须在早期引导期间挂载一个单独的 /usr 分区,因此有理由进行拆分。此外,现状中的/bin和/sbin中的很多工具已经失去了在没有预先挂载/usr的情况下运行的能力。没有正当理由让操作系统分布在多个层次结构中,它失去了它的目的。

/usr罗伯·兰德利 (Rob Landley)对分裂及其理由的精彩解读:

理解 bin, sbin, usr/bin , usr/sbin 拆分


如今

目前,关于安装目录,您最好的理解方式是这样想:

  • /usr - 操作系统安装(或提供)的所有系统范围的只读文件

  • /usr/local- 由本地管理员(通常是您)安装的系统范围的只读文件。这就是为什么大多数目录名称在/usr这里重复的原因。

  • /opt- 一种针对全系统、只读和自包含软件的暴行。也就是说,软件,不随分裂他们的文件binlibshareinclude像乖巧的软件应该。

  • ~/.local- 每个用户对应的/usr/local,即:由(和为)每个用户安装的软件。象/usr,它有它自己的~/.local/share~/.local/bin~/.local/lib

  • ~/.local/opt - 每个用户对应的 /opt

那么在哪里安装软件呢?

上面的列表已经是您 Oracle JDK 问题的一半答案,至少它提供了一些线索。“我应该在哪里安装软件 X?”的清单 路过:

  • 它是一个完全独立的单目录软件,如 Eclipse IDE 和其他下载的 Java 应用程序,并且您希望所有用户都可以使用它吗?然后安装在/opt

  • 和上面一样,但是你不关心其他用户,我想单独为你的用户安装?然后安装在~/.local/opt

  • 它的文件分成多个目录,比如binshare,就像用 编译和安装的传统软件一样./configure && make && sudo make install,应该对所有用户可用?然后安装在/usr/local

  • 与上面相同,但仅适用于您的用户?然后安装在~/.local

  • 由操作系统或通过包管理器(如软件中心)安装的软件,最重要的是,当更新管理器将其升级到新版本时,任何本地修改都可能被覆盖?它去/usr

笔记:

  • 这解释了为什么编译软件的默认安装前缀是/usr/local,以及为什么./configure --prefix=$HOME/.local在仅为您自己的用户安装软件时应该将其更改为

  • 您可能已经注意到上述所有目录都是只读的(当然,安装/删除软件时除外)。可写文件(如配置文件)通常转到/etc(对于系统范围的软件)和~/.config(对于每用户设置)。尽管许多旧版软件(不幸的是,也有一些现代软件)仍在使用~/.<software-name>.

  • ~/.local并且~/.config不是 FHS 规范的一部分。FHS 不处理用户的主文件夹。它们是Freedesktop/XDG 的一种尝试,另一个面向桌面环境(如 Gnome、KDE ​​和 Unity)的标准组织试图设置一些关于用户主页结构的约定。并非所有软件都遵守它(例如,发行版最近才包含~/.local/bin在用户的默认值中 $PATH,并且仅当它存在时),并且没有用户被迫遵循它,但是如果他们这样做,两者都会获得许多互操作性好处。

我希望这有助于澄清一些事情。随时提出任何问题,以便我改进答案!

(我也希望纯粹主义者不要因为这种极其非正式的语言和解释而扼杀我。这是故意的,它肯定有很多不准确之处,但我确实相信这是让新手对安装有一个简要概述的好方法目录原理)

  • @ignis:如果攻击者有权在用户的家中创建和修改文件,那么该用户已经完全受到威胁,并且`$PATH` 无关紧要。攻击者甚至可以通过`~/.profile` 改变*那个*,所以你的观点没有实际意义。`~/.local/bin` 与 `~/bin` 一样安全(或不安全,如果你愿意),这是大多数发行版中的常见做法。用户不应该有 *any* 目录来保存和执行 `$PATH` 中的个人脚本的想法是荒谬的。 (3认同)
  • 你总结得非常简洁,是的,这是真的——完整的答案比上面的故事要长得多! (2认同)
  • 这个答案就像一次旅行!这个人统治:) (2认同)