Amiga 文件系统概述¶
并非所有 Amiga 文件系统的变体都支持读取和写入。 Amiga 目前知道六种不同的文件系统
DOS0 |
旧的或原始的文件系统,不太适合硬盘,通常也不在硬盘上使用。支持读/写。 |
DOS1 |
原始的快速文件系统。支持读/写。 |
DOS2 |
旧的“国际”文件系统。“国际”意味着修复了一个错误,使得文件名中带重音的(“国际”)字母不区分大小写,就像它们应该的那样。支持读/写。 |
DOS3 |
“国际”快速文件系统。支持读/写。 |
DOS4 |
带有目录缓存的原始文件系统。目录缓存大大加快了软盘上的目录访问速度,但减慢了文件创建/删除速度。在硬盘上没有多大意义。支持只读。 |
DOS5 |
带有目录缓存的快速文件系统。支持只读。 |
以上所有文件系统都允许 512 到 32K 字节的块大小。支持的块大小为:512、1024、2048 和 4096 字节。较大的块几乎可以加快所有速度,但会浪费磁盘空间。 4K 以上的速度提升似乎不值得付出代价,所以您也不会在这里损失太多。
也支持以上文件系统的 muFS(多用户文件系统)等效项。
AFFS 的挂载选项¶
- protect
如果设置此选项,则无法更改保护位。
- setuid[=uid]
这将文件系统中所有文件和目录的所有者设置为 uid 或当前用户的 uid。
- setgid[=gid]
与上述相同,但用于 gid。
- mode=mode
将模式标志设置为给定的(八进制)值,而忽略原始权限。如果设置了相应的 r 位,目录将获得 x 权限。这很有用,因为大多数普通的 AmigaOS 文件将映射到 600。
- nofilenametruncate
当文件名超出标准最大文件名长度(30 个字符)时,文件系统将返回错误。
- reserved=num
将分区开头的保留块数设置为 num。您永远不需要此选项。默认为 2。
- root=block
设置根块的块号。这应该永远没有必要。
- bs=blksize
将块大小设置为 blksize。有效的块大小为 512、1024、2048 和 4096。与 root 选项一样,这应该永远没有必要,因为 affs 可以自行计算出来。
- quiet
文件系统不会为不允许的模式更改返回错误。
- verbose
挂载文件系统时,卷名、文件系统类型和块大小将写入系统日志。
- mufs
该文件系统实际上是一个 muFS,即使它没有将自己标识为一个。如果文件系统没有格式化为 muFS,但被用作一个 muFS,则此选项是必要的。
- prefix=path
路径将作为前缀添加到 AFFS 分区上符号链接的每个绝对路径名称。默认值 = “/”。(见下文。)
- volume=name
当在 AFFS 分区上创建带有绝对路径的符号链接时,name 将作为卷名称添加到前面。默认值 = “”(空字符串)。(见下文。)
用户/组和保护标志的处理¶
Amiga -> Linux
Amiga 保护标志 RWEDRWEDHSPARWED 的处理方式如下
R 映射到用户、组和其他用户的 r。在目录上,R 意味着 x。
W 映射到 w。
E 映射到 x。
D 被忽略。
H、S 和 P 在 Linux 下始终保留并被忽略。
当写入文件时,A 被清除。
除非将 set[gu]id 作为挂载选项给出,否则将使用用户 ID 和组 ID。由于大多数 Amiga 文件系统是单用户系统,因此它们将由 root 拥有。Amiga 文件系统的根目录(挂载点)将由实际挂载文件系统的用户拥有(根目录没有 uid/gid 字段)。
Linux -> Amiga
Linux rwxrwxrwx 文件模式的处理方式如下
r 权限将允许用户、组和其他用户的 R。
w 权限将允许用户、组和其他用户的 W。
用户的 x 权限将允许普通文件的 E。
将允许用户、组和其他用户的 D。
所有其他标志(suid、sgid、...)都将被忽略,并且不会保留。
新创建的文件和目录将获得当前用户的用户和组 ID,以及根据 umask 的模式。
符号链接¶
尽管 Amiga 和 Linux 文件系统彼此相似,但仍存在一些并非总是细微的差异。其中一个在符号链接中变得明显。虽然 Linux 具有只有一个根目录的文件系统,但 Amiga 为每个文件系统(例如,分区、软盘,...)都有一个单独的根目录。在 Amiga 中,这些实体称为“卷”。它们具有可用于访问它们的符号名称。因此,符号链接可以指向不同的卷。 AFFS 将卷名转换为目录名,并将前缀路径(请参阅 prefix 选项)添加到该目录名。
示例:您将所有 Amiga 分区挂载在 /amiga/<volume> 下(其中 <volume> 是卷的名称),并且在挂载所有 AFFS 分区时,您给出了选项“prefix=/amiga/”。(它们可能是 “User”、“WB” 和 “Graphics”,挂载点分别为 /amiga/User、/amiga/WB 和 /amiga/Graphics)。引用 “User:sc/include/dos/dos.h” 的符号链接将被追踪到 “/amiga/User/sc/include/dos/dos.h”。
示例¶
命令行
mount Archive/Amiga/Workbench3.1.adf /mnt -t affs -o loop,verbose
mount /dev/sda3 /Amiga -t affs
/etc/fstab 条目
/dev/sdb5 /amiga/Workbench affs noauto,user,exec,verbose 0 0
重要提示¶
如果在连接到您的 PC 的情况下引导 Windows 95(不了解 3.x、98 和 NT),它将用垃圾覆盖块 0 的字节 0x00dc..0x00df,从而使刚性磁盘块无效。纯粹的运气使该区域是 RDB 的未使用区域,因此只有校验和不再匹配。 Linux 将忽略此垃圾并仍然识别 RDB,但在您再次将该驱动器连接到 Amiga 之前,您必须还原或修复您的 RDB。因此,请在启动 Windows 之前制作它的备份副本!
如果损坏已经完成,则以下内容应修复 RDB(其中 <disk> 是设备名称)。
风险自负
dd if=/dev/<disk> of=rdb.tmp count=1
cp rdb.tmp rdb.fixed
dd if=/dev/zero of=rdb.fixed bs=1 seek=220 count=4
dd if=rdb.fixed of=/dev/<disk>
错误、限制、注意事项¶
很多事情可能无法按预期工作。并非所有内容都经过测试,尽管已使用此 fs 读取和写入了数百 MB。有关最新的错误列表,请参阅 fs/affs/Changes。
默认情况下,文件名将被截断为 30 个字符,且不发出警告。 ‘nofilenametruncate’ 挂载选项可以更改该行为。
affs 在文件名匹配中忽略大小写,但 Linux shell 确实关心大小写。示例(/wb 是挂载的 affs 文件系统)
rm /wb/WRONGCASE
将删除 /mnt/wrongcase,但
rm /wb/WR*
不会删除,因为 shell 会匹配名称。
块分配是为硬盘分区设计的。如果多个进程写入(小)软盘,则块的分配方式很糟糕(但真正的 AFFS 并不会好太多)。当空间变得紧张时也是如此。
您无法在 OFS(旧文件系统)上执行程序,因为由于 488 字节的块,程序文件无法进行内存映射。出于同样的原因,您无法通过环回设备在此类文件系统上挂载映像。
当系统在挂载 affs 分区时崩溃时,根块中的位图有效标志可能不准确。目前,如果没有 Amiga(磁盘验证器)或手动(谁会这样做?),则无法修复损坏的文件系统。也许以后会修复。
如果在系统启动时挂载 affs 分区,您可能需要告诉 fsck 不应检查该文件系统(在 /etc/fstab 的第六个字段中放置 ‘0’)。
由于与 Amiga 软盘控制器不兼容,因此无法使用普通的 PC 或工作站读取软盘。
如果您对适用于 Linux 的 Amiga 模拟器感兴趣,请查看
http://web.archive.org/web/%2E/http://www.freiburg.linux.de/~uae/