读/写 HPFS 2.09

1998-2004, Mikulas Patocka

邮箱:

mikulas@artax.karlin.mff.cuni.cz

主页:

https://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi

贡献者

Chris Smith, 1993, 原始只读 HPFS,一些代码和 hpfs 结构文件取自它

取自它

Jacques Gelinas, MSDos mmap,灵感来自 fs/nfs/mmap.c (Jon Tombs 1993 年 8 月 15 日)

Werner Almesberger, 1992, 1993, MSDos 选项解析器 & CR/LF 转换

挂载选项

uid=xxx,gid=xxx,umask=xxx (默认 uid=gid=0 umask=default_system_umask)

为扩展属性中未指定所有者的文件设置所有者/组/模式。模式是反转的 umask - 例如 umask 027 给予所有者所有权限,组读取权限,以及其他任何人无访问权限。请注意,对于文件,模式会与 0666 进行按位与运算。如果您希望文件具有“x”权限,则必须使用扩展属性。

case=lower,asis (默认 asis)

readdir 中的文件名小写。

conv=binary,text,auto (默认 binary)

CR/LF -> LF 转换,如果设置为 auto,则根据扩展名做出决策 - 有一个文本扩展名列表(我认为不转换文本文件比损坏二进制文件更好)。 如果您想更改该列表,请在源代码中更改它。 原始只读 HPFS 包含一些奇怪的启发式算法,我已将其删除。 我认为让计算机决定文件是文本还是二进制是危险的。 例如,DJGPP 二进制文件在开头包含小的文本消息,并且在某些情况下可能会被错误识别和损坏。

check=none,normal,strict (默认 normal)

检查级别。 选择 none 将只会导致少量加速和很大的危险。 我尝试编写它,以便在损坏的文件系统上使用 check=normal 时不会崩溃。 check=strict 表示许多多余的检查 - 用于调试(例如,它检查访问文件时是否在位图中分配了该文件)。

errors=continue,remount-ro,panic (默认 remount-ro)

发现文件系统错误时的行为。

chkdsk=no,errors,always (默认 errors)

何时将文件系统标记为脏,以便 OS/2 检查它。

eas=no,ro,rw (默认 rw)

如何处理扩展属性。“no” - 忽略它们,并始终使用 uid/gid/mode 选项中指定的值。“ro” - 读取扩展属性但不创建它们。“rw” - 当您在文件系统上使用 chmod/chown/chgrp/mknod/ln -s 时,创建扩展属性。

timeshift=(-)nnn (默认 0)

将时间移动 nnn 秒。 例如,如果您在 linux 下看到的时间比在 os/2 下多一个小时,请使用 timeshift=-3600。

文件名

与 OS/2 中一样,文件名不区分大小写。但是,shell 认为名称区分大小写,因此,例如,当您创建一个名为 FOO 的文件时,您可以使用“cat FOO”、“cat Foo”、“cat foo”或“cat F*”,但不能使用“cat f*”。请注意,您也无法在 HPFS 上编译 linux 内核(以及其他一些东西),因为内核会创建不同的文件,名称如 bootsect.S 和 bootsect.s。当搜索名称中包含字符 >= 128 的文件时,将使用代码页 - 请参见下文。 OS/2 忽略文件名末尾的点和空格,因此此驱动程序也这样做。如果您创建“a. ...”,将创建文件“a”,但您仍然可以使用名称“a.”、“a..”、“a . . . ”等访问它。

扩展属性

在 HPFS 分区上,OS/2 可以将称为扩展属性的特殊信息与每个文件关联。扩展属性是 (key,value) 对,其中 key 是标识该属性的 ascii 字符串,value 是任何可变长度的字节字符串。OS/2 在此处存储窗口和图标位置以及文件类型。那么为什么不将其用于 unix 特有的信息,如文件所有者或访问权限呢?此驱动程序可以做到这一点。如果您在 hpfs 分区上执行 chown/chgrp/chmod,则会创建具有键“UID”、“GID”或“MODE”和 2 字节值的扩展属性。只会创建那些与挂载选项中指定的默认值不同的扩展属性。一旦创建,扩展属性将永远不会被删除,它们只是被更改。这意味着当您的默认 uid=0 并且您键入类似“chown luser file; chown root file”的内容时,该文件将包含扩展属性 UID=0。当您卸载文件系统并使用 uid=luser_uid 再次挂载它时,该文件仍将由 root 拥有!如果您将文件的 chmod 设置为 444,则不会设置扩展属性“MODE”,此特殊情况是通过设置只读标志完成的。当您 mknod 一个块设备或字符设备时,除了“MODE”之外,还将创建一个包含设备编号的特殊 4 字节扩展属性“DEV”。目前,此驱动程序无法调整扩展属性的大小 - 这意味着如果有人(我不知道是谁?)设置了大小不同的“UID”、“GID”、“MODE”或“DEV”属性,它们将不会被重写,并且更改这些值不起作用。

代码页

