《本人认为不错的文章》特转
磁盘分割 ( Partition ):
在了解了硬盘的物理组件之后,再接着下来介绍的就是硬盘的分割( Partition )啰!为什么要进行硬盘分割啊?!因为我们必须要告诉操作系统:『我这块硬盘可以存取的区域是由 A 磁柱到 B 磁柱』,如此一来,操作系统才能够控制硬盘磁头去 A-B 范围内的磁柱存取数据;如果没有告诉操作系统这个信息,那么操作系统就无法利用我们的硬盘来进行数据的存取了,因为操作系统将无法知道他要去哪里读取数据啊!这 就是磁盘分割( Partition )的重点了:也就是记录每一个分割区( Partition )的起始与结束磁柱!好了,那么这个分割区的起始与结束磁柱的数据放在哪里呢?!那就是我们在 Linux 安装与多重开机技巧 那个章节提到的 主要开机扇区( Master Boot Recorder, MBR )啰!事实上, MBR 就是在一块硬盘的第零轨上面,这也是计算机开机之后要去利用该硬盘时,必须要读取的第一个区域!在这个区域内记录的就是硬盘里面的所有分割信息,以及开机的时候可以进行该机管理程序的写入的处所啊!所以,当一个硬盘的 MBR 坏掉时,由于分割的数据不见了,呵呵,那么这个硬盘也就几乎可以说是寿终正寝了,因为操作系统不知道该去哪个磁柱上读取数据啊~~
那么 MBR 有什么限制呢?他最大的限制来自于他的大小不够大到储存所有分割与开机管理程序的信息,因此,他仅提供最多四个 partition 的记忆,这就是所谓的 Primary (P)与 Extended (E) 的 partition 最多只能有四个的原因了。所以说,如果你预计分割超过 4 个 partition 的话,那么势必需要使用 3P + 1E ,并且将所有的剩余空间都拨给 Extended 才行( 记得呦! Extended 最多只能有一个 ),否则只要 3P + E 之后还有剩下的空间,那么那些容量将成为废物而浪费了,所以结论就是『如果您要分割硬碟时,并且已经预计规划使用掉 MBR 所提供的 4 个 partition ( 3P + E 或 4P )那么磁盘的全部容量需要使用光,否则剩下的容量也不能再被使用』。不过,如果您仅是分割出 1P + 1E 的话,那么剩下的空间就还能再分割两个 partition !
![](http://linux-vbird.bluedata.org/linux_base/0230filesystem_files/penguin-s.gif)
在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为『我的操作系统认识的档案系统( Filesystem )』啰!因为每个操作系统认识的 filesystem 并不相同!例如 Windows 操作系统在预设状态下就无法认识 Linux 的档案系统 ( 这里指 Linux 的标准档案系统 ext2 )。所以当然要针对我们的操作系统来格式化 partition 啰!
我们可以说,每一个 partition 就是一个 Filesystem ,那么一个 partition 是否可以具有两个 Filesystem 呢?!理论上应该是不行的!因为每个档案系统都有其独特的支持方式,例如 Linux 的 ext3 就无法被 Windows 系统所读取!而你将一个 partition 格式化的时候,总不能格式化为 ext3 也同时格式化为 fat32 吧?!那是不可能的啊!
不论是哪一种 filesystem ,数据总是需要储存的吧!既然硬盘是用来储存数据的,想当然尔,数据就必须写入硬盘啦!刚刚我们提到硬盘的最小储存单位是 sector ,不过数据所储存的最小单位并不是 sector 喔,因为用 sector 来储存太没有效率了。怎么说呢?因为一个 sector 只有 512 Bytes ,而磁头是一个一个 sector 的读取,也就是说,如果我的档案有 10 MBytes ,那么为了读这个档案,我的磁头必须要进行读取 (I/O) 20480 次!
为了克服这个效率上的困扰,所以就有 逻辑区块( Block )的产生了! 逻辑区块是在 partition 进行 filesystem 的格式化时,所指定的『最小储存单位』,这个最小储存单位当然是架构在 sector 的大小上面( 因为 sector 为硬盘的最小物理储存单位啊! ),所以啦, Block 的大小为 sector 的 2 的次方倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 Block 为 4 KBytes ( 亦即由连续的八个 sector 所构成一个 block ),那么同样一个 10 MBytes 的档案,磁头要读取的次数则大幅降为 2560 次,这个时候可就大大的增加档案的读取效能啦!
不过,Block 单位的规划并不是越大越好喔!怎么说呢? 因为一个 Block 最多仅能容纳一个档案!这有什么问题呢?举例来说好了,假如您的 Block 规划为 4 KBytes ,而您有一个档案大小为 0.1 KBytes ,这个小档案将占用掉一个 Block 的空间,也就是说,该 Block 虽然可以容纳 4 Kbytes 的容量,然而由于档案只占用了 0.1 Kbytes ,所以,实际上剩下的 3.9 KBytes 是不能再被使用了,所以,在考虑 Block 的规划时,需要同时考虑到:
- 档案读取的效能
- 档案大小可能造成的硬盘空间浪费
因此,在规划您的磁盘时,需要留意到您主机的用途来进行规划较佳!例如 BBS 主机由于文章较短,也就是说档案较小,那么 Block 小一点的好;而如果您的主机主要用在储存大容量的档案,那么考虑到效能,当然 Block 理论上,规划的大一点会比较妥当啦!
Superblock:如同前面说的,当我们在进行磁盘分割( partition )时,每个磁盘分割槽( partition )就是一个档案系统( filesystem ),而每个档案系统开始的位置的那个 block 就称为 superblock ,superblock的作用是储存像是档案系统的大小、空的和填满的区块,以及他各自的总数和其它诸如此类的信息等等,这也就是说,当您要使用这一个磁盘分割槽( 或者说是档案系统 )来进行数据存取的时候,第一个要经过的就是 superblock 这个区块了,所以啰, superblock 坏了,您的这个磁盘槽大概也就回天乏术了!
![](http://linux-vbird.bluedata.org/linux_base/0230filesystem_files/penguin-s.gif)
看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈 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 记录的信息(当然不止这些):
- 该档案的拥有者与群组(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 这个档案,整个读取的流程是如何呢?可由底下的图三来作为说明: