Linux 的档案系统( inode ):
看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈 Linux 的档案系统( Filesystem )啰!我们这里以 Linux 最标准的 ext2 这个档案系统来作为说明。还记得我们在
Linux 档案属性与目录配置
那个章节提到的,在 Linux 系统当中,每个档案不止有档案的内容数据,还包括档案的种种属性,例如:所属群组、所属使用者、能否执行、档案建立时间、档案特殊属性等等。由于 Linux 操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性,所以档案属性的增加是在所难免的!在标准的 ext2 档案系统当中,我们将每个档案的内容分为两个部分来储存,一个是档案的属性,另一个则是档案的内容。
为了应付这两个不同的咚咚,所以 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 记录的信息(当然不止这些):
至于一个 inode 的大小为 128 bytes 这么大!好了,那么我的 Linux 系统到底是如何读取一个档案的内容呢?底下我们分别针对目录与档案来说明:
目录:
当我们在 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 这个档案,整个读取的流程是如何呢?可由底下的图三来作为说明:
看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈 Linux 的档案系统( Filesystem )啰!我们这里以 Linux 最标准的 ext2 这个档案系统来作为说明。还记得我们在
为了应付这两个不同的咚咚,所以 ext2 规划出 inode 与 Block 来分别储存档案的属性( 放在 inode 当中 )与档案的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说, 当 partition 被格式化为 ext2 的档案系统时,他一定会有 inode table 与 block area 这两个区域。
Block 已经在前面说过了,他是数据储存的最小单位。那么 inode 是什么?!简单的说,
- 该档案的拥有者与群组(owner/group);
- 该档案的存取模式;
- 该档案的类型;
- 该档案的建立日期(ctime)、最近一次的读取时间(atime)、最近修改的时间 (mtime);
- 该档案的容量;
- 定义档案特性的旗标(flag),如 SetUID...;
- 该档案真正内容的指向 (pointer);
至于一个 inode 的大小为 128 bytes 这么大!好了,那么我的 Linux 系统到底是如何读取一个档案的内容呢?底下我们分别针对目录与档案来说明:
目录:
当我们在 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 这个档案,整个读取的流程是如何呢?可由底下的图三来作为说明:
![Linux <wbr>的档案系统( <wbr>inode <wbr>)](http://linux-vbird.bluedata.org/linux_base/images/Linux-filesystem.jpg)
图 读取 /etc/crontab 的简易流程示意。
一块 partition 在 ext2 底下会被格式化为 inode table 与 block area 两个区域,所以在图三里面,我们将 partition 以长条的方式来示意,会比较容易理解的啦!而读取 /etc/crontab 的流程为:
- 操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这个目录的所有相关属性;
- 根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有档案的关连数据是放置在哪一个 Block 当中,并前往该 block 读取档案的关连性内容;
- 由上个步骤的 Block 当中,可以知道 crontab 这个档案的 inode 所在地,并前往该 inode ;
- 由上个步骤的 inode 当中,可以取得 crontab 这个档案的所有属性,并且可前往由 inode 所指向的 Block 区域,顺利的取得 crontab 的档案内容。
整个读取的流程大致上就是这样,不过这里有几点小事情要提醒一下:
- 在目录底下的档案数如果太多而导致一个 Block 无法容纳的下所有的关连性数据时,Linux 会给予该目录多一个 Block 来继续记录关连数据;
- 一个档案所占用的 Block 都会记录在该档案所在的 inode 内,所以硬盘的磁头可以直接去读取各个 Block ,除非该档案所储存的各个 Block 真的很离散(事实上不太可能发生),否则在 Linux 的 ext2 当中,是不需要进行磁盘重组的!
- inode 数量与 Block 的大小在格式化的时候就已经被设定好了,通常一个 Block 的大小为 4 Kbytes,至于 inode 的数量则依据不同的设定而异,基本的设定为 ( 硬盘大小 / 一个 inode 所控制的容量 ) 。举例来说,我有一个 1 GBytes 的硬盘,我希望该硬盘中 inode 的数量只要 block 的一半就好了,那么就可以设定一个 inode 控制的容量为 8 Kbytes ,则 inode 数量共有: ( G * 1024M/G * 1024K/M )/( 8 K ) = 131072 个 inode 啰!而 inode table 则占去了 131072 * 128 byte = 16777216 bytes = 16384 Kbytes。也就是说,这一个 1GB 的硬盘还有没任何数据时,就少了 16 MBytes 的容量啦!(用在 inode table 上面)。
- 因为一个 inode 只能记录一个档案的属性,所以 inode 数量比 block 多是没有意义的!举上面的例子来说,我的 Block 规划为 4 Kbytes ,所以 1GB 大概就有 262144 个 4Kbytes 的 block ,如果一个 block 对应一个 inode 的话,那么当我的 inode 数量大于 262144 时,多的 inode 将没有任何用处,徒然浪费硬盘的空间而已!另外一层想法,如果我的档案容量都很大,那么一个档案占用一个 inode 以及数个 block ,当然 inode 数量就可以规划的少很多啦!
- 格式化 Linux 的 ext2 档案系统,可以使用 mke2fs 这个程序来执行!
- 当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差;这种情况适合档案数量多,但是档案容量小的系统,例如 BBS 或者是新闻群组( News )这方面服务的系统;
- 当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多;这种状况则比较适合档案容量较大的系统!