鸟哥的linux私房菜读书笔记8

第八章:linux磁盘与文件系统管理

磁盘的物理组成:圆形的盘片,主要记录数据的部分;机械手臂与机械手臂上面的磁头,可读写盘片上的数据;主轴马达,可以转动盘片,让机械手臂的磁头在盘片上面读写数据;扇区为最小的物理存储单位,每个扇区为512字节;将扇区组成一个圆,那就是柱面,柱面是分区的最小单位;第一扇区非常重要,里面有硬盘主引导记录及分区表,其中主引导记录MBR占有446字节,分区表占有64字节;/dev/sd[a-p][1-25]为SCSI,SATA,USB,Flash等接口的磁盘文件名;/dev/hd[a-d][1-63]为IDE接口的磁盘文件名;

磁盘分区就是指定分区的起始与结束柱面就可以。分区表里仅有64字节,最多只能记录四条分区的纪录,这四条记录我们称为主分区或扩展分区,其中扩展分区还可以再分出逻辑分区,而能被格式化的仅有主要分区与逻辑分区;

分区的定义:主分区与扩展分区最多可以有四个(硬盘的限制);扩展分区最多只能有一个,操作系统的限制;逻辑分区是由扩展分区持续分出来的分区;能够被格式化后作为数据访问的分区为主要分区与逻辑分区,扩展分区无法格式化;逻辑分区的数量依操作系统而不同,在linux系统中,IDE硬盘最多有59个逻辑分区,SATA硬盘则有11个逻辑分区;

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

磁盘分区完毕后还需要进行格式化,之后操作系统才能使用这个分区,因为每种操作系统所设置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要将分区进行格式化,已成为操作系统能够利用的文件系统格式;每种操作系统能使用的文件系统并不相同。linux默认的文件系统是Ext2,windows的文件系统为早期的FAT和之后的NTFS文件系统。默认情况下windows是不会认识Ext2的;以前一个分区就只能是一种文件系统,但是现在可以将多个分区合成一个文件系统,通常我们称呼一个可被挂载的数据为一个文件系统而不是一个分区。文件数据除了文件实际内容外,还含有其他属性,例如linux中的文件权限与文件属性。文件系统通常会将这两部分的数据分别存放在不同的块中。权限与属性放置在inode中,至于实际数据则放置在data block块中。另外还有一个超级块superblock会记录整个文件系统的整体信息,包含inode与block的总量、使用量、剩余量等;这三个数据的意义简洁说明如下:

superblock:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;

inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;

block:实际记录文件的内容,若文件太大时,会占用多个block。

每个inode和block都有编号,通过inode去读取文件的数据。这种数据访问方法称为索引式文件系统。FAT是通过链表的形式去存储数据,会产生大量碎片,是的文件读取性能变差;Ext2是索引式文件系统,不太需要进行碎片整理,但是时间长了也有可能产生文件数据过于离散的问题;

ext2文件系统在格式化时基本上是区分为多个块组的,每个块组都有独立的inode/block/superblock系统。在整体规划中,文件系统最前面还有一个启动扇区,这个启动扇区可以安装引导装载程序,这样就可以将不同的引导装载程序安装到个别的文件系统最前端而不用覆盖整块硬盘的唯一的MBR,也能制作出多重引导的环境。

ext2系统的block的限制:文件系统所支持的block大小有1kb、2kb、4kb三种而已;某些应用程序采用旧的限制,不支持2GB以上的文件;原则上,block的大小与数量在格式化完就不能再改变了,除非重新格式化;每个block内最多只能够放置一个文件的数据;呈上,如果文件大于block的大小,则一个文件会占用多个block数量;承上,若文件小于block,则该block的剩余空间就不能够再被使用了,如果文件都比较小会产生大量空间浪费;如果文件都比较大,block设的比较小,inode就会记录更多的block号码,会导致文件系统不良的读写性能;所以在格式化之前,要预先想好预计使用的情况,再进行格式化;

inodetable记录的文件数据至少有:文件的访问模式;文件的所有者和组;文件的大小;文件创建或状态改变的时间;最近一次的读取时间;最近修改的时间;定义文件特性的标志;该文件真正内容的指向;

除此之外,inode还有以下特点:每个inode大小均固定在128字节;每个文件都会仅占用一个inode而已;承上,因此文件系统能够创建的文件数量与ionde的数量有关;系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容;

inode记录block的区域定义为12个直接、一个间接、一个双间接、一个三间接记录区;所以一个block的大小为1k的话,最大可以支持16GB的单一文件;

