@ 2018.11.08 , 22:05
50

bug 永存

一个 9.57 KB 的巨型文件和 Linux 为什么会有/usr

编译自@foone的twitter

Author:Uing

你无法复制一个 9.57 KB 的巨型文件

今年是 8012 2018年,而这个 bug 来自 1974 年。准确来说,这只是一个限制,但是这个限制甚至还存在于最新的 Windows 10 !一个《星球大战》上映之前、和水门事件一样老的 bug。

bug 永存

你的太大

在这个特性开发的时候,所有东西都没有条形码,因为它还没被发明;而当这个 bug 正式引入的时候,美国只有一个电话公司,都没拆分呢(1984年ATT被拆分)。而那时候斯皮尔伯格还是一个默默无闻的电视导演和票房毒药。

甚至史上最伟大的电影《教父2》才刚刚上映(不接受争议)!

好吧,它到底是怎么来的? 1974 年,那是一个遥远的计算机原始时代,Unix 也才五岁。但是 Unix 神童说了:一切都是文件!无论是 socket (套接字),pipe(管道),还是 console(终端)都可以用同样的方式操作。

例如,你要打印东西,只需要把打印机当作文件,往这个文件写就可以

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 文件, 用

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,你就会看到这个

bug 永存

你的无效

因为 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。

bug 永存

你的很多

让我们看看 /usr,你试试觉得很熟悉呢?/usr 下面也有 bin/, sbin/, lib/。

bug 永存

你也一样啊

如果有新手问你为什么,你要很装逼的告诉他:/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)发布。


给这篇稿打赏,让译者更有动力 !
支付宝打赏 [x]
您的大名: 打赏金额:
已打赏蛋友(3): sml · 不编译不虔诚Gentoo党 · 飞鼠
4.3
赞一个 (47)

