在Linux下,命令
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。
举例:
dd if=/dev/zero of=vdisk bs=1024 count=1440
mke2fs vdisk 1440
在vdsik的虚拟擦盘文件上创建一个EXT2文件系统。
超级块:
s_first_data_block: 0表示4KB块大小,1表示1KB块大小。它用于确定块组描述符的 起始块,即 s_first_data_block + 10
s_log_block_size :确定文件块大小,为 lKB*(2**s_log_block_size),例如:0 表示 1KB块大小,1表示2KB块大小,2表示4KB块大小等。最常用的块大小是用于小文件系 统的1KB和用于大文件系统的4KB。
s_mnt_count :已挂载文件系统的次数。当挂载计数达到max mnt count时,fsck会话 将被迫检查文件系统的一致性。
s_magic:文件系统类型的幻数。EXT2/3/4文件系统的幻数是0xEF53
块和索引节点位图
Block#8 :块位图(Bmap)(bg_block_bitmap)位图是用来表示某种项的位序列,例如 磁盘块或索引节点。位图用于分配和回收项。在位图中,0位表示对应项处于FREE状态, 1位表示对应项处于IN_USE状态。一个软盘有1440个块,但是Block#。未被文件系统使 用。所以,位图只有1439个有效位。无效位被视作IN_USE,设置为1。
Block#9 :索引节点位图(Imap) (bg_inode_bitmap) 一个索引节点就是用来代表一个 文件的数据结构° EXT2文件系统是使用有限数量的索引节点创建的。各索引节点的状态用 B9的Imap中的一个位表示。在EXT2 FS中,前10个索引节点是预留的。所以,空EXT2 FS的Imap以10个1开头,然后是0。无效位再次设置为1。
文件系统的实现分为三个级别:
每个级别处理文件系统的不同部分。这使得实现过程模块化,更容易理解。在文件系统的实现过程中,FS目录包含实现EXT2文件系统的文件。
第1级别实现了基本文件系统树。它包含以下文件,实现了指定函数。
mkdir_creat.c : make directory, create regular file
ls_cd_pwd.c : list directory, change directory, get CWD path
rmdir.c : remove directory
link_unlink.c : hard link and unlink files
symlink_readlink.c : symbolic link files
stat.c : return file information
misc1.c : access,chmod, chown, utime, etc.
第2级别实现了文件内容读/写函数。
open_close_lseek.c : open file for RBAD | WRITE|APPEND,close file and lseek
read.c : read from file descriptor of an opened regular file
write.c : write to file descriptor of an opened regular file
opendir_readdir.c : open and read directory
第3级别实现了文件系统的挂载、卸载和文件保护。
mount__umount.c : mount/umount file systems
file_protection : access permission checking
file-locking : lock/unlock files
文件锁定
文件锁定机制允许进程对一个文件或文件的某些部分设置文件锁,以防止在更新文件时出现竞态条件。文件锁可共享(允许同步读取),也可独占(执行独占写)。文件锁既可以是强制性的,也可以是建议性的。例如, Linux既支持共享文件锁,也支持独占文件锁,但文件锁定只是建议性的。在 Linux I中,文件锁可通过ntl(系统调用设置,也可通过fock系统调用操作。为简单起见,我们假设一种非常简单的文件锁定。
当一个进程试图打开一个文件时,将会检查目标操作模式的兼容性。唯一容模式是读模式。如果已经为更新模式打开了一个文件,即写读写追加,则该文件无法再次打开。但是,这并不会阻止相关进程(例如父进程和子进程)修改父进程打开的同一文件,而且在Unix/ Linux中同样如此。在这种情况下,文件系统只能保证每个写操作是原操作,但不能保证进程的写入顺序,写入顺序取决于进程调度。
文件系统项目的扩展
简单的EXT2文件系统使用1KB块大小,只有一个磁盘块组它可以轻松进行以下扩展。
(1)多个组:组描述符的大小为32字节对于1KB大小的块,一个块可能包含
1024/32=32组描述符。32个组的文件系统大小可以扩展为32*8=256MB
(2)4KB大小的块:对于4KB大小的块和一个组,文件系统大小应为4*8=32MB。
对于一个组描述符块,文件系统可能有128个组,可将文件系统大小扩展到128*32=4GB
对于2个组描述符块,文件系统大小为8GB等。大多数扩展都很简单,适合用于编程项目。
(3)管道文件:管道可实现为普通文件,这些文件遵循管道的读/写协议。此方案的优点是:它统一了管道和文件索引节点,并允许可被不相关进程使用的命名管道。为支持快速读/写操作,管道内容应在内存中,比如在 RAMdisk中。必要时,读者可将命名管道实现为FIFO文件。
(4)I/O缓冲:在编程项目中,每个磁盘块都是接读写的。这会产生过多的物理磁盘I/O操作。为提高效率,实际文件系统通常使用一系列I缓冲区作为磁盘块的缓存内存。文件系统的IO缓冲将会在第12章中讨论,但是可把它合并到文件系统.