HPFS 可以包含多个代码页的多个大写表,并且每个文件都有一个指向其名称所在代码页的指针。然而,OS/2 是在美国创建的,那里的人们不太关心代码页,因此对多个代码页的支持非常错误。我在我的磁盘上有一个以代码页 852 运行的捷克语 OS/2。我曾经启动过一个以 cp 850 运行的英语 OS/2,并且我在我的 852 分区上创建了一个文件。它将文件名的代码页标记为 850 - 很好。但是当我再次启动捷克语 OS/2 时,该文件在任何名称下都完全无法访问。看起来 OS/2 使用其系统代码页 (852) 将搜索模式大写,并使用其代码页 (850) 大写与其比较的文件名。这些永远无法匹配。这真的是 IBM 开发人员想要的吗?但问题仍在继续。当我在捷克语 OS/2 中在该目录中创建另一个文件时,该文件也无法访问。OS/2 可能在搜索将文件放置在哪里时(请注意,HPFS 目录中的文件必须排序)和搜索文件时使用不同的求大写方法。最后,当我在 PmShell 中打开此目录时,PmShell 崩溃了(有趣的是,当重新启动时,PmShell 试图再次重新打开此目录 :-)。chkdsk 愉快地忽略了这些错误,只有低级磁盘修改才拯救了我。永远不要在同一个系统上混合使用不同语言版本的 OS/2,尽管 HPFS 的设计允许这样做。好吧,我可以在此驱动程序中实现复杂的代码页支持,但我认为它会在 OS/2 中以如此错误的方式实现而导致更多问题而不是好处。因此,无论文件代码页索引是什么,此驱动程序只是简单地使用它找到的第一个代码页来进行大写和小写。通常,所有文件名都位于此代码页中 - 如果您不尝试执行我上面描述的操作 :-)

已知错误

不支持 OS/2 服务器上的 HPFS386。在普通 OS/2 客户端上安装的 HPFS386 应该可以工作。如果您有 OS/2 服务器,请仅使用只读模式。我不知道如何处理某些 HPFS386 结构,如访问控制列表或扩展权限列表,我不知道如何在删除文件时删除它们,也不知道如何不使用扩展属性覆盖它们。请给我发送一些有关这些结构的信息,我将完成它。但是,此驱动程序应该检测到 HPFS386 结构的存在,以只读方式重新挂载并且不破坏它们(我希望如此)。

当扩展属性的空间不足时,它们将被截断并且不返回任何错误。

如果路径长度超过大约 256 个字符,OS/2 将无法访问文件,但此驱动程序允许您这样做。chkdsk 忽略此类错误。

有时您将无法删除非常满的文件系统上的某些文件(返回错误 ENOSPC)。这是因为目录树中非叶节点中的文件(如果目录很大,则一个目录在 HPFS 上具有树中的 dirent)在删除时必须替换为另一个节点。并且该新文件可能具有比旧文件更大的名称,因此新名称不适合目录节点 (dnode)。这将导致目录树拆分,这会占用磁盘空间。解决方法是删除其他叶节点的文件(文件是非叶节点的概率约为 1/50)或首先截断文件以释放一些空间。只有当您有许多目录以至于预先分配的目录带已满时,才会遇到此问题,即。

number_of_directories / size_of_filesystem_in_mb > 4.

您无法删除打开的目录。

您无法在目录上重命名(这有什么好处呢?)。

仅更改大小写的方式重命名文件不起作用。此驱动程序支持它,但 vfs 不支持。类似“mv file FILE”的操作将不起作用。

所有 atime 和目录 mtime 都未更新。这是因为性能原因。如果您非常希望更新它们,请告诉我,我将编写它(但会很慢)。

当系统内存不足并且交换时,它可能会稍微损坏文件系统(丢失文件,不平衡的目录)。(我猜所有文件系统都可能这样做)。

编译时,您会收到警告:函数声明不是原型。有人知道这意味着什么吗?

“树不平衡”消息是什么意思?

此驱动程序的旧版本有时会创建不平衡的 dnode 树。如果树不平衡,OS/2 chkdsk 不会尖叫(有时也会创建不平衡的树 :-) 但 HPFS 和 HPFS386 都包含一个错误,即当树不平衡时,它很少会崩溃。此驱动程序可以正确处理不平衡的树,并在找到它们时写入警告。如果您看到此消息,则可能是因为使用旧版本的此驱动程序创建的目录。解决方法是将该目录中的所有文件移动到另一个目录,然后再移回。在 Linux 中执行此操作,而不是在 OS/2 中执行!如果您在由该驱动程序完全创建的目录中看到此消息,则表示存在 BUG - 请告诉我。

OS/2 中的错误

当您有两个(或更多)指向彼此的丢失目录时,chkdsk 在修复文件系统时会锁定。

有时(我认为是随机的),当你在 OS/2 下创建只有一个字符名称的文件时,OS/2 会将其标记为“长”文件名。然后 chkdsk 会移除此标记,并提示“已更正轻微的文件系统错误”。