+1

  1. 误食萌汉药
    @6 days ago
    4019776

    每个字都看得懂。。

  2. Tentacle
    @6 days ago
    4019779

    简单说,windows以及大部分windows系系统(你可以自己配置一个Windows EMB出来看看能不能枪毙掉这个限制)不能建立一些特定字符文件名的文件。
    而有人为了绕过这个限制用Ubuntu建立了这个文件名的文件,然后用windows去复制它来触发这个限制。

  3. 匿名的王小虎
    @6 days ago
    4019781

    太喜欢这种文章了

  4. 三当家
    @6 days ago
    4019782

    @误食萌汉药: 已经解释的很通俗了,某种特殊文件名不能复制是因为windows想要兼容一些dos时代的硬软件特性。而类unix系统用户文件夹下有bin等系统文件只是单纯建立这个方式的创造者买不起第三个盘单独装这些文件。然后就被接下来的维护使用者延续下来了

  5. 4019807

    接近于两千年前罗马的两匹马屁股宽度决定了航天飞机的宽度……

  6. 罗尼
    @6 days ago
    4019809

    外行装内行写的文章

  7. 4019814

    于是去试了试新建一个 prn.txt 文件,真的不行。
    然后启动 Win 10 的 Linux 子系统,拿 Bash 新建了一个,用 vi 写了点东西,成功了,可以在资源管理器看到,但是打开看不到内容,也不能删除。只好再用 Bash 删掉。

  8. 清澄之眼
    @6 days ago
    4019816

    真的牛逼,就是看不懂

  9. 橘子
    @6 days ago
    4019829

    那么。。哪里能看到更多的这种东西呢

  10. 流浪猫
    @6 days ago
    4019846

    Linux 是 Unix 的一个分支(不接受争议),强盗逻辑。翻译就好好翻译,不要加料。原话是“Linux is Unix”,而实际是“Linux is Unix-like”。如果你要指出错误,直接加注释。但为什么要曲解原话成“Linux is a fork of Unix”?类 Unix 和分支可是差很多。

  11. 4019847

    我以前写的程序,为了简便用了取巧处理方式,决定了它不能用到30年后,不过反正也没指望有人用它30年。但是有些人的写的东西就确实流传了那么久,写的人都没意识到会有那么久

  12. 阿拉斯加妞子
    @6 days ago
    4019851

    2匹马的屁股宽度决定了铁轨的宽度 真事

  13. 4019852

    笑死,Windows没有con.dom

  14. 前点点点点蛋
    @6 days ago
    4019908

    翻译太烂了自己都没弄清楚

  15. youjizz
    @6 days ago
    4019910

    为什么我的评论显示不了

  16. 4019914

    好文啊,要是能把别的目录起名方式也解释下就好了,比如/etc到底是什么的缩写

  17. 机器设备
    @6 days ago
    4019915

    @zdw: 就是 et cetera, 至少最开始定义的时候是这个意思

  18. 6⃣️
    @6 days ago
    4019925

    翻译真幸苦了,这么接地气

  19. 4019935

    写完的时候太长了,就没有加上,放在这里做个补充吧
    ### 撒旦的报复
    神说: /usr 不重要。撒旦说:呵!
    随着 Linux 的发展,大部分的软件都放在 /usr 下面了。当然,都是一些不会影响系统启动的程序;但是对于用户来说,/usr的程序更好玩,更重要,例如 firefox (浏览器),utorrent(下载器),mpv (播放器), firefox(贤者模式煎蛋器)……
    2014 年 bumblebee 作为一个 Linux 支持 Nvidia 显卡的一个牛逼模式的软件,向世人展示了什么就“不重要”。在他们的安装脚本中,不小心多写一个空格,从
    “`
    rm -rf /usr/lib/nvidia-current/xorg/xorg
    “`
    变成了
    “`
    rm -rf /usr /lib/nvidia-current/xorg/xorg
    “`
    是不是你也没看出来是什么问题?就是在/usr 后多了一个空格,所以从删除 /usr/lib/nvidia-current/xorg/xorg 变成了 删除 /usr 和/lib/nvidia-current/xorg/xorg 两个文件夹。
    整个/usr被删除了,哀鸿遍野…… rm 作为 Linux 的杀器,是无法恢复的。煎蛋器就这么不见了……

  20. 4019971

    程序员大型考古活动。明白了原来CON, PRN, AUX, NUL, COM1~9, LPT1~9。这些文件名windows都不能起

  21. 中山鸽子王
    @6 days ago
    4019981

    不 这不是bug 这真是个feature 想想看你可以把装了羞羞的东西的文件夹在Linux子系统中重命名为aux 然后不懂这个feature的人就对这个文件夹没办法了(狗头)

  22. 4020038

    太可怕了。。我一几十年的CODER居然看不下去。。

  23. 脑子坏掉了
    @6 days ago
    4020063

    这都不是问题,这是特色!

  24. 4020068

    比英文辛苦的中文,求原文链接

  25. 胖次喵喵叫
    @6 days ago
    4020089

    这篇文章太皮了

  26. 悲观的安东尼
    @6 days ago
    4020138

    太好了这篇文章

  27. 双黄蛋
    @6 days ago
    4020152

    蝴蝶效应

  28. 海带啊海带
    @6 days ago
    4020175

    这文章很有意思,不过usr是Unix System Resource的缩写,而不是用户目录

  29. 4020235

    lpt据我所知在win98的时代(XP似乎也是),在系统帮助里,按操作步骤检查打印机是否能工作时,依然会用到。

    不过那似乎是个管道,类似 print 153 > lpt1这样?

  30. 大家一起mmp
    @6 days ago
    4020283

    程序员大型考古活动

  31. intotherain711
    @6 days ago
    4020423

    就跟哺乳动物的喉返神经一样。当初的权宜之计,在进化的路上,没啥大碍,就一直这么将就着了。滑稽。

  32. 4020470

    都是兼容惹的祸

  33. Turfer
    @6 days ago
    4020499

    可怕的路径原则

  34. 安以林
    @6 days ago
    4020648

    居然会从阅读这种文章中获得快感~~~

  35. 阿库娅
    @6 days ago
    4020730

    @Uing:
    我想知道这个dev最后被干死了没

  36. 567的
    @6 days ago
    4020750

    机翻?

  37. 4020780

    控制面板将会成为新的马屁股
    打开控制面板可以修改设置
    打开设置还是为了跳转到控制面板功能去修改设置
    win10悖论,设置有什么用?

  38. 4021035

    译者似乎缺乏基础的CS知识,各种私货更是尴尬

  39. 4021168

    img src=”file:///C:/con/con” 当年的BSOD炸弹。

  40. 4021195

    漏译了几个「不」字。

  41. 4021221

    一直以为 /usr 是 User 目录的意思,后来才知道其实是 Unix Share Resources

  42. 飞鼠
    @5 days ago
    4021558

    煎蛋应该有更多这样的文章,打赏走起

  43. 王老三
    @5 days ago
    4021596

    翻译有点那个什么了

  44. 忘川桥
    @5 days ago
    4021603

    con、prn还有nul这些特殊文件我是知道的,但是谁能告诉我为什么是w9.57 KB?

  45. JimmyZ
    @3 days ago
    4023131

    In the original Unix implementations, /usr used to contain the user home directories, … The “Unix specific (or system) resources” is a backronym. 瞎装逼的几位去查查backronym是什么意思.

  46. 你是一个
    @3 days ago
    4023192

    /bin -> /usr/bin
    来自一位Arch用户的小声bb

  47. 你是一个
    @3 days ago
    4023193

    /bin -> /usr/bin

  48. 4026023

    隐藏的空间 ?

发表评论


24H最赞