第一类,机械磁盘,磁盘也称为硬盘驱动器(Hard Disk Driver),文件通常缩写为 HDD。系统磁盘有多个盘片,聊聊每个盘片双面存储。磁盘磁道(Track)磁头(Head)在盘片上画出的文件不同半径的同心圆。柱面(Cylinder)全部盘片相同磁道组成的圆柱侧面。柱面是从0开始编号,由外向内。柱面越靠外,吞吐量越大。(因为越靠外转动的线速度越大。扇区(Sector)盘片上的扇形区域。每个扇区512字节。是硬盘的基本单位。从1开始编号。每个扇区中的数据作为一个单元同时读出或写入。硬盘的0柱面0磁头1扇区是系统启动时首先读取的扇区。
第二类,固态磁盘(Solid State Disk),通常缩写为 SSD,由固态电子元器件组成。固态磁盘不需要磁道寻址,所以,不管是连续 I/O,还是随机 I/O 的性能,都比机械磁盘要好得多。
磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低。所以,文件系统Ext又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成。a)如果是一个启动盘,我们需要预留一块区域作为引导区,所以第一个块组的前面要留 1K,用于启动引导区。b)磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区。
默认情况下,超级块和块组描述符表都有副本保存在每一个块组里面。如果开启了 sparse_super(稀疏超级快) 特性,超级块和块组描述符表的副本只会保存在块组索引为 0、3、5、7 的整数幂里。除了块组 0 中存在一个超级块外,在块组 1(30=1)的第一个块中存在一个副本;在块组 3(31=3)、块组 5(51=5)、块组 7(71=7)、块组 9(32=9)、块组 25(52=25)、块组 27(33=27)的第一个 block 处也存在一个副本。对于超级块来讲,由于超级块不是很大,所以就算我们备份多了也没有太多问题。但是,对于块组描述符表来讲,如果每个块组里面都保存一份完整的块组描述符表,一方面很浪费空间;另一个方面,由于一个块组最大 128M,而块组描述符表里面有多少项,这就限制了有多少个块组,128M * 块组的总数目是整个文件系统的大小,就被限制住了。这样会产生一个限制,以Ext4的块组描述符大小64 Bytes计算,文件系统中最多只能有2^21个块组,也就是文件系统最大为256TB。
这是ext4引入的一个特点。就是将连续的多个block groups绑在一起组成一个逻辑块组,称之为flex_group。在一个flex_group中,第一个物理block group是存放当前flex_group全部的bitmap、inode表。也就是说将几个块组合并为一个更大的块组。比如flex_group的大小为4(就是由4个块组组成),其中的group0将按顺序存放Super Block、GDT、4个块组的块位图、4个块组的inode位图、4个块组的inode表,剩余的空间是用作数据块。就是说ext4将几个块组合并为一个更大的块组。
flex_group块组的作用是:
首先,块组描述符表不会保存所有块组的描述符了,而是将块组分成多个组,我们称为元块组(Meta Block Group)。每个元块组里面的块组描述符表仅仅包括自己的,一个元块组包含 64 个块组,这样一个元块组中的块组描述符表最多 64 项。我们假设一共有 256 个块组,原来是一个整的块组描述符表,里面有 256 项,要备份就全备份,现在分成 4 个元块组,每个元块组里面的块组描述符表就只有 64 项了,这就小多了,而且四个元块组自己备份自己的。
根据图中,每一个元块组包含 64 个块组,块组描述符表也是 64 项,备份三份,在元块组的第一个,第二个和最后一个块组的开始处。这样化整为零,我们就可以发挥出 ext4 的 48 位块寻址的优势了,在超级块 ext4_super_block 的定义中,我们可以看到块寻址分为高位和低位,均为 32 位,其中有用的是 48 位,2^48 个块是 1EB,足够用了。
- struct ext4_super_block {
- ......
- __le32 s_blocks_count_lo; /* Blocks count */
- __le32 s_r_blocks_count_lo; /* Reserved blocks count */
- __le32 s_free_blocks_count_lo; /* Free blocks count */
- ......
- __le32 s_blocks_count_hi; /* Blocks count */
- __le32 s_r_blocks_count_hi; /* Reserved blocks count */
- __le32 s_free_blocks_count_hi; /* Free blocks count */
- ......
- }
在机械磁盘上,保持相关的数据块相互接近可以总的磁头移动时间,因而可以加速磁盘IO。在SSD上虽然没有磁头转动,数据局部性可以增加每次IO请求的传输的数据大小,因而减少响应IO请求的传输次数。数据的局部性对单个擦除块的写入产生影响,可以加速文件重写的速度。因而尽可能减少碎片是必要的。inode和数据块的分配策略可以保证数据的局部集中。以下为inode和数据块的分配策略:
a)硬链接:
责任编辑:姜华 来源: 运维开发故事 磁盘机械磁盘固态磁盘
(责任编辑:娱乐)
2021年中欧班列(郑州)开行稳步增长 累计开行班列1546班次
好消息!上海首例高速公路服务区分布式光伏发电项目建设成功并网发电
网上初始发行数量为906.80万股 中旗新材申购价值怎么样?
中国煤层气(08270.HK)年度亏损收窄至3622.4万元 每股亏损为人民币3.08分