细说 Linux/Unix 下 /usr 目录的前世今生
简洁版本:
/usr
是用来存放全局的只读文件的。你安装的所有软件都会在那里,但它不与任何除/bin
和/lib
外的所有文件重复。/bin
和/lib
与/usr/bin
和/usr/lib
作用范围不一样,前者只存放引导系统启动需要的二进制文件和库,而后者是用来存放所有可执行文件和库的。(就此打住,不要问/sbin
又是用来干嘛的啦,毕竟这是简洁版本嘛)
现在,“引导文件”的区分已经一点点淡化了。因为大多数发行版(包括 Ubuntu ),在缺失了一些/usr
的文件后可能无法启动。这也就是存在合并/usr/bin
和/bin
的强烈趋势的原因。或许未来的 Ubuntu 版本中的/bin
将会是一个指向/usr/bin
的软链接呢。(原文中作者还说可能在 Ubuntu 12.10 中实现,然而经过译者验证,在Ubuntu 14.04 版本,/bin
和/usr/bin
仍是两个不同的目录)
详细版本:
早在七十年代,Unix 里的软盘没有多少空间。而且系统的二进制文件已经超出单张磁盘的储存容量了。开发者们不得不将它们分散在几个盘里并为此多创建了几个挂载点。/bin
目录塞满了,所以他们把其余的二进制文件放进了/usr/bin
里,并且在那时/usr
是他们的用户目录!
在那次(几乎是尴尬甚至是被认为是笑话的)分割之后,他们开始(人为的)决定什么东西应该放在/bin
里什么东西应该放在/usr/bin
里。一个非正式的规则是:重要的东西放在/bin
里,其余的放在/usr/bin
里。/bin
目录也是一样的。不久后,/usr
中混杂着堆满了系统相关文件和用户文件。因此,/home
目录应运而生,用来吧/usr
中的用户文件分离出来。
在那很长一段时间后,FHS 的诞生让/usr
目录成了一个非常尴尬的存在,尽管在那时它早已和 "user" 没有多大关系了。是的,什么 "U NIX s ource r epository" 、 "U NIX s ystem r esources" 都是化名,想要重命名也已经为时已晚了。
那么有人会问了,“/usr/sbin
又是啥?” 其实就是用来存放只有 root
用户才能执行的命令的啦,比如 mount
和 fdisk
。
“那岂不是跟/bin
差不多?”。是的,但是...
“等等,那为什么还要有/sbin
呢,这不科学啊”。这个嘛...
看,你身后有只有三个头的猴子!?
好吧,希望你还能有足够的注意力,我们继续...
(如果你觉得我在扯淡,那么你是对的。官方的说法是:“一些只能由 root 用户来执行并且甚至可以在/
挂载之前执行的重要命令”)。事实上,这个说法是很模糊的,很多历史遗留的名字就这么无法避免的“卡住”了。
关于/usr
的分割,systemd
中是这么解释的:
关于 /bin, /sbin 和 /lib 从 /usr 中分离出来的历史原因,对于现今来说已经不存在了。它们的分离是为了让更快的硬盘(当时的硬盘还很小而且很昂贵)能装下所有用来挂载其他相对慢一些的硬盘的工具。如今,一个单独的 /usr 分区早在预引导过程中挂载,也就是分离 /usr 的原因。此外,现在 /bin 和 /sbin 很多工具已经失去了运行没有预先安装 /usr 使用的能力。对于多层次结构的系统,已经没有必要分离 /usr 盘了,它失去了它的作用
还有出自的 Rob Landley 有关/usr
的分割及其理由的一篇文章:
Understanding the bin, sbin, usr/bin , usr/sbin split
现在的状况
关于安装目录,你可以这么理解:
/usr
- 系统自带的全局只读文件。/usr/local
- 系统管理员安装的系统级的只读文件(通常是你),这也就是为什么/usr/local
中的文件名与/usr
相同的原因了。/opt
- 其中包含着全局、独立的只读文件。也就是说,其中的软件不会将文件分散在bin
、lib
、share
、include
等目录中。~/.local
- 用户对应的/usr/local
,存放用户安装的软件。~/.local/opt
- 用户对应的/opt
。
那我应该把软件装在哪?
- 对于单一目录、自包含的软件,比如 Eclipse IDE 和其他 java apps,如果想要所有用户都能使用,那么安装在
/opt
- 和前面一样,如果是针对单一用户的,安装在
~/.local/opt
- 如果是安装文件散落在其他目录(
bin
和share
等),比如以传统方式./configure && make && sudo make install
安装的的软件并想要所有用户都可访问的,安装在/usr/local
- 一样的,只为单一用户安装的话,放在
~/.local
- 系统自带的或是通过包管理软件安装的,尤其是会随着系统升级被覆盖的文件。放在
/usr
顺带一提:
- 这解释了为什么默认安装目录是
/usr/local
,当你需要只为当前用户安装时需要指定./configure --prefix=$HOME/.local
- 你可能主要到了,前面提到的所有目录文件都是只读的(安装、卸载软件的情况除外)。可写文件一般放在
/etc
(全局软件)和~/.config
(用户软件)。不过许多传统软件将用户软件放在~/.<文件名>
下。 ~/.local
和~/config
并不是 FHS 规范的一部分,FHS不处理用户的主目录。他们是另一个标准组织面向桌面环境 XDG(如GNOME,KDE和Unity)的一种尝试,尝试设置一些关于用户的主结构的约定。并非所有软件坚持它(例如~/local/bin
不在用户的默认$PATH
),他们并没有强制用户遵循它,但如果他们这样做,会获得许多操作性上的好处,。
原文链接:http://askubuntu.com/questions/130186/what-is-the-rationale-for-the-usr-directory