3Linux 磁盘与档案系统管理.docx
《3Linux 磁盘与档案系统管理.docx》由会员分享,可在线阅读,更多相关《3Linux 磁盘与档案系统管理.docx(60页珍藏版)》请在冰豆网上搜索。
![3Linux 磁盘与档案系统管理.docx](https://file1.bdocx.com/fileroot1/2022-12/29/7707b03b-8451-4d93-b73d-453a9345d816/7707b03b-8451-4d93-b73d-453a9345d8161.gif)
3Linux磁盘与档案系统管理
Linux磁盘与档案系统管理1
认识EXT2档案系统1
硬盘物理组成1
磁盘分割(Partition)2
档案系统3
Linux的EXT2档案系统(inode)4
EXT2/EXT3档案的存取与日志式档案系统的功能8
数据的不一致(Inconsistent)状态11
Linux档案系统的运作12
挂载点的意义(mountpoint)13
其它Linux支持的档案系统13
档案系统的简单操作14
磁盘与目录的容量14
df14
du17
连结档的介绍:
ln18
#HardLink(硬式连结或实际连结)19
#SymbolicLink(符号连结,亦即是快捷方式)20
关于目录的link数量22
磁盘的分割、格式化、检验与挂载23
磁盘分割:
fdisk24
#删除磁盘分割槽27
新增磁盘分割槽28
#操作环境的说明30
#注意事项:
31
磁盘格式化31
mkbootdisk(制作软盘开机片)33
fdformat(进行软盘低阶格式化)33
磁盘检验:
fsck,badblocks33
fsck34
badblocks35
sync35
磁盘挂载与卸载36
umount(将装置档案卸载)39
磁盘参数修订39
mknod39
e2label40
tune2fs41
#hdparm41
设定开机挂载43
各式磁盘挂载与中文编码挂载还有USB随身碟44
挂载软盘44
挂载Windows磁盘44
挂载USB随身碟45
开机挂载/etc/fstab及/etc/mtab45
特殊装置loop挂载49
建立大型档案49
格式化49
挂载50
虚拟内存之建置50
建立虚拟内存装置51
建立虚拟内存档案51
虚拟内存的限制53
本章习题练习:
53
Linux磁盘与档案系统管理
我们在前面的档案权限介绍的章节当中,提到很多的权限与属性的观念,那么接下来要了解的是,这些属性是记录在硬盘的那个地方?
这里就要特别了解到Linux档案系统(filesystem)是如何记录档案,与档案是如何被读取的啰!
而要了解整个档案系统的观念,就不能不知道硬盘的组成组件!
所以,在这个章节当中,我们由最基础的硬盘组成组件介绍起,并介绍inode与连结文件等基本知识,以及如何利用开机即可挂载的方式来使我们的各个partition可以在开机时就已经进行好挂载的动作喔!
认识EXT2档案系统
既然这个章节主要在探讨Linux的磁盘档案系统,所以我们当然就需要先来了解一下硬盘是个什么东西啦!
首先,我们就来看一看硬盘的物理组成,了解了物理组成之后,再来说明一下怎么样进行硬盘的分割(partition)吧!
硬盘物理组成
就硬盘的物理组件来说,硬盘其实是由许许多多的圆形硬盘盘所组成的,依据硬盘盘能够容纳的数据量,而有所谓的单碟(一块硬盘里面只有一个硬盘盘)或者是多碟(一块硬盘里面含有多个硬盘盘)的硬盘。
在这里我们以单一个硬盘盘来说明,硬盘盘可由底下的图形来示意:
图二、磁柱示意图
图一、硬盘盘示意图
首先,硬盘里面一定会有所谓的磁头(Head)在进行该硬盘盘上面的读写动作,而磁头是固定在机械手臂上面的,机械手臂上有多个磁头可以进行读取的动作。
而当磁头固定不动(假设机械手臂不动),硬盘盘转一圈所画出来的圆就是所谓的磁道(Track);而如同我们前面刚刚提到的,一块硬盘里面可能具有多个硬盘盘,所有硬盘盘上面相同半径的那一个磁道就组成了所谓的磁柱(Cylinder)。
例如上图二所示意,在两个硬盘盘上面的同一个磁道就是一个磁柱啦!
这个磁柱也是磁盘分割(partition)时的最小单位了;另外,由圆心向外划直线,则可将磁道再细分为一个一个的扇区(Sector),这个扇区就是硬盘盘上面的最小储存物理量了!
通常一个sector的大小约为512Bytes。
以上就是整个硬盘的基本组件。
在计算整个硬盘的储存量时,简单的计算公式就是:
CylinderxHeadxSectorx512Bytes。
另外,硬盘在读取时,主要是『硬盘盘会转动,利用机械手臂将磁头移动到正确的数据位置(单方向的前后移动),然后将数据依序读出。
』在这个操作的过程当中,由于机械手臂上的磁头与硬盘盘的接触是很细微的空间,如果有抖动或者是脏污在磁头与硬盘盘之间时,就会造成数据的损毁或者是实体硬盘整个损毁~
因此,正确的使用计算机的方式,应该是在计算机通电之后,就绝对不要移动主机,并免抖动到硬盘,而导致整个硬盘数据发生问题啊!
另外,也不要随便将插头拔掉就以为是顺利关机!
因为机械手臂必须要归回原位,所以使用操作系统的正常关机方式,才能够有比较好的硬盘保养啊!
因为他会让硬盘的机械手臂归回原位啊!
磁盘分割(Partition)
在了解了硬盘的物理组件之后,再接着下来介绍的就是硬盘的分割(Partition)啰!
为什么要进行硬盘分割啊?
!
因为我们必须要告诉操作系统:
『我这块硬盘可以存取的区域是由A磁柱到B磁柱』,如此一来,操作系统才能够控制硬盘磁头去A-B范围内的磁柱存取数据;如果没有告诉操作系统这个信息,那么操作系统就无法利用我们的硬盘来进行数据的存取了,因为操作系统将无法知道他要去哪里读取数据啊!
这就是磁盘分割(Partition)的重点了:
也就是记录每一个分割区(Partition)的起始与结束磁柱!
好了,那么这个分割区的起始与结束磁柱的数据放在哪里呢?
!
那就是我们在Linux安装与多重开机技巧那个章节提到的主要开机扇区(MasterBootRecorder,MBR)啰!
事实上,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的话,那么剩下的空间就还能再分割两个primarypartition!
档案系统
在告知系统我的partition所在的起始与结束磁柱之后,再来则是需要将partition格式化为『我的操作系统认识的档案系统(Filesystem)』啰!
因为每个操作系统认识的filesystem并不相同!
例如Windows操作系统在预设状态下就无法认识Linux的档案系统(这里指Linux的标准档案系统ext2)。
所以当然要针对我们的操作系统来格式化partition啰!
我们可以说,每一个partition就是一个Filesystem,那么一个partition是否可以具有两个Filesystem呢?
!
理论上应该是不行的!
因为每个档案系统都有其独特的支持方式,例如Linux的ext3就无法被Windows系统所读取!
而你将一个partition格式化的时候,总不能格式化为ext3也同时格式化为fat32吧?
!
那是不可能的啊!
不论是哪一种filesystem,数据总是需要储存的吧!
既然硬盘是用来储存数据的,想当然尔,数据就必须写入硬盘啦!
刚刚我们提到硬盘的最小储存单位是sector,不过数据所储存的最小单位并不是sector喔,因为用sector来储存太没有效率了。
怎么说呢?
因为一个sector只有512Bytes,而磁头是一个一个sector的读取,也就是说,如果我的档案有10MBytes,那么为了读这个档案,我的磁头必须要进行读取(I/O)20480次!
为了克服这个效率上的困扰,所以就有逻辑区块(Block)的产生了!
逻辑区块是在partition进行filesystem的格式化时,所指定的『最小储存单位』,这个最小储存单位当然是架构在sector的大小上面(因为sector为硬盘的最小物理储存单位啊!
),所以啦,Block的大小为sector的2的次方倍数。
此时,磁头一次可以读取一个block,如果假设我们在格式化的时候,指定Block为4KBytes(亦即由连续的八个sector所构成一个block),那么同样一个10MBytes的档案,磁头要读取的次数则大幅降为2560次,这个时候可就大大的增加档案的读取效能啦!
不过,Block单位的规划并不是越大越好喔!
怎么说呢?
因为一个Block最多仅能容纳一个档案(这里指Linux的ext2档案系统)!
这有什么问题呢?
举例来说好了,假如您的Block规划为4KBytes,而您有一个档案大小为0.1KBytes,这个小档案将占用掉一个Block的空间,也就是说,该Block虽然可以容纳4Kbytes的容量,然而由于档案只占用了0.1Kbytes,所以,实际上剩下的3.9KBytes是不能再被使用了,所以,在考虑Block的规划时,需要同时考虑到:
*档案读取的效能
*档案大小可能造成的硬盘空间浪费
因此,在规划您的磁盘时,需要留意到您主机的用途来进行规划较佳!
例如BBS主机由于文章较短,也就是说档案较小,那么Block小一点的好;而如果您的主机主要用在储存大容量的档案,那么考虑到效能,当然Block理论上,规划的大一点会比较妥当啦!
Superblock:
如同前面说的,当我们在进行磁盘分割(partition)时,每个磁盘分割槽(partition)就是一个档案系统(filesystem),而每个档案系统开始的位置的那个block就称为superblock,superblock的作用是储存像是档案系统的大小、空的和填满的区块,以及他各自的总数和其它诸如此类的信息等等,这也就是说,当您要使用这一个磁盘分割槽(或者说是档案系统)来进行数据存取的时候,第一个要经过的就是superblock这个区块了,所以啰,superblock坏了,您的这个磁盘槽大概也就回天乏术了!
Linux的EXT2档案系统(inode)
看完了上面的说明,您应该对于硬盘有一定程度的认识了!
好了,那么接下来就是要谈一谈Linux的档案系统(Filesystem)啰!
我们这里以Linux最标准的ext2这个档案系统来作为说明。
还记得我们在Linux档案属性与目录配置那个章节提到的,在Linux系统当中,每个档案不止有档案的内容数据,还包括档案的种种属性,例如:
所属群组、所属使用者、能否执行、档案建立时间、档案特殊属性等等。
由于Linux操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性,所以具有多样化的档案属性是在所难免的!
在标准的ext2档案系统当中,我们将每个档案的内容分为两个部分来储存,一个是档案的属性,另一个则是档案的内容。
为了应付这两个不同的咚咚,所以ext2规划出inode与Block来分别储存档案的属性(放在inode当中)与档案的内容(放置在Blockarea当中)。
当我们要将一个partition格式化(format)为ext2时,就必须要指定inode与Block的大小才行,也就是说,当partition被格式化为ext2的档案系统时,他一定会有inodetable与blockarea这两个区域。
Block已经在前面说过了,他是数据储存的最小单位。
那么inode是什么?
!
简单的说,Block是记录『档案内容数据』的区域,至于inode则是记录『该档案的相关属性,以及档案内容放置在哪一个Block之内』的信息。
简单的说,inode除了记录档案的属性外,同时还必须要具有指向(pointer)的功能,亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容啊!
底下几个是inode记录的信息(当然不止这些):
*该档案的拥有者与群组(owner/group);
*该档案的存取模式(read/write/excute);
*该档案的类型(type);
*该档案建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime);
*该档案的容量;
*定义档案特性的旗标(flag),如SetUID...;
*该档案真正内容的指向(pointer);
我们在前一章Linux档案与目录管理当中提到过利用ls查询档案所记载的时间,就是atime/ctime/mtime三种时间。
这三种时间的意义我们已经在前一章的touch指令介绍时提过,这三种时间就是记录在inode里面的啦~如果回到前一章,您会发现,我们可以利用ls的相关功能来查询到时间喔!
而预设的显示时间是mtime。
[root@linux~]#ls-la--time=atimePATH
那个PATH是您所想要查询的档案或目录名称。
利用上面的ls相关参数,就可以取得您想要知道的档案相关的三种时间啰~至于一个inode的大小为128bytes这么大(可以使用底下要介绍的dumpe2fs来查阅inode的大小喔!
)!
好了,那么我的Linux系统到底是如何读取一个档案的内容呢?
底下我们分别针对目录与档案来说明:
*目录:
当我们在Linux下的ext2档案系统建立一个目录时,ext2会分配一个inode与至少一块Block给该目录。
其中,inode记录该目录的相关属性,并指向分配到的那块Block;而Block则是记录在这个目录下的相关连的档案(或目录)的关连性!
*档案:
当我们在Linux下的ext2建立一个一般档案时,ext2会分配至少一个inode与相对于该档案大小的Block数量给该档案。
例如:
假设我的一个Block为4Kbytes,而我要建立一个100KBytes的档案,那么linux将分配一个inode与25个Block来储存该档案!
要注意的是,inode本身并不纪录文件名,而是记录档案的相关属性,至于文件名则是记录在目录所属的block区域!
那么档案与目录的关系又是如何呢?
就如同上面的目录提到的,档案的相关连结会记录在目录的block数据区域,所以当我们要读取一个档案的内容时,我们的Linux会先由根目录/取得该档案的上层目录所在inode,再由该目录所记录的档案关连性(在该目录所属的block区域)取得该档案的inode,最后在经由inode内提供的block指向,而取得最终的档案内容。
我们以/etc/crontab这个档案的读取为例,他的内容数据是这样取得的:
图三、读取/etc/crontab的简易流程示意。
一块partition在ext2底下会被格式化为inodetable与blockarea两个区域,所以在图三里面,我们将partition以长条的方式来示意,会比较容易理解的啦!
而读取/etc/crontab的流程为:
1.操作系统根据根目录(/)的相关资料可取得/etc这个目录所在的inode,并前往读取/etc这个目录的所有相关属性;
2.根据/etc的inode的资料,可以取得/etc这个目录底下所有档案的关连数据是放置在哪一个Block当中,并前往该block读取档案的关连性内容;
3.由上个步骤的Block当中,可以知道crontab这个档案的inode所在地,并前往该inode;
4.由上个步骤的inode当中,可以取得crontab这个档案的所有属性,并且可前往由inode所指向的Block区域,顺利的取得crontab的档案内容。
整个读取的流程大致上就是这样,如果您想要实作一下以了解整个流程的话,可以这样试做看看:
1.察看一下根目录所记载的所有档案关连性数据
[root@linux~]#ls-lia/
2drwxr-xr-x24rootroot4096Jul1623:
45.
2drwxr-xr-x24rootroot4096Jul1623:
45..
719489drwxr-xr-x83rootroot12288Jul2104:
02etc
523265drwxr-xr-x24rootroot4096Jun2520:
16var
#注意看一下,在上面的.与..都是连结到inode号码为2的那个inode,
#也就是说,/与其上层目录..都是指向同一个inodenumber啊!
两者是相同的。
#而在根目录所记载的档案关连性(在block内)得到/etc的inodenumber
#为719489那个inodenumber喔!
2.察看一下/etc/内的档案关连性的数据
[root@linux~]#ls-liad/etc/crontab/etc/.
719489drwxr-xr-x83rootroot12288Jul2104:
02/etc/.
723496-rw-r--r--1rootroot663Jul412:
03/etc/crontab
#瞧!
此时就能够将/etc/crontab找到关连性啰!
所以您知道,目录的最大功能就是在提供档案的关连性,在关连性里面,当然最主要的就是『档名与inode的对应数据』啰!
另外,关于EXT2档案系统,这里有几点小事情要提醒一下:
*ext2与ext3档案在建立时(format)就已经设定好固定的inode数与block数目了;
*格式化Linux的ext2档案系统,可以使用mke2fs这个程序来执行!
*ext2允许的blocksize为1024,2048及4096bytes;
*一个partition(filesystem)所能容许的最大档案数,与inode的数量有关,因为一个档案至少要占用一个inode啊!
*在目录底下的档案数如果太多而导致一个Block无法容纳的下所有的关连性数据时,Linux会给予该目录多一个Block来继续记录关连数据;
*通常inode数量的多寡设定为(partition的容量)除以(一个inode预计想要控制的容量)。
举例来说,若我的block规划为4Kbytes,假设我的一个inode会控制两个block,亦即是假设我的一个档案大致的容量在8Kbytes左右时,假设我的这个partition容量为1GBytes,则inode数量共有:
(1G*1024M/G*1024K/M)/(8K)=131072个。
而一个inode占用128bytes的空间,因此格式化时就会有(131072个*128bytes/个)=16777216byes=16384Kbytes的inodetable。
也就是说,这一个1GB的partition在还没有储存任何数据前,就已经少了16MBytes的容量啊!
*因为一个inode只能记录一个档案的属性,所以inode数量比block多是没有意义的!
举上面的例子来说,我的Block规划为4Kbytes,所以1GB大概就有262144个4Kbytes的block,如果一个block对应一个inode的话,那么当我的inode数量大于262144时,多的inode将没有任何用处,徒然浪费硬盘的空间而已!
另外一层想法,如果我的档案容量都很大,那么一个档案占用一个inode以及数个block,当然inode数量就可以规划的少很多啦!
*当block大小越小,而inode数量越多,则可利用的空间越多,但是大档案写入的效率较差;这种情况适合档案数量多,但是档案容量小的系统,例如BBS或者是新闻群组(News)这方面服务的系统;
*当Block大小越大,而inode数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间较多;这种状况则比较适合档案容量较大的系统!
简单的归纳一下,ext2有几个特色:
*Blocks与inodes在一开始格式化时(format)就已经固定了;
*一个partition能够容纳的档案数与inode有关;
*一般来说,每4Kbytes的硬盘空间分配一个inode;
*一个inode的大小为128bytes;
*Block为固定大小,目前支持1024/2048/4096bytes等;
*Block越大,则损耗的硬盘空间也越多。
*关于单一档案:
若blocksize=1024,最大容量为16GB,若blocksize=4096,容量最大为2TB;
*关于整个partition:
若blocksize=1024,则容量达2TB,若blocksize=4096,则容量达32TB。
*文件名最长达255字符,完整文件名长达4096字符。
另外,关于partition的使用效率上,当您的一个partition规划的很大时,例如100GB这么大,由于硬盘上面的数据总是来来去去的,所以,整个partition上面的档案通常无法连续写在一起,而是填入式的将数据填入没有被使用的block当中。
如果档案写入的b