「译介」/bin, /sbin, /usr/bin, /usr/sbin 是怎么分开的

2020-03-19, 星期四, 21:39

译介

本文选自 busybox 邮件列表,David Collier 问道为什么 busybox 的二进制文件散落在多个目录中。Rob Landley 从历史发展的角度说明了这些目录最初是因为什么原因出现的。这些内容发表于 2010 年(Understanding the bin, sbin, usr/bin , usr/sbin split),2020 年的时候在 Hacker News 上又 引发了一些讨论,时至今日情况可能又有了一些变化,诸位读者作为茶余饭后的有趣谈资。受限于译者的学识,如果一些地方晦涩难懂,那必是译文的问题。

Understanding the bin, sbin, usr/bin , usr/sbin split

Rob Landley rob at landley.net

Thu Dec 9 15:45:39 UTC 2010

  • Previous message: Applet for detecting the filesystem type.
  • Next message: Understanding the bin, sbin, usr/bin , usr/sbin split
  • Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]

On Tuesday 30 November 2010 15:58:00 David Collier wrote:

> I see that busybox spreads it's links over these 4 directories.
>
> Is there a simple rule which decides which directory each link lives
> in.....
>
> For instance I see kill is in /bin and killall in /usr/bin.... I don't
> have a grip on what might be the logic for that.

你知道 1969 年的时候 Ken Thompson 和 Dennis Ritchie 是怎么在 PDP-7 上搞出 Unix 的吗?1971 年他们升级成了 PDP-11,储存用的是一组 RK05 磁盘(每个 1.5MB)。

操作系统塞爆第一块 RK05 磁盘后,他们把多出来的文件挪到了第二块磁盘上,和用户 home 目录放在一起(这就是这个挂载点为什么叫做 /usr)。他们在新地方又创建了一份系统目录(/bin/sbin/lib/tmp 什么的),新增加的文件就写到对应的目录里去。后来他们得到了第三块磁盘,就挂载到 /home,然后把用户目录都挪了过去。于是系统本身就独享两块磁盘高达 3MB 的空间了。

当然他们立了点规矩,比如「系统得先启动一部分才能把 /usr 下的第二块磁盘给挂上,所以不要把挂载命令之类的东西放在 /usr/bin 下面,不然我们就会有先有鸡还是先有蛋的麻烦了」。

/bin/usr/bin 之别就是这么来的,这个 1970 年代的做法一直被沿用了几十年,因为从来没有人问过为什么。这种区分早在 Linux 发明出来之前就没有什么意义了,原因有很多:

  1. 早期系统的启动是由 initrdinitramfs 支持的,负责处理「先得是这个然后是那个」的问题。现代操作系统有一个临时系统用来启动主系统。

  2. 共享库(伯克利那帮家伙发明的)让你不能分别更新 /lib/usr/bin。这两个部分要是对不上,就不能工作了。这在 1974 年不是问题,那时候所有东西都是静态链接的。

  3. 大于 100 兆的便宜磁盘在 1990 年还是个稀奇货,而分区调整软件才刚露曙光(Partition magic 3.0 在 1997 年发布)。

人们会自己制定出规则应对变化的情况。比如根目录是给系统文件用的,本地的文件得放在 /usr 下面。后来变成了 / 归 AT&T,/usr 里得放 IBM AIX 或者 DEC Ultrix 或者 SGI Irix 的发行版加的料,用户自己装的东西要放在 /usr/local 里。然后又有人觉得 /usr/local 不妥,于是发明了 /opt。等着瞧吧,说不定哪天还能搞出来个 /opt/local……

30 年过去了,形形色色的规矩出现又消失,比如「每次重启应该清空 /tmp 但是 /usr/tmp 就例外」,Ubuntu 没有 /usr/tmp 这个目录,Gentoo 上的 /usr/tmp 则是 /var/tmp 的符号链接,满足「重启不清空文件」的规则。是的,所有这些都发生在 tmpf 出现之前。对于只读的根文件系统,/usr 总是只读的,/var 用来写入,/ 大部分是只读的,除了 /etc 里的少部分例外。有人试着把 /etc 移到 /var 去,但更常见的做法是弄个指向 /var/etc 的链接。

Linux 基金会这样的官僚机构很高兴地记录了这些复杂的规则,却从来不去了解原因。「Ken 和 Dennis 把文件放到这里是因为 PDP-11 上的 RK05 磁盘太小了」这种话就像一阵风吹过。

我十分确定 busybox 只是照着其他版本历来放置的位置照做了。没有什么特别的理由。我自己的系统给 /bin /sbin/lib 做了指向 /usr 中对应目录的符号链接。搞嵌入式的人就得弄得简单点……

Rob