Ext4 Disk Layout (ext4 磁盘布局)

本文介绍了Ext4文件系统的磁盘布局方式,包括其与Ext2/3的共通特性及特有的性能优化策略。详细解释了块组的概念,超级块与组描述符的作用及其在磁盘上的分布情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

英文原文网址:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout


本文主要介绍ext4文件系统在磁盘上的格式。一些和ext2/3文件系统共同的特性也可以适用于ext2/3,只不过ext4的一些特性ext2无法支持。

1 相关术语

ext4文件系统把一个物理存储切分成物理快的数组,可以减少bookkeeping的开销,并且提升大数据量传输的吞吐量。通常块大小是4KB,计算公式为2 ^ (10 + sb.s_log_block_size) bytes。在本文所有的磁盘地址都是基于这个逻辑块大小,而不是原始的 LBAs和1024byte的块。为了方便阅读,本文后面的块大小都用$block_size来表示,

当分析已经格式化好了的文本块的时候,sb指的是super block区域,inode指的是inode table区域。


2 概述

ext4文件系统被切分为多个块组。为了减少由于碎片化导致的性能下降,块分配器尽量让每个文件的块都在同一个块组内,这样可以减少seek的定位时间。块组的大小由sb.s_blocks_per_group决定,单位是块,默认情况下是8*block_size_in_bytes。在默认块大小为4KB时,每个块组会包含32768个块,总大小128M。块组的个数由设备总大小除以每个块组的大小。

所有ext4区域都是用小端存储方式。所有jbd2(日志) 都是用大端存储模式。

2.1 块

ext分配存储的单位是块,一个块是一组扇区组成,总大小在1K到64K,扇区数量必须是2的整数倍。多个连续块又组成块组。块大小在用命令mkfs创建文件系统的时候指定,一般是4KB。很多人可能都会经历过挂载问题,特别是当块大小比页大小还要大的时候(例如:64K的块,但是只有4K的内存页)。默认文件系统可以支持2^32Byte的块,如果64位系统特性使能,可以有2^64Byte的块。

注意:没用用extens的文件必须放在文件系统的前2^32个块里面,有extents的文件必须放在前2^48个块中,更大的文件会有什么问题目前还不确定。


2.2 布局

标准的块组布局如下:

块组0比较特殊,前1024个Bytes都没有用,为了兼容安装x86的启动扇区和其他特俗场景。超级快会在1024的偏移处开始,每一个块组都是这样(通常来说都是第0块组)。然而当块大小刚好等于1024,于是第0块被标记为已经在使用,超级快就被设置到第1块。对于所有其他块组,都没有padding的1024Byte。

ext4驱动主要操作超级快,和块组0中找到的组描述符。superblock和组描述符会重复的拷贝到一些块组中,防止磁盘起始位置被破坏,但是,并不是每一个块组都需要保存一份这种拷贝。如果一个块组没有这种备份,那么块组直接从data block bitmap开始。注意,当系统是刚刚格式化的,mkfs会在块组描述符后分配“保留的GDT 块”,用于后期的功能扩展。默认情况下文件系统允许在原来的文件系统大小基础上扩容,要求是1024的倍数。

inode table的地址由变量grp.bg_inode_table_*给出。inode table是一个连续的足够大的块,能包含sb.s_inodes_per_group*sb.s_inode_size bytes。








### 如何在 Ubuntu 22.04 虚拟机中扩展磁盘空间 #### 准备工作 为了实现虚拟机中的磁盘扩容,首先需要调整虚拟机的磁盘大小。这可以通过虚拟机管理器(如 VMware Workstation 或 VirtualBox)来完成。以下是具体的操作方法。 --- #### 使用 VMware 进行磁盘扩容 1. **关闭虚拟机** 确保目标虚拟机关机状态,因为无法对正在运行的虚拟机执行磁盘修改操作[^1]。 2. **增加虚拟磁盘容量** 在 VMware 中右键单击虚拟机,选择 `Settings` -> `Hard Disk (SCSI)` -> `Utility` -> `Expand...`,输入新的磁盘大小并确认保存更改[^2]。 3. **启动虚拟机并检查新磁盘空间** 启动虚拟机后,使用以下命令查看当前磁盘分区情况: ```bash lsblk ``` 如果新增加的空间未被分配到现有分区,则需进一步处理。 4. **扩展分区** - 安装 `parted` 工具用于管理和调整分区表: ```bash sudo apt update && sudo apt install parted -y ``` - 使用 `parted` 创建一个新的逻辑分区覆盖剩余空间: ```bash sudo parted /dev/sda mkpart primary ext4 START END quit ``` 5. **扩展文件系统** - 对于已有的根分区 `/`,可以使用 `resize2fs` 来扩展其文件系统: ```bash sudo resize2fs /dev/sdaX ``` (注意:将 `sdaX` 替换为实际的目标分区号) --- #### 使用 VirtualBox 进行磁盘扩容 1. **关闭虚拟机** 类似 VMware 的操作,先确保虚拟机处于关机状态[^3]。 2. **增大 VDI 文件大小** 利用 VirtualBox 提供的命令行工具 `VBoxManage` 修改磁盘大小: ```bash VBoxManage modifyhd "path_to_your_vdi_file.vdi" --resize NEW_SIZE_IN_MB ``` 将 `NEW_SIZE_IN_MB` 设置为目标磁盘大小(单位 MB),例如 `--resize 20000` 表示 20GB。 3. **启动虚拟机并初始化 GParted Live CD** 下载 [GParted](https://gparted.org/) ISO 并将其挂载至虚拟光驱。通过引导进入 GParted 图形界面,手动拖拽分区边界以利用新增空间[^4]。 4. **验证改动效果** 返回终端再次运行 `lsblk` 和 `df -h` 查看最终结果。 --- #### 自动化脚本辅助 如果频繁遇到此类需求,可编写简单的 Bash 脚本来简化流程: ```bash #!/bin/bash # 更新包列表并安装必要组件 sudo apt update && sudo apt install gdisk lvm2 -y # 显示当前磁盘结构 echo "Current disk layout:" lsblk # 输入要扩大的设备路径 read -p "Enter the device to expand (e.g., /dev/sda): " DEVICE # 初始化 fdisk 操作 fdisk $DEVICE <<EOF n p t 8e w EOF # 加载 LVM 功能模块 pvcreate ${DEVICE}1 vgextend ubuntu-vg ${DEVICE}1 lvextend -l +100%FREE /dev/mapper/ubuntu--vg-root # 执行文件系统增长 resize2fs /dev/mapper/ubuntu--vg-root echo "Disk expansion completed successfully!" ``` 此脚本适用于基于 LVM 的 Ubuntu 系统,能够自动识别可用空间并将之加入默认卷组。 --- #### 注意事项 - 若原始磁盘采用 MBR 分区方案而非 GPT,则可能受限于最大支持四个主分区的数量上限。 - 当前教程假设用户熟悉基本 Linux 命令行交互;对于初学者而言,建议优先尝试图形化工具如 GParted[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值