1. 虚拟机硬盘扩容的必要性与场景
刚接手一台运行中的虚拟机时,最常遇到的突发状况就是磁盘空间告急。上周我就遇到一个典型案例:某台部署了MySQL的虚拟机因为业务量激增,数据盘使用率飙升至95%,系统频繁弹出空间不足告警。这种时候,最直接的解决方案就是给虚拟机新增一块硬盘。
虚拟机硬盘扩容通常出现在以下三种典型场景:
- 数据盘容量不足:像数据库、日志存储这类持续增长型应用,初始分配的磁盘空间很快会被耗尽
- 业务需求变更:新增业务模块需要独立的存储空间,例如为Web服务单独挂载附件存储盘
- 性能隔离需求:将不同IO特性的数据分离到不同物理磁盘,比如SSD挂载给数据库,HDD存放备份
与直接扩容原有磁盘相比,添加新硬盘的优势在于:
- 无需停机操作,不影响线上服务
- 可灵活选择磁盘类型(如标准HDD换为高性能SSD)
- 便于实现存储隔离,避免单点故障
2. 虚拟机硬盘添加全流程解析
2.1 虚拟化平台侧操作
以VMware vSphere为例的添加步骤:
-
虚拟机停机准备(非必须但建议):
bash复制sudo sync && sudo umount /dev/sdb1 # 若有旧磁盘需卸载 sudo shutdown -h now -
在vCenter中添加硬盘:
- 右键虚拟机 → 编辑设置 → 添加硬盘
- 选择磁盘类型(厚置备/精简置备)
- 设置容量(建议按实际需求增加20%冗余)
- 选择SCSI控制器位置(注意控制器类型需一致)
-
磁盘模式选择:
- 独立-持久:写入立即生效(生产环境推荐)
- 独立-非持久:重启后还原(测试环境适用)
关键点:对于KVM虚拟化平台,需要通过virsh attach-disk命令添加,且需注意cache mode设置对IO性能的影响
2.2 操作系统侧识别与分区
启动虚拟机后执行以下操作:
-
检测新磁盘:
bash复制lsblk # 查看块设备列表典型输出示例:
code复制NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 512M 0 part /boot └─sda2 8:2 0 49.5G 0 part / sdb 8:16 0 1T 0 disk # 新添加的磁盘 -
分区方案选择:
- MBR分区(适合<2TB磁盘):
bash复制fdisk /dev/sdb # 交互式操作:n→p→1→回车→回车→w - GPT分区(≥2TB磁盘必须):
bash复制
parted /dev/sdb (parted) mklabel gpt (parted) mkpart primary 0% 100% (parted) quit
- MBR分区(适合<2TB磁盘):
-
文件系统创建:
bash复制# 对于常规场景推荐ext4 mkfs.ext4 /dev/sdb1 -L "data_disk" # 需要日志功能可选xfs mkfs.xfs /dev/sdb1 -f
3. 挂载配置与自动化方案
3.1 临时挂载与测试
先进行手动挂载测试:
bash复制mkdir /mnt/new_disk
mount /dev/sdb1 /mnt/new_disk
df -h # 验证挂载结果
测试IO性能(可选):
bash复制# 测试顺序写入速度
dd if=/dev/zero of=/mnt/new_disk/testfile bs=1G count=2 oflag=direct
# 测试随机读写
fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k \
--numjobs=4 --size=1G --runtime=60 --time_based --end_fsync=1 \
--filename=/mnt/new_disk/fio_test
3.2 永久挂载配置
编辑/etc/fstab实现开机自动挂载:
bash复制# 获取磁盘UUID
blkid /dev/sdb1
# 在fstab中添加(示例):
UUID=5e5a8c7a-1b2c-4d3e-8f5a-9b6c7d8e9f0a /data ext4 defaults,noatime 0 2
关键参数说明:
noatime:减少metadata写入,提升性能nobarrier:对SSD可考虑添加(需确保有UPS)data=writeback:ext4专用,提升性能但增加崩溃风险
3.3 LVM高级配置(可选)
对于需要灵活扩容的场景,建议使用LVM:
bash复制pvcreate /dev/sdb1
vgcreate vg_data /dev/sdb1
lvcreate -l 100%FREE -n lv_data vg_data
mkfs.xfs /dev/vg_data/lv_data
4. 常见问题排查手册
4.1 磁盘识别异常
现象:执行lsblk看不到新磁盘
排查步骤:
- 检查虚拟化平台是否成功添加:
bash复制dmesg | grep -i scsi # 查看内核日志 - 重新扫描SCSI总线:
bash复制echo "- - -" > /sys/class/scsi_host/host0/scan
4.2 挂载失败处理
报错:mount: wrong fs type, bad option
解决方案:
- 检查文件系统是否创建:
bash复制
blkid /dev/sdb1 - 修复损坏的文件系统:
bash复制
fsck -y /dev/sdb1
4.3 性能调优技巧
-
IO调度器选择:
bash复制# 查看当前调度器 cat /sys/block/sdb/queue/scheduler # 对SSD建议改为noop或deadline echo "noop" > /sys/block/sdb/queue/scheduler -
EXT4文件系统优化:
bash复制tune2fs -o journal_data_writeback /dev/sdb1 tune2fs -O ^has_journal /dev/sdb1 # 禁用journal提升性能
5. 生产环境最佳实践
-
容量规划建议:
- 单块磁盘不超过2TB(避免性能下降)
- 预留15-20%的未分配空间(特别是XFS文件系统)
-
安全挂载方案:
bash复制
mount -o defaults,nosuid,nodev,noexec /dev/sdb1 /data关键参数作用:
nosuid:禁止执行setuid程序nodev:禁止设备文件noexec:禁止直接执行二进制文件
-
监控配置示例:
bash复制# 监控磁盘空间(添加到crontab) */5 * * * * df -h | grep /data | awk '{print $5}' | cut -d'%' -f1 | \ xargs -I {} test {} -gt 90 && echo "Disk space alert" | mail -s "Disk Warning" admin@example.com
对于数据库等关键应用,建议额外配置:
- 定期执行
sync命令强制落盘 - 使用ionice调整IO优先级:
bash复制
ionice -c2 -n0 -p $(pgrep mysql)