像 “a .b” 这样的文件名会被 OS/2 标记为“长”文件名,但 chkdsk 会“纠正”它,并将其标记为短文件名(并写入“已更正轻微的文件系统错误”)。此错误不在 HPFS386 中。

上述代码页错误

如果你不安装补丁包,还会有很多很多错误...

历史

0.90

首次公开发布

0.91

修复了在对打开的 inode 调用 write_inode 时导致写入内存的错误(很少发生)

0.92

修复了释放目录 inode 时的一个小内存泄漏

0.93

修复了当有太多前 15 个字符相同的文件名时导致机器锁定的错误。修复了在文件末尾之后写入文件时将文件归零的错误

0.94

修复了尝试删除忙碌的文件或目录时的一个小内存泄漏

0.95

修复了移动文件时 i_hpfs_parent_dir 未更新的错误

1.90

2.1.1xx 内核的第一个版本

1.91

修复了当扇区位于磁盘末尾时 chk_sectors 失败的错误。修复了在删除文件时调用 write_inode 时的竞争条件。修复了在文件名中使用 0xff 时可能发生(概率非常低)的错误。

重写了锁定以避免竞争条件

挂载选项“eas”现在可以工作了

Fsync 不再返回错误

以“.”开头的文件被标记为隐藏

添加了重新挂载支持

当文件系统即将满时,分配不再那么慢

Atimes 不再更新,因为它会减慢操作速度

代码清理(删除了所有注释掉的调试打印)

1.92

更正了在关闭文件之前调用 sync 时出现的错误

1.93

修改后,它适用于 >= 2.1.131 的内核,我不知道它是否适用于以前的版本

修复了大于 64G 的磁盘可能出现的问题(但我没有这样的磁盘,所以无法测试)

修复了 2G 时的文件溢出

添加了新选项“timeshift”

更改了 HPFS386 上的行为:现在可以在只读模式下操作 HPFS386

修复了一个减慢分配速度并阻止分配 100% 空间的错误(此错误不是破坏性的)

1.94

为 Linux 中的一个错误添加了解决方法

修复了一个缓冲区泄漏

修复了一些与大型扩展属性的不兼容问题(但仍然不是 100% 正常,我没有相关信息,而且 OS/2 不想创建它们)

重写了分配

修复了 i_blocks 的一个错误(du 有时不会显示正确的值)

目录不再设置存档属性(有些程序不喜欢这样)

修复了它在大 anode 树中设置错误标志的错误(这不是破坏性的)

1.95

修复了一个缓冲区泄漏,它可能发生在损坏的文件系统上

修复了 1.94 版本中分配的一个错误

1.96

为 OS/2 中的一个错误添加了解决方法(HPFS 锁定,HPFS386 有时在 PMSHELL 中打开目录时报告错误)

修复了可能的位图竞争

修复了大型磁盘上可能出现的问题

现在你可以删除打开的文件了

修复了重命名中的一个非破坏性竞争

1.97

支持 HPFS v3(在大型分区上)

修复了它不允许创建 > 128M 的文件(应该是 2G)的错误

1.97.1

更改了全局符号的名称

修复了 chmod 或 chown 根目录时的错误

1.98

修复了使用 old_readdir 时的死锁。更好的目录处理;为 OS/2 中的“不平衡树”错误提供解决方法

1.99

更正了删除文件时空间不足可能出现的问题

现在,如果删除时空间不足,它会尝试截断文件

删除了大量冗余代码

2.00

修复了重命名中的一个错误(自 1.96 版本以来就存在)。更好的反碎片策略

2.01

修复了 NFS 上目录列表的问题

目录 lseek 现在检查参数是否正确

修复了缓冲区代码中的竞争条件 - 它存在于 Linux 的所有文件系统中;当在读取设备 (cat /dev/hda) 的同时在其上创建文件时,文件可能会损坏

2.02

为 Linux 中的 breada 错误提供解决方法。breada 可能会导致访问超出分区末尾的区域

2.03

字符设备、块设备和管道已正确创建

修复了 unlink 中的非崩溃竞争(Alexander Viro)

现在它可以与日语版本的 OS/2 一起工作了

2.04

修复了 ftruncate 用于扩展文件时出现的错误

2.05

修复了获取不带“=”的挂载参数时崩溃的问题

修复了由于磁盘已满而导致 anode 分配失败时崩溃的问题

修复了当块 io 或 inode 分配失败时的一些崩溃

2.06

修复了损坏的磁盘结构上的一些崩溃

更好的分配策略

添加了重新调度点,以便它不会长时间锁定 CPU

它应该可以在 Warp Server 上的只读模式下工作

2.07

更多针对 Warp Server 的修复。现在它真的可以工作了

2.08

在大型磁盘上创建新文件不再那么慢

尝试同步已删除的文件不会生成文件系统错误

2.09

修复了在极端碎片化文件上出现的错误