磁盘文件系统

 

https://www.51cto.com/article/667383.html

1 磁盘是怎样工作的?

第一类,机械磁盘,也称为硬盘驱动器(Hard Disk Driver),通常缩写为 HDD。磁盘有多个盘片,每个盘片双面存储。磁道(Track)磁头(Head)在盘片上画出的不同半径的同心圆。柱面(Cylinder)全部盘片相同磁道组成的圆柱侧面。柱面是从0开始编号,由外向内。柱面越靠外,吞吐量越大。(因为越靠外转动的线速度越大。扇区(Sector)盘片上的扇形区域。每个扇区512字节。是硬盘的基本单位。从1开始编号。每个扇区中的数据作为一个单元同时读出或写入。硬盘的0柱面0磁头1扇区是系统启动时首先读取的扇区。

第二类,固态磁盘(Solid State Disk),通常缩写为 SSD,由固态电子元器件组成。固态磁盘不需要磁道寻址,所以,不管是连续 I/O,还是随机 I/O 的性能,都比机械磁盘要好得多。

2 磁盘逻辑结构概观

磁盘读写的最小单位是扇区,然而扇区只有 512B 大小,如果每次都读写这么小的单位,效率一定很低。所以,文件系统Ext又把连续的扇区组成了逻辑块,然后每次都以逻辑块为最小单元,来管理数据。常见的逻辑块大小为 4KB,也就是由连续的 8 个扇区组成。a)如果是一个启动盘,我们需要预留一块区域作为引导区,所以第一个块组的前面要留 1K,用于启动引导区。b)磁盘在执行文件系统格式化时,会被分成三个存储区域,超级块、索引节点区和数据块区

 

会被分成三个存储区域,超级块、索引节点区和数据块区。

  • 索引节点:简称为 inode,用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期、数据的位置等。索引节点和文件一一对应,它跟文件内容一样,都会被持久化存储到磁盘中。所以记住,索引节点同样占用磁盘空间。
  • 数据块:简称为block,普通文件用来记录文件的数据。目录文件的块里面保存的是目录里面一项一项的文件信息,每一项都会保存这个目录的下一级的文件的文件名和对应的 inode,通过这个 inode,就能找到真正的文件。第一项是“.”,表示当前目录,第二项是“…”,表示上一级目录,接下来就是一项一项的文件名和 inode。
  • 超级块:简称为super_block。用于存储文件系统自身元数据的核心结构。其中的信息包括空闲和以使用块的数目、块长度、当前文件系统的状态、各种时间戳。还包括一个表示文件系统类型的魔数,能检查mount确认文件系统的类型是否正确。一般只使用块组0中的超级块,因此也叫主超级块。如果主超级块信息损坏,可以从超级块的备份信息中复制数据来修复。c)另外还有几个概念了解一下:
  • 组描述符表(GDT):组描述符表包含的信息反映了文件系统中各个块组的状态。其中信息包含块组中空闲块和空闲inode的数目。每个块组都包含了文件系统中所有块组的组描述符信息。由于GDT对于定位文件系统的元数据非常重要,因此和超级块一样,也对其进行了备份。GDT及其备份的内容都是一样的,所占块数也相同。
  • inode位图:用二进制的方式记录了inode的使用情况, 比如inode是否空闲等。
  • 数据块位图:用二进制方式记录了块的使用情况。当查找或创建文件时,会扫描此位图来寻找空闲的inode号对应的块。一个块组可以有32768(40968)个逻辑块。每一个块组均有自己的块位图与inode位图,用于记录本块组中块与inode的使用情况。一个逻辑块的大小为4K。则一个块位图所描述的块组最大为40968*4K=128MB。
  • inode列表:包含了块组中所有的inode,inode用于保存文件系统中与各个文件和目录相连的所有元数据。

 

 

除了超级快与数据块,其他都是索引节点区?

 

3 数据块和Inode分配策略

在机械磁盘上,保持相关的数据块相互接近可以总的磁头移动时间,因而可以加速磁盘IO。在SSD上虽然没有磁头转动,数据局部性可以增加每次IO请求的传输的数据大小,因而减少响应IO请求的传输次数。数据的局部性对单个擦除块的写入产生影响,可以加速文件重写的速度。因而尽可能减少碎片是必要的。inode和数据块的分配策略可以保证数据的局部集中。以下为inode和数据块的分配策略:

  • 多块分配可以减少磁盘碎片。当文件初次创建的时候,块分配器预测性地分配8KB的磁盘空间给文件。当文件关闭的时候,未使用的空间当然也就释放了。但是如果推测是正确的,那么文件数据将写到一个多个块的extent中。
  • 延迟分配。当一个文件需要更多的数据块引起写操作时,文件系统推迟决定新数据在磁盘上的存放位置,直到脏的buffer写到磁盘为止。
  • 尽量保持文件的数据块与其inode在同一个块组中。可以减少磁盘寻道时间.
  • 尽量保持同一个目录中的所有inodes与目录位于同一个块组中。这样的假设前提是一个目录中的文件是相关的。
  • 磁盘卷被分成128MB的块组。当在根目录中创建目录时,inode分配器扫描块组并将新目录放到它找到的使用负荷最小的块组中。这可以保证目录在磁盘上的分散性。
  • 即使上述机制无效,仍然可以使用e4defrag整理碎片文件。

4 硬链接与软链接

a)硬链接:

  • 多个文件指向同一个inode,这些文件的inode number相同
  • 硬链接表明文件可以通过不同的文件名访问
  • 不能对目录创建硬链接
  • 硬链接不能跨分区
  • 每多一个硬链接,inode的引用计数(链接数)+1 b)软链接(符号链接):
  • 文件及其软链接文件,使用的不是同一个inode,inode number不一样;
  • 软链接文件的实际数据是另一个文件的路径,是一个字符串,软链接文件的大小为该字符串的长度;
  • 可以对目录创建软链接
  • 软链接可以跨分区
  • 增加文件软链接,不会增加inode的引用计数

 

来自:https://www.51cto.com/article/667383.html 

 

https://www.51cto.com/article/667640.html

数据的存放

  • 在 ext2 和 ext3 中,其中前 12 项直接保存了块的位置,也就是说,我们可以通过 i_block[0-11],直接得到保存文件内容的块。

 

但是,如果一个文件比较大,inode的块号不足以标识所有的数据块,就会使用间接块。文件系统会在硬盘上分配一个数据块,不存储文件数据,专门用来存储块号。该块被称为间接块。inode的长度是固定的。间接块占用的空间对于大文件来说是必要的。但是对于小文件不会带来额外的开销。当我们用到 i_block[12]的时候,就不能直接放数据块的位置了,要不然 i_block 很快就会用完了。这该怎么办呢?我们需要想个办法。我们可以让 i_block[12]指向间接块。也就是说,我们在 i_block[12]里面放间接块的位置,通过 i_block[12]找到间接块后,间接块里面放数据块的位置,通过间接块可以找到数据块。如果文件再大一些,i_block[13]会指向一个块,我们可以用二次间接块。二次间接块里面存放了间接块的位置,间接块里面存放了数据块的位置,数据块里面存放的是真正的数据。如果文件再大一些,i_block[14]会指向三次间接块。

  • ext4文件系统的Extents一棵树:

解释一下 Extents。比方说,一个文件大小为 128M,如果使用 4k 大小的块进行存储,需要 32k 个块。Extents 可以用于存放连续的块,也就是说,我们可以把 128M 放在一个 Extents 里面。这样的话,对大文件的读写性能提高了,文件碎片也减少了。如下图所示:

 

 索引节点区,用来存储索引节点。Inode存储了文件系统对象的一些元信息,如所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等。知道了1个文件的inode号码,就可以在inode元数据中查出文件内容数据的存储地址。对于EXT4的默认情况,一个inode的大小是256字节,inode是EXT4最重要的元数据信息。注意Inode没有文件名称,将在下文中讲述。

如果文件不大,inode 里面的 i_block 中,可以放得下一个 ext4_extent_header 和 4 项 ext4_extent。所以这个时候,eh_depth 为 0,也即 inode 里面的就是叶子节点,树高度为 0。如果文件比较大,4 个 extent 放不下,就要分裂成为一棵树,eh_depth>0 的节点就是索引节点,其中根节点深度最大,在 inode 中。最底层 eh_depth=0 的是叶子节点。

 

ext类文件系统的缺点

最大的缺点是它在创建文件系统的时候就划分好一切需要划分的东西,以后用到的时候可以直接进行分配,也就是说它不支持动态划分和动态分配。对于较小的分区来说速度还好,但是对于一个超大的磁盘,速度是极慢极慢的。例如将一个几十T的磁盘阵列格式化为ext4文件系统,可能你会因此而失去一切耐心。除了格式化速度超慢以外,ext4文件系统还是非常可取的。当然,不同公司开发的文件系统都各有特色,最主要的还是根据需求选择合适的文件系统类型。

 

以上来自:https://www.51cto.com/article/667640.html

还有个https://www.51cto.com/article/668513.html  磁盘文件系统 三

 

 

 

 

 

 

 

 

 

 

 

