问题描述
“unix系统资源”或/usr
目录的基本原理是什么,如here所述,它复制了根目录/
下的许多目录名称?
我的目的:我正在安装Oracle JDK的时间很短,并决定把它放在/home/user
下,我只是稍微阅读一下,看看它是不是一个用户机器上的坏主意。
最佳解决方案
有你的答案的简短版本和长版本…
简洁版本:
如您的链接已经说过,/usr
是system-wide,read-only文件的地方。所以你安装的软件都去那里了。除了/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
当时是…用户目录!
在(几乎令人尴尬并且常常被告知为玩笑/传奇)发生分裂之后,他们开始创建”artificial”理由(和标准)来决定将会转到/bin
以及将转到/usr/bin
。非正式的规则是:”essential”的东西去/bin
,”the rest”去/usr/bin
。与/lib
一样。不久之后,/usr
变得拥挤了system-related dirs,与user-dirs混合在一起。因此,/home
诞生了,以保持所有user-related dirs,并且保持/usr
仅用于系统”stuff”。
这在FHS存在很久之前。当它被创建时,它接受了(并形式化)了当前的传统,并保留了名称/usr
,但当时它已经不再与”user”无关。所以,有趣的名字“U NIX s ource r epository”或“U NIX s ystem r esources”都是made-up的名字,现在为时已晚,无法重新命名。 (但是将/bin
合并到它并不晚)
“好的,/usr/sbin
呢?”,你问。该死的,我希望你已经忘记了。好的… /usr/sbin
用于root
用户执行的命令,例如mount
和fdisk
。
“但是这与/bin
几乎没有什么区别?”。是的,当然,但是…
“等等,为什么还有/sbin
?没有任何意义!”那是因为……呃……哼..
看,你身后有一只三头猴子!
好的,希望你已经分心了。继续…
(如果你认为我是作弊者,那么你是对的,但”official”答案也是“只能由root执行的基本命令,在安装/
之前必须可用”)。事实是:这条线确实是模糊的,并且有很多旧的名称,只是”stuck”,现在很难摆脱。
有关/usr
合并案的更多信息,请参阅systemd
文档:
The historical justification for a /bin, /sbin and /lib separate from /usr no longer applies today. They were split off to have selected tools on a faster hard disk (which was small, because it was more expensive) and to contain all the tools necessary to mount the slower /usr partition. Today, a separate /usr partition already must be mounted by the initramfs during early boot, thus making the justification for a split-off moot. In addition, a lot of tools in /bin and /sbin in the status quo already lost the ability to run without a pre-mounted /usr. There is no valid reason anymore to have the operating system spread over multiple hierarchies, it lost its purpose.
Rob Landley对/usr
拆分及其基本原理有了惊人的解读:
Understanding the bin, sbin, usr/bin , usr/sbin split
如今
目前,关于安装目录,你最好的理解方式是这样思考:
-
/usr
– 由OS安装(或由OS提供)的所有system-wide,read-only文件 -
/usr/local
– system-wide,read-only由本地管理员(通常是您)安装的文件。这就是为什么来自/usr
的大多数目录名都在这里重复。 -
/opt
– 针对system-wide,read-only和self-contained软件的暴行。也就是说,不能通过bin
,lib
,share
,include
(如well-behaved)软件分割文件的软件应该如此。 -
~/.local
– 与/usr/local
相对应的per-user,即:由(以及为每个用户安装的)软件 -
~/.local/opt
– 与/opt
相对应的per-user
那么在哪里安装软件?
上面的列表已经是Oracle JDK问题的一半答案,至少它提供了几条线索。 “我应该在哪里安装软件X?”清单过去:
-
它是完全self-contained,单目录软件,如Eclipse IDE和其他下载的Java应用程序,并且您希望它可供所有用户使用?然后安装在
/opt
中 -
同上,但你不关心其他用户,我想为你的用户单独安装?然后安装在
~/.local/opt
中 -
它的文件分割为多个目录,如
bin
和share
,就像传统软件一样,它们是用./configure && make && sudo make install
编译和安装的,应该供所有用户使用?然后安装在/usr/local
中 -
同上,但仅限于您的用户?然后安装在
~/.local
中 -
由操作系统安装的软件,还是通过软件包管理器(如软件中心)安装的软件,最重要的是,当更新管理器升级到新版本时,哪些本地修改可能会被覆盖?它转到
/usr
笔记:
-
这就解释了为什么编译软件的默认安装前缀是
/usr/local
,以及为什么只有在为自己的用户安装软件时才应将其更改为./configure --prefix=$HOME/.local
-
您可能已经注意到以上所有目录都是read-only(当然,除了安装/删除软件时)。可写文件(如配置文件)通常转到
/etc
(用于system-wide软件)和~/.config
(用于per-user设置)。虽然许多遗留软件(不幸的是,也有一些现代化的软件)使用~/.<software-name>
,但用数十亿个目录和文件弄乱了您的个人文件夹。 -
~/.local
和~/.config
不属于FHS规范的一部分。 FHS不处理用户的主文件夹。他们是XDG的尝试,XDG是面向桌面环境(例如Gnome,KDE和Unity)的另一个标准组织,试图设置关于用户家庭结构的一些约定。并非所有的软件都遵守它(例如,~/.local/bin
不在用户的默认$PATH
中,而应该按照逻辑进行),并且没有用户被迫遵循它,但是如果它们两者都获得了许多互操作性益处。
我希望这有助于澄清一些事情。随意问任何事情,以便我可以改善答案!
(我也希望纯粹主义者不会因为这种非常非正式的语言和解释而杀了我,这是故意的,它肯定有很多不准确的地方,但我相信这是一个让新人对安装有一个简单概述的理解的好方法目录理由)