现在的位置: 首页 > 综合 > 正文

linux磁盘与文件系统管理

2014年11月13日 ⁄ 综合 ⁄ 共 5035字 ⁄ 字号 评论关闭

        linux文件系统(filesystem)是如何记录文件,如何读取文件的。要了解整个文件系统的概念,就不能不知道硬盘的组成。

     认识EXT2文件系统:

    1.1   硬盘物理组成:

    硬盘其实是由许多圆形硬盘片组成,按照硬盘片能够容纳的数据量,分为单盘(一块硬盘里只有一个硬盘片)或者是多盘的硬盘。我们以单一的硬盘为例。

   

        磁盘里有磁头(HEAD)在硬盘片上读写,磁头固定在机械手臂上,机械手臂上有多个磁头,可以进行读取。当磁头固定不动时(假设机械手臂不动),硬盘片转一圈所画出来的圆就是磁道(track)。一块硬盘里可能有多个硬盘片,所有硬盘片上相同半径的那个磁道就组成了柱面(cylinder)。

        如图8.2所示,两个硬盘片上的同一个磁道就是一个柱面。这个柱面也是分区时的最小单位由圆心向外画直线,可以将磁道再分为扇区,扇区就是硬盘片上最小的存储物理量,通常,一个扇区的大小约为512字节,这些就是整个硬盘的基本组成。

      在计算整个硬盘存储容量时,公式就是:柱面*磁头*扇区*512字节,当硬盘在读取数据时,硬盘片会转动。利用机械手臂将磁头移动到正确的数据位置(单方向前后移动),然后就将数据按顺序读出。

      1.2 分区

    为什么要分区呢?

    因为我们必须要告诉操作系统,“这块硬盘可以访问的区域是由A柱面到B柱面”,如此一来,操作系统才能够控制硬盘磁头去A~B范围内的柱面访问数据,如果没有操作系统这个信息,那么操作系统就无法利用硬盘来进行数据访问,因为操作系统将无法知道他要去哪里读取数据分区的要点:就是记录每一个分区的起始与结束柱面。

   分区的起始与结束柱面的数据放在哪里呢?

    主引导区(Master Boot Recorder,MBR)。事实上,MBR就是在一块硬盘的第0轨上,这也是计算机启动之后要去使用硬盘时必须读取的第一个区域。这个区域内记录了硬盘里的所有分区信息,以及启动时可以写入引导程序的位置。当一个硬盘的MBR坏掉时,由于分区数据不见了,这个硬盘也就没用了,因为操作系统不知道去哪个柱面读取数据。

      MBR的最大限制是,他的大小不能大到存储所有分区与引导程序的信息。因此,MBR仅提供最多4个分区的记忆。这就是主分区(primary,P),与拓展分区(extended,E),  

       最 多只有4个的原因:

      如果预计超过4个分区,那么势必要使用3P+1E,并且将所有的剩余空间都分配给拓展分区(记住,拓展分区最多只能有一个),否则只要3P+1E之后还有剩余空间,那么,那些容量就没用了。结论是“如果要分区硬盘,并且已经预计规划使用MBR所提供的4个分区(3P+1E或4P),那么需要使用硬盘的全部容量,否则剩下的容量也就不能在使用”。如果仅分区1P+1E,那么剩下的空间还能再分两个主分区。

     

     1.3文件系统

      在告知系统分区所在的起始与结束柱面之后,随后需要将分区格式化为“操作系统能够识别的文件系统”。因为每个操作系统能够识别的文件系统是不同的,例如windows系统默认状态下无法识别linux的文件系统(这里指的是linux标准的文件系统ext2),所以要针对操作系统格式化分区。

      可以说,每一个分区就是一个文件系统。

     那么,一个分区是否可以有两个文件系统呢?

    理论上是不行的。因为每个文件系统都有其独特的支持方式,例如linux的ext3就无法被windows系统读取,将一个分区格式化的时候,不可能在格式化为ext3的同时也格式化为fat32.

           不论是哪一种文件系统,总是要存储数据,既然硬盘是用来存储数据的,当然,数据就必须写入硬盘。硬盘的最小存储单位是扇区,数据所存储的最小单位并不是扇区,因为用扇区来存储效率太低了,因为一个扇区只有512字节,而磁头是一个扇区一个扇区的读取,也就是说,如果文件是10M,那么为了读取这个文件,磁头必须要进行读取(I/O)20480次。

           为了提高效率,就有了逻辑块的概念(Block),逻辑块是在分区进行文件系统的格式化时所指定的“最小存储单位”,这个最小存储单位以扇区大小为基础(因为扇区为硬盘的最小物理存储单位),所以块的大小为扇区的2^n倍数,此时,磁头一次可以读取一块,假设在格式化的时候,指定的块为4KB(即由连续8个扇区构成一块),那么,同样一个10MB的文件,磁头要读取的次数则大幅降为2560次,这就大大提高了文件的读取效率。

          块的规划并不是越大越好,因为一个块最多仅能容纳一个文件(这里指linux的ext2文件系统)。

         这有什么问题呢?

          加入块的规划为4KB,一个文件的大小仅为0.1KB,这个小文件将占用掉一个块的空间,也就是说,这块虽然可以容纳4KB的容量,然而由于文件只占用了0.1KB,所以,实际上剩下的3.9KB就无法使用了。

          在进行分区时,每个分区就是一个文件系统,而每个文件系统开始位置的那个块就是超级块(Superblock),超级快的作用是存储文件系统的大小,空的和填满的块。以及他们各自的总数和其他诸如此类的信息。也就是说,要使用这一个分区(或文件系统)来进行数据访问时,第一个要经过的就是超级块,所以,超级块不能坏。

         1.4 linux的EXT2文件系统(inode) 

         linux系统中,每个文件不仅有内容数据,还包括文件的各种属性,例如,所属用户组,所属用户,能否执行,文件建立时间,文件特殊属性等等。

          在标准的ext2文件系统中,将每个文件内容分为两个部分来存储,一个是文件属性,一个是文件内容

          ext2规划处inode与块来分别存储文件的属性(inode)与文件内容(放在块区域中)。要将一个分区格式化为(Format)为ext2,时,就必须指定inode与块的大小才行,也就是说,当分区被格式化为ext2文件系统时,它一定会有inode表与块区域这两个区域

         块,它是数据存储的最小单位。块是记录“文件内容数据”的区域,inode则是记录“该文件的相关属性,以及文件内容放置在哪一个块内”的信息。inode记录了文件的属性外,同时还必须具有指针额功能。指向文件内容放置的块之中,让操作系统可以正确的获取文件的内容,下面几个是inode记录的信息(当然不止这些):

      1)该文件的拥有者与用户组(owner/group)

      2) 该文件访问模式(read/write/excute)

      3) 该文件的类型(type)

      4) 该文件建立或状态改变的时间(ctime),最近一次的读取时间(atime),最近修改的时间(mtime)

      5)该文件的大小

      6) 定义文件属性的标志(flag),如setuid.....

      7) 该文件真正内容的指针(pointer)

    一个inode的大小为128字节(可以使用dumpe2fs来查看inode的大小)。

      linux到底如何读取一个文件的内容的呢?

       下面分别针对目录与文件来说明。

      目录:

       在linux的ext2文件系统建立一个目录时,ext2会给该目录分配一个inode与至少一个块,其中,inode记录该文件目录的相关属性,并指向分配到的那个块,块记录在这个目录下的相关文件(或目录)的关联性。

     文件:

        在linux的ext2建立普通文件时,ext2会给该文件分配至少一个inode与相对于该文件大小的块数量,例如,假设一个块为4KB,要建立一个100KB的文件,linux将分配一个inode与25个块来存储该文件。

        要注意:

         inode本身并不记录文件名。而是记录文件的相关属性,文件名则记录在目录所属的块区域,文件的相关连接会记录在目录的块数据区域,所以,要读取一个文件的内容时,linux会先由根目录/获取该文件的上层目录所在的inode,再由该目录所记录的文件关联性(在该目录所属的块区域)获取该文件的inode,最后通过inode内提供的指针块,来获取最终的文件内容。

        

 

   读取/etc/crontab的流程为:

1)操作系统根据目录(/)的相关数据可获取/etc目录所在的inode,并读取/etc这个目录的所有相关属性。

2)根据/etc的inode的数据,可以获取/etc目录下所有文件的关联数据是否放置在哪一个块中,并前往该块读取文件的相关内容。

3)由上一个步骤的块中,可以知道crontab文件的inode所在地,并前往该inode.

4)由上一个步骤的inode中,可以获取crontab文件的所有属性,并且前往由inode所指向的块区域,顺利获取crontab的文件内容。

可知:目录的最大功能就是提供文件的关联性,在关联性中,最主要的就是“文件名与inode的对应数据”。

 

   1.5 EXT2/EXT3文件的访问与日志文件系统的功能

            当建立ext2文件系统时,它拥有超级able块(superblock)/描述组(group description)/块位图(block bitmap)/inode位图(inode bitmap)/inode表(inode table)

/数据块(data blocks)等区域。要注意,在建立每个ext2文件系统的时候,会按照分区大小,确定数个块组,每个块组就有上述这些部分。整个文件系统结构图如图8-4所示。

           我们将整个文件系统简化,假设仅有一个块组(block group),那么上面的各个部分分别表示什么呢?

               

如果想知道某个ext2/ext3的文件系统内的这些信息,可以使用dumpe2fs命令来读取。例如:/dev/hda1读出ext3的信息:

 

