ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

VMware虚拟机磁盘挂载:从原理到实战的Linux存储管理指南

2026/8/6 3:50:43 拓冰建站 浏览量
VMware虚拟机磁盘挂载:从原理到实战的Linux存储管理指南 1. 项目概述为什么虚拟机磁盘挂载是运维的必修课在虚拟化环境里折腾尤其是用 VMware 跑 Linux 虚拟机磁盘扩容和挂载几乎是绕不开的日常操作。你可能遇到过这种情况线上服务跑得好好的突然日志就报“No space left on device”一看是根分区或者数据盘满了。这时候最直接的办法不是去物理机房加硬盘而是在 VMware 的管理界面给虚拟机加一块虚拟磁盘然后在 Linux 系统里把它识别、分区、格式化最后挂载到指定目录。这个过程就是“VMware 虚拟机磁盘挂载”它连接了虚拟化层的资源供给和操作系统层的存储管理。听起来简单不就是几个命令吗但实际操作里新手和老手效率能差出一个数量级。新手可能会在fdisk的交互界面里卡住分不清主分区和扩展分区或者格式化时选错文件系统导致性能不佳又或者忘了修改/etc/fstab导致重启后挂载失效服务直接宕机。而老手则有一套完整的“组合拳”从 VMware 端的厚置备、精简置备选择到 Linux 端的 UUID 挂载、xfs_growfs在线扩容每一步都有讲究。这篇文章我就以一个十多年运维老兵的身份把 VMware 环境下给 Linux 虚拟机挂载新磁盘的完整流程、背后的原理、以及我踩过的那些坑掰开揉碎了讲给你听。无论你是刚入行的运维工程师还是需要管理自己开发环境的程序员这套流程都能让你在面对磁盘空间告急时心里有底手上有术。2. 核心思路与前置准备谋定而后动在动手之前理清思路和做好准备工作能避免至少80%的后续麻烦。整个挂载过程可以清晰地分为两个阶段虚拟化层资源分配和操作系统层存储管理。前者在 VMware vSphere Client 或 Workstation 中完成后者则在 Linux 命令行中操作。2.1 虚拟化层VMware 磁盘添加的三种策略在 VMware 里给虚拟机添加硬盘不是点一下“添加”就完事的你需要根据实际场景做出选择这直接关系到磁盘的性能和空间利用率。1. 创建新虚拟磁盘 vs 使用现有磁盘这是第一个决策点。绝大多数情况我们都是“创建新虚拟磁盘”也就是凭空生成一个.vmdk文件。而“使用现有磁盘”通常用于磁盘迁移或者共享磁盘如集群环境等特殊场景。对于常规扩容我们选前者。2. 磁盘置备策略厚置备与精简置备这是影响存储空间占用和初期性能的关键选择。厚置备延迟置零创建时就直接占满你指定大小的物理存储空间比如你创建100G它就立刻在数据存储上占100G但不对这些空间进行擦写置零。第一次写入时再置零所以创建快但首次写入可能有轻微延迟。这是性能和空间占用比较平衡的常规选择。厚置备置零创建时不仅占满空间还立刻对整块磁盘进行写零操作。这确保了最佳的性能因为后续写入无需置零但创建时间最长且完全占用空间。适用于对性能极其敏感的生产环境。精简置备创建时只占用极少量的元数据空间比如几KB声称自己有100G。只有当虚拟机真正向磁盘写入数据时存储空间才会被一点一点地实际分配出去。这极大地提高了存储利用率适合开发测试环境或磁盘使用增长可预测的环境。但要注意如果数据存储空间本身快满了所有精简盘同时开始“膨胀”可能导致存储宕机。实操心得对于生产环境的数据盘我通常选择“厚置备延迟置零”在性能和空间确定性上取得平衡。对于开发测试环境果断用“精简置备”节省空间。记住一旦选择了精简置备后期很难直接转换为厚置备需要借助vmkfstools等工具进行转换过程较慢。3. 虚拟设备节点与磁盘模式添加磁盘时你需要指定一个“SCSI控制器”和“节点”比如 SCSI(0:1)。这里有个关键点确保你添加的磁盘和系统盘不在同一个SCSI控制器上。例如系统盘在 SCSI(0:0)那么新盘可以添加到 SCSI(1:0)。这是因为不同的SCSI控制器由不同的驱动模块处理可以避免一些潜在的兼容性问题也能稍微提升一点IO性能如果控制器类型不同。磁盘模式通常保持默认的“独立-持久”即可这意味着磁盘的更改会被永久保存。2.2 操作系统层Linux 存储管理知识梳理在 Linux 这边你需要理解几个核心概念它们构成了挂载操作的逻辑链条磁盘设备文件在/dev/目录下SCSI磁盘通常命名为sdX如sda,sdb。新添加的磁盘通常是系统中下一块未使用的比如原有sda新盘就是sdb。分区一块物理磁盘可以被划分成多个逻辑区域即分区。分区后在/dev/下会生成对应的设备文件如sdb1,sdb2。文件系统这是分区上的“数据结构”用于组织和存储文件。常见的如 ext4稳定通用、xfs高性能、大文件、btrfs高级特性多。分区必须格式化为某种文件系统后才能挂载。挂载将某个分区已格式化的存储空间关联到目录树中的一个空目录挂载点使得可以通过该目录访问分区中的文件。/etc/fstab系统启动时自动挂载的文件系统配置文件。手动挂载重启会失效写入fstab才能持久化。理解了这些整个操作路径就清晰了添加虚拟磁盘 - 系统识别 (sdb) - 分区 (sdb1) - 格式化 (ext4/xfs) - 创建挂载点 (/data) - 临时挂载测试 - 写入/etc/fstab实现开机自动挂载。3. 详细操作步骤从 VMware 到 Linux 的完整流水线下面我们以一个实际场景为例为一台已部署业务的 CentOS 7 虚拟机添加一块 100GB 的数据盘并挂载到/data目录。3.1 第一阶段VMware 控制台操作关闭虚拟机虽然 VMware 支持热添加硬盘但为了最大兼容性和避免意外建议先关闭虚拟机再进行操作。这是最稳妥的做法。编辑虚拟机设置右键虚拟机 - “编辑设置”。添加硬盘点击“添加” - 选择“硬盘” - 点击“下一步”。选择磁盘类型通常选择“SCSI”推荐或“SATA”。对于新版本系统两者性能差异不大SCSI 兼容性更好。选择创建新虚拟磁盘- 下一步。指定容量输入“100”单位选择“GB”。根据你的需求填写。选择置备策略根据之前的分析这里我们选择“厚置备延迟置零”。指定虚拟设备节点注意这里如果系统盘在SCSI (0:0)我们这里手动选择SCSI (1:0)将其放在另一个控制器上。保持磁盘模式为“独立-持久”。完成检查摘要信息无误后点击“完成”。启动虚拟机。3.2 第二阶段Linux 系统内操作虚拟机启动后通过 SSH 或控制台登录系统。3.2.1 识别新磁盘使用lsblk或fdisk -l命令查看当前系统的磁盘情况。lsblk你会看到类似下面的输出。sda是原有的系统盘下面有sda1,sda2等分区。新添加的磁盘会显示为sdb如果没有其他新磁盘且没有子分区。NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part / sdb 8:16 0 100G 0 disk # 这就是我们新加的盘也可以用fdisk -l来查看更详细的信息确认/dev/sdb的大小是否正确。3.2.2 对新磁盘进行分区我们计划将整个100G磁盘作为一个单独的分区使用。使用fdisk工具对/dev/sdb进行操作。fdisk /dev/sdb进入交互式命令行后按顺序输入以下命令n创建新分区。p选择主分区如果整块盘只分一个区主分区和扩展分区没区别默认选 p。1分区号默认 1。两次回车接受默认的起始扇区和结束扇区即使用整个磁盘。p打印分区表确认分区/dev/sdb1已创建。w将分区表写入磁盘并退出。注意事项fdisk的w命令是危险操作一旦写入不可撤销。在按w之前务必用p命令反复确认分区信息是否正确。如果误操作在按w之前可以用q命令不保存退出。3.2.3 格式化分区分区创建好后需要格式化为具体的文件系统。这里我们选择ext4因为它非常稳定且兼容性极好。mkfs.ext4 /dev/sdb1你会看到格式化过程的输出信息。如果想用XFS文件系统适用于大文件、高性能场景命令是mkfs.xfs /dev/sdb1。3.2.4 创建挂载点并临时挂载挂载点就是一个普通的空目录。我们创建/data目录并将新分区挂载上去。mkdir /data # 创建挂载点目录 mount /dev/sdb1 /data # 将分区临时挂载到目录现在使用df -h命令查看应该能看到/dev/sdb1已经挂载到了/data并且显示了可用容量。df -h /data3.2.5 配置开机自动挂载关键上面的mount命令是临时的重启后就失效了。为了让系统每次启动都自动挂载需要修改/etc/fstab文件。首先获取分区的UUID。UUID 是分区的唯一标识符比使用/dev/sdb1这种设备名更稳定因为设备名 (sda,sdb) 可能在增加或移除硬盘后发生变化而 UUID 不会。blkid /dev/sdb1输出类似/dev/sdb1: UUIDc1f9c8a1-...-... TYPEext4复制引号内的 UUID 值。然后编辑/etc/fstab文件vim /etc/fstab在文件末尾添加一行UUIDc1f9c8a1-...-... /data ext4 defaults 0 0这一行由6个字段组成用空格或Tab分隔设备这里我们使用更稳定的UUIDxxx。挂载点/data。文件系统类型ext4必须和格式化类型一致。挂载选项defaults包含了rw, suid, dev, exec, auto, nouser, async等常用选项。对于数据盘通常够用。如果需要更严格的权限控制可以设置为defaults,noexec,nosuid。dump备份标记0表示不使用dump工具备份。fsck检查顺序0表示开机不进行磁盘检查。根分区/通常是1其他数据盘设为0。3.2.6 测试 fstab 配置这是一个极其重要的步骤可以避免因为/etc/fstab配置错误导致系统无法启动。mount -a这条命令会尝试挂载/etc/fstab中所有未挂载的文件系统。如果没有报错再用df -h确认/data已挂载成功。如果有任何错误比如 UUID 写错、文件系统类型不对、挂载点不存在mount -a会明确提示此时必须修正/etc/fstab中的错误否则重启后系统可能进入紧急恢复模式。4. 进阶操作与深度优化基础的挂载完成后为了应对更复杂的需求和获得更好的性能我们还需要掌握一些进阶操作。4.1 使用 LVM 实现灵活的存储管理如果一块磁盘未来可能需要动态扩容、缩容或者想将多块物理磁盘合并成一个大的逻辑卷那么逻辑卷管理LVM是更好的选择。LVM 在物理磁盘和文件系统之间增加了一个抽象层提供了极大的灵活性。假设我们新加的磁盘是/dev/sdb我们想将其加入 LVM 管理创建物理卷pvcreate /dev/sdb扩展或创建卷组如果已有卷组如vg_data则扩展它。如果没有则新建一个。vgextend vg_data /dev/sdb # 扩展现有卷组 # 或 vgcreate vg_data /dev/sdb # 创建新卷组创建或扩展逻辑卷在卷组中创建逻辑卷或扩展现有逻辑卷。lvcreate -L 90G -n lv_data vg_data # 创建名为 lv_data大小90G的逻辑卷 # 或扩展现有逻辑卷 lv_data lvextend -L 90G /dev/vg_data/lv_data格式化并挂载对逻辑卷设备如/dev/vg_data/lv_data进行格式化 (mkfs.ext4) 和挂载步骤同上。/etc/fstab中设备名填写逻辑卷路径即可。LVM 的优势在于未来如果空间不足你可以在 VMware 端直接扩容虚拟磁盘然后在 Linux 中通过pvresize,lvextend,resize2fs对 ext4或xfs_growfs对 xfs一系列命令在线、不重启、不中断服务地完成文件系统扩容这是直接分区模式无法比拟的。4.2 挂载选项的精细调优/etc/fstab中的defaults选项是个通用集合。根据数据盘的用途我们可以进行精细调整以提升性能或安全性。数据盘无需执行程序defaults,noexec,nosuidnoexec禁止在此分区上执行二进制程序增强安全。nosuid忽略set-user-id和set-group-id位防止提权攻击。数据库或日志盘defaults,noatime,nodiratimenoatime读取文件时不更新其访问时间戳可以显著减少磁盘写操作提升 IO 性能。对于 MySQL、PostgreSQL 的数据目录强烈推荐。nodiratime不更新目录的访问时间。网络文件系统如 NFS会有专门的选项如hard,intr,rsize,wsize等需根据网络情况调整。4.3 磁盘性能简易测试挂载完成后如何知道磁盘的 IO 性能是否符合预期可以使用dd或fio工具进行简单测试。使用dd测试顺序写速度注意这会覆盖测试文件# 写入一个1GB的文件测试速度 dd if/dev/zero of/data/testfile bs1M count1024 oflagdirect命令结束后会输出速度如xxx MB/s。oflagdirect参数绕过了系统缓存测试的是真实的磁盘写入速度。更专业的测试可以使用fio工具它可以模拟随机读、随机写、混合读写等多种负载。5. 常见问题排查与实战避坑指南即使按照步骤操作也可能会遇到各种问题。下面是我总结的常见“坑点”及解决方法。5.1 问题一系统未识别到新磁盘现象在 VMware 添加磁盘后Linux 中lsblk或fdisk -l看不到新磁盘如sdb。排查思路检查虚拟机设置确认磁盘已成功添加且控制器、节点设置无误。扫描 SCSI 总线对于热添加的磁盘有时需要手动触发系统扫描。执行以下命令# 查看主机总线编号 ls /sys/class/scsi_host/ # 假设输出 host0则扫描该总线 echo - - - /sys/class/scsi_host/host0/scan可以尝试扫描所有主机for i in /sys/class/scsi_host/host*/scan; do echo - - - $i; done检查内核消息使用dmesg | tail -20或journalctl -k --since 5 minutes ago查看内核日志看是否有关于新磁盘的识别或错误信息。5.2 问题二mount -a或重启后挂载失败现象执行mount -a报错或重启后/data目录为空。排查步骤检查/etc/fstab语法确保没有多余的空格或 Tab字段数正确。特别检查 UUID 是否抄写正确。检查挂载点是否存在确认/data目录存在。检查文件系统类型blkid查看分区的TYPE与fstab中填写的是否一致。ext4 分区不能写成 xfs。检查文件系统完整性如果怀疑磁盘损坏可以尝试对未挂载的分区进行fsck检查务必在卸载状态下进行umount /dev/sdb1 # 先卸载 fsck.ext4 -y /dev/sdb1 # 检查并修复 ext4 文件系统查看具体错误信息mount -a的报错信息通常很明确如 “wrong fs type” “bad option” “bad superblock” 等根据提示修正。5.3 问题三磁盘空间显示异常现象df -h显示的大小与预期不符比如 100G 的盘只显示 90G 可用。原因与解决文件系统预留空间ext 系列文件系统默认会预留 5% 的空间给 root 用户防止普通用户写满磁盘导致系统服务崩溃。对于纯数据盘这 5% 通常可以释放。# 查看当前预留比例 tune2fs -l /dev/sdb1 | grep Reserved # 将预留空间比例调整为 1% tune2fs -m 1 /dev/sdb1调整后df -h显示的可用空间会增加。LVM 或分区未使用全部空间使用lsblk查看分区大小再用pvdisplay,lvdisplay查看 LVM 逻辑卷大小确保每一层都分配了全部容量。5.4 一个真实的“坑”误操作覆盖了系统盘惨痛教训有一次在给一台服务器加盘fdisk -l显示原有系统盘是/dev/sda新盘是/dev/sdb。但由于之前有人热拔插过硬盘导致设备名顺序变了实际上sdb才是系统盘。结果我在sdb上执行了mkfs.ext4……直接导致业务瘫痪。避坑技巧永远通过大小和分区信息确认磁盘不要只相信设备名。用fdisk -l时结合磁盘大小比如系统盘是 50G新盘是 100G和已有的分区结构系统盘通常有/boot,swap等分区来双重确认。使用lsblk -f或blkid这两个命令会显示文件系统类型和 UUID。系统盘的分区上肯定已经有文件系统了如 ext4, xfs而新盘是空的。这是最可靠的区分方法。操作前“刹车”在执行fdisk,mkfs等危险命令前养成习惯把命令写成fdisk /dev/sdX先不回车再核对一遍设备名。或者先对目标盘做一个无害操作比如lsblk /dev/sdb确认输出无误后再进行下一步。6. 生产环境下的高可用考量在要求高可用的生产环境中单块磁盘挂载存在单点故障风险。这时我们需要考虑更高级的方案1. 软件 RAID在 VMware 层面添加多块虚拟磁盘然后在 Linux 内部使用mdadm工具创建 RAID 阵列如 RAID1 镜像RAID5/6 带校验。再将 RAID 设备 (/dev/md0) 进行分区、格式化、挂载。这提供了磁盘级别的冗余。2. 多路径 IO如果虚拟机通过多条路径例如两个不同的虚拟 HBA 卡访问同一块共享存储如 iSCSI LUN就需要配置多路径 IO以避免单条路径故障导致存储不可用。常用的工具是multipathd。3. 结合监控将磁盘挂载状态纳入监控系统如 Zabbix, Prometheus。监控点包括挂载点是否存在通过df或mount命令检查。磁盘空间使用率超过 80% 告警。磁盘 IO 性能监控 await平均等待时间、util利用率等指标。文件系统健康度定期通过smartctl对于直通盘或日志检查。一套完整的 VMware 虚拟机磁盘挂载流程远不止是敲几个命令。它贯穿了从虚拟化资源规划、Linux 存储栈原理理解、到具体命令实操、性能安全调优再到生产环境高可用设计的整个知识链条。理解每一步背后的“为什么”并积累下那些手册里不会写的“坑”和技巧才能真正做到在关键时刻从容不迫。下次当你再面对磁盘空间不足的告警时希望这份指南能成为你手边最可靠的那份“作战地图”。