在 ESXi 上部署 CentOS 虚拟机时,系统盘与数据盘分离是生产环境的标准做法。本文记录从 ESXi 创建虚拟机、CentOS 分区挂载,到 MongoDB 数据迁移的完整流程,可直接复制执行。


一、为什么不要一次性给 2.2TB

很多新手在 ESXi 创建虚拟机时,会把系统盘和数据盘合在一块大硬盘里(比如系统需要 200G,数据需要 2T,直接创建一个 2.2T 的盘)。这在生产环境会带来几个问题:

问题 说明
管理混乱 单块大盘做系统,后续分区麻烦,重装系统时数据风险高
备份困难 系统盘和数据盘混在一起,无法单独对系统或数据做快照/备份
迁移不灵活 数据盘独立后,可以单独拆挂到其他虚拟机
快照膨胀 ESXi 快照针对整盘,数据盘变动会导致快照文件急剧膨胀

正确做法: 创建虚拟机时只给系统盘(如 200GB),创建完成后再单独挂载一块数据盘(如 2TB)。


二、ESXi 中创建虚拟机的正确姿势

  1. 创建 CentOS 虚拟机时,硬盘只分配 200GB(系统盘)
  2. 磁盘置备方式建议选 精简置备(Thin Provision)厚置备延迟置零
  3. 虚拟机创建完成后,关闭虚拟机(或保持运行,CentOS 7/8/9 支持热插拔)
  4. 右键虚拟机 → 编辑设置添加新设备硬盘
  5. 配置数据盘:
    • 大小:2TB(2048GB)
    • 虚拟设备节点:SCSI(0:1)SATA(0:1),确保和系统盘分开
  6. 保存,开机

三、CentOS 中挂载新硬盘

开机后先确认新盘已被识别:

lsblk

你会看到类似输出:

NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0   200G  0 disk
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0   199G  0 part
  ├─centos-root 253:0    0    50G  0 lvm  /
  ├─centos-swap 253:1    0  15.8G  0 lvm  [SWAP]
  └─centos-home 253:2    0 133.2G  0 lvm  /home
sdb               8:16   0     2T  0 disk      <-- 新数据盘
sr0              11:0    1   4.4G  0 rom

3.1 创建 GPT 分区

parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary xfs 0% 100%

3.2 格式化为 XFS

mkfs.xfs /dev/sdb1

3.3 创建挂载点并挂载

mkdir -p /data
mount -o noatime /dev/sdb1 /data

noatime 参数:禁止记录文件访问时间,减少不必要的磁盘 IO,对数据库场景非常友好。

3.4 写入 fstab 实现开机自动挂载

echo '/dev/sdb1 /data xfs noatime 0 0' >> /etc/fstab

⚠️ 注意: 如果之前执行过 echo '/dev/sdb1 /data xfs defaults 0 0' >> /etc/fstab,现在又追加了一行 noatime,会导致 fstab 中有重复条目。去重方法:

awk '!seen[$0]++' /etc/fstab > /etc/fstab.tmp && mv /etc/fstab.tmp /etc/fstab

四、MongoDB 生产环境迁移与优化

如果这台虚拟机用于运行 MongoDB,建议将数据目录迁移到独立的 /data 盘。

4.1 停止 MongoDB

systemctl stop mongod

4.2 迁移数据

mkdir -p /data/mongodb
cp -a /var/lib/mongo/* /data/mongodb/

4.3 修改 MongoDB 配置

sed -i 's|dbPath: /var/lib/mongo|dbPath: /data/mongodb|' /etc/mongod.conf

4.4 修正权限(关键!)

MongoDB 对数据目录权限极其敏感,必须确保 mongod 用户有完全控制权:

chown -R mongod:mongod /data/mongodb
chmod 755 /data/mongodb

4.5 重启并验证

systemctl start mongod
systemctl status mongod

五、验证清单

执行完以上步骤后,逐项确认:

检查项 命令 预期结果
分区是否存在 lsblkfdisk -l /dev/sdb 看到sdb1
文件系统类型 blkid /dev/sdb1 TYPE="xfs"
挂载状态 mount | grep sdb1 包含(rw,noatime,...)
磁盘空间 df -h /data 显示 2TB 可用
fstab 是否正确 cat /etc/fstab 一行/dev/sdb1 且无重复
MongoDB 数据路径 cat /etc/mongod.conf | grep dbPath /data/mongodb
MongoDB 权限 ls -ld /data/mongodb mongod mongod
重启后是否正常 rebootdf -h /data 自动挂载成功

六、常见问题汇总

Q1: ESXi 提示"许可证不足,无法完成该操作"

ESXi 评估期(60 天)到期后,无法开启任何虚拟机。
解决: 前往 VMware 官网申请免费许可证,在 管理 → 许可 → 分配许可证 中填入密钥即可。

Q2: sed: 没有输入文件

sed -i 命令必须指定文件路径。正确写法:

sed -i 's|defaults|noatime|' /etc/fstab

Q3: MongoDB 启动失败,日志报 Permission denied

99% 是 /data/mongodb 目录权限问题。检查:

ls -ld /data/mongodb
ps -ef | grep mongod   # 确认运行用户

Q4: 可以在线添加硬盘吗?

可以。CentOS 7/8/9 支持 SCSI/SATA 硬盘热插拔。添加后执行:

echo '- - -' > /sys/class/scsi_host/host0/scan
lsblk

即可识别新盘,无需重启。


七、总结

场景 推荐做法
ESXi 创建虚拟机 系统盘单独 200GB,数据盘后续单独挂载
CentOS 分区 GPT + XFS,noatime 挂载
MongoDB 数据 迁移到独立数据盘,严格设置mongod:mongod 权限
长期维护 系统盘和数据盘分离,备份、扩容、迁移都更灵活

这套方案在单机和集群环境都适用,核心原则就是:系统与数据分离,权限最小化,挂载参数优化