与目录树的关系
由前一小节的介绍我们知道在 Linux 系统下,每个档案(不管是一般档案还是目录档案)都会占用一个 inode , 且可依据档案内容的大小来分配多个 block 给该档案使用。而由第六章的权限说明中我们知道目录的内容在记录档名, 一般档案才是实际记录资料内容的地方。那么目录与档案在 Ext2 档案系统当中是如何记录资料的呢? 基本上可以这样说:
* 目录
当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的档名与该档名占用的 inode 号码资料。也就是说目录所占用的 block 内容在记录如下的资讯:
图1.4.1、目录占用的 block 记录的资料示意图
如果想要实际观察 root 家目录内的档案所占用的 inode 号码时,可以使用 ls -i 这个选项来处理:
[root@www ~]# ls -li
total 92
654683 -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
648322 -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log
648323 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
由于每个人所使用的电脑并不相同,系统安装时选择的项目与 partition 都不一样,因此你的环境不可能与我的 inode 号码一模一样!上表的右边所列出的 inode 仅是鸟哥的系统所显示的结果而已!而由这个目录的 block 结果我们现在就能够知道, 当你使用‘ ll / ’时,出现的目录几乎都是 1024 的倍数,为什么呢?因为每个 block 的数量都是 1K, 2K, 4K 嘛! 看一下鸟哥的环境:
[root@www ~]# ll -d / /bin /boot /proc /lost+found /sbin
drwxr-xr-x 23 root root 4096 Sep 22 12:09 / <==一个 4K block
drwxr-xr-x 2 root root 4096 Sep 24 00:07 /bin <==一个 4K block
drwxr-xr-x 4 root root 1024 Sep 4 18:06 /boot <==一个 1K block
drwx------ 2 root root 16384 Sep 5 01:49 /lost+found <==四个 4K block
dr-xr-xr-x 96 root root 0 Sep 22 20:07 /proc <==此目录不占硬碟空间
drwxr-xr-x 2 root root 12288 Sep 5 12:33 /sbin <==三个 4K block
由于鸟哥的根目录 /dev/hdc2 使用的 block 大小为 4K ,因此每个目录几乎都是 4K 的倍数。 其中由于 /sbin 的内容比较复杂因此占用了 3 个 block ,此外,鸟哥的系统中 /boot 为独立的 partition , 该 partition 的 block 为 1K 而已,因此该目录就仅占用 1024 bytes 的大小啰!至于奇怪的 /proc 我们在第六章就讲过该目录不占硬碟容量, 所以当然耗用的 block 就是 0 啰!
Tips:
由上面的结果我们知道目录并不只会占用一个 block 而已,也就是说: 在目录底下的档案数如果太多而导致一个 block 无法容纳的下所有的档名与 inode 对照表时,Linux 会给予该目录多一个 block 来继续记录相关的资料;
* 档案:
当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配一个 inode 与相对于该档案大小的 block 数量给该档案。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 block 来储存该档案! 但同时请注意,由于 inode 仅有 12 个直接指向,因此还要多一个 block 来作为区块号码的记录喔!
* 目录树读取:
好了,经过上面的说明你也应该要很清楚的知道 inode 本身并不记录档名,档名的记录是在目录的 block 当中。 因此在第六章档案与目录的权限说明中, 我们才会提到‘新增/删除/更名档名与目录的 w 权限有关’的特色!那么因为档名是记录在目录的 block 当中, 因此当我们要读取某个档案时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取档案的 inode 号码, 最终才会读到正确的档案的 block 内的资料。
由于目录树是由根目录开始读起,因此系统透过挂载的资讯可以找到挂载点的 inode 号码(通常一个 filesystem 的最顶层 inode 号码会由 2 号开始喔!),此时就能够得到根目录的 inode 内容,并依据该 inode 读取根目录的 block 内的档名资料,再一层一层的往下读到正确的档名。
举例来说,如果我想要读取 /etc/passwd 这个档案时,系统是如何读取的呢?
[root@www ~]# ll -di / /etc /etc/passwd
2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
1912545 drwxr-xr-x 105 root root 12288 Oct 14 04:02 /etc
1914888 -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
在鸟哥的系统上面与 /etc/passwd 有关的目录与档案资料如上表所示,该档案的读取流程为(假设读取者身份为 vbird 这个一般身份使用者):
1. / 的 inode:
透过挂载点的资讯找到 /dev/hdc2 的 inode 号码为 2 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r 与 x) ;
2. / 的 block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545);
3. etc/ 的 inode:
读取 1912545 号 inode 得知 vbird 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
4. etc/ 的 block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888);
5. passwd 的 inode:
读取 1914888 号 inode 得知 vbird 具有 r 的权限,因此可以读取 passwd 的 block 内容;
6. passwd 的 block:
最后将该 block 内容的资料读出来。
* filesystem 大小与磁碟读取效能:
另外,关于档案系统的使用效率上,当你的一个档案系统规划的很大时,例如 100GB 这么大时, 由于硬碟上面的资料总是来来去去的,所以,整个档案系统上面的档案通常无法连续写在一起(block 号码不会连续的意思), 而是填入式的将资料填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的档案资料离散的问题发生了。
如前所述,虽然我们的 ext2 在 inode 处已经将该档案所记录的 block 号码都记上了, 所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 因为磁碟读取头还是得要在整个档案系统中来来去去的频繁读取! 果真如此,那么可以将整个 filesystme 内的资料全部复制出来,将该 filesystem 重新格式化, 再将资料给他复制回去即可解决这个问题。
此外,如果 filesystem 真的太大了,那么当一个档案分别记录在这个档案系统的最前面与最后面的 block 号码中, 此时会造成硬碟的机械手臂移动幅度过大,也会造成资料读取效能的低落。而且读取头再搜寻整个 filesystem 时, 也会花费比较多的时间去搜寻!因此, partition 的规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!^_^
阅读(1640) | 评论(0) | 转发(0) |