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


107

什么是对“UNIX系统资源”,或理/usr目录,描述在这里,它复制了根目录下的许多目录的名称/

我的目的:我是在第十次安装Oracle JDK,并决定这次将它放在下面,/home/user而我只是在阅读一遍,以了解在单用户计算机上是否是个坏主意。


1
您的主目录是非第三方安装第三方软件的理想场所。
Lekensteyn'5

9
...可悲的认识,因为您认为/usr这意味着一个隐藏的“用户”目录已有很多年了……
Govind Rai

6
我一直以为这一直是“用户”。如用户的二进制文件
坦纳巴布科克

Answers:


168

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

简洁版本:

由于您的链接已经说过,/usr是一个地方的全系统只读文件。因此,所有已安装的软件都已安装在那里。它不复制/except /bin和的任何名称/lib,但最初具有不同的用途:/bin, /lib用于引导所需的二进制文件和库,而/usr/bin, /usr/lib用于所有其他可执行文件和库。(现在是个好孩子,不要问/sbin,毕竟这是短版)

如今,“需要引导”和“不需要引导”之间的区别已经减少,因为包括Ubuntu在内的大多数现代发行版都无法从发行多个文件来正确引导/usr。这就是为什么有对合并一个强烈的运动/usr/bin/bin,所以很可能在不久的将来(Ubuntu的12.10吧?)/bin将是一个符号链接/usr/bin

但是,也许你是混乱/usr/usr/local?因为是的,所以有(并且应该是)很多重复的目录名。稍后再说...

长版:

上世纪70年代,在Unix(是Unix,早于Linux)中,软盘空间很小(没有HD,还记得吗?),并且在给定的位置,系统二进制文件的数量和大小都增加了太多,以至于它们不会磁盘只能容纳一个磁盘,因此开发人员必须将它们拆分为几种介质,从而为它们创建新的挂载点。/bin文件系统已满,因此他们在...上安装了新的二进制文件/usr/bin。而且/usr是,在那个时候,他们的...... 用户目录!

在发生了(几乎令人尴尬并且经常被讲成笑话/知识)的分裂之后,他们开始创建“人为”的理由(和标准)来决定将/bin要做什么和要去做什么/usr/bin。非正式规则是:“必不可少”的东西去 /bin,“其余”去/usr/bin。与相同/lib。不久之后,/usr就变得与系统相关的目录挤满了用户目录。这样/home就诞生了,它可以保留所有与用户相关的目录,并/usr仅对系统“填充” 保持清洁。

这早在FHS出现之前就已经存在。创建它时,它接受(并正式化)了当前的传统并保留了名称/usr,尽管那时它已经与“用户”无关。所以,是的,花哨的名字“ ü NIX 小号乌尔斯河- [R epository”或“ ü NIX 小号 ystem [R物资跟不上”都是虚构的名字,这是为时已晚无论如何将其重命名。(但为时不晚/bin

“好吧/usr/sbin?” , 你问。该死,我希望你已经忘记了。好的... /usr/sbin适用于只能(或仅在有意义时)由root用户执行的命令,例如mountfdisk

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

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

看,你后面的三头猴!

好的,希望您分心了。继续...

(如果您认为我在作弊,是的,您是对的。但是“官方”答案也是如此,“只能由root用户执行并且在挂载之前必须可用的基本命令/”)。事实是:这条线确实很模糊,并且有很多旧名称只是“卡住”了,现在很难摆脱它。

有关合并案例的/usr更多信息,来自systemddocs:

与/ usr分开的/ bin,/ sbin和/ lib的历史理由今天不再适用。拆分它们是为了在较快的硬盘上选择工具,该工具较小,因为价格昂贵,并且包含安装较慢的/ usr分区所需的所有工具。如今,initramfs必须已经在早期启动期间挂载了单独的/ usr分区,因此有理由进行拆分。此外,/ bin和/ sbin中的许多工具在现状下已经失去了在没有预安装/ usr的情况下运行的能力。不再有充分的理由使操作系统分散在多个层次结构中,从而失去了其用途。

/usr罗伯·兰德利(Rob Landley)令人惊讶地读到了有关拆分及其原理的文章:

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

如今

当前,关于安装目录,最好的理解方法是这样思考:

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

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

  • /opt-对系统范围内的只读且自包含的软件的恶意行为。也就是说,软件不会对他们的文件分割binlibshareinclude像乖巧的软件应该。

  • ~/.local-的每用户对应项/usr/local,即:每个用户(并为每个用户安装)的软件

  • ~/.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不处理用户的主文件夹。这是XDG的尝试,XDG是另一个面向桌面环境的标准组织(例如Gnome,KDE和Unity),试图就用户住宅的结构设置一些约定。并非所有软件都遵守它(例如,~/.local/bin不是用户的默认值$PATH,而是逻辑上应该如此),并且没有用户被迫遵循它,但是如果这样做,它们都会获得很多互操作性。

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

(我也希望纯粹主义者不要因为这样一种非常非正式的语言和解释而杀了我。这是有意的,并且肯定有很多不正确之处,但是我确实相信这是使新来者对安装有一个简要概述的好方法。目录基本原理)


1
您非常简洁地总结了它,是的,这是真的-完整的答案比上面的要长得多!
papashou 2012年

为什么不?逻辑相同:攻击者可以在可执行文件的主目录或子目录下创建可执行文件,并以系统命令命名。
ignis

3
@ignis:如果攻击者有权在用户家中创建和修改文件,则该用户已经完全受到威胁,$PATH因此无关紧要。攻击者甚至可以通过更改此内容~/.profile,因此您的想法没有意义。~/.local/bin与一样安全(如果需要~/bin,也可以不安全),这是大多数发行版中的常见做法。用户不应具有任何目录来保留和执行个人脚本的想法$PATH是荒谬的。
MestreLion

因此,~/bin和一样安全~/.profile,并且$PATH不能保护我免受我运行的恶意软件的侵害(该恶意软件有权在我自己的家中写东西)。我不知道该文件,很抱歉。感谢您的澄清,对不起我的评论。
ignis 2013年

历史越长,改进/混乱越多。
smwikipedia '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.