非POSIX文件系统

2020-09-09 05:10:27

操作系统和文件系统传统上是携手开发的。它们相互制约。今天,我们在文件系统语义方面有两个主要的领导者:Windows和POSIX,与全套可能性相比,它们彼此非常接近。在POSIX垄断文件系统和语义之前,有趣的事情发生了。

当您通过库而不是通过操作系统使用文件系统时,会有一些额外的可能性。您不再需要遵守主机操作系统的文件名语义。您可以决定是使用/还是\来分隔目录组件(或者完全使用其他东西)。也许您甚至不使用字符串作为文件名。Fs-fafs库使用一个字符串列表,因此由调用者为自己定义一个目录分隔符。在那个图书馆工作的时候,我驱车写下了一些我以前遇到过的想法,发现很鼓舞人心。

第一个分层文件系统是为Multics开发的。在罗伯特·C·戴利和彼得·G·诺伊曼的论文“二级存储的通用文件系统”(1965)中描述了这一点。关于这篇论文,我发现了几点令人震惊的地方:

在Multices之前显然没有层次化的文件系统,参考资料没有引用任何关于这方面的工作,我也没有发现任何工作。

现代分级文件系统与1965年相比基本没有变化,但一些功能在发展过程中消失了。

树名,即树形结构中的文件或目录的名称。类似于realpath(3)。

路径名,它类似于树名,但它在概念上是不同的,因为组件可以是链接。该报使用";:";代替";/";来分隔目录。

相对路径。他们用首字母";:";代替";./";(Orempty)和";*";代替";.";。您使用的不是";CD..";CHANGEDIRECTORY:*";。

文件和目录的读取、执行和写入模式。目录上的Executeon意味着搜索它的权限,就像在POSIX中一样。

段和段号(如果我没有弄错的话,分别是文件描述和文件描述符)。

据说Unix从Multics中获得灵感,简化了事情。丢失了什么?不管是谁为Unix实现了文件系统,他在2.3节附近的某个地方停止了阅读这篇论文。至少有这些功能我们还没有找到:

访问控制列表可以为用户定义陷阱。用户可能会拒绝使用陷阱,反而会收到错误。否则,陷阱将在访问时调用命名函数。它们可用于实现智能文件,例如可以监控文件使用情况或应用基于密码的文件锁定。

(毫无疑问,很快就会有人将eBPF插入到Linux VFS中,我们将再次发明陷阱。)。

Multics完全分离了附加模式和写入模式,并使其可供用户使用。实际上,您可以拥有可写但不可附加的文件和目录,或可附加但不可写的文件和目录(或两者兼而有之)。

(附加-Linux上仅存在通过超级用户设置的文件属性或使用CAP_LINUX_IMMARTABLE的进程设置的文件属性。这酱汁很淡。存在不可变的目录,但不是仅附加目录。当然,没有办法拥有一个不能完全增长的可写文件或目录)。

指向辅助存储的目录条目。这是一个文件系统管理的游戏转换器。下面是关于这一点的更多信息。

Multics文件系统中的文件可以具有指向辅助存储介质的目录项。当时的辅助介质是磁带,但今天它们可以是机械硬盘、USB驱动器或网络服务器。但是有一个不在那里的文件有什么意义呢?它真的很聪明,而且你越看它,它只会变得越聪明。

当Multics系统磁盘空间不足时,它可以从主介质中删除未使用的文件,但保留目录条目。如果您随后尝试打开这样的文件,它会要求您在文件可用期间等待。它将向操作员(可能稍后是磁带机器人)发出指令,让他们检索所需的磁带以恢复文件。当磁盘很小而磁带非常多的时候非常有用。

但当您考虑备份时,它会变得更好。现在,如果您需要从备份恢复Linux系统,您可以这样做:找到最旧的完整备份并将其恢复,然后按照从最旧到最新的顺序恢复每个增量备份。这意味着系统在您从备份中完全还原之前不能使用。考虑到今天的磁盘大小,这可能需要非常长的一段时间。

Multics备份的方式不同。要恢复完全受主机控制的系统,首先要恢复系统文件,这将允许您引导。然后恢复最新的增量备份。在此之后,文件系统将包含最新的目录条目。只需存储一盘增量备份磁带,所有文件都已放到正确的位置。这比等待一切完全恢复要快得多!

为什么只需要最新的增量备份就能将一切恢复正常?巧妙的是,这些文件可能还没有放到磁盘上。事实上,大多数文件可能会在另一个备份介质上。但是最近使用的文件已经恢复,所以您很可能已经可以做有用的工作了,并且所有其他文件都有它们的目录项。如果您尝试打开尚未恢复的文件,系统会要求您等待,操作员会告诉您要放入哪盘磁带才能恢复文件。

施乐Alto也是一个多个第一的系统。它最出名的是拥有第一个窗口图形用户界面,它启发了苹果的设计,然后又启发了微软的设计。当然,它有一个有版本号的分层文件系统,甚至还有一个网络文件系统。

我想强调Altofile系统的有趣的磁盘结构,这在Butler Lampson和Robert F.S.Sproull的论文An Open Operating System for a Single-User Machine(1979)中进行了描述。

系统的设计者担心由于硬件问题和软件缺陷造成的数据丢失。他们想出了一项功能,以保护用户的数据不会丢失磁盘上的任何块。(当然,除非用户数据在那个丢失的块中)。

标签表示每个模块都是自识别的。根据我的统计,这种类型的磁盘在每个512字节的块中有额外的14字节的标签。

