1. Ubuntu磁盘分区扩容实战指南
刚装完Ubuntu时分配的50GB磁盘空间,用了不到半年就被开发环境和项目文件塞得满满当当。上周编译Android源码时直接报"No space left on device",这才意识到必须对磁盘分区动手了。作为经历过多次扩容的老司机,我整理出这份涵盖物理机、虚拟机、双系统等场景的完整扩容方案。
磁盘扩容本质上包含三个关键操作:调整底层存储容量、扩展分区边界、同步文件系统。不同环境(如VMware虚拟机、物理硬盘、LVM逻辑卷)的操作差异主要体现在第一步,后两步则遵循相同的Linux底层逻辑。以下是各场景通用操作框架:
- 存储层扩容:虚拟机扩展虚拟磁盘/物理机添加新硬盘
- 分区调整:使用fdisk/gparted修改分区表
- 文件系统扩展:resize2fs/xfs_growfs等工具同步空间
重要提示:操作前务必备份重要数据!误操作可能导致分区表损坏。建议在LiveCD环境下操作,避免对已挂载的文件系统进行修改。
2. 虚拟机磁盘扩容全流程
2.1 VMware虚拟机扩容步骤
以VMware Workstation中的Ubuntu 22.04为例,首先关闭虚拟机,在VM设置中直接调整虚拟磁盘大小:
# 查看当前磁盘布局(示例输出) $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 50G 0 disk ├─sda1 8:1 0 512M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 48.5G 0 part /在VMware界面将磁盘从50GB调整为80GB后,启动Ubuntu执行:
# 识别新增空间 $ echo 1 > /sys/class/scsi_disk/0\:0\:0\:0/device/rescan $ lsblk # 确认sda总容量变为80G2.2 分区调整实战
使用gdisk工具调整分区(推荐GPT分区表):
$ sudo gdisk /dev/sda Command: p # 打印当前分区表 Command: d # 删除需要扩展的分区(如sda3) Command: n # 新建分区 Partition number: 3 # 保持编号一致 First sector: 按原值输入 # 保持起始扇区不变 Last sector: 最大可用值 # 自动扩展到剩余空间 Command: w # 写入更改关键技巧:如果提示分区正在使用,需要先卸载(umount)或使用LiveCD启动。对于根分区,可以尝试
mount -o remount,rw /临时重新挂载。
2.3 文件系统扩展
对于ext4文件系统:
$ sudo resize2fs /dev/sda3 resize2fs 1.46.5 (30-Dec-2021) Filesystem at /dev/sda3 is mounted on /; on-line resizing required old_desc_blocks = 4, new_desc_blocks = 5 The filesystem on /dev/sda3 is now 20971520 (4k) blocks long.验证结果:
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 79G 45G 31G 60% /3. 物理服务器LVM扩容方案
3.1 添加新物理磁盘
假设新增一块2TB的NVMe SSD(/dev/nvme0n1):
$ sudo fdisk /dev/nvme0n1 # 创建Linux LVM分区(类型8e) $ sudo pvcreate /dev/nvme0n1p1 $ sudo vgextend ubuntu-vg /dev/nvme0n1p13.2 扩展逻辑卷
查看当前VG空间:
$ sudo vgdisplay --- Volume group --- VG Name ubuntu-vg System ID Format lvm2 VG Size <100.00 GiB Free PE / Size 0 / 0扩展根逻辑卷:
$ sudo lvextend -l +100%FREE /dev/ubuntu-vg/root $ sudo resize2fs /dev/ubuntu-vg/root3.3 在线扩容技巧
对于生产环境,推荐使用xfs文件系统支持实时扩容:
$ sudo lvextend -r -L +500G /dev/ubuntu-vg/data # -r参数自动resize文件系统4. 双系统共享分区调整
4.1 Windows+Ubuntu分区方案
常见问题:Windows占用了全部空间导致Ubuntu无法扩容。解决方案:
- 在Windows磁盘管理压缩NTFS分区
- 使用Ubuntu LiveCD启动
- 删除swap分区(如果有)腾出连续空间
- 移动Ubuntu分区至新空间起始位置
$ sudo gparted # 图形化操作更安全4.2 分区移动风险控制
移动分区是高风险操作,必须注意:
- 确保UPS供电稳定
- 提前备份分区表:
sudo sfdisk -d /dev/sda > sda.bak - 使用
-i参数显示进度:sudo dd if=/dev/sda2 of=/dev/sda3 bs=1M status=progress
5. 典型问题排查手册
5.1 扩容后系统无法启动
症状:GRUB rescue提示"unknown filesystem"
修复步骤:
- LiveCD启动挂载原系统
- 检查/etc/fstab UUID是否匹配:
$ blkid /dev/sda3 $ cat /mnt/etc/fstab - 重新安装GRUB:
$ sudo mount /dev/sda3 /mnt $ sudo mount --bind /dev /mnt/dev $ sudo chroot /mnt # grub-install /dev/sda # update-grub
5.2 空间未正确释放
当使用LVM精简配置(thin provisioning)时,可能需要手动回收空间:
$ sudo lvmconfig --type current $ sudo lvchange --discards passdown ubuntu-vg/root $ sudo fstrim -v /6. 高级技巧与自动化方案
6.1 脚本化扩容
对于需要频繁操作的开发环境,可使用自动化脚本:
#!/bin/bash # auto_expand.sh DISK=$(lsblk -o NAME,MOUNTPOINT | awk '$2=="/"{print $1}' | sed 's/[0-9]*$//') PART="/dev/$(lsblk -o NAME,MOUNTPOINT | awk '$2=="/"{print $1}')" growpart /dev/$DISK ${PART##*[a-z]} resize2fs $PART6.2 云环境特殊处理
AWS/Aliyun等云平台需要先扩展EBS/云盘,再通知内核:
# AWS示例 $ sudo growpart /dev/xvda 1 $ sudo xfs_growfs / # 针对xfs文件系统6.3 监控预警设置
配置prometheus警报规则,当空间使用率>80%时触发扩容:
# alert.rules groups: - name: disk_alerts rules: - alert: DiskSpaceLow expr: (1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100 > 80 for: 30m labels: severity: warning annotations: summary: "Low disk space on {{ $labels.instance }}"实际操作中我发现,对于数据库服务器,建议保留至少20%的剩余空间避免性能下降。曾经有个PostgreSQL实例在空间使用达95%时,查询性能下降了近10倍。定期使用ncdu分析大文件分布是个好习惯:
$ sudo apt install ncdu $ ncdu / # 交互式分析磁盘使用情况最后提醒:扩容只是临时解决方案,合理的存储规划才是根本。建议为不同用途建立独立分区(如/home、/var、/opt),并采用LVM架构方便后续调整。对于开发环境,可以考虑将Docker存储目录(/var/lib/docker)挂载到独立磁盘,避免容器日志爆满影响系统运行。