1.6linux文件系统的运行

            当linux 文件系统在运行的时候,真的要将数据直接存放到硬盘上吗?是否有更有效的做法呢?

           数据处理最快的是CPU,接下来是主存储器RAM,硬盘要慢好多。为了让linux加快对整个系统的访问速度,linux通常采取异步处理(asynchronously)。

           什么是异步呢?

            当系统读取了某个文件,则该文件所在的块数据会加载到内存中,所以该磁盘块就会放在主存储器的缓冲区中。若这些块的数据被改变时,刚开始只有主存储器重的块数据会被改变,而且在缓冲中的块数据会被标记为‘脏(dirty)’,这个时候,磁盘实体块尚未被修正,所以,这些‘脏’块的数据必须会写到磁盘中,以维持磁盘实体块上的数据域主存储器中的数据块的一致性。

           为什么要这么做呢?

         主存储器的运行速度比硬盘快很多,如果系统中有一个文件很大,并连续访问,那么由于较慢的硬盘访问速度,将降低整个linux的运行速度,所以才会使用异步方式处理数据。

 

   1.7载入点

         要能够使用linux,必须使用‘载入(mount)’linux系统,刚刚提到了,目录可以记录文件名与inode的相关信息,并且,目录与文件系统能产生对应的入口点,因此,我们称那个入口点目录为‘载入点(mount point)’

       例如:安装系统,将硬盘划分为几个分区,并将‘/’与‘home’设置为两个分区的载入点。假设‘/’接在/dev/hda1,/home接在/dev/hda2,也就是说,在/home下面的所有子目录,使用的都是/dev/hda2分区的数据,而非/home的则都是使用/dev/hda1的数据。

2、文件系统的简单操作

 2.1磁盘与目录容量

       了解了一些简单的硬盘与文件系统的概念以后,并且知道了如何通过ls查询文件系统的相关概念信息后,接下来就要了解如何知道整个磁盘的剩余容量与总容量以及连接文件(link file)的概念。

       

 

3、ext2、ext3文件系统

         

 

抱歉!评论已关闭.