如果磁盘结构损坏,那么一个称为清道夫的特殊程序将遍历所有块并恢复结构,这与ext4这样的文件系统形成对比,在文件系统中,损坏的结构可能意味着无法访问大量数据。

清道夫也被用来升级磁盘结构。想象一下,只需为新的磁盘结构运行ascavenger,就可以在ext4、btrfs或zfs之间就地转换。它将例如将现有的ext4元数据视为无稽之谈,并通过使用标签来构建基于btrf的新的盘结构。(它不能与特定的文件系统一起工作,但它演示了基本原理)。

为什么我们今天不吃这个呢?没有人想要构建使用标签的POSIX文件系统,因为我们使用的磁盘有512字节或4096字节的块,没有容纳标签的空间。标签对于每个数据块都有非常小的开销,但是即使像这样非常小的开销对于文件系统设计者来说也是不可接受的。更严重的是,这会扰乱mmap(2)。有些磁盘的块稍大一些,用来存储标签,但它们更昂贵,而且不是很常见。因此,我们只剩下脆弱的文件系统结构和无论如何都应该有备份的明智建议(有关这一点,请参阅上一节)。

最好的现代替代方案是类似于btrfs或zfs的东西。对块进行校验和,并将这些校验和存储在磁盘结构中指针的旁边。现代版本的ALTO文件系统当然应该有校验和,但不使用标签提供的保护比ALTO文件系统提供的保护要弱。如果您想了解Alto文件系统设计在今天有多重要,只需阅读使用ZFS可以防止什么,但请记住它没有使用任何标签。

Hydra是另一个在文件系统方面有创新的历史操作系统。在W.Wulf,E.Cohen,W.Corwin,A.Jones,R.Levin,C.Pierson和f的论文Hydra:The Kernel of a Multi Processor Operating System(1974)中描述了它。卡内基-梅隆大学的波拉克。

九头蛇摒弃了所有权的概念和永远享有特权的组件的等级制度。它使用了与POSIX所基于的根本不同的保护和安全概念。

“技术专家喜欢分层结构--它们很优雅;但现实世界的经验表明,它们不是可行的安全结构。那么,九头蛇试图正视的问题,就是在一个没有等级制度的商业环境中维持秩序。“

需要保护的资源(如文件)称为对象。您可以对对象应用操作,如读取或写入。但要执行此操作,需要对该对象进行引用,这称为功能。你甚至可以知道一个文件的身份,但是如果没有引用,你什么都做不了。

这与安全编程语言类似,但不完全相同,在安全编程语言中,如果没有对对象和执行操作的过程(例如,向量集!)的引用,则不能修改该对象(如向量)。这个类比实际上延伸得相当远:在Hydra设计中,对象(如文件)甚至有可能变得无法访问,并受到垃圾收集的影响。

请记住,在Multics中,您可以使用TRAP动态运行代码,与在Hydra中所能做的相比,这是非常薄弱的一步。在Hydra中,可以自己设计正常的读写(ETC)操作,甚至可以提供额外的操作。文件可以由有效的二进制数据结构支持,但其自身呈现为文本文件。

本文给出了一个对数据保护有非常特殊要求的研究人员的例子。您需要阅读论文才能了解所有要求,但基本上研究人员希望控制一个文件,但也希望其他人对同一文件有部分控制。文件结构很微妙,需要加以保护,以防腐败。

这种抽象对于保护用户免受文件表示的影响至关重要,我认为任何至少不支持这种形式抽象的文件系统现在都远远落后于最先进的技术。

大多数人甚至无法想象一份文件就能满足研究人员的要求。今天,有问题的研究人员将不得不使用实现API的网络服务来执行这些要求。就像这些事情通常会发生的那样,该服务可能会有一些安全漏洞,让用户做比他们应该做的更多的事情(例如,读取任何文件、写入其他文件或启动shell)。但在九头蛇上,它只是一个带有实现所需语义的操作的对象,不能用来破坏保护系统。

九头蛇的设计在今天仍然有意义。我们经常看到所谓的“混乱的代理”引起的问题,这是指当一个系统被摇晃到执行一个行动时,行动的发起人本应没有许可这样做,但中间层(代理)却有许可这样做。

POSIX中能力系统的缺乏正在造成现实世界的破坏,影响着数十亿人。它可能是你手机上的一个监视你所有消息的应用程序,一个将你所有的SSH和比特币私钥发送给小偷的JavaScript软件包,或者你的浏览器可能被利用了,用你的权限运行sudo,让自己成为根,然后安装一个rootkit。为什么您的浏览器可以运行sudo?Sudo是ByDesign,一个困惑的副手。

假设只有您的SSH客户端具有使用SSH密钥所需的操作。假设只有当您专门使用键盘或鼠标进行导出时,才能通过登录会话访问导出这些SSH密钥的操作。这会更安全。

假设文件系统保护您的文件免受数据损坏(例如,不可能写入错误的/etc/fstab)?听起来很适合我。

Multics为存储管理和备份提供了卓越的范例。施乐Alto允许恢复磁盘结构,即使所有元数据块都已损坏。九头蛇使用能力系统为数据提供强大的保护机制。所有这些启用的有趣类型的功能都是我们在POSIX中所缺少的。

历史上的文件系统中有许多好的想法,但今天这些想法已经完全被抛弃了。我正在我的Loko计划项目中构建某种类型的操作系统计划,我想在那里探索这些想法。