Linux 磁盘与文件系统管理.docx
《Linux 磁盘与文件系统管理.docx》由会员分享,可在线阅读,更多相关《Linux 磁盘与文件系统管理.docx(18页珍藏版)》请在冰豆网上搜索。
Linux磁盘与文件系统管理
Linux磁盘与文件系统管理
磁盘分割(Partition):
在了解了硬盘的物理组件之后,再接着下来介绍的就是硬盘的分割(Partition)!
为什么要进行硬盘分割?
因为我们必须要告诉操作系统:
『我这块硬盘可以存取的区域是由A磁柱到B磁柱』,如此一来,操作系统才能够控制硬盘磁头去A-B范围内的磁柱存取数据;这就是磁盘分割(Partition)的重点了:
也就是记录每一个分割区(Partition)的起始与结束磁柱!
文件系统:
在告知系统我的partition所在的起始与结束磁柱之后,再来则是需要将partition格式化为『我的操作系统认识的文件系统(Filesystem)』!
不论是哪一种文件系统,数据总是需要储存的!
既然硬盘是用来储存数据的,想当然数据就必须写入硬盘!
刚刚我们提到硬盘的最小储存单位是扇区,不过数据所储存的最小单位并不是扇区,因为用扇区来储存太没有效率了。
怎么说呢?
因为一个扇区只有512Bytes,而磁头是一个一个扇区的读取,也就是说,如果我的文件有10MBytes,那么为了读这个文件,我的磁头必须要进行读取(I/O)20480次!
为了克服这个效率上的困扰,所以就有逻辑区块(Block)的产生了!
逻辑区块是在硬盘分割进行硬盘的分割的格式化时,所指定的『最小储存单位』,这个最小储存单位当然是架构在扇区的大小上面(因为扇区为硬盘的最小物理储存单位啊!
),所以,逻辑区块Block的大小为扇区的2的次方倍数。
此时,磁头一次可以读取一个block,如果假设我们在格式化的时候,指定一个逻辑区块(Block)为4KBytes(亦即由连续的八个扇区所构成一个block),那么同样一个10MBytes的文件,磁头要读取的次数则大幅降为2560次,这个时候可就大大的增加文件的读取效能!
不过,逻辑区块(Block)单位的规划并不是越大越好!
怎么说呢?
因为一个Block最多仅能容纳一个文件(这里指Linux的ext2文件系统)!
这有什么问题呢?
举例来说好了,假如您的Block规划为4KBytes,而您有一个文件大小为0.1KBytes,这个小文件将占用掉一个Block的空间,也就是说,该Block虽然可以容纳4Kbytes的容量,然而由于文件只占用了0.1Kbytes,所以,实际上剩下的3.9KBytes是不能再被使用了,所以,在考虑Block的规划时,需要同时考虑到:
∙文件读取的效能
∙文件大小可能造成的硬盘空间浪费
Linux的EXT2文件系统(inode):
inode译成中文就是索引节点,它用来存放档案及目录的基本信息,包含时间、档名、使用者及群组等
∙在Linux系统当中,每个文件不止有文件的内容数据,还包括文件的种种属性,例如:
所属群组、所属使用者、能否执行、文件建立时间、文件特殊属性等等。
由于Linux操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性,所以具有多样化的文件属性是在所难免的!
在标准的ext2文件系统当中,我们将每个文件的内容分为两个部分来储存,一个是文件的属性,另一个则是文件的内容。
为了应付这两个不同的,所以ext2规划出inode与Block来分别储存文件的属性(放在节点inode当中)与文件的内容(放置在Blockarea当中)。
当我们要将一个partition格式化(format)为ext2时,就必须要指定inode与Block的大小才行,也就是说,当partition被格式化为ext2的文件系统时,他一定会有inodetable与blockarea这两个区域。
底下我们分别针对目录与文件来说明:
∙目录:
当我们在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指向,而取得最终的文件内容。
挂载点的意义(mountpoint):
我们上面提到的都是关于文件系统(filesystem),但是要能够让我们的Linux使用的话,非得『挂载(mount)』上我们的Linux系统才行,
举例来说,,我们将硬盘分割为几大部分,同时主要将/与/home设定为两个partition的挂载点。
假设/是接在/dev/hda1,而/home是接在/dev/hda2上面,那么,也就是说,在/home底下的所有次目录,使用的都是/dev/hda2那个partition的资料!
而非/home的则都是使用/dev/hda1的数据!
请注意,挂载点一定是『目录』而不是文件!
也就是说,这个挂载点就是进入该filesystem的入口!
磁盘与目录的容量:
在文字接口底下有什么方法可以查看目前的磁盘最大容量、已经使用掉的容量、目前所在目录的已使用容量?
还有还有,怎么知道目前目录底下使用掉的硬盘容量呢?
以及如何查询目前的inodes数目?
底下我们就来谈一谈主要的两个指令:
df
[root@linux~]#df[-ahikHTm][目录或文件名]
参数:
-a:
列出所有的文件系统,包括系统特有的/proc等文件系统;
-k:
以KBytes的容量显示各文件系统;
-m:
以MBytes的容量显示各文件系统;
-h:
以人们较易阅读的GBytes,MBytes,KBytes等格式自行显示;
-H:
以M=1000K取代M=1024K的进位方式;
-T:
连同该partition的filesystem名称(例如ext3)也列出;
-i:
不用硬盘容量,而以inode的数量来显示
范例:
范例一:
将系统内所有的partition列出来!
[root@linux~]#df
Filesystem1K-blocksUsedAvailableUse%Mountedon
/dev/hda159522523012332263268054%/
/dev/shm19283601928360%/dev/shm
/dev/hda5949264422160487810603%/home
#特别注意,在Linux(FC4)底下,如果df没有加任何参数,那么预设会将系统内所有的(不含特殊内存内的文件系统与swap)都以Kbytes的容量来列出来!
至于那个/dev/shm是与内存有关的挂载,先不要理他!
范例二:
将容量结果以易读的容量格式显示出来
[root@linux~]#df-h
FilesystemSizeUsedAvailUse%Mountedon
/dev/hda15.7G2.9G2.6G54%/
/dev/shm189M0189M0%/dev/shm
/dev/hda59.1G217M8.4G3%/home
#不同于范例一,这里会以G/M等容量格式显示出来,比较容易看!
范例三:
将/etc底下的可用的磁盘容量以易读的容量格式显示
[root@linux~]#df-h/etc
FilesystemSizeUsedAvailUse%Mountedon
/dev/hda15.7G2.9G2.6G54%/
#这个范例比较有趣一点,在df后面加上目录或者是文件时,df会自动的分析该目录或文件所在的partition,并将该partition的容量显示出来,所以,您就可以知道某个目录底下还有多少容量可以使用了!
^_^
范例五:
将目前各个partition当中可用的inode数量列出
[root@linux~]#df-ih
FilesystemInodesIUsedIFreeIUse%Mountedon
/dev/hda11.5M141K1.4M10%/
/dev/shm48K148K1%/dev/shm
/dev/hda52.4M672.4M1%/home
du
[root@linux~]#du[-ahskm]文件或目录名称
参数:
-a:
列出所有的文件与目录容量,因为预设仅统计目录底下的文件量而已。
-h:
以人们较易读的容量格式(G/M)显示;
-s:
列出总量而已,而不列出每个各别的目录占用容量;
-k:
以KBytes列出容量显示;
-m:
以MBytes列出容量显示;
范例:
范例一:
列出目前目录下的所有文件容量
[root@linux~]#du
[root@vbird~]#du
16./.gnome2
16./.ssh
.......中间省略........
292.
#直接输入du没有加任何参数时,则du会分析『目前所在目录』的文件与目录所占用的硬盘空间。
但是,实际显示时,仅会显示目录容量,但我的.目录有很多文件没有被列出来,所以,全部的目录相加不会等于.的容量!
范例二:
同范例一,但是将文件的容量也列出来
[root@linux~]#du-a
12./install.log.syslog
16./.gnome2
16./.ssh
76./install.log
16./.bash_history
4./.bashrc
.......中间省略........
292.
#加上这个-a参数后,就会将目录底下的文件也一起列示出来,
#而不是仅列出文件信息而已!
注意~^_^
磁盘分割:
fdisk
[root@linux~]#fdisk[-l]装置名称
参数:
-l:
输出后面接的装置所有的partition内容。
若仅有fdisk-l时,
则系统将会把整个系统内能够搜寻到的装置的partition均列出来。
范例:
范例:
查阅您的第一颗硬盘内的相关信息
[root@linux~]#fdisk/dev/hda<==仔细看,不要加上数字!
Thenumberofcylindersforthisdiskissetto2494.
Thereisnothingwrongwiththat,butthisislargerthan1024,
andcouldincertainsetupscauseproblemswith:
1)softwarethatrunsatboottime(e.g.,oldversionsofLILO)
2)bootingandpartitioningsoftwarefromotherOSs
(e.g.,DOSFDISK,OS/2FDISK)
#在你进入fdisk这支程序的工作画面后,如果您的硬盘太大的话,就会出现如上讯息。
这个讯息仅是在告知你,因为某些旧版的软件与操作系统并无法支持大于1024磁柱(cylinter)后的扇区使用,不过我们Linux是没问题!
Command(mforhelp):
m<==输入m后,就会看到底下这些指令介绍
Commandaction
atoggleabootableflag
beditbsddisklabel
ctogglethedoscompatibilityflag
ddeleteapartition
llistknownpartitiontypes
mprintthismenu
naddanewpartition
ocreateanewemptyDOSpartitiontable
pprintthepartitiontable
qquitwithoutsavingchanges
screateanewemptySundisklabel
tchangeapartition'ssystemid
uchangedisplay/entryunits
vverifythepartitiontable
wwritetabletodiskandexit
xextrafunctionality(expertsonly)
#这里注意一下,使用fdisk这支程序是完全不需要背指令的,因为按下m之后立刻就会有一堆指令说明跑出来了!
在上面的指令当中,比较重要的有:
#d删除一个磁盘分割槽、n新增一个磁盘分割槽、p将目前的磁盘分割槽列出来、q不储存离开!
这个重要!
w写入磁盘分割表后离开!
这个危险!
Command(mforhelp):
p<==这里可以输出目前磁盘的状态
Disk/dev/hda:
20.5GB,20520493056bytes<==硬盘的信息在这底下三行
255heads(磁面),63扇区s/track,2494cylinders(磁柱)
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*1765614483183Linux
/dev/hda27661147306841583Linux
/dev/hda3114812741020127+82Linuxswap
/dev/hda41275249497996505Extended
/dev/hda5127524949799618+83Linux
#由上面的信息,您可以知道,我的硬盘是20GB的,而Head/扇区/Cylinder
#的数量为255/63/2494,另外,可以看到上头的Boot吗?
那个地方代表有开机信息的partition!
另外,那个start与end则是指每一个partition的开始与结束的Cylinder(磁柱)号码!
#此外,上头显示的那个Id为主要文件格式的代号,你可以按下l(L的小写)就可以知道我们linux的fdisk认识多少文件系统!
至于Blocks则以KBytes来显示该partition的容量的
Command(mforhelp):
q
#想要不储存离开吗?
按下q就对了!
不要随便按w啊!
范例:
查阅目前系统内的所有partition有哪些?
[root@linux~]#fdisk-l
Disk/dev/hda:
20.5GB,20520493056bytes
255heads,63扇区s/track,2494cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hda1*1765614483183Linux
/dev/hda27661147306841583Linux
/dev/hda3114812741020127+82Linuxswap
/dev/hda41275249497996505Extended
/dev/hda5127524949799618+83Linux
Disk/dev/hdb:
30.7GB,30735581184bytes
255heads,63扇区s/track,3736cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hdb1*136332918204183Linux
#由于我的这个系统有两颗硬盘,下达fdisk-l的话,所有的partition都看到了!
另外,我可以确定我的/dev/hdb还有剩余空间!
因为由上面的信息看来,
#我的/dev/hdb的磁柱应该可以到3736,但是目前只用到3633,所以,
#就肯定还有剩余空间拉!
等一下我们就用这个来测试!
这个fdisk只有root才能执行,我们知道可以利用fdisk来查阅硬盘的partition信息外,底下再来说一说进入fdisk之后的几个常做的工作!
Tips:
你可以使用fdisk在您的硬盘上面胡搞瞎搞的进行实际操作,都不打紧,但是请『万记住,不要按下w即可!
』离开的时候按下q就万事无妨!
删除磁盘分割槽
刚刚的fdisk结果当中,我知道我的/dev/hdb仅有/dev/hdb1而已,那么假设我要将这个/dev/hdb1删除的话,可以怎么做?
1.fdisk/dev/hdb:
先进入fdisk画面;
2.p:
先看一下扇区的信息,假设要杀掉/dev/hdb1;
3.d:
这个时候会要你选择一个partition,就选1!
4.w(or)q:
按w可储存到磁盘数据表中,并离开fdisk;当然,如果你反悔了,呵呵,直接按下q就可以取消刚刚的删除动作了!
[root@linux~]#fdisk/dev/hdb
1.先看看整个结果是如何~
Command(mforhelp):
p
Disk/dev/hdb:
30.7GB,30735581184bytes
255heads,63扇区s/track,3736cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
/dev/hdb1*136332918204183Linux
2.按下d给他删除吧!
Command(mforhelp):
d
Selectedpartition1
#因为我们这个磁盘仅有1个partition,所以系统会自动帮我们~
Command(mforhelp):
p
Disk/dev/hdb:
30.7GB,30735581184bytes
255heads,63扇区s/track,3736cylinders
Units=cylindersof16065*512=8225280bytes
DeviceBootStartEndBlocksIdSystem
#『看』不见了!
partition就这样不见了!
Command(mforhelp):
q
#这里仅是做一个练习而已,所以,按下q就能够离开~
新增磁盘分割槽
那么如何新增partition呢?
以刚刚的/dev/hdb为例,我的/dev/hdb有一个/dev/hdb1,而且还有剩余空间,那我如何利用?
1.fdisk/dev/hdb:
先进入fdisk画面中;
2.n:
新增一个扇区,这个时候系统会问你,如果您已经具有extended(扩展分区)扇区时,那么系统会问您,您要新增的是Primary(主分区)还是Logical(逻辑分区),而如果您还没有extended,那么系统仅会问你要新增(主分区)Primary还是(扩展分区)Extended。
除此之外,如果您已经用完了四个P主+E扩的话,那么就仅有(逻辑分区)Logical可以选择!
如果是选择primary的话,请按p,否则请按e(extended)或l(logical)。
3.p:
由于选择为primary所以就会按下p!
4.1-4:
primary只允许四个,所以这里请按尚未被使用的那一个扇区!
5.w:
同样的储存离开!
好了,假设想要将我刚刚的/dev/hdb剩余空间分为两个分割槽,一个是primary,另一个则是logical,且primary只要100MBytes就够了!
其它的都分给logical,那可以这么做!
[root@linux~]#fdisk/dev/hdb
Command(mforhelp):
n
Commandaction
eextended
pprimarypartition(1-4)
p<==就是这里!
可以自行决定是p还是e!
Partitionnumber(1-4):
4<==编号可以随意!
Firstcylinder(3634-3736,default3634):
<==这里按下Enter就会使用默认值
Usingdefaultvalue3634
Lastcylinderor+sizeor+sizeMor+sizeK(3634-3736,default3736):
+100M
#这个地方有趣了!
我们知道partition是由n1到n2的磁柱(cylinder),
#但是我们对于磁柱的大小不容易掌握!
这个时候可以填入+100M来让系统自动帮我们找出
#『最接近100M的那个(磁柱)cylinder号码』!
因为不可能刚好等于100MBytes!
Comman