当前位置:首页>Linux>Linux 内网环境硬盘扩容完整指南

Linux 内网环境硬盘扩容完整指南

  • 2026-10-12 16:45:21
Linux 内网环境硬盘扩容完整指南
本文档详细说明在 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 操作步骤:

  1. 在 vCenter Web Client 中右键点击虚拟机 → 编辑设置

  2. 点击 添加新设备 → 硬盘

  3. 选择 创建新虚拟磁盘

  4. 设置磁盘大小(例如:50GB)

  5. 选择磁盘置备类型(推荐:厚置备延迟清零)

  6. 选择数据存储位置

  7. 点击 完成 → 确定

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 扩展步骤:

  1. 关闭虚拟机(重要:某些 Linux 发行版支持在线扩展,但建议关机操作)

  2. 右键虚拟机 → 编辑设置

  3. 选择要扩展的现有硬盘

  4. 将磁盘大小增加 10GB(例如:从 20GB → 30GB)

  5. 点击 确定

  6. 启动虚拟机

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:中间分区扩容(复杂,需要移动数据)

如果要扩容的分区不是最后一个,需要:

  1. 备份该分区数据

  2. 删除该分区及后面的所有分区

  3. 重新创建更大的分区

  4. 恢复数据

  5. 重新创建后面的分区

强烈建议:这种情况最好使用 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



最佳实践建议

  1. 优先使用 LVM:LVM 提供灵活的存储管理,扩容缩容都非常简单

  2. 规划初始磁盘布局:为未来扩容预留空间,避免频繁操作

  3. 使用 GPT 分区表:支持大容量磁盘,更现代可靠

  4. 定期监控磁盘使用:设置告警,避免空间耗尽

  5. 文档化操作流程:记录每次扩容的操作步骤和结果

  6. 测试环境先行:在生产环境操作前,先在测试环境验证

重要提醒:磁盘操作具有破坏性风险,务必在操作前备份重要数据,并在维护窗口期进行操作。

最新文章

随机文章