superblock是记录整个文件系统相关信息的地方,没有superblock就没有整个文件系统,它记录的信息主要有:block与inode的总量;未使用与已使用的inode/block数量;block与inode的大小(block为1K,2K,3K,inode为128个字节);文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等系统的相关信息;一个validbit的数值,若此文件系统已被挂载,则validbit为0,若未被挂载为1;

在linux系统中,每个文件(不管是一般的文件还是目录文件)都会有一个inode,且可依据文件的内容大小来分配多个block来给文件使用;

目录:在ext2中,新建一个目录,ext2会分配一个inode与至少一个block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block记录在这个目录下的文件名与该文件名占用的inode号码数据。

查看root目录内的文件所占用的inode号码可以用ls –i来处理;

文件:在ext2中,新建一个文件,ext2会分配一个inode与相对于该文件大小的block数量给该文件;

目录树的读取:inode本身并不记录文件名,文件名的纪录是在目录的block当中。因为文件名是记录在目录的block中,所以读取该文件时,必经过目录的inode与block,然后才能找到那个待读取文件的inode,最终才会读到正确的文件的block内的数据;

目录树是从根目录开始读起,因此系统通过挂载的信息可以找到挂载点的inode号码,此时就能够得到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,在一层一层往下读正确的文件名;

新建一个文件或目录时,就需要blockbitmap与inodebitmap,此时文件系统的行为是:先确定用户对该与添加文件的目录是否有w和x的权限,若有的话才能添加;根据inodebitmap找到没有使用的inode号码,并将新文件的权限/属性写入;根据blockbitmap找到没有使用的block号码,并将实际的数据写入block中,且更新inode的block指向数据;将刚才写入的inode与block数据同步更新inodebitmap与blockbitmap,并更新superblock的内容;

日志文件系统:预备,当系统写入一个文件时,会先在日志记录块中记录某个文件准备要写入的信息;实际写入,开始写入文件的权限与数据,开始更新metadata的数据;结束,完成数据与metadata的更新后,在日志记录块当中完成该文件的纪录;

在内存中编辑一个比较大的文件,需要频繁的写入磁盘,降低效率;linux通过异步处理来解决:当内存中加载一个文件时,如果该文件没有改动,则在内存段的文件数据会被设置为clean。但如果内存中文件数据被更改过,此时该内存中的数据会被设置为dirty。此时的所有操作都在内存中,并没有写入磁盘,系统会不定期将内存中设置为dirty的数据写回到磁盘,以保持磁盘与内存数据的一致性;

系统会将常用的文件数据放置在主存储器的缓冲区,以加速文件系统的读写;承上,新词linux的物理内存最后都会被用光,这是正常的情况,可加速系统性能;可以手动使用sync来强迫内存中设置为dirty的文件回写到磁盘中;若正常关机,系统会自动调用sync来将内存的数据回写入磁盘内;但若不正常关机,由于数据尚未回写到磁盘内,因此重新启动后可能会花很多时间再进行磁盘检验,甚至可能导致文件系统的损坏;

挂载点一定是目录,该目录为进入该文件系统的入口;

除了ext2和加入日止功能的ext3,linux支持其他一些文件系统,linux系统通过一个虚拟文件系统VFS的内核功能去读取文件系统。

磁盘与目录的容量命令:

df列出文件系统的整体磁盘使用量;-a列出所有的文件系统,包括系统特有的/proc等文件系统;-k以kb的容量显示各文件系统;-m以mb的容量显示各文件系统;-h以人们较易阅读的GB、MB、KB等格式自行显示;-H以M=1000K替代M=1024的进位方式;-T连同该分区的文件系统名称列出;-i不用硬盘容量,而以inode的数量来显示;

du评估文件系统的磁盘使用量,常用于评估目录所占容量;-a列出所有的文件与目录容量,因为默认仅统计目录下面的文件量而已;-h以人们较易读的容量格式显示;-s列出总量而已,而不列出每个个别的目录占用容量;-S不包括子目录下的总计,与-s有点区别;-k以KB列出容量显示;-m以MB列出容量显示;

连接文件ln分两种,一种是类似windows的快捷方式功能的文件,可以让你快速连接到目标文件或目录;另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬链接;

