Friday, January 16, 2009

Linux 的档案系统( inode )

每个档案的内容分为两个部分来储存,一个是档案的属性,另一个则是档案的内容。
 
为了应付这两个不同的咚咚,所以 ext2 规划出 inode 与 Block 来分别储存档案的属性( 放在 inode 当中 )与档案的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 partition 被格式化为 ext2 的档案系统时,他一定会有 inode table 与 block area 这两个区域。
 
Block 已经在前面说过了,他是数据储存的最小单位。那么 inode 是什么?!简单的说, Block 是记录『档案内容数据』的区域,至于 inode 则是记录『该档案的相关属性,以及档案内容放置在哪一个 Block 之内』的信息。 简单的说, inode 除了记录档案的属性外,同时还必须要具有指向( pointer )的功能,亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容啊!底下几个是 inode 记录的信息(当然不止这些):
 
  • 该档案的拥有者与群组(owner/group);
  • 该档案的存取模式;
  • 该档案的类型;
  • 该档案的建立日期(ctime)、最近一次的读取时间(atime)、最近修改的时间 (mtime);
  • 该档案的容量;
  • 定义档案特性的旗标(flag),如 SetUID...;
  • 该档案真正内容的指向 (pointer);
 
至于一个 inode 的大小为 128 bytes 这么大!

目录:
当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)的关连性!
 
档案:
当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配至少一个 inode 与相对于该档案大小的 Block 数量给该档案。例如:假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 Block 来储存该档案!
 
由上面的说明当中,我们可以知道要读取一个树状目录下的档案时,操作系统会先读取该档案所在目录的 inode ,并取得该目录的关连区域(在 Block 区域里面),然后根据该关连资料读取该档案所在的 inode ,并再进一步经由档案的 inode 来取得档案的最后内容!

举个例子来说,假设我们要读取 /etc/crontab 这个档案,整个读取的流程是如何呢?可由底下的图三来作为说明:

图三、读取 /etc/crontab 的简易流程示意。

格式化 Linux 的 ext2 档案系统,可以使用 mke2fs 这个程序来执行!当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差;这种情况适合档案数量多,但是档案容量小的系统,例如 BBS 或者是新闻群组( News )这方面服务的系统;当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多;这种状况则比较适合档案容量较大的系统!

Linux 档案系统的运作通常采取异步处理( asynchronously )的方式。什么是异步呢?举例来说:当系统读取了某一个档案, 则该档案所在的 区块数据会被加载到内存当中,所以该磁盘区块就会被放置在主存储器的缓冲快取区中,若这些区块的数据被改变时,刚开始数据仅有主存储器的区块数据会被改 变,而且在缓冲区当中的区块数据会被标记为” Dirty “,这个时候磁盘实体区块尚未被修正!所以亦即表示,这些” Dirty “区块的数据必需回写到磁盘当中,以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。

No comments: