zenglOX v1.5.0 zenglfs文件系统, MBR主引导记录, fdisk分区工具及format磁盘格式化工具, file文件目录读写工具等

>>> fdisk工具简介(源代码为build_initrd_img/fdisk.c文件)：

我们可以使用类似fdisk -l 0的命令来查看0号ide硬盘里的分区信息，
原理就是通过读取该硬盘的0号扇区(也就是硬盘的第一个扇区, 也可以称之为MBR)，
对MBR里的分区表进行分析，就可以显示出每个分区的信息了。
要设置分区的话，可以使用类似如下的命令:
fdisk -hd 0 -pt 1 -type zenglfs -start 8 -num 123456
该命令表示将0号IDE硬盘的1号分区设置为zenglfs文件系统，该分区的
起始扇区号为8，分区拥有的扇区数为123456(相当于60M)
在执行该命令时，fdisk工具会检测你设置的信息是否有误，
比如当-num设置的扇区数超过磁盘的总扇区数时，等等。
如果参数没问题，在fdisk将分区信息写入到MBR后，通过fdisk -l 0就可以看到类似如下的输出
zenglOX> fdisk -l 0
[1] start LBA: 8 Total Sectors: 123456 [60M] filesystem: zenglfs
[2] .............
[3] .............
[4] .............

如果要删除1号分区，则可以使用类似如下的命令:
fdisk -hd 0 -pt 1 -type 0 -start 0 -num 0
其实就是将相关信息设置为0，再使用fdisk -l 0就可以看到该分区被删除了

fdisk工具只是对MBR里的分区表进行写入操作，要使用该分区，还必须使用
format工具来格式化该分区，格式化好后，最后再通过mount工具加载分区

MBR的结构可以参考 http://wiki.osdev.org/MBR_%28x86%29
MBR里的分区表结构则可以参考 http://wiki.osdev.org/Partition_Table

>>> format工具简介(源代码为build_initrd_img/format.c文件)：

通过format工具可以对fdisk工具所分的区进行格式化操作，
可以使用类似如下的命令:
format -hd 0 -pt 1 -type zenglfs
该命令表示将0号IDE硬盘的1号分区格式化为zenglfs文件系统
如果格式化成功，则可以使用format -l命令来查看格式化后的zenglfs文件系统的相关信息:
zenglOX> format -l 0 1
super block info:
..................
Group Info:
..................
如果不想显示Group Info信息，或者想控制Group Info所显示的Group信息数量，
则可以在末尾再添加一个数字，例如:
format -l 0 1 0 最后一个0表示显示的Group信息数为0,即不显示Group Info信息。

>>> mount工具简介(源代码为build_initrd_img/mount.c文件)

mount工具可以加载cdrom到iso目录，也可以将硬盘里格式化过的zenglfs分区给加载到hd目录，
当使用mount iso命令时，会通过syscall_mount_iso()系统调用将cdrom加载到iso目录
当使用类似 mount hd 0 1 命令时，则可以将0号IDE硬盘的1号分区给加载到hd目录
iso和hd是内核固定设置好的目录，目前不可以加载到其他的目录名上

>>> unmount工具简介(源代码为build_initrd_img/unmount.c文件)：

使用unmount iso命令可以卸载iso目录
使用unmount hd命令可以卸载hd目录

>>> file工具简介(源代码为build_initrd_img/file.c文件)：

当使用mount工具将硬盘分区挂载到hd目录后，就可以使用
file工具对hd目录进行读写文件或创建文件，创建子目录，删除文件，
删除子目录，重命名文件，重命名子目录的操作，
例如：file hd/hello命令表示在hd目录内创建一个空的hello文件
然后使用ls hd命令就可以在hd目录中查看到刚才创建的hello文件了，
通过ls hd/hello命令可以看到该hello文件的length尺寸为0，
通过file ata hd/ata2命令可以将ramdisk里的ata文件拷贝到hd目录内，同时，
在hd目录里的文件名为ata2，接着就可以通过hd/ata2命令来执行ata工具的操作了，如下所示:
zenglOX> file ata hd/ata2
copy content of ata to hd/ata2 success
zenglOX> hd/ata2 -s
ata0-master(....) ......
.........................
zenglOX>

通过file -rm hd/ata2命令就可以将刚才创建的ata2文件给删除掉。
file工具里为了简化起见，目录是在创建文件时，一起被创建的，
在你自定义的程式里，也可以根据file里的原理来单独创建某目录。
例如 file ata hd/dir/ata命令表示将ata文件拷贝到hd目录里的dir目录内，
如果dir目录不存在，则会创建该目录。

