第11章学习笔记(20191213兰毅达)

第11章学习笔记

一、知识点归纳

  • 1、Linux最传统的磁盘文件系统(filesystem)使用的是EXT2
  • 2、硬盘组成与分割
    磁盘的物理组成,整颗磁盘的组成主要有:
    圆形的磁盘盘(主要记录数据的部分);
    机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);
    主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据
    扇区(Sector)为最小的物理储存单位,每个扇区为 512 bytes;
    将扇区组成一个圆,那就是磁柱(Cylinder),磁柱是分割槽(partition)的最小单位;
    第一个扇区最重要,里面有:(1)主要启动区(Master boot record, MBR)及分割表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
    各种接口的磁盘在Linux中的文件名分别为:
    /dev/sd[a-p][1-15]:为SCSI, SATA, U盘, Flash闪盘等接口的磁盘文件名;
    /dev/hd[a-d][1-63]:为 IDE 接口的磁盘文件名;
  • 3、data block (数据区块)
    data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录。 由于 block大小的差异,会导致该文件系统能够支持的最大磁盘容量与最大单一文件容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:
    Block 大小 1KB 2KB 4KB
    最大单一文件限制 16GB 256GB 2TB
    最大文件系统总容量 2TB 8TB 16TB
    原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
    每个 block 内最多只能够放置一个文件的数据;
    如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
    若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
  • 4、 EXT2文件系统由以下几个部分组成:
    Boot Sector:上图启动块(Boot Sector),是用来存储磁盘分区信息和启动信息,任何文件系统给都不能缺少启动块。启动块大小并不是我们前面所说的4KB,而是1KB,是由PC标准定义的。
    Block Group:启动块之后才是ext2文件系统的开始。ext2文件系统将整个分区划分为大小相等的块组(Block Group),每个块组由以下部分组成:
    Super Block:超级块主要有两个功能:1)超级块结构给出了文件系统的全局信息。例如块大小,文件系统的版本等等。2)超级块结构包含一些函数指针,例如super_operation的成员函数read_inode提供了读取inode信息的功能。每个具体的文件系统一般都要提供这个函数来实现对inode信息的读取,例如ext2文件系统提供的具体函数是ext2_read_inode。
    GDT(Group Descriptor Table),组描述符表。由很多组描述符组成,整个分区分成多少个组就对应有多少个组描述符。每个组描述符(Group Descriptor)存储一个组的描述信息,例如在这个组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。
    Block Bitmap,块位图。块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。
  • 5、EXT2的索引节点inode
    在EXT2文件系统中每个文件与目录由惟一的inode来描述。每个数据块组的EXT2 inode被保存在inode表中,同时还有一个位图被系统用来跟踪已分配和未分配的inode。

EXT2文件系统使用索引节点来记录文件信息。每个普通文件盒目录都有惟一的索引节点与之对应,索引节点中含有文件或目录的重要信息。当你要访问一个文件或目录时,通过文件或目录名首先找到与之对应的索引节点,然后通过索引节点得到文件或目录的信息及磁盘上的具体的存储位置。

EXT2在硬盘上的索引节点的数据结构如下:



EXT2通过索引节点中的数据块指针数组进行逻辑块到物理块的映射。在EXT2索引节点中,数据块中数组共有15项,前12个为直接指针,后三个分别为“一次间接指针”、“二次间接指针”、“三次间接指针”,EXT2默认的物理块大小为1KB,块地址占4个字节,所以每个物理块可以存储256个地址。这样,文件大小最大可达12KB+256KB+64MB+16GB。但实际上,Linux是32位系统,故文件大小最大只能为4GB,及整个文件系统都被一个文件所占用。索引节点的物理块指针数组如图所示:

系统是以逻辑块号为索引查找物理块的。例如,要找到第100个逻辑块对应的物理块,因为256+12>100>12,所以要用到一次间接块,在一次间接块中查找第88项,此项内容就是对应的物理块的地址。
节点在磁盘上是经过编号的。其中,有一些节点有特殊用途,用户不能使用。这些特殊节点定义为:

  • 6、EXT2文件系统的节点信息结构
    与EXT2超级块类似,当磁盘上的索引节点调入内存后,除了要填写VFS的索引节点外,系统还要根据它填写另一个数据结构ext2_inode_info,其作用也是为了存储特定文件系统自己的特性。
    结构ext2_inode_info分析如下:

    VFS索引节点中没有物理块指针数组的域,这个EXT2特有的信息在调入内存后,就必须保持在ext2_inode_info这个结构中
  • 7、EXT2文件系统的组描述符
    在块组中紧跟着超级块后面的块是组描述符,在start_sect+block_size*2位置上。乘以2的原因是block_size是KByte为单位,我们用扇区访问。组描述符表每一项为组描述符,是一个叫ext2_group_desc的数据结构,供32字节。它用来描述某个块组的整体信息。
    找到了组描述符,可得到很多信息,如该组块组位图的位置,该组块inode位图位置,该组块inode表的位置等。
    组描述符的定义如下:

二、问题与解决思路

  • 问题1:为什么用df命令比du命令统计整个磁盘的已用空间非常快呢?
  • 解决思路:因为df命令只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。
    Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
    Linux du命令用于显示目录或文件的大小。
    详情可参照:http://www.runoob.com/linux/linux-comm-df.html
    http://www.runoob.com/linux/linux-comm-du.html
  • 问题2:在格式化一个分区时究竟会划出多少个块组呢?
  • 解决思路:这主要取决于分区大小和块的大小。我们考虑一个32GB的ext2分区,块大小为4KB,Block Bitmap占一个块,也就是4KB,可以标注4K*8=32K个块,即128MB。因此,一个32GB的ext2分区需要32GB/128MB=256个块组。
    三、实践
  1. 创建ext2文件镜像并映射
    复制代码
cd /tmp
dd if=/dev/zero of=ext2-1M.img bs=1024 count=1024
mkfs.ext2 ext2-1M.img
mkdir ext2
sudo mount -o loop ext2-1M.img ext2
  1. 在ext2文件系统内创建一个普通文件,方便测试
cd ext2
touch test
echo "test content" > test
  1. 用vim打开ext2-1M.img,十六进制查看(:%!xxd)
原文地址:https://www.cnblogs.com/1301cn/p/15404724.html