磁盘分区

对于大型硬盘,可以将可用空间划分或分区为多个不同的分区,比如在windows系统上,将一块磁盘分区成C、D、E盘,这就叫做分区。

分区信息存储在磁盘上的分区表上,该表列出了每个分区的起点和终点信息、它的类型信息等,这些信息都存储在分区表中,而磁盘分区表主要有两种:MBR和GPT。前者是传统格式,兼容性好;后者更现代,功能更强大。

文件系统与文件

在文件系统中,一个文件大体上可以由目录项inode数据块组成:

  • inode: 索引节点,存放数据块的指针
  • 目录项:包含文件名和inode节点号
  • 数据块:包含具体的文件内容

还有一个关注点是超级块,它会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

inode

inode,全称是index node,中文含义就是索引节点,它用来记录文件的元数据,比如 inode 编号、文件大小、访问权限、修改日期以及文件数据块的地址索引等,通过数据块的索引就可以找到具体的数据块。

 

 在ext3文件系统中inode有15个索引,其中前12个索引直接记录数据块的地址,第13个索引记录索引地址。也就是说,索引块指向的硬盘数据块并不直接记录文件数据,而是记录文件数据块的索引表,依次的,第 14 个索引记录二级索引地址,第 15 个索引记录三级索引地址,下面是示意图:

 

 还有一点需要注意,索引节点和文件一一对应(inode与文件一一对应),它跟文件内容一样,需要持久化到磁盘,是占磁盘空间的。

如果一个文件比较大,inode的块号不足以标识所有的数据块,就会使用间接块。文件系统会在硬盘上分配一个数据块,不存储文件数据,专门用来存储块号。就是上图的索引表?。

 

 

 

目录项

在Linux系统中,目录(directory)也是一种文件,打开目录,也就是打开目录文件,目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。下面是示意图

 

 

文件系统组件的体系结构

接下来,我们来梳理一下体系结构,从应用层到VFS,再到磁盘的一个结构图,从这个架构图中我们可以对文件系统有一个更加清晰的认识,如下图所示:

 

从图中可以看到上文未提及的Page Cache与直接IO,实际上根据是否利用操作系统的页缓存,可以将文件I/O分为直接IO和非直接IO。

  • 直接IO: 不经过页缓存,直接访问磁盘数据
  • 非直接IO: 文件读写时,先要经过系统的页缓存,如果缓存中有数据中,直接读取;如果没有,再从磁盘中读取

Page Cache主要用来减少对磁盘的I/O操作,通过将磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。

其实,还有一个Buffer Cache,它主要用来缓存磁盘块,用于块I/O,也就是对磁盘块数据的缓存,而Page Cache是文件数据的缓存,在Linux 2.4内核以前,两者是独立的,2.4之后就统一了,只有Page Cache,而Buffer是页映射块的,它实际上就是在Page Cache中。

 

以上来自:https://pjmike.github.io/2019/12/23/%E8%81%8A%E8%81%8A%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E9%82%A3%E4%BA%9B%E4%BA%8B/

 

关于ext4文件系统概述

来自:https://zhuanlan.zhihu.com/p/326496788

https://blog.csdn.net/TSZ0000/article/details/84663875

打印ext4文件系统信息

    刚格式化完没有写文件,使用命令dumpe2fs:

#dumpe2fs /dev/loop0 【-h不打印Group信息】

dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: <not available> 最后挂载目录
Filesystem UUID: cef5f647-058f-49bd-88c6-baf3ce2338a0
Filesystem magic number: 0xEF53 ext4文件系统标志
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 25688 文件系统inode号总数,由系统决定但可以指定比例
Block count: 102400 文件系统block总数,==容量/默认的1KB
Reserved block count: 5120 保留的block总数,默认比例为5%
Free blocks: 93504 空闲的block总数,
Free inodes: 25677 空闲的inode总数
First block: 1 第一个block号
Block size: 1024 block大小
Fragment size: 1024
Group descriptor size: 64 块组描述大小
Reserved GDT blocks: 256 预留块组描述block数量
Blocks per group: 8192 块组中block数量
Fragments per group: 8192
Inodes per group: 1976 块组中inode数量==25688/13
Inode blocks per group: 247 块组中inode占用block总数
Flex block group size: 16 inode表大小?
Filesystem created: Tue Nov 27 13:26:27 2018
Last mount time: Tue Nov 27 13:28:39 2018
Last write time: Tue Nov 27 13:28:39 2018
Mount count: 1 挂载次数
Maximum mount count: -1
Last checked: Tue Nov 27 13:26:27 2018
Check interval: 0 (<none>)
Lifetime writes: 4447 kB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11 文件系统的第一个inode号
Inode size: 128 inode大小
Journal inode: 8 日志文件inode号
Default directory hash: half_md4
Directory Hash Seed: 45d2f9d4-714a-4ccf-9c9d-308d12552317
Journal backup: inode blocks
Journal features: journal_64bit
日志大小: 4096k
Journal length: 4096
Journal sequence: 0x00000002
Journal start: 1


Group 0: (Blocks 1-8192) [ITABLE_ZEROED]
Checksum 0x0229, unused inodes 1965
主 superblock at 1, Group descriptors at 2-2
保留的GDT块位于 3-258
Block bitmap at 259 (+258), Inode bitmap at 275 (+274)
Inode表位于 291-537 (+290)
4683 free blocks, 1965 free inodes, 2 directories, 1965个未使用的inodes
可用块数: 3510-8192
可用inode数: 12-1976

