Ubuntu ext4 数据盘缩容并新建分区实践
操作系统: Ubuntu
文件系统: ext4
分区工具: fdisk + resize2fs + e2fsck
磁盘类型: NVMe SSD
一、需求背景
机器有两块 NVMe SSD:
| 磁盘 | 用途 |
|---|---|
/dev/nvme0n1 | Ubuntu 系统盘 |
/dev/nvme1n1 | 数据盘(2TB) |
当前数据盘只有一个分区:
/dev/nvme1n1
└── nvme1n1p1
ext4
1.9TB
挂载:
/home/user/works
由于希望将开发项目和历史数据分开管理,需要将该分区拆分为两个独立分区:
| 分区 | 大小 | 挂载点 |
|---|---|---|
| nvme1n1p1 | 约1.1TB | /home/user/works |
| nvme1n1p2 | 约800GB | /home/user/workspace |
最终结构:
/dev/nvme1n1
├── nvme1n1p1
│ ext4
│ 1.1TB
│ /home/user/works
│
└── nvme1n1p2
ext4
800GB
/home/user/workspace
整个操作要求:
- 保留原有数据
- 不重装系统
- 不重新格式化原分区
- 在原 ext4 分区基础上进行缩容
二、操作原理
很多人认为:
ext4 分区无法缩容。
其实这是误解。
真正不能直接缩小的是 分区。
ext4 文件系统本身支持在线扩容、离线缩容。
正确流程如下:
┌──────────────────────────────┐
│ ext4 文件系统 │
│ │
│ 分区 │
└──────────────────────────────┘
第一步:
缩小 ext4 文件系统:
┌──────────────────────┐ 空闲空间
│ ext4 │─────────
└──────────────────────┘
第二步:
缩小分区:
┌──────────────────────┐─────────
│ ext4 │ 空闲空间
└──────────────────────┘─────────
第三步:
利用剩余空间创建新的分区:
┌──────────────────────┬──────────┐
│ p1 │ p2 │
└──────────────────────┴──────────┘
因此,整个流程遵循:
先缩文件系统,再缩分区。
顺序绝不能反。
三、查看当前分区信息
查看磁盘:
df -Th
lsblk
sudo fdisk -l /dev/nvme1n1
输出:
Disklabel type: dos
Device Start End Size
/dev/nvme1n1p1 2048 4000796671 1.9T
这里需要重点记录:
Start = 2048
这是整个操作最关键的数据。
重新创建分区时:
Start Sector 必须保持完全一致。
否则整个 ext4 文件系统都会发生偏移,数据将无法识别。
四、停止业务服务
查看是否仍有进程占用:
sudo lsof +D /home/user/works
如果有输出,需要先关闭对应程序。
五、卸载分区
sudo umount /home/user/works
确认已经卸载:
lsblk /dev/nvme1n1
确认 MOUNTPOINTS 为空。
六、检查 ext4 文件系统
缩容之前必须检查:
sudo e2fsck -f /dev/nvme1n1p1
检查通过后才能继续。
七、缩小 ext4 文件系统
执行:
sudo resize2fs /dev/nvme1n1p1 1100G
注意:
resize2fs不支持1.1T这种带小数的写法。
例如:
resize2fs /dev/nvme1n1p1 1.1T
会提示:
resize2fs: 无效的新大小
因此需要使用整数 GiB:
sudo resize2fs /dev/nvme1n1p1 1100G
完成后再次检查:
sudo e2fsck -f /dev/nvme1n1p1
确保文件系统一致。
八、缩小分区
进入:
sudo fdisk /dev/nvme1n1
先查看:
p
确认:
Start = 2048
删除分区:
d
说明:
此步骤仅删除 分区表记录,
不会立即删除 ext4 文件系统数据。
重新创建:
n
选择:
p
分区号:
1
First sector:
2048
必须与原来一致。
Last sector:
+1100G
随后 fdisk 会提示:
Partition #1 contains an ext4 signature.
Remove the signature?
这里必须选择:
N
不能选择:
Y
因为:
- ext4 文件系统仍然存在
- 数据仍然存在
- 只是缩小了分区
保留 ext4 签名即可。
再次查看:
p
确认:
Start = 2048
保存:
w
刷新内核分区表:
sudo partprobe /dev/nvme1n1
九、验证原有数据
再次检查:
sudo e2fsck -f /dev/nvme1n1p1
重新挂载:
sudo mount /dev/nvme1n1p1 /home/user/works
查看:
ls /home/user/works
du -sh /home/user/works
确认:
- 文件存在
- 数据完整
- 文件系统正常
只有确认无误,才继续下一步。
十、新建第二个分区
再次卸载:
sudo umount /home/user/works
进入:
sudo fdisk /dev/nvme1n1
创建:
n
p
2
First sector:
直接回车即可。
Last sector: 直接回车也可以,默认会从p1后面开始
+800G
查看:
p
确认:
Device
/dev/nvme1n1p1
/dev/nvme1n1p2
保存:
w
刷新:
sudo partprobe /dev/nvme1n1
十一、格式化新分区
因为 p2 是新建分区,没有文件系统。
执行:
sudo mkfs.ext4 /dev/nvme1n1p2
这里只格式化:
/dev/nvme1n1p2
不会影响:
/dev/nvme1n1p1
十二、挂载
创建目录:
sudo mkdir -p /home/user/workspace
挂载:
sudo mount /dev/nvme1n1p1 /home/user/works
sudo mount /dev/nvme1n1p2 /home/user/workspace
修改权限:
sudo chown -R user:user /home/user/workspace
十三、配置开机自动挂载
编辑:
sudo nano /etc/fstab
加入:
/home/user/works ext4 defaults 0 0
/home/user/workspace ext4 defaults 0 0
测试:
sudo mount -a
如果没有任何报错,则配置成功。
十四、恢复业务
如果在缩容前有关闭的服务,这里可以正常启动了
十五、踩坑记录
1、resize2fs 不支持小数 TB
错误:
resize2fs /dev/nvme1n1p1 1.1T
提示:
resize2fs: 无效的新大小
正确:
resize2fs /dev/nvme1n1p1 1100G
2、fdisk 提示删除 ext4 签名
提示:
Remove the signature?
必须选择:
N
否则可能导致文件系统无法识别。
3、Start Sector 一定不能变
原来:
2048
重新创建:
2048
必须保持一致。
这是整个操作中最关键的一步。
4、一定要先验证数据
不要缩容完成后立即创建第二个分区。
正确顺序:
- 缩文件系统
- 缩分区
- 挂载验证数据
- 创建第二个分区
这样风险最低。
十六、最终结果
最终磁盘结构:
/dev/nvme1n1
├── nvme1n1p1
│ ext4
│ 1.1TB
│ 挂载:
│ /home/user/works
│
└── nvme1n1p2
ext4
约800GB
挂载:
/home/user/workspace
最终实现:
- 原有数据全部保留
- ext4 文件系统完整
- 成功缩小原分区
- 新建约 800GB 分区
- 两个目录独立管理
- 可配置开机自动挂载
十七、经验总结
本次操作遵循以下原则:
- 操作前备份重要数据。
- 先缩文件系统(
resize2fs),再缩分区。 - 重新创建分区时,起始扇区(Start Sector)必须保持一致。
- fdisk 提示删除 ext4 签名时,选择
N保留文件系统签名。 - 每完成一个关键步骤,都通过
e2fsck和挂载验证确认数据正常,再继续下一步。 - 最后通过 UUID 配置
/etc/fstab,确保系统重启后自动挂载。
本次实践验证:在严格遵循上述流程的前提下,可以安全地对 ext4 数据盘进行缩容,并在释放出的空间中创建新的分区,同时完整保留原有数据。

5181

被折叠的 条评论
为什么被折叠?