hardlink硬连接:每个文件都会有一个inode,文件内容由inode的记录来指向;想要读取该文件,必须经过目录记录的文件名来指向正确的inode号码才能读取;文件名只与目录有关,但文件内容则与inode有关。当多个文件名指向同一个inode号码时,就是硬连接;硬连接只是在某个目录下新建了一个文件名连接到某个inode号码的关联记录而已;如果将任何一个文件名删除,其实inode与block都还是存在的。此时可以通过另一个文件名来读取到正确的文件数据;使用硬连接设置连接文件时,磁盘空间与inode的数目都不会改变,只是在某个目录下的block多写入一个关联数据而已;硬连接有限制:不能跨文件系统;不能连接到目录;

symbolic link符号连接,也就是快捷方式:就是创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名;两个文件会指向两个不同的inode号码,当然就是两个独立的文件;链接文件的重要内容就是它会写上目标文件的文件名;

看起来似乎硬连接比较可靠,但是硬连接没法连接目录,所以在用途上比较受限;软连接如果目标文件删除就无法读取;

ln [-sf] 源文件 目标文件;参数:如果不加任何参数就进行连接,那就是硬连接,加上s就是软连接;-f如果目标文件存在时,就主动将目标文件直接删除后在创建。

新增一块硬盘时需要做的是:对硬盘进行分区,以新建可用的分区;对该分区进行格式化,以创建系统可用的文件系统;若想要仔细一点,则可对刚才新建好的系统进行检验;在linux系统上,需要创建挂载点(也即是目录),并将它挂载上来;

磁盘分区命令fdisk;只有root才能执行;退出时不按w就不会保存,按q退出;

1-4号尚有剩余,且系统未有扩展分区;此时会出现让你挑选primary/extended的选项,让你指定1~4的号码;

1-4尚有剩余,且系统有扩展分区;此时会出现让你挑选primary/logical的选项,若悬p还需制定1~4的号码;若选l则不需设置号码,系统自动设定;

1-4没有剩余,且系统有扩展分区;不会选分区类型,直接进入logical的分区形式;

fdisk无法处理大于2TB的磁盘分区;

挂载的意义是挂载点是目录,而这个目录是进入磁盘分区的入口就是了;挂载前需要明确:单一文件系统不应该被重复挂载在不同的挂载点;单一目录不应该重复挂载多个文件系统;作为挂载点的目录理论上应该都是空目录才是。

如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时消失;等到新分区被卸载之后,原来的文件都会显示出来;

系统挂载的一些限制:根目录是必须挂载的,而且一定要先于其他mount point被挂载进来;其他挂载点必须为以新建的目录,可任意指定,但一定要遵守必须的系统目录架构原则;所有挂载点在同一时间内,只能挂载一次;所有分区在同一时间之内,只能挂载一次;如若进行卸载,你必须先将工作目录一到挂载点之外;

安装时一定需要的两个分区:一个是根目录;另外一个就是swap(内存交换空间);swap的功能就是在应付物理内存不足的情况下所造成的内存扩展记录的功能;

swap在被构建时是有限制的:在内核2.4.10版本以后,单一swap已经没有2GB的限制了;但是,最多还是仅能创建32个swap;而且,由于目前x86-64最大内存寻址64GB,因此,swap总量最大也是仅能达到64GB就是了;

重点回顾:

基本上linux最重要的文件系统为ext2,该文件系统内的信息主要有:superblock,记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息;inode,记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;block,世纪记录文件的内容,若文件太大时,会占用多个block;

ext2文件系统的数据访问为索引式文件系统;

需要碎片整理的原因是文件写入block太过于松散,此时文件读取的性能将会变得很差所致。这个时候可以通过碎片整理将同一个文件所属的block汇集在一起;

ext2文件系统主要有bootsector,superblock,inodebitmap,blockbitmap,inodetable,datablock等六大部分;

datablock是用来放置文件内容数据的地方,在ext2文件系统中所支持的block大小有1KB,2KB,4KB三种而已;

inode记录文件的属性/权限等数据,每个inode大小均固定为128字节;每个文件都会仅占用一个inode而已;因此文件系统能够新建的文件数量与inode的数量有关;

文件的block记录文件的实际数据,目录的block则记录该目录下面文件名与inode号码的对照表;

日志文件系统会多出一块记录区,随时记载文件系统的主要活动,可加快系统恢复时间;

linux文件系统为了增加性能,会让主存储器作为大量的磁盘高速缓存。

实际连接只是多一个文件名对该inode号码的连接而已;

符号链接就类似于windows的快捷方式功能;

磁盘的使用必须经过分区、格式化与挂载,分别惯用的命令fdisk、mkfs和mount;

开机自动挂载可参考/etc/fstab的设置,设置完毕后务必使用mount–a测试语法正确;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章