在前文《磁盘开篇:扒开机械硬盘坚硬的外壳!》和《拆解固态硬盘结构》中,咱们了解到了硬盘基本单位是扇区。在《磁盘分区也是隐含了技术技巧的》中咱们也了解了磁盘分区是怎么回事,但刚分完区的硬盘也是不能直接被被操做系统使用的,必须还得要通过格式化。那么今天咱们就简单聊一聊,Linux下的格式化到底都干了些啥。node
Linux下的格式化命令是mkfs
,mkfs在格式化的时候须要制定分区以及文件系统类型。该命令其实就是把咱们的连续的磁盘空间进行划分和管理。我在个人机器上执行了一下,输出以下:数组
# mkfs -t ext4 /dev/vdb mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 6553600 inodes, 26214400 blocks 1310720 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2174746624 800 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872
接下来让咱们深刻理解一下上面输出里携带的信息。服务器
在上面的结果中咱们看到了几个重要信息oracle
块大小设置的是4096字节,咱们来分析两种场景ide
很明显,以上这两种状况下4096字节的块大小是不合适的。你须要本身根据状况选择本身的块大小进行从新格式化。操作系统
咱们再看另外的两个数据,inode数量和block数量。咱们用block数量除一下inode,26214400/6553600=4,也就是说平均4个block会有一个inode。再举两个极端的例子:code
这些状况下,block和inode的配比也都是不符合你使用的,你须要根据本身的业务从新配置。mkfs傻瓜格式出来的结果没法知足你的业务需求,你就须要使用另一些格式化命令了,好比mke2fs,这个命令容许你输入更详细的格式化选项,demo以下:blog
mke2fs -j -L "卷标" -b 2048 -i 8192 /dev/sdb1
咱们再回头看格式化后的结果,结果中显示了一些和groups相关的东东,以下:索引
800 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group
那么这个groups到底说的是啥呢?其实呀,格式化后的全部inode并非挨着一块儿放的,一样block也不是。而是分红了一个个的group,每个group里都有一些inode和block。逻辑图以下:ip
这个块组通常是多大呢?注意每一个块中的数据块位图只有一个,假如你的块大小为4KB,这样一个bit表明一个数据块,4KB能够有32KB个bit,能够管理32K*4K=128M的数据块。来让咱们实际动手验证一下,以下:
# dumpe2fs /dev/vdb ...... Block size: 4096 Inode size: 256 Inode count: 6553600 Block count: 26214400 ...... Group 16: (Blocks 524288-557055) [INODE_UNINIT, ITABLE_ZEROED] Checksum 0xe838, unused inodes 8192 Block bitmap at 524288 (+0), Inode bitmap at 524304 (+16) Inode表位于 524320-524831 (+32) 24544 free blocks, 8192 free inodes, 0 directories, 8192个未使用的inodes 可用块数: 532512-557055 可用inode数: 131073-139264 ...... Group 799: (Blocks 26181632-26214399) [INODE_UNINIT, ITABLE_ZEROED] ......
上述结果中包含信息以下:
好了,了解了以上原理之后,让咱们回头在来看看目录使用的数据是怎么在磁盘上组织的。建立目录的时候,操做系统会在inode位图上寻找还没有使用的inode编号,找到后把inode分配给你。目录会默认分配一个block,因此还须要查询block位图,找到后分配一个block。在block里面,存储的就是文件系统本身定义的desty结构了,每个结构里会保存其下的文件名,文件的inode编号等信息。某个实际文件夹在磁盘上最终使用的空间以下图所示:
目录的block中保存的是其下面的文件和子目录的desty结构体,保存着它们的文件名和inode号。理解了目录,对于文件也是同样的。也须要消耗inode,当有数据写入的时候,再去申请block。
硬盘就是一个扇区组成的大数组,是没法被咱们使用的,须要通过分区、格式化和挂载三个步骤。分区是把全部的扇区按照柱面分割成不一样的大块,格式化就把原始的扇区数组变成了可被Linux文件系统使用的inode、block等基本元素了。感受格式化程序有点像是厨师团队里的那个切墩的,把原材料变成了可被厨师直接使用的葱花,肉段。格式化完后再通过最后一步挂载,对应的命令是mount
,而后你就能够在它下面建立和保存文件了。
再扩展一下其实刚分完区的设备也是可使用的,这个时候的分区叫裸分区,也叫裸设备。好比oracle就是绕开操做系统直接使用裸设备的。可是这个时候你就没法利用Linux文件系统里为你封装好的inode、block组成的文件与目录了,开发工做量会增长。
发现写文章的过程当中最费时的是画图,眼睛快瞎了,路过就给个赞把,谢了!
开发内功修炼之硬盘篇专辑:
个人公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不仅介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提升你的技术实践能力。欢迎你来关注个人公众号,也请分享给你的好友~~~