ext4-分区缩容

📅 2026/7/3 7:57:06
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/worksnvme1n1p2约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-Thlsblksudofdisk-l/dev/nvme1n1输出Disklabel type: dos Device Start End Size /dev/nvme1n1p1 2048 4000796671 1.9T这里需要重点记录Start 2048这是整个操作最关键的数据。重新创建分区时Start Sector 必须保持完全一致。否则整个 ext4 文件系统都会发生偏移数据将无法识别。四、停止业务服务查看是否仍有进程占用sudolsofD /home/user/works如果有输出需要先关闭对应程序。五、卸载分区sudoumount/home/user/works确认已经卸载lsblk /dev/nvme1n1确认MOUNTPOINTS为空。六、检查 ext4 文件系统缩容之前必须检查sudoe2fsck-f/dev/nvme1n1p1检查通过后才能继续。七、缩小 ext4 文件系统执行sudoresize2fs /dev/nvme1n1p1 1100G注意resize2fs不支持1.1T这种带小数的写法。例如resize2fs /dev/nvme1n1p11.1T会提示resize2fs: 无效的新大小因此需要使用整数 GiBsudoresize2fs /dev/nvme1n1p1 1100G完成后再次检查sudoe2fsck-f/dev/nvme1n1p1确保文件系统一致。八、缩小分区进入sudofdisk/dev/nvme1n1先查看p确认Start 2048删除分区d说明此步骤仅删除分区表记录不会立即删除 ext4 文件系统数据。重新创建n选择p分区号1First sector2048必须与原来一致。Last sector1100G随后 fdisk 会提示Partition #1 contains an ext4 signature. Remove the signature?这里必须选择N不能选择Y因为ext4 文件系统仍然存在数据仍然存在只是缩小了分区保留 ext4 签名即可。再次查看p确认Start 2048保存w刷新内核分区表sudopartprobe /dev/nvme1n1九、验证原有数据再次检查sudoe2fsck-f/dev/nvme1n1p1重新挂载sudomount/dev/nvme1n1p1 /home/user/works查看ls/home/user/worksdu-sh/home/user/works确认文件存在数据完整文件系统正常只有确认无误才继续下一步。十、新建第二个分区再次卸载sudoumount/home/user/works进入sudofdisk/dev/nvme1n1创建n p 2First sector直接回车即可。Last sector 直接回车也可以默认会从p1后面开始800G查看p确认Device /dev/nvme1n1p1 /dev/nvme1n1p2保存w刷新sudopartprobe /dev/nvme1n1十一、格式化新分区因为 p2 是新建分区没有文件系统。执行sudomkfs.ext4 /dev/nvme1n1p2这里只格式化/dev/nvme1n1p2不会影响/dev/nvme1n1p1十二、挂载创建目录sudomkdir-p/home/user/workspace挂载sudomount/dev/nvme1n1p1 /home/user/workssudomount/dev/nvme1n1p2 /home/user/workspace修改权限sudochown-Ruser:user /home/user/workspace十三、配置开机自动挂载编辑sudonano/etc/fstab加入/home/user/works ext4 defaults 0 0 /home/user/workspace ext4 defaults 0 0测试sudomount-a如果没有任何报错则配置成功。十四、恢复业务如果在缩容前有关闭的服务这里可以正常启动了十五、踩坑记录1、resize2fs 不支持小数 TB错误resize2fs /dev/nvme1n1p11.1T提示resize2fs: 无效的新大小正确resize2fs /dev/nvme1n1p1 1100G2、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 数据盘进行缩容并在释放出的空间中创建新的分区同时完整保留原有数据。