QDFS - Quick & Dirty File System
注意:此设计仅供测试
此文件系统只是一个最小化实现,没有作出任何优化或者安全性优化。在之后此文档将继续更新以优化或改善安全性。
你可以在 dist/hosttools/edhd
中找到磁盘镜像编辑可执行文件.
可执行文件构建平台为 openSUSE 42.1 x86_64. 如果需要自行编译文件,源码可在 src/hosttools/edhd.c
处找到. 请用host模式编译!
概念
+--------------------+
| 主硬盘引导记录 |
+--------------------+
| 记录区块 | -> 不使用分区
+--------------------+
| 数据区块 |
\____________________/
记录格式
0 15 19 23 27 31 (Byte)
+---------------+------+----+----------+---------+
|名字 |偏移量 |大小|文件属性 |时间戳 |
+---------------+------+----+----------+---------+
|<---- 016 ---->|<-04->|<04>|<-- 04 -->|<-- 4 -->| (Byte)
文件属性结构
0 7 11 14 15
+----------+-----+----+--------+
|权限 |所有 |类型|扩展标志位|
+----------+-----+-------------+
|<-- 08 -->|<-4->|<---- 4 ---->| (bit)
权限
0 7
+----------+
|rwx|rwx|rw| 分别属于:所有者、所有组、其他人(其他人总无执行权限)
+----------+
struct record{
char name[16];
uint32_t offset;
uint32_t size;
uint32_t attribute;
uint32_t timestamp;
};
记录区块的大小不固定。为了之后的读写操作方便,建议预先留1024个条目(包括
空记录和扩展记录),或者预留5%剩余磁盘空间。
首条记录为空记录。空记录用于记录记录区块的属性,其名称必须为 #REC_TBL
,
其偏移量必须为 0
, 其大小即为记录区块大小,其权限必须为 11011011(0xDB)
,
其时间戳必须为 0
.
文件操作之前,必须先检查空记录的权限。当发生异常时(如记录互相冲突或记录
互相重叠),程序必须放弃文件操作,空记录权限会被置为 10010010(0x92)
. 硬
盘进入只读模式,直到用户运行磁盘检查程序修复冲突。
当记录区块空间用尽时,使最后一条记录指向硬盘中的一个文件作为记录区块。最后
一条记录即为扩展记录。扩展记录的权限应该设为 11111111(0xFF)
, 类型为 3
.
出于性能考虑应尽量避免使用扩展记录。如果操作系统中实现了磁盘清理工具,应该
在磁盘清理时扩充记录表并合并扩展记录内容。
文件的物理地址由此公式计算: 记录区块大小 + 偏移量 * 4字节
. 即每个文件都对齐到
4字节处。
文件的逻辑大小由 size
属性给出。当扩展位为 1
时,文件的逻辑大小为 size
属性
的4倍。此操作可能会导致实际文件大小小于逻辑文件大小。
文件夹的属性 type
为 1
. 其偏移量指向硬盘中一个4KB的文件,文件中存放在文件夹内
的文件的偏移量。
链接的属性 type
为 2
. 其偏移量指向链接对象,大小为 0
.
特殊文件的属性 type
为 3
. 此时其偏移量和大小将作为数据值使用。
当修改文件时,如果文件将覆盖到后一个文件,则将其转移到一个合适空间。合适的空间
满足条件 >= 新文件大小 * 1.1
.
Bugs
由于这个文件系统没有备份表或者其他的安全保护措施,这个设计会相当脏而且容易
损坏。如果希望测试这个文件系统,可以尝试用虚拟机(比如 qemu
).