📄 0230filesystem.htm
字号:
partition )时,每个磁盘分割槽( partition )就是一个档案系统( filesystem),而每个档案系统开始的位置的那个 block 就称为 superblock ,superblock的作用是储存像是档案系统的大小、空的和填满的区块,以及他各自的总数和其它诸如此类的信息等等,这也就是说,当您要使用这一个磁盘分割槽(或者说是档案系统 )来进行数据存取的时候,第一个要经过的就是 superblock 这个区块了,所以啰,superblock 坏了,您的这个磁盘槽大概也就回天乏术了!<br> <br><hr width="100%"><a name="harddisk-inode"></a><img src="0230filesystem_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><b><font color="#000099">Linux的档案系统( inode ):</font></b><br> <br>看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈Linux 的档案系统( Filesystem )啰!我们这里以 Linux 最标准的 ext2 这个档案系统来作为说明。还记得我们在<a href="http://linux.vbird.org//linux_basic/0210filepermission.php">Linux 档案属性与目录配置</a> 那个章节提到的,在Linux 系统当中,每个档案不止有档案的内容数据,还包括档案的种种属性,例如:所属群组、所属使用者、能否执行、档案建立时间、档案特殊属性等等。由于Linux 操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性,所以档案属性的增加是在所难免的!在标准的ext2 档案系统当中,我们将每个档案的内容分为两个部分来储存,一个是档案的属性,另一个则是档案的内容。<br> <br>为了应付这两个不同的咚咚,所以 ext2 规划出 inode 与 Block 来分别储存档案的属性(放在 inode 当中 )与档案的内容( 放置在 Block area 当中 )。当我们要将一个partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,<b><font color="#000066">当partition 被格式化为 ext2 的档案系统时,他一定会有 inode table 与 blockarea 这两个区域。</font></b><br> <br>Block 已经在前面说过了,他是数据储存的最小单位。那么 inode 是什么?!简单的说,<b><font color="#000066">Block 是记录『档案内容数据』的区域</font></b>,至于 <b><font color="#000066">inode则是记录『该档案的相关属性,以及档案内容放置在哪一个 Block 之内』的信息</font></b>。简单的说, inode 除了记录档案的属性外,同时还必须要具有指向( pointer )的功能,亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容啊!底下几个是inode 记录的信息(当然不止这些):<br> <ul><li><font color="#000099">该档案的拥有者与群组(owner/group);</font></li><li><font color="#000099">该档案的存取模式;</font></li><li><font color="#000099">该档案的类型;</font></li><li><font color="#000099">该档案的建立日期(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime);</font></li><li><font color="#000099">该档案的容量;</font></li><li><font color="#000099">定义档案特性的旗标(flag),如 SetUID...;</font></li><li><font color="#000099">该档案真正内容的指向 (pointer);</font></li></ul> <br>至于一个 inode 的大小为 128 bytes 这么大!好了,那么我的 Linux 系统到底是如何读取一个档案的内容呢?底下我们分别针对目录与档案来说明:<br> <br><b><font color="#000066">目录:</font></b><br>当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)的关连性!<br> <br><b><font color="#000066">档案:</font></b><br>当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配至少一个 inode与相对于该档案大小的 Block 数量给该档案。例如:假设我的一个 Block 为 4Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode与 25 个 Block 来储存该档案!<br> <br>由上面的说明当中,我们可以知道要读取一个树状目录下的档案时,操作系统会先读取该档案所在目录的inode ,并取得该目录的关连区域(在 Block 区域里面),然后根据该关连资料读取该档案所在的inode ,并再进一步经由档案的 inode 来取得档案的最后内容!举个例子来说,假设我们要读取/etc/crontab 这个档案,整个读取的流程是如何呢?可由底下的图三来作为说明:<br> </ul><center><img src="0230filesystem_files/Linux-filesystem.jpg" alt="" height="155" width="456"><br><a name="fig_3"></a>图三、读取 /etc/crontab 的简易流程示意。</center><ul> <br>一块 partition 在 ext2 底下会被格式化为 inode table 与 block area 两个区域,所以在图三里面,我们将partition 以长条的方式来示意,会比较容易理解的啦!而读取 /etc/crontab 的流程为:<br> <ol><li><font color="#000099">操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的inode ,并前往读取 /etc 这个目录的所有相关属性;</font></li><li><font color="#000099">根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有档案的关连数据是放置在哪一个Block 当中,并前往该 block 读取档案的关连性内容;</font></li><li><font color="#000099">由上个步骤的 Block 当中,可以知道 crontab 这个档案的inode 所在地,并前往该 inode ;</font></li><li><font color="#000099">由上个步骤的 inode 当中,可以取得 crontab 这个档案的所有属性,并且可前往由inode 所指向的 Block 区域,顺利的取得 crontab 的档案内容。</font></li></ol></ul><blockquote>整个读取的流程大致上就是这样,不过这里有几点小事情要提醒一下:<ul><li><font color="#000099">在目录底下的档案数如果太多而导致一个 Block 无法容纳的下所有的关连性数据时,Linux会给予该目录多一个 Block 来继续记录关连数据;</font></li><li><font color="#000099">一个档案所占用的 Block 都会记录在该档案所在的 inode内,所以硬盘的磁头可以直接去读取各个 Block ,除非该档案所储存的各个 Block真的很离散(事实上不太可能发生),否则在 Linux 的 ext2 当中,是不需要进行磁盘重组的!</font></li><li><font color="#000099">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 的硬盘还有没任何数据时,就少了 16MBytes 的容量啦!(用在 inode table 上面)。</font></li><li><font color="#000099">因为一个 inode 只能记录一个档案的属性,所以 inode数量比 block 多是没有意义的!举上面的例子来说,我的 Block 规划为 4 Kbytes,所以 1GB 大概就有 262144 个 4Kbytes 的 block ,如果一个 block 对应一个inode 的话,那么当我的 inode 数量大于 262144 时,多的 inode 将没有任何用处,徒然浪费硬盘的空间而已!另外一层想法,如果我的档案容量都很大,那么一个档案占用一个inode 以及数个 block ,当然 inode 数量就可以规划的少很多啦!</font></li><li><font color="#000099">格式化 Linux 的 ext2 档案系统,可以使用 mke2fs 这个程序来执行!</font></li><li><font color="#000099">当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差;这种情况适合档案数量多,但是档案容量小的系统,例如BBS 或者是新闻群组( News )这方面服务的系统;</font></li><li><font color="#000099">当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多;这种状况则比较适合档案容量较大的系统!</font></li></ul><p><br></p><hr size="2" width="100%"><a name="harddisk-filerun"></a><img src="0230filesystem_files/penguin-s.gif" nosave="" align="middle" height="23" width="17"><b><font color="#000099">Linux档案系统的运作</font></b>:</blockquote><blockquote>好了,知道了 Linux 标准的 ext2 档案系统的状况后,再来了解一下那么Linux 系统在运作时,他是如何进行数据的存取呢?!我们知道,整个计算机主机当中,输出输入(I/O) 最快速的应该是 CPU 的快取了,然后则是主存储器,至于硬盘的存取则比前两个慢上许多。为了让Linux 加快整个系统的存取效率,因此在 Linux 上面通常采取异步处理( asynchronously)的方式。什么是异步呢?举例来说:<font color="#000000">『</font><b><font color="#000066">当系统读取了某一个档案,则该档案所在的 区块数据会被加载到内存当中,所以该磁盘区块就会被放置在主存储器的缓冲快取区中,若这些区块的数据被改变时,刚开始数据仅有主存储器的区块数据会被改变,而且在缓冲区当中的区块数据会被标记为” Dirty “,这个时候磁盘实体区块尚未被修正!所以亦即表示,这些”Dirty “区块的数据必需回写到磁盘当中,以维持磁盘实体区块上的数据与主存储器中的区块数据的一致性。</font></b><font color="#000000">』</font><br><font color="#000000"> </font><br><font color="#000000">为什么要这么做呢?这是因为主存储器的运作速度比起硬盘来实在是快太多了,万一系统当中有一个档案相当的大,而又持续性的存取,那么由于较慢的硬盘存取速度,将使得整个 Linux 速度被拖垮,所以才会使用异步方式的数据处理啊!不过,也由于硬盘与主存储器的数据可能没有同步化,因此,如果Linux 不正常关机( 例如跳电或者是当机 )时,则由于数据尚未回写入磁盘当中,会导致系统在再次开机时,会花相当多的时间进行磁盘检验,同时也有可能造成磁盘的损毁啊!</font></blockquote><p><br></p><hr width="100%"><img src="0230filesystem_files/penguin-m.gif" alt="" nosave="" align="middle" height="34" width="25"><a name="hardcontent"></a><font size="+1" color="#000099">查看硬盘或目录的容量</font><blockquote>了解了硬盘之后,接下来当然要知道我的 Linux 系统里面还剩下多少磁盘空间啰!嗯,那么在文字接口底下有什么方法可以查看目前的磁盘最大容许容量、已经使用掉的容量、目前所在目录的已使用容量?还有还有, 怎么知道目前目录底下使用掉的硬盘容量呢?以及如何查询目前的 inodes数目?呵呵!底下我们就来谈一谈主要的两个指令:<blockquote><font face="SimSun"><b>df</b> 查看已挂载磁盘的总容量、使用容量与inode 等等</font><br><font face="SimSun"><b>du</b> 查看档案使用掉的容量有多少?</font></blockquote><blockquote><hr width="100%"><li><a name="df"></a><b><font color="#000099" face="SimSun">df</font></b></li><br><font color="#ff0000">语法</font>:<table bgcolor="#000000" border="1" cols="1" width="500"><tbody><tr><td><font size="-1" face="SimSun"><font color="#ffffff">[root @tsai/root ]# </font><font color="#ffff00">df -[ikm]</font></font><br><font size="-1" color="#ffffcc" face="SimSun">参数说明:</font><br><font size="-1" color="#ff9900" face="SimSun">-i:  使用i-nodes 显示结果</font><br><font size="-1" color="#ff9900" face="SimSun">-k:  使用KBytes 显示结果</font><br><font size="-1" color="#ff9900" face="SimSun">-m:  使用MBytes 显示结果</font><br><font size="-1" color="#ffffcc" face="SimSun">范例:</font><br><font size="-1" face="SimSun"><font color="#ffffff">[root @test/root ]# </font><font color="#ffff00">df -k </font><font color="#ffffff">     </font><font color="#ff9900"><==以 KB 显示磁盘空间</font></font><br><font size="-1" color="#ffffff" face="SimSun">Filesystem          1k-blocks      Used Available Use% Mounted on</font><br><font size="-1" color="#ffffff" face="SimSun">/dev/hda1             2118832    904600   1106600  45% /</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -