您好,欢迎访问三七文档
第5章Linux内核简介文件系统为什么要进行分区格式化?因为各种操作系统都必须按照一定的方式来管理磁盘,而只有格式化才能使磁盘的结构能被操作系统认识。因为每种操作系统所配置的文件属性/权限并不相同,为了存放这些文件所需的数据,因此就需要分区进行格式化,以成为操作系统能够利用的文件系统格式(filesystem)。文件系统是如何运行的呢?这与操作系统的文件数据有关。较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如Linux操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到datablock区块中。另外,还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。每个inode与block都有编号,至于这三个数据的意义可以简略说明如下:superblock:记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;block:实际记录文件的内容,若文件太大时,会占用多个block。我们将inode与block区块用图解来说明一下,文件系统先格式化出inode与block的区块,假设某一个文件的属性与权限数据是放置到inode4号,而这个inode记录了文件数据的实际放置点为2,7,13,15这四个block号码,操作系统就能够据此来排列磁盘的阅读顺序,可以将四个block内容读出来!这种数据存取的方法我们称为索引式文件系统(indexedallocation)。我们以闪存常用的FAT格式为例做对比。FAT这种格式每个block号码都记录在前一个block当中,他的读取方式如下图所示:Linux的EXT2文件系统inode的内容在记录文件的权限与相关属性,至于block区块则是在记录文件的实际内容。Ext2文件系统在格式化的时候基本上是区分为多个区块群组(blockgroup)的,每个区块群组都有独立的inode/block/superblock系统。datablock(数据区块)datablock是用来放置文件内容数据地方,在Ext2文件系统中所支持的block大小有1K,2K及4K三种而已。在格式化时block的大小就固定了,且每个block都有编号,以方便inode的记录。Block大小1KB2KB4KB最大单一文件限制16GB256GB2TB最大文件系统总容量2TB8TB16TBExt2文件系统的block基本限制如下:原则上,block的大小与数量在格式化完就不能够再改变了(除非重新格式化);每个block内最多只能够放置一个文件的数据;如果文件大于block的大小,则一个文件会占用多个block数量;若文件小于block,则该block的剩余容量就不能够再被使用了(磁盘空间会浪费)。例题:假设你的Ext2文件系统使用4Kblock,而该文件系统中有10000个小文件,每个文件大小均为50bytes,请问此时你的磁盘浪费多少容量?答:每个block会浪费4096-50=4046(byte),所有文件容量为:50(bytes)x10000=488.3Kbytes,浪费的容量为:4046(bytes)x10000=38.6MBytes。inodeinode的内容是记录文件的属性以及该文件实际数据是放置在哪几号block内!inode记录的文件数据至少以下这些:该文件的存取模式(read/write/excute);该文件的拥有者与群组(owner/group);该文件的容量;该文件创建或状态改变的时间(ctime);最近一次的读取时间(atime);最近修改的时间(mtime);定义文件特性的旗标(flag),如SetUID...;该文件真正内容的指向(pointer);inode的数量与大小也是在格式化时就已经固定了,除此之外inode还有些什么特点呢?每个inode大小均固定为128bytes;每个文件都仅会占用一个inode;文件系统能够创建的文件数量与inode的数量有关;系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。多重索引结构Superblock(超级区块)Superblock是记录整个filesystem相关信息的地方,没有Superblock,就没有这个filesystem了。他记录的信息主要有:block与inode的总量;未使用与已使用的inode/block数量;block与inode的大小(block为1,2,4K,inode为128bytes);filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息;一个validbit数值,若此文件系统已被挂载,则validbit为0,若未被挂载,则validbit为1。FilesystemDescription(块组描述符)这个区段可以描述每个blockgroup的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,datablock)分别介于哪一个block号码之间。blockbitmap(区块对照表)从blockbitmap当中可以知道哪些block是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件。删除某些文件时,那么那些文件原本占用的block号码就得要释放出来,此时在blockbitmap当中相对应到该block号码的标志就得要修改成为未使用中!这就是bitmap的功能。inodebitmap(inode对照表)inodebitmap则是记录使用与未使用的inode号码df指令格式:df[选项][文件]功能:显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。参数:-a全部文件系统列表-h方便阅读方式显示-i显示inode信息-k区块为1024字节-l只显示本地文件系统-T文件系统类型范例:找出我的根目录磁盘文件名,并观察文件系统的相关信息[root@~]#df==这个命令可以叫出目前挂载的装置Filesystem1K-blocksUsedAvailableUse%Mountedon/dev/hdc299206243822848558570841%//dev/hdc3495631614137645591084%/home/dev/hdc1101086111268474112%/boottmpfs37133203713320%/dev/shm格式:dumpe2fs[-bh]装置文件名选项与参数:-b:列出保留为坏轨的部分(一般用不到吧!?)-h:仅列出superblock的数据,不会列出其他的区段内容![root@~]#dumpe2fs/dev/hdc2dumpe2fs1.39(29-May-2006)Filesystemvolumename:/1==这个是文件系统的名称(Label)Filesystemfeatures:has_journalext_attrresize_inodedir_indexfiletypeneeds_recoverysparse_superlarge_fileDefaultmountoptions:user_xattracl==默认挂载的参数Filesystemstate:clean==这个文件系统是没问题的(clean)Errorsbehavior:ContinueFilesystemOStype:LinuxInodecount:2560864==inode的总数Blockcount:2560359==block的总数Freeblocks:1524760==还有多少个block可用Freeinodes:2411225==还有多少个inode可用Firstblock:0Blocksize:4096==每个block的大小Filesystemcreated:FriSep501:49:202008Lastmounttime:MonSep2212:09:302008Lastwritetime:MonSep2212:09:302008Lastchecked:FriSep501:49:202008Firstinode:11Inodesize:128==每个inode的大小Journalinode:8Journalbackup:inodeblocksJournalsize:128MGroup0:(Blocks0-32767)==第一个datagroup内容,包含block的启始/结束号码Primarysuperblockat0,Groupdescriptorsat1-1==超级区块在0号blockReservedGDTblocksat2-626Blockbitmapat627(+627),Inodebitmapat628(+628)Inodetableat629-1641(+629)==inodetable所在的block0freeblocks,32405freeinodes,2directories==所有block都用完了!Freeblocks:Freeinodes:12-32416==剩余未使用的inode号码Group1:(Blocks32768-65535)ext2和目录树每个文件(不管是一般文件还是目录文件)都会占用一个inode,且可依据文件内容的大小来分配多个block给该文件使用。而我们知道目录的内容是记录文件名,一般文件才是实际记录数据内容的地方。那么目录与文件在Ext2文件系统当中是如何记录数据的呢?当我们在Linux下的ext2文件系统创建一个目录时,ext2会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。也就是说目录所占用的block内容在记录如下的信息:当创建一个目录时,文件系统会为该目录分配一个inode和至少一个block。该inode记录该目录的属性,并指向那块block。该block记录该目录下相关联的文件或目录的关联性和名字。当创建一个文件时,文件系统会为该文件分配至少一个inode和与该文件大小相对应的数量的block。该inode记录该文件的属性,并指向block。如果一个目录中的文件数太多,以至于1个block容纳不下这么多文件时,Linux的文件系统会为该目录分配更多的block。要读取/etc/passwd这个文件时,系统是如何读取的呢?Ext2是如何新建文件的呢?先确定用户对于欲新增文件的目录是否具有w与x的权限,若有的话才能新增;根据inodebitmap找到没有使用的inode号码,并将新文件的权限/属性写入;根据blockbitmap找到没有使用中的block号码,并将实际的数据写入block中,且升级inode的block指向数据;将刚刚写入的inode与block数据同步升级inodebitmap与blockbitmap,并升级superblock的内容。一般来说,我们将inode与datablock称为数据存放区域,至于其他例如superblock、blockbitmap与inodebitmap等区段就被称为metadata(中介数据),因为superblock,inodebitmap及blockbitmap的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此称为中介数据。日志式文件系统(J
本文标题:第五章文件系统.
链接地址:https://www.777doc.com/doc-2084312 .html