bug 永存
一个 9.57 KB 的巨型文件和 Linux 为什么会有/usr
编译自@foone的twitter
Author:Uing
你无法复制一个 9.57 KB 的巨型文件
今年是 8012 2018年,而这个 bug 来自 1974 年。准确来说,这只是一个限制,但是这个限制甚至还存在于最新的 Windows 10 !一个《星球大战》上映之前、和水门事件一样老的 bug。
你的太大
在这个特性开发的时候,所有东西都没有条形码,因为它还没被发明;而当这个 bug 正式引入的时候,美国只有一个电话公司,都没拆分呢(1984年ATT被拆分)。而那时候斯皮尔伯格还是一个默默无闻的电视导演和票房毒药。
甚至史上最伟大的电影《教父2》才刚刚上映(不接受争议)!
好吧,它到底是怎么来的? 1974 年,那是一个遥远的计算机原始时代,Unix 也才五岁。但是 Unix 神童说了:一切都是文件!无论是 socket (套接字),pipe(管道),还是 console(终端)都可以用同样的方式操作。
例如,你要打印东西,只需要把打印机当作文件,往这个文件写就可以
1 |
cat to_print.txt > /dev/lp0 |
而你想往终端显示字符,只需要往 /dev/tty 这个文件写东西就行。产生随机数,也只需要从 /dev/random 读取就行。这些特殊的文件叫做设备文件。
对 geek 来说,这简直太舒服了。想象一下你和世界上任何人打交道只需要学会五句话:你好,谢谢,好的,不要,再见。简直太美好了。
Gary Kiddal( IBM 的 CP/M 之父)在 1974 年决定把这个特性加到新开发的 CP/M 系统来, 从而可以通过命令行来把端口数据导入到文本文件,或者直接打印文本文件。你只需要一个类似 Unix 的 /dev 文件目录放各种设备文件。
但是!这个世界最怕但是,CP/M是运行8位计算机的系统。这种计算机内存非常小,只有 4K,而且没有硬盘,直接插8英寸的软盘。文件目录?不存在的!想用别的文件,直接换软盘。
如果没有目录,那么那里是对应 Unix 的 /dev 目录呢?到处都是!也就是说如果你想打印 foo.txt 文件, 用
1 |
PIP LST:=foo.txt |
就是把 foo.txt 输入到文件 LST,而 LST 就是 CP/M 的打印机。因为没有文件系统,所以 LST 不需要指定目录。如果你写完东西想保存文件,系统提示:输入文件名。你可以直接输入 LST 就打印出来了,或者 PTP 就是能保存到磁带 (那可以是 1974 年啊, 磁带才是保存数据的最重要的方式,想想 Unix 的 tar 的全称就是 tape archive)。
嗯,似乎不太对?如果我的文件是文本格式,程序会不会自动给我保存到 LST.txt 文件而不是打印出来呢?
啊哈!不会的,所有的 LST.txt, LST.aux, LST.wat, LST.bug 都是 LST。
是的,你没看错,LST 不仅存在所有地方,而且是不管是什么格式都是一样的。想想那时候只有4K 的内存,其实这也很无所谓。
CP/M 还是很成功的,所以在70年代到80年代早期很多商业系统都用这个 CP/M 系统。到了80年代,IBM想进入个人电脑市场,但是 CP/M 在 x86 的 迁移拖到 IBM PC 发布之后六个月才完成,而且一份拷贝 $240。而 DOS 只需要 $40。 用用奶子脑子想想都知道应该买哪个。
是的,就是那个 DOS,让微软发家致富的 DOS。但是那时候还是在 Seattle Compute Products 的手上,由 Tim Paterson 开发。一开始叫做 QDOS,全称 Quick and Dirty Operation System (是的, DOS 就是 Dirty Opeation System,你个 Dirty Boy)。之所以是 dirty,就是因为 CP/M 没有 x86 版本才开发的。
为了兼容 CP/M 上面原来的程序,QDOS 保存了所有的特殊文件,例如AUX, PRN, CON, LPT等等。
然后微软上场了。微软购买了 QDOS 然后改名为 MS-DOS, 并且在1983 年新的 IBM XT 发布的时候,重构了很多东西,发布了 DOS 2.0, 使得这个系统终于支持文件目录(Unix也就是提前了14年支持而已)。为什么要支持呢?因为 IBM XT终于提供硬盘了。那可是高达10MB 的硬盘,文件必须要有序啊。微软终于可以建一个 C:文件夹,把所有特殊的设备文件都放进去了,就像 Unix 的 /dev。
但是,我们的但是!微软作为兼容狂魔,大声的说出:我不!为了兼容以前的 QDOS 的所有批处理脚本,微软让这些特殊的设备文件继续存在你硬盘里面的所有文件夹(字面上)。
好在我们已经用这个 MS-DOS 2.0。然而,Windows 95 发布的时候,它是建立在 DOS 上面的,所以 Windows 95 继承了所有的行为。
好在我们已经用这个 Windows 95了。现在的 Windows 是建立在 Windows NT 上面而不是 Windows 95。但, Windows XP 想兼容 Windows 95 和 Windows NT, 所以 XP 也继承了这个特性。
好在我们大部分人已经不用 XP了(某国除外)。但是……我已经说不出但是了。是的, Windows 7, Windows 8, Windows 10 都兼容了所有的行为。所以我们继承了44 年的 bug。
如果想体验一把,你只需要在任意一个 Windows 的文件夹里面新建一个 aux.txt 或者 prn.txt,你就会看到这个
你的无效
因为 Gary Kiddal 被 Unix 的“一切都是文件”吸引,所以我们在 Windows 一直有这个限制。那个年代出生的人的孩子都可以喝酒了(美国法定年龄 21岁),而我们还不能在 Windows 有 con.dom。
微软还专门给出所有不能用的列表:CON, PRN, AUX, NUL, COM1~9, LPT1~9。
让我们回到开头,那么你可能会奇怪, foone 是怎么会出现拷贝这个“巨型文件” aux.h 的问题呢?因为他用的是 Linux, Linux 是可以支持读写 NTFS 格式。而这些特殊文件名字不是在文件系统级别实现的,而是在系统级别实现的!也就是说,你可以在 NTFS 里面用这些文件名字,但是你不能在 Windows 里面用……
当把一些文件拷贝到 Windows 时,你可能会遇到这个问题,如果你给文件起名就像给孩子起名一样随意的话。
为什么 Linux 会有 /usr 这个文件夹
自从我 (foone) 写了 1974 年的 CP/M 系统的一个决定影响了 Windows 10,有些人说:“这就是为什么我用 Linux!”
慢!Linux 是 Unix 的一个分支(不接受争议),而 Unix 比 CP/M 还老(毫无争议),而事实是,有些设计决定比之前那个更老,那就是 /usr 文件夹。
如果你看看 Linux 的根目录下面,你会看到很多经典的文件夹, 例如 /bin, /lib, /etc, /sbin。
你的很多
让我们看看 /usr,你试试觉得很熟悉呢?/usr 下面也有 bin/, sbin/, lib/。
你也一样啊
如果有新手问你为什么,你要很装逼的告诉他:/usr 下面放的都是不会影响系统正常运行的,而根目录下面的都是最重要的。当你做紧急维护的时候,可以没有 /usr,但不能没有根目录。
例如,经典的 bash(可以让你提高逼格的利器)和 fdisk (临死前你想对你的硬盘操作的工具)都放在根目录的 /bin/ 和 /sbin/ 下面,而 Firefox (你为什么会对你的硬盘想用 fdisk 的主要原因) 就放在 /usr/bin 下面。毕竟,当你的系统挂了或者你快挂了,你会想用 bash 启动 fdisk 做一些修复或者终极摧毁你的硬盘,而不是想上微博发个自拍(应该有人会吧……)
但是这应该是因为有了 /usr 而这么做,而不是为什么我们要有一个 /usr。
时间拨回到 1971 年,Unix 在贝尔实验室出生两年后,两个大神(大神的名字不可直呼)终于鸟枪换炮,从 PDP-7 升级到 PDP-11了。这可是当时价值 $20,000 的机器,等价于现在$133,000 。
最重要的是,就是这台机器有了更多的存储空间。他们买了一个 RK11 控制器,最多可以支持 8 个硬盘。但是资金不是无限的,所以两个大宅也只能买两个 RK05 硬盘,每个高达 2.5 MB。
原来在 PDP-7 所有文件系统都在一个分区,而且那时候已经有 /bin 和 /usr。是的,/usr本来就有的,但是那时候是作为用户目录的,也就是现在的 /home 目录。
神说:要有区别。所以第一个盘就用来放根目录,作为开发系统用,而第二个硬盘就用来放用户的东西,然后挂载到 /usr下面。用户目录下面就放的都是小东西,所以那可是 2.5 MB 近乎无限的空间啊(大雾)
神说:我x!第一块盘满了!作为一个积极开发的系统, 肯定会生成大量的二进制文件,而各种 debug 的工具更是庞大无比。再买一块 RK05 是可以的,就是没钱而已。而似乎用户目录 /usr 不是很满……
神说:复制黏贴是神圣的。所以他们就把整个系统文件架构都复制了一份,黏贴到 /usr 下面, 所以就有了 /usr/bin, /usr/lib。但是哪些文件要移过来呢?肯定是那些不会影响系统启动的啊,因为首先要启动系统,然后再把 /usr 挂载到根目录下面。
神说:就这么定了。于是直到 Ubuntu(一个流行的Linux)的最新版本 18.10,你系统里面会有 /bin 和 /usr/bin,就是因为 45 年前两个极客买不起 2.5 MB 硬盘做出的决定。
总结
这不是 bug, 这是 feature!feature,懂不?
Foone 的 twiiter.
创作共用协议(BY-NC)发布。
bug 永存http://t.jinritoutiao.js.cn/RxaPUP/
转载请注明:徐自远的乱七八糟小站 » bug 永存