Group 1: (Blocks 8193-16384) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xe320, unused inodes 1976
备份 superblock at 8193, Group descriptors at 8194-8194
保留的GDT块位于 8195-8450
Block bitmap at 260 (bg #0 + 259), Inode bitmap at 276 (bg #0 + 275)
Inode表位于 538-784 (bg #0 + 537)
7934 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 8451-16384
可用inode数: 1977-3952
Group 2: (Blocks 16385-24576) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0x5f58, unused inodes 1976
Block bitmap at 261 (bg #0 + 260), Inode bitmap at 277 (bg #0 + 276)
Inode表位于 785-1031 (bg #0 + 784)
8192 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 16385-24576
可用inode数: 3953-5928
Group 3: (Blocks 24577-32768) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xcbc0, unused inodes 1976
备份 superblock at 24577, Group descriptors at 24578-24578
保留的GDT块位于 24579-24834
Block bitmap at 262 (bg #0 + 261), Inode bitmap at 278 (bg #0 + 277)
Inode表位于 1032-1278 (bg #0 + 1031)
7934 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 24835-32768
可用inode数: 5929-7904
Group 4: (Blocks 32769-40960) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xf99a, unused inodes 1976
Block bitmap at 263 (bg #0 + 262), Inode bitmap at 279 (bg #0 + 278)
Inode表位于 1279-1525 (bg #0 + 1278)
8192 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 32769-40960
可用inode数: 7905-9880
Group 5: (Blocks 40961-49152) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xd61e, unused inodes 1976
备份 superblock at 40961, Group descriptors at 40962-40962
保留的GDT块位于 40963-41218
Block bitmap at 264 (bg #0 + 263), Inode bitmap at 280 (bg #0 + 279)
Inode表位于 1526-1772 (bg #0 + 1525)
7934 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 41219-49152
可用inode数: 9881-11856
Group 6: (Blocks 49153-57344) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0x5ff4, unused inodes 1976
Block bitmap at 265 (bg #0 + 264), Inode bitmap at 281 (bg #0 + 280)
Inode表位于 1773-2019 (bg #0 + 1772)
4096 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 53249-57344
可用inode数: 11857-13832
Group 7: (Blocks 57345-65536) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xe898, unused inodes 1976
备份 superblock at 57345, Group descriptors at 57346-57346
保留的GDT块位于 57347-57602
Block bitmap at 266 (bg #0 + 265), Inode bitmap at 282 (bg #0 + 281)
Inode表位于 2020-2266 (bg #0 + 2019)
7934 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 57603-65536
可用inode数: 13833-15808
Group 8: (Blocks 65537-73728) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0x02c4, unused inodes 1976
Block bitmap at 267 (bg #0 + 266), Inode bitmap at 283 (bg #0 + 282)
Inode表位于 2267-2513 (bg #0 + 2266)
8192 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 65537-73728
可用inode数: 15809-17784
Group 9: (Blocks 73729-81920) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xe55f, unused inodes 1976
备份 superblock at 73729, Group descriptors at 73730-73730
保留的GDT块位于 73731-73986
Block bitmap at 268 (bg #0 + 267), Inode bitmap at 284 (bg #0 + 283)
Inode表位于 2514-2760 (bg #0 + 2513)
7934 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 73987-81920
可用inode数: 17785-19760
Group 10: (Blocks 81921-90112) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0xf84c, unused inodes 1976
Block bitmap at 269 (bg #0 + 268), Inode bitmap at 285 (bg #0 + 284)
Inode表位于 2761-3007 (bg #0 + 2760)
8192 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 81921-90112
可用inode数: 19761-21736
Group 11: (Blocks 90113-98304) [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
Checksum 0x8508, unused inodes 1976
Block bitmap at 270 (bg #0 + 269), Inode bitmap at 286 (bg #0 + 285)
Inode表位于 3008-3254 (bg #0 + 3007)
8192 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 90113-98304
可用inode数: 21737-23712
Group 12: (Blocks 98305-102399) [INODE_UNINIT, ITABLE_ZEROED]
Checksum 0xff44, unused inodes 1976
Block bitmap at 271 (bg #0 + 270), Inode bitmap at 287 (bg #0 + 286)
Inode表位于 3255-3501 (bg #0 + 3254)
4095 free blocks, 1976 free inodes, 0 directories, 1976个未使用的inodes
可用块数: 98305-102399
可用inode数: 23713-25688

 

前言: 目前大部分Linux操作系统使用的文件系统是ext4和xfs, 了解ext4在磁盘中的分布

1. 容量概念

对于储存几个概念的解析:

sector(扇区) :

1.磁盘最小的储存单位,可以通过命令行 fdisk -l得知单位每sector的大小(一般是512byte)

2.机械硬盘HDD的可用空间大小计算公式是 heads(磁头数量) cylinders(柱面数量) sectors(扇区数量) * 每个sector大小(512byte)

3.所以固态可用空间的总大小是 sectors(扇区数量) * 每个sector大小(512byte)。

4.这几个属性是固定不能修改, 但可以通过命令读取得到。因为固态硬盘SSD没有磁头柱面的概念。

// 1073741824 bytes的大小刚好是 sectors * 512 bytes 得出来的
root@xxxxxx:~# fdisk -l /dev/rbd0
Disk /dev/rbd0: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 4194304 bytes / 4194304 bytes
Disklabel type: dos
Disk identifier: 0x5510f42b

Device      Boot Start     End Sectors  Size Id Type
/dev/rbd0p1       8192 2097151 2088960 1020M 83 Linux
root@xxxxxx:~#


block (块) :

1.是文件系统EXT4,FAT32,XFS等最小的储存单位,使用命令 blkid 可查看文件系统类型。

2.每一个block只能存储一个文件的数据。

3.当格式化一个文件系统时,如果选择不当,就会造成大量的磁盘空间浪费。

4.默认操作系统每个block的大小是4k(4096bytes),一个block由连续的sector组成。

5.一个文件在文件系统中的block不一定是连续的。

inode (索引节点) :

1.记录文件的权限、属性和数据所在块block的号码。

2.每个文件都有且仅有一个的inode,每个inode都有自己的编号,可以把inode简单地理解为文档索引。

data block (数据区块) :

1.block可以区分成两种概念,第一就是上述说的文件系统中最小的储存单位(存在1个block存下多个inode的说法),第二也是这里谈及到数据区块

2.存储的文件内容,也叫数据区块(data block),每个block都有自己的编号,Ext2支持的单位block容量仅为1k、2k、4k
目录的data block保存该目录下所有文件以及子目录的名字,inode编号等信息。

2. Ext4文件系统磁盘布局

Ext4文件系统把整个分区划分成各个block group(块组),每个block group由superblock(超级块),block group(区块群组), block bitmap(区块对照表), inode bitmap(inode 对照表)和group descriptor以及inode table、data block组成。

1024 bytes 的 Group 0 Padding(boot block)只有 块组0 有,用于装载该分区的操作系统。MBR 为主引导记录用来引导计算机。在计算机启动时,BIOS 读入并执行 MBR,MBR 作的第一件事就是确定活动分区(这对应于双系统的计算机开机时选择启动项,单系统的直接就能确定了所以就不需要选择),读入活动分区的引导块(Boot block),引导块再加载该分区中的操作系统。

官方网站:

图2为简略图省略了块组描述与预留GDT部分。

 

 

superblock(超级块)

1.记录文件系统(filesystem)的整体信息,包括inode/block的总量、使用量、剩余量、大小、以及文件系统的格式和相关信息。

备注:superblock对于文件系统太重要了,但是文件系统的superblock又只有一个,所以除了第一个block group含有superblock外,后续block group都可能会含有备份的superblock,目的就是为了避免superblock单点无法救援的问题。

block bitmap(区块对照表)

1.一个block只能被一个文件使用,当我们新增文件时,肯定需要使用新的block来记录文件数据。那么如何快速地知道,哪些block是新的?哪些block是已经使用了的?block bitmap就是这样被设计出来,记录所有使用和未使用的block号码。同样的,

2.我们删除文件时,先从block bitmap中找到对应的block号码,然后更新标志为未使用,最后释放block。

inode bitmap(inode 对照表)

和block bitmap一样的设计理念,只不过它记录地是已使用和未使用的inode号码,这里就不再敖述了。

group descriptor

描述每个区段(block group)开始和结束的block号码,以及说明每个区段(inodemap、blockmap、inode table)分别介于哪些block号码之间。


inode table

该组所有inode的合集,可以通过inode编号 以inode table起始位置作偏移找到inode所在的位置。

data block

上节已叙述,为存放文件或目录数据的地方。

 

 

 

2.1 获取ext4分区相关信息

可以使用dumpe2fs 打印ext4分区的详细信息。

Inode count:              65280
Block count:              261120
Block size:               4096
Inode size:               256
Blocks per group:         32768
Inodes per group:         8160


可以从以上获取得整个分区inode的数量是65280 block的数量261120,一个block的大小是4K,每个block group有 32768 block (4096 * 32768 大小)

其中一个block 可以存放 4096Bytes (block size) / 2566Bytes (Inode size) = 16 个 inode

一个 block group 有 8160 个 inode

root@xxxxxx:~# dumpe2fs /dev/rbd0p1


dumpe2fs 1.44.1 (24-Mar-2018)
Filesystem volume name:   <none>
Last mounted on:          /mnt/ceph-vol1
Filesystem UUID:          6f074db1-8f6f-4313-851d-fa3c9b7590f8
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65280
Block count:              261120
Reserved block count:     13056
Free blocks:              247156
Free inodes:              65267
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8160
Inode blocks per group:   510
RAID stride:              1024
RAID stripe width:        1024
Flex block group size:    16
Filesystem created:       Wed Oct 14 17:42:24 2020
Last mount time:          Thu Oct 15 17:35:48 2020
Last write time:          Thu Oct 15 17:35:48 2020
Mount count:              2
Maximum mount count:      -1
Last checked:             Wed Oct 14 17:42:24 2020
Check interval:           0 (<none>)
Lifetime writes:          153 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      6a8799b4-6528-499d-9f62-fde45cb8991a
Journal backup:           inode blocks
Checksum type:            crc32c
Checksum:                 0x1ab86e25
Journal features:         journal_64bit journal_checksum_v3
Journal size:             16M
Journal length:           4096
Journal sequence:         0x00000010
Journal start:            1
Journal checksum type:    crc32c
Journal checksum:         0xdc3ea2cb


Group 0: (Blocks 0-32767) csum 0xe2fe [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-128
  Block bitmap at 129 (+129), csum 0x06292657
  Inode bitmap at 137 (+137), csum 0xc6f39952
  Inode table at 145-654 (+145)
  28533 free blocks, 8143 free inodes, 6 directories, 8143 unused inodes
  Free blocks: 4235-32767
  Free inodes: 18-8160
Group 1: (Blocks 32768-65535) csum 0x4d02 [INODE_UNINIT, ITABLE_ZEROED]
  Backup superblock at 32768, Group descriptors at 32769-32769
  Reserved GDT blocks at 32770-32896
  Block bitmap at 130 (bg #0 + 130), csum 0xfa6bcbac
  Inode bitmap at 138 (bg #0 + 138), csum 0x00000000
  Inode table at 655-1164 (bg #0 + 655)
  27518 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 32898-33791, 38912-65535
  Free inodes: 8161-16320
Group 2: (Blocks 65536-98303) csum 0xba1c [INODE_UNINIT, ITABLE_ZEROED]
  Block bitmap at 131 (bg #0 + 131), csum 0x8c3dbe87
  Inode bitmap at 139 (bg #0 + 139), csum 0x00000000
  Inode table at 1165-1674 (bg #0 + 1165)
  28672 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 69632-98303
  Free inodes: 16321-24480
Group 3: (Blocks 98304-131071) csum 0x579e [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Backup superblock at 98304, Group descriptors at 98305-98305
  Reserved GDT blocks at 98306-98432
  Block bitmap at 132 (bg #0 + 132), csum 0x00000000
  Inode bitmap at 140 (bg #0 + 140), csum 0x00000000
  Inode table at 1675-2184 (bg #0 + 1675)
  32639 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 98433-131071
  Free inodes: 24481-32640
Group 4: (Blocks 131072-163839) csum 0xfc69 [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Block bitmap at 133 (bg #0 + 133), csum 0x00000000
  Inode bitmap at 141 (bg #0 + 141), csum 0x00000000
  Inode table at 2185-2694 (bg #0 + 2185)
  32768 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 131072-163839
  Free inodes: 32641-40800
Group 5: (Blocks 163840-196607) csum 0x0b15 [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Backup superblock at 163840, Group descriptors at 163841-163841
  Reserved GDT blocks at 163842-163968
  Block bitmap at 134 (bg #0 + 134), csum 0x00000000
  Inode bitmap at 142 (bg #0 + 142), csum 0x00000000
  Inode table at 2695-3204 (bg #0 + 2695)
  32639 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 163969-196607
  Free inodes: 40801-48960
Group 6: (Blocks 196608-229375) csum 0x18c8 [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Block bitmap at 135 (bg #0 + 135), csum 0x00000000
  Inode bitmap at 143 (bg #0 + 143), csum 0x00000000
  Inode table at 3205-3714 (bg #0 + 3205)
  32768 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 196608-229375
  Free inodes: 48961-57120
Group 7: (Blocks 229376-261119) csum 0x9bc0 [INODE_UNINIT, ITABLE_ZEROED]
  Backup superblock at 229376, Group descriptors at 229377-229377
  Reserved GDT blocks at 229378-229504
  Block bitmap at 136 (bg #0 + 136), csum 0xde491fa2
  Inode bitmap at 144 (bg #0 + 144), csum 0x00000000
  Inode table at 3715-4224 (bg #0 + 3715)
  31615 free blocks, 8160 free inodes, 0 directories, 8160 unused inodes
  Free blocks: 229505-261119
  Free inodes: 57121-65280


2.2 Ext4块数据属性

要定位文件在磁盘的位置,首先要清楚ionde 和data block的数据内容。

在 Ext4 中除日志以外的数据都是以小端法存储的。

不过多对查找文件内容不起作用的部分进行叙述。

 

 

常用命令参考

fdisk -l
dumpe2fs
tree
stat
dd
debugfs


结束语

ext4 文件系统并不复杂,分析当中的储存架构可以使我们对操作系统有更好的了解。

以上来自:https://zhuanlan.zhihu.com/p/326496788

 

 

 

 

 

 

遍历目录查看:https://www.51cto.com/article/667640.html

查看ext4 具体实验,查看:http://oliveryang.net/2016/05/linux-file-system-basic-4/#37-data-block

 

1. 背景

本文将在 Sampleblk 块设备上创建 Ext4 文件系统,以 Ext4 文件系统为例,用 debugfs 和 crash 来查看 Ext4 文件系统的磁盘格式 (File System Disk Layout)。

在 Linux File System - 3 中,Samplefs 只有文件系统内存中的数据结构,而并未规定文件系统磁盘数据格式。 而 Linux Block Driver - 1 则实现了一个最简的块驱动 Sampleblk。 Sampleblk day1 的源码只有 200 多行,但已经可以在它上面创建各种文件系统。 由于 Sampleblk 是个 ramdisk,磁盘数据实际上都写在了驱动分配的内核内存里,因此可以很方便的使用 Linux Crash 工具来研究任意一种文件系统的磁盘格式。

2. 准备

2.1 Ram Disk 驱动

需要按照如下步骤去准备 Sampleblk 驱动,

  • Linux 4.6.0 编译,安装,引导
  • Sampleblk 驱动编译和加载
  • 在 /dev/sampleblk1 上创建 Ext4 文件系统。
  • mount 文件系统到 /mnt 上

以上详细过程可以参考 Linux Block Driver - 1

2.2 调试工具

需要做的准备工作如下,

  • 升级 Crash 到支持 Linux 4.6.0 内核的版本

    详细过程请参考 Linux Crash - coding notes 这篇文章。

  • 确认 debugfs 工具是否安装

    debugfs 是 ext2, ext3, ext4 文件系统提供的文件系统调试工具,通过它我们可以不通过 mount 文件系统而直接访问文件系统的内容,它是 e2fsprogs 软件包的一部分,如果找不到请安装。 debugfs 的详细使用说明可以通过 debugfs man page 得到。

3. Ext4 磁盘格式

如 Linux File System - 3 中所述。很多磁盘文件系统的重要数据结构都存在三个层面上的实现,

  1. VFS 内存层面上的实现。
  2. 具体文件系统内存层面上的实现。
  3. 具体文件系统磁盘上的实现。

上述 1 和 2 共同组成了文件系统的内存布局 (memory layout),而 3 则是文件系统磁盘布局 (disk layout) 的主要部分,即本文主要关注的部分。

本小节将对 Ext4 的磁盘格式做简单介绍。Ext2/Ext3 文件系统的磁盘格式与之相似,但 Ext4 在原有版本的基础上做了必要的扩展。

如下图所示,一个 Ext4 文件系统的磁盘格式是由一个引导块和很多个 block group 组成的,

ext4 block groups

其中,上图的 boot block (引导块) 用于存放系统引导代码,这个区域并不属于文件系统。在 x86 系统,此引导代码会被 BIOS 在系统加电后加载执行。

上图中的每个 block group 又由如下格式构成,

ext4 layout in one group

接下来我们对 Ext4 磁盘上的 block group 及其内部的构成做简单介绍。

3.1 Block Group

一个 block group 里的存储的数据就两大类,存放于文件的 data 和用于描述 aata 的 meta data (元数据)。 而 Ext 文件系统由多个 block group 组成,每个 block group 都有部分重复的元数据,浪费了一些空间,但是却可以带来如下好处,

  • 错误恢复。例如,super block 和 group descriptor 在每个 block group 都有副本,如果发生损坏时这些副本可以用于恢复。
  • 性能。一个文件的存放会尽可能不跨越 block group,因此,同一文件的访问都在 block group 内部,使得数据访问具有局部性。这样减少了 HDD 设备磁头移动和寻道时间。

3.2 Super Block

Super block 包含了文件系统的全局配置和信息。是关联其它文件系统元数据的核心数据,即元数据的元数据。

默认情况下,文件系统使用 block group 0 的 super block 和 group descriptor 。其它每个 block group 里都有一个 super block 和 group descriptor 的副本。 为减少空间浪费,Ext 文件系统引入了 sparse super block 的特性,这样,只有 block group 1,和 block group ID 为 2 的 3,5,7 次幂的 block group 会存副本。这时,没有存放 super block 和 group descriptor 的 block group 起始偏移将从 data block bitmap 开始。

为了性能考虑,super block 一般都缓存在内存中。本文只关注磁盘上的 super block 格式,其对应数据结构为 struct ext4_super_block

3.3 Group Descriptor

Group descriptor 描述文件系统所有的 block group 的信息。文件系统默认使用 block group 0 里的 group descriptor。其它副本存放情况已经在 super block 章节有所描述。

通过 group descriptor 可以定位 block group 的 data block bitmap,inode bitmap 和 inode table 的所在块号。这就意味着 data block bitmap,inode bitmap 和 inode table 的位置可以不是固定的。 Ext4 文件系统的 group descriptor 对应数据结构为 struct ext4_group_desc。具体信息见后续章节的相关实验。

3.4 Data Block Bitmap

Data block bitmap 跟踪 block group 内的 data block 使用情况,是占一个 block 大小的 bitmap。已分配数据块为 1,空闲块为 0。

3.5 Inode Bitmap

Inode bitmap 跟踪 inode table 内的表项使用情况,是占一个 block 大小的 bitmap。已分配表项为 1,空闲表项为 0。

3.6 Inode Table

Inode table 存放 block group 内部的所有文件和目录的 meta data 即 inode 的信息。对 Ext4 文件系统,就是 struct ext4_inode 的数组。

3.7 Data Block

Data block 存放 block group 的所有文件的实际数据。文件的磁盘空间使用都是以 block 为单位的。文件的数据块在磁盘上连续可以减少 fragmentation 从而改善性能。 Ext4 super block 会给出文件系统每个 block 的大小。

4. 实验

下面我们会利用 sampleblk 驱动做简单的实验来帮助加深对 Ext4 磁盘格式的认识。

4.1 查看 Block Group

在格式化 Ext4 文件系统时,mkfs.ext4 命令已经报告了在块设备 /dev/sampleblk1 上创建了 1 个 block group,并且给出这个 block group 里的具体 block,fragment 和 inode 的个数,

$ sudo mkfs.ext4 /dev/sampleblk1
...[snipped]...

1 block group
8192 blocks per group, 8192 fragments per group
64 inodes per group

...[snipped]...

同样的,也可以使用 debugfs 的 show_super_stats 命令得到相应的信息,

$ sudo debugfs /dev/sampleblk1 -R show_super_stats | grep -i block
debugfs 1.42.9 (28-Dec-2013)
Block count:              512
Reserved block count:     25
Free blocks:              482
First block:              1
Block size:               1024 /* block 的长度 */
Reserved GDT blocks:      3
Blocks per group:         8192
Inode blocks per group:   8
Flex block group size:    16
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
 Group  0: block bitmap at 6, inode bitmap at 22, inode table at 38
           482 free blocks, 53 free inodes, 2 used directories, 53 unused inodes

从 debugfs 的命令输出,我们也可以清楚的知道 block group 0 内部的情况。它的 block bitmap,inode bitmap,inode table 的具体位置。

4.2 磁盘起始地址和长度

因为 sampleblk 是 ramdisk,因此在此块设备上创建文件系统时,所有的数据都被写在了内存里。所以,可以利用 crash 来查看 Ext4 文件系统在 sampleblk 上的磁盘布局。

首先,需要加载 sampleblk.ko 和 ext4 模块的符号,

crash> mod -s sampleblk /home/yango/ws/lktm/drivers/block/sampleblk/day1/sampleblk.ko
     MODULE       NAME                   SIZE  OBJECT FILE
ffffffffa03dd580  sampleblk              2681  /home/yango/ws/lktm/drivers/block/sampleblk/day1/sampleblk.ko

crash> mod -s ext4 /lib/modules/4.6.0-rc3+/kernel/fs/ext4/ext4.ko
     MODULE       NAME                   SIZE  OBJECT FILE
ffffffffa063cc40  ext4                 574717  /lib/modules/4.6.0-rc3+/kernel/fs/ext4/ext4.ko

然后,通过驱动的全局数据结构 struct sampleblk_dev 即可找回磁盘在内存中的起始地址和长度,

crash7> p *sampleblk_dev
$1 = {
  minor = 1,
  lock = {
    {
      rlock = {
        raw_lock = {
          val = {
            counter = 0
          }
        }
      }
    }
  },
  queue = 0xffff880034e38000,
  disk = 0xffff880034268000,
  size = 524288, /* 磁盘在内存中的长度 */
  data = 0xffffc900017bc000 /*此地址为磁盘在内存中的起始地址 */
}

crash7> p 524288/8
$5 = 65536                  /* 换算成字节数 */

4.3 查看 Super Block

根据 Ext4 磁盘布局,由于 sampleblk 上只存在一个 block group:group 0,因此,super block 存在于 group 0 上的第一个块。

首先,block group 0 距离磁盘起始位置的偏移是 boot block,而一个 block 的大小我们从前面的例子里可以得知是 1024 字节。因此,可以得到磁盘上 super block 的起始地址,

crash> p /x 0xffffc900017bc000+1024
$3 = 0xffffc900017bc400

然后,根据前面得到的 super block 起始地址,利用 crash 查看 struct ext4_super_block 数据结构的命令就可以直接查看 ext4 在磁盘上的 super block 的布局了,

crash> ext4_super_block 0xffffc900017bc400
struct ext4_super_block {
  s_inodes_count = 64,
  s_blocks_count_lo = 512,
  s_r_blocks_count_lo = 25,
  s_free_blocks_count_lo = 482,
  s_free_inodes_count = 53,
  s_first_data_block = 1,
  s_log_block_size = 0,
  s_log_cluster_size = 0,
  s_blocks_per_group = 8192,
  s_clusters_per_group = 8192,
  s_inodes_per_group = 64,
  s_mtime = 1464150337,
  s_wtime = 1464150337,
  s_mnt_count = 2,
  s_max_mnt_count = 65535,
  s_magic = 61267, /* 文件系统幻数 */

  ...[snipped]...
}

crash> p /x 61267
$5 = 0xef53 /* 文件系统幻数 */

而且,可以查看 ext4_super_block 的大小,

crash7> ext4_super_block | grep SIZE
SIZE: 1024

最后,用 debugfs 来检查 crash 查看的 super block 是否不是和 debugfs 一样准确,

$ sudo debugfs /dev/sampleblk1 -R show_super_stats
debugfs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          5c651ae8-bc3f-4fab-9e94-5b7d14c633f3
Filesystem magic number:  0xEF53  /* 文件系统幻数 */
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              64
Block count:              512
Reserved block count:     25
Free blocks:              482
Free inodes:              53
First block:              1
Block size:               1024
Fragment size:            1024
Group descriptor size:    64
Reserved GDT blocks:      3
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         64
Inode blocks per group:   8
Flex block group size:    16
Filesystem created:       Mon May 23 08:07:40 2016
Last mount time:          Tue May 24 21:25:37 2016
Last write time:          Tue May 24 21:25:37 2016
Mount count:              2
Maximum mount count:      -1
Last checked:             Mon May 23 08:07:40 2016
Check interval:           0 (<none>)
Lifetime writes:          93 kB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          128
Default directory hash:   half_md4
Directory Hash Seed:      31db6c7b-1f26-4ddb-87b9-2e9a9216ba8f
Directories:              2
 Group  0: block bitmap at 6, inode bitmap at 22, inode table at 38
           482 free blocks, 53 free inodes, 2 used directories, 53 unused inodes
           [Checksum 0x01c7]

4.4 查看 Group Descriptor

根据 block group 的格式,可以知道,磁盘的第三个块就是 Group Descriptor 的起始地址,

crash> p /x 0xffffc900017bc000+1024+1024
$6 = 0xffffc900017bc800

因此用 crash 可以看到这个地址对应的磁盘上的 Group Descriptor 的内容。很容易就找到 block bitmap, inode bitmap, 和 inode table 的所在块编号,

crash> ext4_group_desc 0xffffc900017bc800
struct ext4_group_desc {
  bg_block_bitmap_lo = 6,  /* block bitmap at 6 */
  bg_inode_bitmap_lo = 22, /* inode bitmap at block 22 */
  bg_inode_table_lo = 38,  /* inode table at block 38 */
  bg_free_blocks_count_lo = 482,
  bg_free_inodes_count_lo = 53,
  bg_used_dirs_count_lo = 2,
  bg_flags = 4,
  bg_exclude_bitmap_lo = 0,
  bg_block_bitmap_csum_lo = 0,
  bg_inode_bitmap_csum_lo = 0,
  bg_itable_unused_lo = 53,
  bg_checksum = 455,
  bg_block_bitmap_hi = 0,
  bg_inode_bitmap_hi = 0,
  bg_inode_table_hi = 0,
  bg_free_blocks_count_hi = 0,
  bg_free_inodes_count_hi = 0,
  bg_used_dirs_count_hi = 0,
  bg_itable_unused_hi = 0,
  bg_exclude_bitmap_hi = 0,
  bg_block_bitmap_csum_hi = 0,
  bg_inode_bitmap_csum_hi = 0,
  bg_reserved = 0
}

4.5 查看 inode table

inode table 就是以 inode record 为元素的数组,不同版本 Ext 文件系统,这里有些差别,

  • Ext2/Ext3 时代,磁盘 inode 数据结构和在 inode table 里的 inode record 长度一样,都是 128 字节。一个 record 就是一个磁盘 inode 数据结构。
  • Ext4时,为兼容旧版本文件系统,同时又为扩展新能力,磁盘 inode 结构 ext4_inode 和 inode table 里 inode record 长度不一致了。 此时,磁盘上的 inode record 长度在 superblock 的 s_inode_size 成员记录。 因此,如果 superblock 的 s_inode_size 超出 128 字节,其磁盘上的 inode record 是分两部分的,第一部分可能还是 128 字节,这样可以兼容原有的 ext2/ext3 文件系统。 第二部分的大小在 ext4_inode 结构的 i_extra_isize 成员记录。

例如,本实验中 ext4_inode 长度是 160 字节,但 inode record 的长度是 128 字节,因此,ext4_inode 结构超出 128 字节的部分并未被使用。

crash> ext4_inode | grep SIZE
SIZE: 160
crash> ext4_super_block.s_inode_size 0xffffc900017bc400
  s_inode_size = 128

从 Group Descriptor 得知,块 38 就是 inode table 的起始地址,因此可以得出其地址为,

crash> p /x 0xffffc900017bc000+1024*38  /* Super block 里显示块长度为 1024 */
$8 = 0xffffc900017c5800

crash> struct ext4_inode -x 0xffffc900017c5800
struct ext4_inode {
  i_mode = 0x0,
  i_uid = 0x0,
  i_size_lo = 0x0,
  i_atime = 0x57431cbc,
  i_ctime = 0x57431cbc,
  i_mtime = 0x57431cbc,
  i_dtime = 0x0,
  i_gid = 0x0,
  i_links_count = 0x0,
  i_blocks_lo = 0x0,
  i_flags = 0x0,

用 debugfs 可以直接查看块号是 38 的对应 ext4_inode 的内容。可以看到,两个结果是一致的。

$ sudo debugfs /dev/sampleblk1 -R 'bd 38'
debugfs 1.42.9 (28-Dec-2013)
0000  0000 0000 0000 0000 bc1c 4357 bc1c 4357  ..........CW..CW
0020  bc1c 4357 0000 0000 0000 0000 0000 0000  ..CW............
0040  0000 0000 0000 0000 0000 0000 0000 0000  ................

如果我们在新创建的文件系统中,创建一个文件。我们可以在 inode table 中定位这个文件的 inode。 如下命令可以创建一个文件,并且得到磁盘上文件对应的 inode 号,

$ sudo touch /mnt/a
$ sudo echo "Linux file system - 4" > /mnt/a
$ ls -i /mnt/a
12 /mnt/a

同样的,debugfs 也可以得到这个文件对应的 inode 号是 12,

$ sudo debugfs /dev/sampleblk1 -R 'show_inode_info a'
debugfs 1.42.9 (28-Dec-2013)
Inode: 12   Type: regular    Mode:  0644   Flags: 0x80000
Generation: 603494144    Version: 0x00000001
User:     0   Group:     0   Size: 22
File ACL: 21    Directory ACL: 0
Links: 1   Blockcount: 4
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x5745313c -- Tue May 24 21:59:40 2016
atime: 0x5745313c -- Tue May 24 21:59:40 2016
mtime: 0x5745313c -- Tue May 24 21:59:40 2016
EXTENTS:
(0):4109  /* 该文件的 Extent 区段号,稍后将会用到 */

Ext4_Disk_Layout 给出了通过 inode 号定位 inode table 里的 inode record 的具体方法,

Each block group contains sb->s_inodes_per_group inodes. Because inode 0 is defined not to exist, this formula can be used to find the block group that an inode lives in: bg = (inode_num - 1) / sb->s_inodes_per_group. The particular inode can be found within the block group’s inode table at index = (inode_num - 1) % sb->s_inodes_per_group. To get the byte address within the inode table, use offset = index * sb->s_inode_size.

因为我们 block group 只有一个,因此略过。只需要算出偏移即可,

crash> p /x 0xffffc900017bc000+1024*38+128*(12-1)
$14 = 0xffffc900017c5d80
crash> struct ext4_inode -x 0xffffc900017c5d80
struct ext4_inode {
  i_mode = 0x81a4,
  i_uid = 0x0,
  i_size_lo = 0x0,
  i_atime = 0x5745313c,
  i_ctime = 0x5745313c,
  i_mtime = 0x5745313c,
  i_dtime = 0x0,
  i_gid = 0x0,
  i_links_count = 0x1,
  i_blocks_lo = 0x2,
  i_flags = 0x80000,
[...snipped...]
  i_block = {127754, 4, 0, 0, 1, 4109, 0, 0, 0, 0, 0, 0, 0, 0, 0},  /* 数据映射区域,B+ 树节点 */

4.6 查看 Extent Tree

Ext3 文件系统使用了直接、间接、二级间接和三级间接块的形式来定位磁盘中的数据块。 通过 ext3_inode->i_block[] 数组可以定位到该 inode 的数据存储的位置。

  • i_block[0] 到 i_block[11] 存储的是 data block 号。如果文件小于12 个块时,就存储在这里。

  • i_block[12] 存储的是 Indirect block (一级间接映射) ,即其指向的块存储的不是数据,而是块号。 如果文件大于 12 个块,而小于 blocksize/4 + 12 时,i_block[12] 指向的数据有效。其存储的数据块个数为:blocksize/4.

  • i_block[13] 存储的是 Double indirect block (二级间接映射). 其存储的数据块个数可以为:blocksize/4 * blocksize/4.

  • i_block[14] 存储的是 Triple indirect block (三级间接映射). 其存储的数据块个数为:blocksize/4 * blocksize/4 * blocksize/4.

Ext3 的这种数据块映射和存储方式比较低效,1000 个连续的数据块也需要相应的 1000 个映射这些数据块的元数据记录。而且也因此限制了单个文件的大小。

Ext4 则引入了 Extent (区段) 的概念,使用 B+ 树来索引数据块。这时,1000 个连续的数据块只需要一个 12 字节的 ext4_extent 数据结构就可以描述。 通过 ext4_inode->i_block[] 数组可以定位到 Extent (区段) 的数据存储的位置。

  • i_block[0] 到 i_block[2] 3 个元素一定是一个 ext4_extent_header 结构
  • i_block[3] 到 i_block[15] 共 12 个元素,每 3 个元素可能是一个 ext4_extent 或 ext4_extent_idx 结构,这取决于所表示的文件的大小。

例如,本例中,ext4_extent_header 的 eh_depth 为 0,就表示后面 4 组元素都应该是 B+ 树的叶子节点,即 ext4_extent 结构。

crash> struct -o ext4_inode.i_block 0xffffc900017c5d80
struct ext4_inode {
  [ffffc900017c5da8] __le32 i_block[15];
  }

crash> ext4_extent_header -x ffffc900017c5da8
struct ext4_extent_header {
  eh_magic = 0xf30a,  /* Magic number, 0xF30A */
  eh_entries = 0x1,   /* Inode 对应的 Extent 区段数 */
  eh_max = 0x4,		  /* 最大的区段数 */
  eh_depth = 0x0,     /* 段节点在段树中的深度。0 则表示为叶子节点,指向数据块;否则指向其它段节点 */
  eh_generation = 0x0
}

本例中,eh_entries 为 1,表明只有一个区段,且存放于 i_block[3] 到 i_block[5],

crash> p /x 0xffffc900017c5da8+0x12
$13 = 0xffffc900017c5dba
crash> struct ext4_extent 0xffffc900017c5dba
struct ext4_extent {
  ee_block = 0,
  ee_len = 1,         /* Extent 里的块的个数,因为是 __le16 类型,所以一个 extent 块数是 <= 32768 */
  ee_start_hi = 0,
  ee_start_lo = 4109  /* 文件对应的区段的数据块号,与 debugfs 显示结果一致 */
}

由于一个 extent 最大块数是 32768,因此对于 4k 大小的块来说,一个 extent 的最大长度就是 128M。

4.7 查看 Data Block

前面我们已经通过遍历 ext4_inode->i_block[] 的 B+ 树节点找到了 /mnt/a 文件对应的数据块号。所以很容易计算出 4109 块号对应的内存地址,并且打印其内容,

crash7> p /x 0xffffc900017bc000+4109*1024  /* Super block 里显示块长度为 1024 */
$15 = 0xffffc90001bbf400
crash7> rd -a 0xffffc90001bbf400
0xffffc90001bbf400:  Linux file system - 4

可以看到,正是我们创建该文件时写入的字符串。此外,我们也可以利用 debugfs 工具的命令来查看指定数据块号的内容,

$ sudo debugfs /dev/sampleblk1 -R 'bd 4109'
debugfs 1.42.9 (28-Dec-2013)
0000  4c69 6e75 7820 6669 6c65 2073 7973 7465  Linux file syste
0020  6d20 2d20 340a 0000 0000 0000 0000 0000  m - 4...........
0040  0000 0000 0000 0000 0000 0000 0000 0000  ................

至此,我们清楚地了解了 Ext4 文件系统是如何从文件的 inode 号定位到磁盘上的 inode 结构,然后定位到具体数据存放的数据块的。

以上来自:http://oliveryang.net/2016/05/linux-file-system-basic-4/#37-data-block  深入研究ext4 

 

mkfs.ext4 参数

-b block-size 块大小(1k,2k,4k)
-c 坏块测试
-l filename从文件读坏块列表
-C cluster-size 簇大小 (大块分配持性)
-D 使用direct I/O
-E 扩展属性
   mmp_update_interval=MMP更新时间间隔,必需小于300s
   stride=条块大小(RAID组中每个条带单元chunk大小)
   stripe_width=条带大小 (单位为block),(在数据定时,块分配器尽可能的防止产生read-modify-write)
   resize=保留在线调整时的空间大小
   lazy_itable_init=0/1 inode表不完全初始化 (挂载时由内核在后台初始化)    // 40TG mount后50M写初始化55分钟 (格式化时:20s,强制初始化时:7min)  (mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 )
   lazy_journal_init=0/1日志inode表不完全清0
   test_fs设置文件系统体验标志
              
-F(force 强制)
-f  fragment-size  指定片段大小
-g blocks-per-group  指定每一个块组内块的数量
-G number-of-groups  指定块组数量(在元数据负载重时可以提高元数据性能)
-i bytes-per-inode  指定 bytes/inode 比率
-I inode-size 指定inode大小
-j 创建一个ext3日志。默认创建合适大小的日志区
-J 创建指定属性的日志。逗号分隔。 (size=1024块 内部日志大小,device= 外部日志设备 )
    size= journal-size  内部日志大小,单位为M,最小为1024个文件系统块,(最大为10240000个文件系统块或文件系统的一半)
    device = external-journal 外部日志块设备(设备名,标签,UUID)
    外部日志必需先创建:mke2fs -b 4096 -O journal_dev  external-journal (/dev/ramhda)
    mkfs.ext4 -J device= external-journal (/dev/ramhda)  -F /dev/mapper/vggxxxxxxx
-L 设置volume 标签,最长为16个byte
-m 指定保留空间百分比,为root用户
-M 设置最后挂载目录
-n 不真正创建文件系统,只是显示创建的信息
-S  只写超级块和块组描述符。(当超级块和备份超级块错误后,可以用来恢复数据。因为它不会touching inode表和bitmap)
-O feature 指定创建文件系统时的持性(/etc/mke2fs.conf)
bigalloc 使能大块分配(cluster-size)
dir_index 使用哈希B树加速目录查找
extents 使用extents替代间接块
filetype在目录项中存储文件类型信息
flex_bg 允许为每一个块组元数据(分配bitmap和inode表)存放在任何位置 
has_journal  创建ext3日志(-j)
journal_dev 在给定的设备上创建外部ext3日志
large_file 支持>2G的文件(现代内核会自动打开) 
quota 创建quota inodes(inode#3为用户配额,inode#4为组配额) ,并在超级块中设置。
               (挂载后自己启用quota)
resize_inode 保留空间以便未来块组描述表增长。用于resize2fs
sparse_super 创建少量的超缓块拷贝
uninit_bg   创建文件系统时不初始化所有的块组,加速创建时间,和e2fsck时间、
-O^has_journal   不启用日志

文件系统属性:
1,/proc/fs/ext4/设备/options  查已挂载文件系统属性
  rw 文件系统挂载时的读写策略
  delalloc 开启延时块分配
  barrier 开启write barrier(提供写顺序)
  user_xattr
  acl
  resuid=0 可以使用保留块的用户ID
  resgid=0 可以使用保留块的组ID
  errors=continue 文件系统出错时动作
  commit=5 文件系统刷cache的时间间隔
  max_batch_time=15000us 最大的等待合并一起提交的时间,默认15ms
  min_batch_time=0us 最小的等待合交一起提交的时间,0us
  stripe=0 多块分配时和对齐的块数,对于raid5/6,大小为数据磁盘数*chunk大小
  data=ordered 文件系统挂载模式
  inode_readahead_blks=32 先行读入缓冲器缓存(buffer cache)的inode表块(table block)数的最大值
  init_itable=10
  max_dir_size_kb=n 目录大小限制


     mb_order2_req=2 对于大于该值(2的幂次方)的块,要求使用Buddy检索
     lifetime_write_kbytes 文件系统生成后写入的数据量(KB)
     mb_stats 指定收集(1)或不收集(0)多块分配的相关统计信息。统计信息在卸载时显示 0(禁用)
     max_writeback_mb_bump 进行下一次inode处理前尝试写入磁盘的数据量的最大值(MB) 128
     mb_stream_req=0 块数小于该值的文件群被集中写入到磁盘上相近的区域
     mb_group_prealloc 未指定挂载选项的stripe参数时,以该值的倍数为单位确保块的分配 512
     session_write_kbytes 挂载后写入文件系统的数据量(KB)
    
2,/sys/fs/ext4/设备/
      mb_stream_req=16 块数小于该值的文件群被集中写入到磁盘上相邻的区域
      inode_readahead_blks=32 控制进行预读的inode表的数量
      inode_goal 下一个要分配的inode编号(调试用) 0(禁用)
      delayed_allocation_blocks 等待延迟分配的块数
      max_writeback_mb_bump=128 进行下一次inode处理前尝试写入磁盘数据量的最大值(MB)
      mb_group_prealloc=512 未指定stripe参数时,以该值的倍数为单位确保块的分配
      mb_max_to_scan=200 分配多块时为找出最佳extent而搜索的最大extent数
      mb_min_to_scan=10 分配多块时为找出最佳extent而搜索的最小extent数
      mb_order2_req=2 对于大于该值的块(2的幂),要用buddy算法。
      mb_stats=0 指定收集1,与不收集0多块分配的相关统计信息,统计信息会在卸载时显示
      reserved_clusters
      lifetime_write_kbytes 只读,记录已经写入文件系统的数据量(kb).
      session_write_kbytes 只读,记录此记挂载以来已写入的数据(kb).

扩大文件系统:ext2/ext3/ext4 resize2fs

来自:http://linux.51yip.com/search/mkfs.ext4

 

 

 

xfs 文件系统:

XFS文件系统的描述数据观察

EXT 家族的 dumpe2fs 去观,而XFS 家族用 xfs_info 去观察

[root@study ~]# xfs_info挂载点|装置文件名

[root@study ~]# df - - T /boot

Filesystem      Type     1K-blocks     Used     Available     Use%     Mounted on

/dev/vda2        xfs     1038336       133704   904632        13%      /boot

没错!可以看得出来是 xfs 文件系统的!来观察一下内容吧!

[root@study ~]# xfs_info /dev/vda2

1    meta-data=/dev/vda2     isize=256    agcount=4, agsize=65536 blks

2                    =              sectsz=512   attr=2, projid32bit=1

3                    =              crc=0        finobt=0

4            data =              bsize=4096   blocks=262144, imaxpct=25

5                    =              sunit=0      swidth=0 blks

6        naming= version 2    bsize=4096   ascii-ci=0 ftype=0

7          log    = internal     bsize=4096   blocks=2560, version=2

8                   =              sectsz=512   sunit=0 blks, lazy-count=1

9     realtime =none          extsz=4096   blocks=0, rtextents=0

  • 第1 行里面的isize 指的是inode 的容量,每个有256bytes 这么大。至于agcount 则是前面谈到的储存区群组(allocation group) 的个数,共有4 个, agsize 则是指每个储存区群组具有65536 个block 。配合第4 行的block 设定为4K,因此整个档案系统的容量应该就是4*65536*4K 这么大!
  • 第2 行里面sectsz 指的是逻辑磁区(sector) 的容量设定为512bytes 这么大的意思。
  • 第4 行里面的bsize 指的是block 的容量,每个block 为4K 的意思,共有262144 个block 在这个档案系统内。
  • 第5 行里面的sunit 与swidth 与磁碟阵列的stripe 相关性较高。这部份我们底下格式化的时候会举一个例子来说明。
  • 第7 行里面的internal 指的是这个登录区的位置在档案系统内,而不是外部设备的意思。且占用了4K * 2560 个block,总共约10M 的容量。
  • 第9 行里面的realtime 区域,里面的extent 容量为4K。不过目前没有使用。

来自:https://www.cnblogs.com/linux2088/p/6201244.html

 

一、XFS为什么替换Ext4?

前面我们介绍过Linux ext系列的文件系统,我想ext系列应该是文件系统史上非常经典的杰作。在CentOS 7之前都是默认采用的这一系列文件系统。但是从CentOS 7开始默认的文件系统变成了xfs文件系统,为啥?

ext系列虽然支持度最广,但是格式化超慢。

ext文件系统系列对于文件格式化的处理方面,采用的是预先规划出所有inode、区块、元数据等数据,未来系统可以直接使用,不需要再进行动态配置的做法。即固定分配好文件系统所需的各种数据,不支持动态分配。这种做法,对于早期磁盘容量是合适的,但是对于当前大容量的磁盘缺陷就很明显了,例如TB以上等级传统的ext系列文件系统在格式化的时候,光是系统要预先分配inode与区块就消耗好多时间。我们项目在采用CentOS 6.5的时候,格式化一个10多点T的时候花费的时间是以小时为单位计算。

二、XFS数据分布的变化

xfs文件系统在数据的分布上,相对于ext系列有明显的变化,主要规划为三个部分,一个数据区,一个文件系统登录区,一个实时运行区。

1、数据区,data section

基本上,数据区和我们之前介绍的ext系列一样,包括inode,数据块,超级块等数据。这个数据区也和ext系列的块组类似,也分为多个块组,不过xfs称作AGallocation groups,分配组)。但是,它的inode与数据块都是系统需要用到时才动态配置的,所以格式化操作非常快。而且,xfs的逻辑块block与inode有多种不同的容量可供设置。但是因存储控制的关系(页面文件pagesize的容量一般4K),建议块的大小最好也是4K,而inode最好为256B。关于页面和磁盘的一些关系和知识后续章节再介绍。

文件和文件夹可以跨越分配组。这一机制为XFS提供了可伸缩性和并行特性——多个线程和进程可以同时在同一个文件系统上执行I/O操作。这种由分配组带来的内部分区机制在一个文件系统跨越多个物理设备时特别有用,使得优化对下级存储部件的吞吐量利用率成为可能。

2、文件系统登录区,log section

也称为日志区,用来记录文件系统的变化。文件的变化会在这里记录下来,直到该变化完整的写入数据区后,该条记录才会被结束。日志的作用是保证文件系统的一致性。

因为所有的文件操作都会在这个区做记录,因此这个区块的磁盘活动相当频繁,所以你可以指定外部的磁盘例如SSD来作为xfs文件系统的日志区。

3、实时运行区, realtime section

当有文件要被创建时,xfs会在这个区段里面找到一个到数个extend区块,将文件放置在这个区块内,等待分配完成后,再写入到data section的inode与区块中。这个区块的大小要在格式化的时候就先指定,最小值4K最大到1G。 (一般非磁盘阵列的磁盘默认64K,而具有类似盘阵的stripe情况下,建议extend设置与stripe一样大。)

 总之实时运行区段由变长Extent管理,B+树组成

其中,一个B+树用于索引未被使用的Extent的长度,另一个索引这些Extent的起始块。这种双索引策略使得文件系统在定位剩余空间中的Extent时十分高效。

因为文件系统对每个文件使用一个Extent表,文件分配表就可以保持一个较小的体积。对于太大以至于无法存储在inode中的分配表,这张表会被移动到B+树中,继续保持对该目标文件在64位地址空间中任意位置的数据的高效访问

最后,xfs的这些数据可以通过什么命令来查看呢?像ext系列的dumpe2fs,xfs使用xfs_info来查看超级区块内容,AG大小尺寸以及extent的大小等等。

三、XFS的定义与特性

XFS一种高性能的日志文件系统,最早于1993年,由Silicon Graphics为他们的IRIX操作系统而开发,是IRIX 5.3版的默认文件系统。2000年5月,Silicon Graphics以GNU通用公共许可证发布这套系统的源代码,之后被移植到Linux 内核上。XFS 特别擅长处理大文件,同时提供平滑的数据传输

xfs在很多方面确实做的比ext4好,ext4受限制于磁盘结构和兼容问题,可扩展性和scalability确实不如xfs,另外xfs经过很多年发展,各种锁的细化做的也比较好。

主要特性包括以下几点: 

1、数据完全性

采用XFS文件系统,当意想不到的宕机发生后,首先,由于文件系统开启了日志功能,所以你磁盘上的文件不再会意外宕机而遭到破坏了。不论目前文件系统上存储的文件与数据有多少,文件系统都可以根据所记录的日志在很短的时间内迅速恢复磁盘文件内容。

2、传输特性

XFS文件系统采用优化算法,日志记录对整体文件操作影响非常小。XFS查询与分配存储空间非常快。xfs文件系统能连续提供快速的反应时间。

3、可扩展性

XFS 是一个全64-bit的文件系统,它可以支持上百万T字节的存储空间。对特大文件及小尺寸文件的支持都表现出众,支持特大数量的目录。最大可支持的文件大小为263 = 9 x 1018 = 9 exabytes,最大文件系统尺寸为18 exabytes。

4、数据结构

XFS使用高效的表结构(B+树),保证了文件系统可以快速搜索与快速空间分配。XFS能够持续提供高速操作,文件系统的性能不受目录中目录及文件数量的限制。

5、传输带宽

XFS 能以接近裸设备I/O的性能存储数据。在单个文件系统的测试中,其吞吐量最高可达7GB每秒,对单个文件的读写操作,其吞吐量可达4GB每秒。 

  

总之,XFS有许多独特的性能提升功能使他从众多文件系统中脱颖而出,像可伸缩/并行IO元数据日志热碎片整理IO暂停/恢复延迟分配等。 

但是,XFS文件系统有一些缺陷,例如它不能压缩,删除大量文件时性能低下

 对于xfs性能缺陷,网上也有高手提出了解决方案(https://www.jianshu.com/p/ac28162d08fd):

mkfs.xfs -f -i size=512-l size=128m,lazy-count=1-d agcount=16/dev/sdb1

以上来自:https://www.cnblogs.com/orange-CC/p/12711078.html

 

Linux XFS系统格式化命令

[root@study ~]# mkfs.xfs [- - b bsize] [- - d parms] [- - i parms] [ [- - l parms] [- - L label] [- - f] \ \

[ [- - r parms] 装置名称

选项与参数:

关于单位:底下只要谈到『数值』时,没有加单位则为 bytes 值,可以用 k,m,g,t,p (小写)等来解释

比较特殊的是 s 这个单位,它指的是 sector 的『个数』喔!

-b :后面接的是 block 容量,可由 512 到 64k,不过最大容量限制为 Linux 的 4k 喔!

-d :后面接的是重要的 data section 的相关参数值,主要的值有:

agcount=数值 :设定需要几个储存群组的意思(AG),通常与 CPU 有关

agsize=数值 :每个 AG 设定为多少容量的意思,通常 agcount/agsize 只选一个设定即可

file :指的是『格式化的装置是个文件而不是个装置』的意思!(例如虚拟磁盘)

size=数值 :data section 的容量,亦即你可以不将全部的装置容量用完的意思

su=数值 :当有 RAID 时,那个 stripe 数值的意思,与底下的 sw 搭配使用

sw=数值 :当有 RAID 时,用于储存数据的磁盘数量(须扣除备份碟与备用碟)

sunit=数值 :与 su 相当,不过单位使用的是『几个 sector(512bytes 大小)』的意思

swidth=数值 :就是 su*sw 的数值,但是以『几个 sector(512bytes 大小)』来设定

-f :如果装置内已经有文件系统,则需要使用这个 -f 来强制格式化才行!

-i :与 inode 有较相关的设定,主要的设定值有:

size=数值 :最小是 256bytes 最大是 2k,一般保留 256 就足够使用了!

internal=[0|1]:log 装置是否为内建?预设为 1 内建,如果要用外部装置,使用底下设定

logdev=device :log 装置为后面接的那个装置上头的意思,需设定 internal=0 才可!

size=数值 :指定这块登录区的容量,通常最小得要有 512 个 block,大约 2M 以上才行!

-L :后面接这个文件系统的标头名称 Label name 的意思!

-r :指定 realtime section 的相关设定值,常见的有:

extsize=数值 :就是那个重要的 extent 数值,一般不须设定,但有 RAID 时,

最好设定与 swidth 的数值相同较佳!最范例一:列出 /dev/vda 磁盘的相关数据

 

du:评估文件系统的磁盘使用量(常用在推估目录所占容量)

[root@study ~]# du [- - ahskm] 文件或目录名称

选项与参数:

-a:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。

-h:以人们较易读的容量格式 (G/M) 显示;

-s:列出总量而已,而不列出每个各别的目录占用容量;

-S:不包括子目录下的总计,与 -s 有点差别。

-k:以 KBytes 列出容量显示;

-m:以 MBytes 列出容量显示;

 

parted列出磁盘的分区表类型与分区信息

[root@study ~]# parted /dev/vda print

Model: Virtio Block Device (virtblk)         # 磁盘的模块名称(厂商)

Disk /dev/vda: 42.9GB                        # 磁盘的总容量

Sector size (logical/physical): 512B/512B    # 磁盘的每个逻辑/物理扇区容量

Partition Tablegpt                         # 分区表的格式 (MBR/GPT)小为 4K 最大为 1G

 

 

blkid列出装置的 UUID 等参数

 

 

lsblk列出系统上的所有磁盘列表

[root@study ~]# lsblk [- - dfimpt] [device]

选项与参数:

-d:仅列出磁盘本身,并不会列出该磁盘的分区数据

-f:同时列出该磁盘内的文件系统名称

-i:使用 ASCII 的线段输出,不要使用复杂的编码 (再某些环境下很有用)

-m:同时输出该装置在 /dev底下的权限数据 (rwx的数据)

-p:列出该装置的完整文件名!而不是仅列出最后的名字而已。

-t:列出该磁盘装置的详细数据,包括磁盘队列机制、预读写的数据量大小等

 

默认输出的信息详解:

 NAME:就是装置的文件名啰!会省略 /dev 等前导目录!

 MAJ:MIN:其实核心认识的装置都是透过这两个代码来熟悉的!分别是主要:次要装置代码!

 RM:是否为可卸除装置 (removable device),如光盘、USB 磁盘等等

 SIZE:当然就是容量啰!

 RO:是否为只读装置的意思

 TYPE:是磁盘 (disk)、分区槽 (partition还是只读存储器 (rom等输出

 MOUTPOINT:就是前一章谈到的挂载点!

 

 

使用parted命令可以分辨分区表类型,『MBR 分区表使用 fdisk 分区, GPT 分区表使用 gdisk 分区!』

[root@study ~]# gdisk  装置名称  具体看下行

[root@study ~]# gdisk  /dev/vda      <==仔细看,不要加上数字喔!

Command (? for help): ?

前面省略。。。

d     te a partition                 # 删除一个分区

中间省略。。。

n     add a new partition            # 增加一个分区

省略一行

p     print the partition table         # 印出分区表 (常用)

q     quit without saving changes     # 不储存分区就直接离开 gdisk

省略部分。。。

w     write table to disk and exit     # 储存分区操作后离开 gdisk

不管你进行了什么动作,只要离开 gdisk 时按下『q』,那么所有的动作『都不会生效!』相反的, 按下『w』就是动作生效的意思。

使用的『装置文件名』请不要加上数字,因为 partition是针对『整个磁盘装置』而不是某个 partition 呢!

 

磁盘与目录的容量

 df:列出文件系统的整体磁盘使用量;

[root@study ~]# df [- - ahikHTm] [ 目 录 或文件名] ]

选项与参数:

-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;

-k:以 KBytes 的容量显示各文件系统;

-m:以 MBytes 的容量显示各文件系统;

-h:以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

-H:以 M=1000K 取代 M=1024K 的进位方式;

-T:连同该 partition 的 filesystem 名称 (例如 xfs) 也列出;

-i:不用磁盘容量,而以 inode 的数量来显示

 

以上来自:https://www.cnblogs.com/linux2088/p/6201244.html

 

 

 

 

参考:

https://www.51cto.com/article/667640.html

https://zhuanlan.zhihu.com/p/326496788

posted @   redrobot  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-03-01 linux编译内核模块
2022-03-01 分布式锁
点击右上角即可分享
微信分享提示