使用-rm参数删除目录时，必须先将目录里的所有内容删除，再删除该目录，
当然在你自定义的程式里，也可以通过递归方法，让工具自动将目录里的文件删除，再将目录删除，
file工具目前为了简化起见，并没有这么做。

通过file -rename hd/hello hello2命令可以将hd目录的hello文件重命名为hello2，如果
hello是一个目录的话，就将该目录重命名为hello2，如果重命名的名称里包含斜杠'/'，则'/'会被zenglfs替换为下划线'_'

以上就是file工具的用法。

>>> zenglfs文件系统简介(源代码为zlox_zenglfs.c文件)：

zenglfs 文件系统是参考ext2文件系统的，ext2文件系统可以参考
http://wiki.osdev.org/Ext2
zenglfs去掉了ext2里的一些字段，同时调整了Group块组信息和位图信息

其结构中，第1部分是super block超级块，第2部分是Group组信息部分,
第3部分是block逻辑块的位图信息(位图里的二进制1表示已分配的逻辑块，二进制0表示未分配
的逻辑块)，第4部分是文件节点的位图信息(位图里的二进制1表示已分配的文件节点，二进制0表示
未分配的文件节点)，第5部分是文件节点数组，数组里的每一项都记录了一个文件节点的具体字段信息，
剩余的部分则都是用于存储文件或目录的内容的

文件系统里所使用的逻辑块都是1024字节的大小，相当于2个磁盘扇区的大小
super block超级块的逻辑块地址是1，0号逻辑块地址目前是预留的

另外，1号文件节点是root根目录文件节点，在format格式化时，会对其进行简单的设置

在mount工具挂载zenglfs文件系统时，会调用zenglfs模块(对应为zlox_zenglfs.c文件)里的zlox_mount_zenglfs函数来完成加载工作，
在file之类的工具对hd目录所在的zenglfs文件系统进行写目录操作时(比如创建子目录，或创建目录里的文件时)，
会调用zenglfs模块的zlox_zenglfs_writedir函数，
在file之类的工具对hd目录进行读写文件的操作时，
会调用zenglfs模块的zlox_zenglfs_read或zlox_zenglfs_write函数，
当对hd目录进行列表或查找文件及子目录的操作时,
会调用zenglfs模块的zlox_zenglfs_readdir或zlox_zenglfs_finddir_ext函数，
当对hd目录进行删除文件或删除子目录的操作时，
会调用zenglfs模块的zlox_zenglfs_remove函数，
当对hd目录里的子文件或子目录进行重命名操作时，
会调用zenglfs模块的zlox_zenglfs_rename函数，
在unmount工具卸载zenglfs文件系统时，则会调用zenglfs模块的zlox_unmount_zenglfs函数。

在zenglfs模块的开头定义了类似zenglfs_cache_inode, zenglfs_cache_inode_blk,
zenglfs_cache_group之类的缓存结构，定义这些结构是为了能缓存磁盘里的数据，
以减少频繁的磁盘I/O读写操作

在文件节点里有SinglyBlockAddr，DoublyBlockAddr，TriplyBlockAddr字段，
这些字段是对blockAddr字段的补充，这些字段参考自ext2文件系统，
blockAddr[12]字段只能分配到12个逻辑块数据(相当于12KByte)，
SinglyBlockAddr对应的逻辑块里可以存储256个blockAddr(相当于256k的数据)，
DoublyBlockAddr的逻辑块里则可以存储256个SinglyBlock的逻辑块地址，这样就可以分配到
256 * 256k = 65536k = 64M的数据，
TriplyBlockAddr对应的逻辑块里可以存储256个DoublyBlock的逻辑块地址，这样就可以分配到
256 * 256 * 256k = 16777216k = 16384M = 16G的数据
因此，理论上，这种结构的单个文件的最大尺寸是16G多，
当然还要看具体的读写操作的算法，目前的读写算法是先将要写入的数据全部缓存到内存，
再将内存里的数据写入磁盘，因此，zenglfs目前可写入文件的实际大小是受限于内存大小的。
如果将读写算法调整为每次只写入一部分数据，分批将数据写入到磁盘的话，就可以让文件
达到理论上的最大尺寸。

作者：zenglong
时间：2014年7月20日
官网：www.zengl.com