Unix 中 /bin、 /sbin、 /usr/bin、 /usr/sbin 的渊源

在包括 Linux、Mac、FreeBSD 等在内的绝大多数类 Unix 系统中,根目录下会存在 /bin /sbin /usr/bin /usr/sbin 等等目录,然而却没有文档能够明确地说明这些目录的相应规则。

其实,这还得从 Ken Thompson 和 Dennis Ritchie 发明 Unix 的时候说起……

1969 年两人在一台 PDP-7 机器上共同发明了 Unix,之后大概在 1971 年机器升级为 PDP-11,同时配备有两块磁盘作为存储。之后由于系统的扩展,一块磁盘已经不能满足系统根目录(root filesystem)容量需求,于是两人把系统的一部分移植进了第二块磁盘,第二块磁盘原本放置的是用户主目录(user home directories),当时的挂载点为 /user。于是,在把 /bin /sbin /lib /tmp 等目录移植之后,出现了对应的 /usr/bin /usr/sbin 等。再之后,又有了第三块磁盘,顺便又把所有的用户目录(user directories)移植,并挂载至 /home

于是,系统可以畅享三块磁盘的空间。这大概也是现在的系统目录分布情况了,几十年前因为磁盘空间不足导致的结果。当然,各 Unix 变体及 Linux 发行版会有区别。那么为什么在移植了最初的 /bin /sbin 等目录之后,还会有 /bin /sbin 存在于根目录呢?先假设所有的这些小程序都移植到了第二块磁盘,那么在系统启动的时候,系统为了获取这些程序需要挂载第二块磁盘。有什么地方不太对?mount 程序也在第二块磁盘吧。所以,需要挂载第二块磁盘才能使用 mount,但是需要先使用 mount 才能挂载第二块磁盘。因为这样一些先有鸡还是先有蛋的问题,根目录下需要保留一些程序。

详情可以参考这封邮件 Understanding the bin, sbin, usr/bin , usr/sbin split


正好前段时间在看 「Linux/Unix 设计思想」一书,我只能说,这种做法非常 Unix。在书中罗列的设计原则中,随处可见诸如:

结合 Linux 的历史轨迹,也正是上述的思想才导致了其蓬勃发展;代码高度复用,杜绝重复造轮子,以实用为主。但是也存在比较明显的弊端,借用 Linus 定律

Given enough eyeballs, all bugs are shallow

软件层面的 bug 是技术层面的问题,比较容易修复;但是在设计层面而言,面对海量的开发者/志愿者,如何调度发展方向?几十年以来发展和使用的设计架构于代码库,如何迁移?光看看从 XorgWayland 这几年的迁移多难就能明白。这种集市化的开发模式,也导致了其必定小众的特点,但同样借用上述一书的观点——「如果你不能理解,那你就不属于这个世界」。