ext4-分区缩容

Ubuntu ext4 数据盘缩容并新建分区实践

操作系统: Ubuntu

文件系统: ext4

分区工具: fdisk + resize2fs + e2fsck

磁盘类型: NVMe SSD


一、需求背景

机器有两块 NVMe SSD:

磁盘用途
/dev/nvme0n1Ubuntu 系统盘
/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、一定要先验证数据

不要缩容完成后立即创建第二个分区。

正确顺序:

  1. 缩文件系统
  2. 缩分区
  3. 挂载验证数据
  4. 创建第二个分区

这样风险最低。


十六、最终结果

最终磁盘结构:

/dev/nvme1n1
├── nvme1n1p1
│   ext4
│   1.1TB
│   挂载:
│   /home/user/works
│
└── nvme1n1p2
    ext4
    约800GB
    挂载:
    /home/user/workspace

最终实现:

  • 原有数据全部保留
  • ext4 文件系统完整
  • 成功缩小原分区
  • 新建约 800GB 分区
  • 两个目录独立管理
  • 可配置开机自动挂载

十七、经验总结

本次操作遵循以下原则:

  1. 操作前备份重要数据。
  2. 先缩文件系统(resize2fs),再缩分区。
  3. 重新创建分区时,起始扇区(Start Sector)必须保持一致。
  4. fdisk 提示删除 ext4 签名时,选择 N 保留文件系统签名。
  5. 每完成一个关键步骤,都通过 e2fsck 和挂载验证确认数据正常,再继续下一步。
  6. 最后通过 UUID 配置 /etc/fstab,确保系统重启后自动挂载。

本次实践验证:在严格遵循上述流程的前提下,可以安全地对 ext4 数据盘进行缩容,并在释放出的空间中创建新的分区,同时完整保留原有数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值