本文档详细说明在 Linux 内网环境中进行硬盘扩容的两种主要场景:物理/虚拟机新增硬盘扩容 和 现有硬盘分区扩容(增加10G空间)。适用于物理服务器、VMware、KVM、Hyper-V 等虚拟化环境。准备工作
1.1 系统信息收集
# 查看当前磁盘使用情况df -h# 查看磁盘分区表lsblkfdisk -l# 查看文件系统类型mount | grep "^/dev"# 检查是否使用 LVMsudo pvssudo vgs sudo lvs
1.2 备份重要数据
重要提示:任何磁盘操作都有风险,操作前务必备份重要数据!
# 示例:备份关键配置文件sudo tar -czf /backup/system-backup-$(date +%Y%m%d).tar.gz /etc /home /var
1.3 安装必要工具
# Ubuntu/Debiansudo apt updatesudo apt install -y lvm2 parted gdisk cloud-guest-utils# CentOS/RHEL/Rockysudo yum install -y lvm2 parted gdisk cloud-utils-growpart
场景一:新增硬盘扩容
2.1 物理/虚拟机添加新硬盘
VMware vSphere 操作步骤:
在 vCenter Web Client 中右键点击虚拟机 → 编辑设置
点击 添加新设备 → 硬盘
选择 创建新虚拟磁盘
设置磁盘大小(例如:50GB)
选择磁盘置备类型(推荐:厚置备延迟清零)
选择数据存储位置
点击 完成 → 确定
KVM/QEMU 操作步骤:
# 创建新磁盘文件sudo qemu-img create -f qcow2 /var/lib/libvirt/images/newdisk.qcow2 50G# 或者使用 raw 格式sudo dd if=/dev/zero of=/var/lib/libvirt/images/newdisk.raw bs=1G count=50# 通过 virsh 添加到虚拟机sudo virsh attach-disk <vm-name> /var/lib/libvirt/images/newdisk.qcow2 vdb --persistent
2.2 识别新硬盘
方法一:重启后识别(推荐)
# 重启系统让内核识别新硬件sudo reboot# 重启后查看新磁盘lsblk# 应该看到类似 sdb、sdc 的新设备
方法二:不重启识别新磁盘
# 扫描 SCSI 总线(适用于大多数虚拟化环境)echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan# 或者针对特定主机适配器for host in /sys/class/scsi_host/host*/; do echo "- - -" | sudo tee $host/scandone# 查看是否识别到新磁盘lsblkdmesg | tail -20
2.3 分区与格式化
方案 A:传统分区(MBR/GPT)
使用 fdisk(适用于 ≤2TB 磁盘)
# 假设新磁盘为 /dev/sdbsudo fdisk /dev/sdb# fdisk 交互命令:# n → p → 1 → Enter → Enter (使用全部空间)# w (写入分区表)# 格式化为 ext4sudo mkfs.ext4 /dev/sdb1# 或格式化为 xfssudo mkfs.xfs /dev/sdb1
使用 parted(适用于 >2TB 磁盘或 GPT)
# 创建 GPT 分区表sudo parted /dev/sdb mklabel gpt# 创建分区(使用全部空间)sudo parted /dev/sdb mkpart primary ext4 0% 100%# 格式化sudo mkfs.ext4 /dev/sdb1
方案 B:直接使用整个磁盘(无分区表)
# 直接格式化整个磁盘(某些场景推荐)sudo mkfs.ext4 /dev/sdb# 注意:这样就没有 /dev/sdb1,直接使用 /dev/sdb
方案 C:LVM 方式(推荐用于生产环境)
# 创建物理卷sudo pvcreate /dev/sdb# 扩展现有卷组(假设卷组名为 vg0)sudo vgextend vg0 /dev/sdb# 或创建新卷组sudo vgcreate new_vg /dev/sdb# 创建逻辑卷(例如:40GB)sudo lvcreate -L 40G -n new_lv new_vg# 格式化逻辑卷sudo mkfs.ext4 /dev/new_vg/new_lv
2.4 挂载与持久化
临时挂载
# 创建挂载点sudo mkdir -p /data# 挂载分区sudo mount /dev/sdb1 /data# 或挂载 LVM 逻辑卷sudo mount /dev/new_vg/new_lv /data
永久挂载(开机自动挂载)
方法一:使用 UUID(推荐)
# 获取分区 UUIDsudo blkid /dev/sdb1# 编辑 /etc/fstabecho "UUID=<your-uuid> /data ext4 defaults 0 2" | sudo tee -a /etc/fstab# 验证 fstab 配置sudo mount -a
方法二:直接使用设备路径
# 编辑 /etc/fstabecho "/dev/sdb1 /data ext4 defaults 0 2" | sudo tee -a /etc/fstab# 验证sudo mount -a
LVM 永久挂载
# LVM 设备路径通常稳定,可以直接使用echo "/dev/new_vg/new_lv /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
场景二:现有硬盘扩容(增加10G)
3.1 虚拟化环境扩展磁盘
VMware vSphere 扩展步骤:
关闭虚拟机(重要:某些 Linux 发行版支持在线扩展,但建议关机操作)
右键虚拟机 → 编辑设置
选择要扩展的现有硬盘
将磁盘大小增加 10GB(例如:从 20GB → 30GB)
点击 确定
启动虚拟机
KVM/QEMU 扩展步骤:
# 关闭虚拟机sudo virsh shutdown <vm-name># 扩展现有磁盘sudo qemu-img resize /var/lib/libvirt/images/existing.qcow2 +10G# 启动虚拟机sudo virsh start <vm-name>
3.2 Linux 系统识别新空间
重新扫描磁盘大小
# 方法一:使用 blockdev(推荐)sudo blockdev --getsize64 /dev/sda # 记录旧大小# 扩展后再次运行,应该显示新大小# 方法二:触发内核重新读取磁盘大小echo 1 | sudo tee /sys/class/block/sda/device/rescan# 方法三:对于 SCSI 设备echo 1 | sudo tee /sys/class/scsi_device/*/device/rescan
验证磁盘大小已更新
lsblk# 应该看到 /dev/sda 的 SIZE 已经增加 10Gfdisk -l /dev/sda# 应该显示新的磁盘总大小
3.3 LVM 扩容方案(推荐)
如果系统使用 LVM(大多数现代 Linux 安装默认使用),扩容非常简单:
步骤 1:扩展分区(如果需要)
# 如果根分区是 LVM 且磁盘末尾有未分配空间# 使用 growpart 扩展分区到磁盘末尾sudo growpart /dev/sda 2 # 假设 LVM 在 /dev/sda2# 验证分区已扩展lsblk
步骤 2:扩展物理卷
# 通知 LVM 物理卷有新空间sudo pvresize /dev/sda2# 验证物理卷大小sudo pvs
步骤 3:扩展逻辑卷和文件系统
# 扩展逻辑卷(增加 10G)sudo lvextend -L +10G /dev/mapper/vg0-root# 同时扩展文件系统# 对于 ext4/ext3sudo resize2fs /dev/mapper/vg0-root# 对于 xfssudo xfs_growfs /# 验证df -h
一键扩展(LVM + ext4)
# 如果要使用所有可用空间sudo lvextend -l +100%FREE /dev/mapper/vg0-rootsudo resize2fs /dev/mapper/vg0-root
3.4 非 LVM 分区扩容方案
如果系统没有使用 LVM,扩容更复杂,需要调整分区表:
方案 A:末尾分区扩容(最简单)
假设要扩容的分区是磁盘上的最后一个分区(如 /dev/sda3):
# 1. 删除并重新创建分区(数据不会丢失,但有风险!)sudo fdisk /dev/sda# fdisk 命令序列:# p (查看当前分区)# d (删除分区,选择要扩容的分区号,如 3)# n (新建分区)# p (主分区) 或 e (扩展分区)# 3 (分区号,必须与删除的相同)# 第一个扇区:使用默认值(必须与原分区相同!)# 最后一个扇区:使用默认值(使用全部可用空间)# w (写入)# 2. 通知内核重新读取分区表sudo partprobe /dev/sda# 或重启系统# 3. 扩展文件系统# 对于 ext4sudo resize2fs /dev/sda3# 对于 xfssudo xfs_growfs /mount/point
方案 B:使用 parted(更安全)
# 1. 检查当前分区sudo parted /dev/sda print# 2. 调整分区大小sudo parted /dev/sda resizepart 3 100%# 其中 3 是分区号,100% 表示使用所有可用空间# 3. 扩展文件系统sudo resize2fs /dev/sda3 # ext4# 或sudo xfs_growfs / # xfs
方案 C:中间分区扩容(复杂,需要移动数据)
如果要扩容的分区不是最后一个,需要:
备份该分区数据
删除该分区及后面的所有分区
重新创建更大的分区
恢复数据
重新创建后面的分区
强烈建议:这种情况最好使用 LVM 或重新规划磁盘布局。
验证与故障排查
4.1 验证扩容成功
# 检查磁盘空间df -h# 检查 inode 使用情况df -i# 检查 LVM 状态(如果使用)sudo lvssudo vgssudo pvs
4.2 常见问题及解决方案
问题 1:resize2fs: Bad magic number in super-block
原因:尝试对非 ext 文件系统使用 resize2fs解决:使用对应的工具(xfs_growfs 用于 XFS)
问题 2:partprobe: Error: Partition(s) not aligned properly
原因:分区对齐问题解决:使用 parted 而不是 fdisk,或确保起始扇区正确
问题 3:扩容后 df 显示空间未增加
原因:文件系统未扩展解决:
# ext4sudo resize2fs /dev/sdXY# xfs sudo xfs_growfs /mount/point
问题 4:无法在线扩展根分区
原因:某些旧版本内核不支持解决:使用 Live CD/USB 启动后操作,或重启系统
4.3 安全检查清单
- 操作前已备份重要数据
- 确认磁盘标识符正确(避免误操作系统盘)
- 对于生产环境,先在测试环境验证流程
- 扩容后验证应用正常运行
- 更新监控系统的磁盘告警阈值
自动化脚本示例
脚本 1:自动识别并挂载新硬盘
#!/bin/bash# auto_mount_new_disk.shset -e# 查找未挂载的磁盘NEW_DISK=$(lsblk -rno NAME,TYPE,MOUNTPOINT | awk '$2=="disk" && $3=="" {print "/dev/"$1; exit}')if [ -z "$NEW_DISK" ]; then echo "未找到未挂载的磁盘" exit 1fiecho "发现新磁盘: $NEW_DISK"# 创建分区echo "正在分区..."sudo parted $NEW_DISK mklabel gptsudo parted $NEW_DISK mkpart primary ext4 0% 100%# 格式化PARTITION="${NEW_DISK}1"echo "正在格式化 $PARTITION..."sudo mkfs.ext4 $PARTITION# 创建挂载点MOUNT_POINT="/data$(echo $NEW_DISK | sed 's/\/dev\///')"sudo mkdir -p $MOUNT_POINT# 获取 UUID 并添加到 fstabUUID=$(sudo blkid -s UUID -o value $PARTITION)echo "UUID=$UUID$MOUNT_POINT ext4 defaults 0 2" | sudo tee -a /etc/fstab# 挂载sudo mount $MOUNT_POINTecho "新磁盘已挂载到 $MOUNT_POINT"
脚本 2:LVM 自动扩容脚本
#!/bin/bash# lvm_expand.sh <size_in_GB>SIZE_GB=${1:-10}VG_NAME="vg0"LV_NAME="root"echo "正在扩展 LVM 逻辑卷 ${VG_NAME}/${LV_NAME} 增加 ${SIZE_GB}G..."# 扩展逻辑卷sudo lvextend -L +${SIZE_GB}G /dev/${VG_NAME}/${LV_NAME}# 扩展文件系统FS_TYPE=$(findmnt -n -o FSTYPE /)case $FS_TYPE in ext2|ext3|ext4) sudo resize2fs /dev/${VG_NAME}/${LV_NAME} ;; xfs) sudo xfs_growfs / ;; *) echo "不支持的文件系统: $FS_TYPE" exit 1 ;;esacecho "扩容完成!"df -h /
脚本 3:非 LVM 分区扩容脚本(末尾分区)
#!/bin/bash# partition_expand.sh <device> <partition_number>DEVICE=${1:-"/dev/sda"}PART_NUM=${2:-3}echo "正在扩展分区 ${DEVICE}${PART_NUM}..."# 使用 parted 扩展分区sudo parted $DEVICE resizepart $PART_NUM 100%# 重新读取分区表sudo partprobe $DEVICE# 扩展文件系统FS_TYPE=$(findmnt -n -o FSTYPE ${DEVICE}${PART_NUM})case $FS_TYPE in ext2|ext3|ext4) sudo resize2fs ${DEVICE}${PART_NUM} ;; xfs) MOUNT_POINT=$(findmnt -n -o TARGET ${DEVICE}${PART_NUM}) sudo xfs_growfs $MOUNT_POINT ;; *) echo "不支持的文件系统: $FS_TYPE" exit 1 ;;esacecho "分区扩容完成!"df -h
最佳实践建议
优先使用 LVM:LVM 提供灵活的存储管理,扩容缩容都非常简单
规划初始磁盘布局:为未来扩容预留空间,避免频繁操作
使用 GPT 分区表:支持大容量磁盘,更现代可靠
定期监控磁盘使用:设置告警,避免空间耗尽
文档化操作流程:记录每次扩容的操作步骤和结果
测试环境先行:在生产环境操作前,先在测试环境验证
重要提醒:磁盘操作具有破坏性风险,务必在操作前备份重要数据,并在维护窗口期进行操作。