在虚拟机里跑Oracle ASM完全可行,尤其适合低成本搭建Oracle RAC ASM环境进行学习与测试,但难点不在数据库安装,而在虚拟机配置Oracle ASM磁盘时的共享控制器、udev绑定和磁盘模式设置。
为什么选择虚拟机部署Oracle ASM?
大多数人接触Oracle ASM不是因为手边有现成的光纤存储柜,而是想用一台工作站或笔记本把RAC集群跑起来,虚拟机正好解决了这个问题,行业共识认为,在虚拟化环境中搭建ASM磁盘组,是验证RAC存储行为、练习OCR/voting disk管理以及模拟磁盘组rebalancing最具性价比的方式。
- 学习场景:不需要购买共享存储,用虚拟共享磁盘就能跑两节点RAC。
- 测试场景:在北京机房或本地工作站上,可以快速克隆虚拟机,测试ASM磁盘组在不同补丁版本下的兼容性。
- 开发场景:开发人员需要一套独立的ASM环境验证表空间迁移或备份恢复脚本。
- 成本场景:一套物理共享存储加光纤交换机往往数万元起步,而虚拟机方案几乎零硬件成本。
虚拟机里跑ASM的代价也客观存在:I/O路径变长,随机读写延迟升高,多节点同时写入时可能出现锁竞争,但如果你清楚自己是在学习、测试或轻度使用,这个代价完全能接受。
Oracle ASM虚拟机安装步骤:从裸机到磁盘组在线
虚拟机配置Oracle ASM磁盘的前置准备
虚拟机搭建ASM环境,最少需要三块磁盘:系统盘、OCR/voting盘、ASM数据盘,磁盘不要用默认SATA控制器,否则后续共享和识别会出问题。
- VMware ESXi下,新建虚拟机后先添加一块独立持久模式的SCSI硬盘,控制器选择LSI Logic SAS或VMware准虚拟化。
- VirtualBox下,用
VBoxManage createhd --filename asm1.vdi --size 20480 --format VDI --variant Fixed创建固定大小磁盘,并在介质设置里勾选可共享。 - KVM/libvirt下,将磁盘挂在virtio-scsi控制器,配置中需要添加
<shareable/>标签,同时设置cache='none',避免宿主页缓存干扰ASM写入顺序。
Oracle ASM虚拟机怎么配置共享磁盘才不踩坑
共享磁盘是虚拟机ASM安装中最容易卡住的地方,踩坑点通常集中在三点:控制器类型、磁盘模式、SCSI目标ID一致性。
- 控制器类型:不要用SATA、NVMe控制器模拟共享盘,SATA盘在多数虚拟化平台不具备多写支持,ASM节点会互相覆盖磁盘头。
- 磁盘模式:在VMware中必须把每块ASM磁盘设置为独立-持久,否则虚拟机快照会让ASM元数据回到旧状态,磁盘组直接判定不一致。
- SCSI目标ID:多节点RAC共享磁盘时,两个节点上同一块盘的SCSI目标ID必须相同,例如节点一看到的
和节点二看到的/dev/sdb
/dev/sdb必须指向同一后端LUN,否则ASM扫描会认为磁盘缺失。
配置完成后,在虚拟机内用lsscsi -g查看磁盘映射,确认共享盘能被所有节点看到。
从udev绑定到磁盘组挂载
磁盘接入虚拟机后,下一步是固定设备路径,不要直接用/dev/sdb这类内核分配名,名称会随启动顺序变化,udev规则是虚拟机配置Oracle ASM磁盘的关键一步。
- 用
scsi_id获取磁盘WWID:/usr/lib/udev/scsi_id -g -u -d /dev/sdb - 编写规则文件:
/etc/udev/rules.d/99-oracle-asm.rules - 示例规则:
KERNEL=="sd", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/%k", RESULT=="36000c29f1a2b3c4d5e6f7a8b9c0d1e2", SYMLINK+="asm-data1", OWNER="grid", GROUP="asmadmin", MODE="0660" - 重新加载规则:
udevadm control --reload-rules && udevadm trigger - 检查软链接:
ls -l /dev/asm
注意:如果使用多路径软件,udev规则的RESULT应匹配聚合后的WWID,而不是单条路径的WWID,否则路径切换后软链接会失效。
磁盘绑定完成后,用grid用户登录,启动ASM实例,创建磁盘组:
CREATE DISKGROUP DATA EXTERNAL REDUNDANCY
DISK '/dev/asm-data1'
ATTRIBUTE 'compatible.asm'='19.0','compatible.rdbms'='19.0';
单节点测试环境用EXTERNAL REDUNDANCY即可,不需要故障组,如果是RAC测试,额外的OCR和voting磁盘组也照此处理。
虚拟机配置Oracle ASM磁盘:三种虚拟化平台对比
不同虚拟化软件对共享磁盘的实现方式不一样,操作路径和坑点也不同,下面这张表把主要差异列出来,方便你对照自己的环境。
| 平台 | 共享磁盘方式 | 磁盘模式要求 | 备注 |
|---|---|---|---|
| VMware ESXi | SCSI控制器总线共享 | 独立-持久,eagerzeroedthick | 多节点RAC需设置物理总线共享 |
| Oracle VirtualBox | 可共享VDI/VHD | 固定大小格式 | 动态磁盘在ASM条带化写入时抖动明显 |
| KVM/libvirt | virtio-scsi + shareable | cache=none, discard=unmap | 宿主机建议用raw或qcow2,别用ceph rbd直通 |
VMware下的操作路径
在VMware ESXi里,给虚拟机添加一块新SCSI控制器,控制器类型选VMware准虚拟化,然后把控制器上的SCSI总线共享设为虚拟或物理,单节点测试选虚拟,多节点RAC建议物理,磁盘独立持久模式一定要开,否则快照会让ASM磁盘头时间戳不一致。
VirtualBox下的共享磁盘细节
VirtualBox里创建磁盘时,格式选VDI,大小固定,添加给虚拟机后,在存储设置中把每块共享盘的固态驱动器关闭,避免系统把虚拟盘当本地SSD优化,同时勾选可共享,如果用SATA控制器,性能会非常差,建议手动切换到SAS或SCSI控制器。
KVM下写libvirt配置
KVM环境中,很多人直接用qcow2文件模拟共享盘,但默认的virtio-blk不支持多节点并发写,要改成virtio-scsi控制器,并在disk段中加入<shareable/>,如果宿主机是本地硬盘,建议设置cache='none',否则数据可能缓存在宿主页缓存里,崩溃后出现ASM元数据不一致。
Oracle ASM虚拟机性能对比:裸盘、VMFS和RDM怎么选
虚拟机里ASM性能下降,根源在于I/O路径增加了一层虚拟化软件栈,裸金属环境一次写入直接落盘,虚拟机环境先从Guest内核到虚拟SCSI设备,再到宿主内核,最后才到物理磁盘,这条更长的路径,对随机小块读写影响最大。
| 磁盘提供方式 | 顺序读写 | 随机小I/O | 配置难度 | 适合场景 |
|---|---|---|---|---|
| VMFS虚拟磁盘 | 较高 | 中等偏低 | 低 | 学习、测试、单实例 |
| RDM物理映射 | 接近物理盘 | 接近物理盘 | 中高 | 小型准生产 |
| 虚拟共享SCSI总线 | 一般 | 一般 | 中 | 多节点RAC测试 |
业内专家指出,虚拟机里跑ASM时使用eagerzeroedthick厚置备磁盘,比thin磁盘在首次写入时的延迟更可控,也减少了零填充带来的I/O尖峰。
影响虚拟机ASM性能的关键参数
- 磁盘置备类型:eagerzeroedthick比lazyzeroedthick稳定,首次写入不触发额外零填充。
- SCSI控制器:准虚拟化SCSI比LSI SAS的CPU开销低,适合性能测试。
- 内核刷盘参数:
vm.dirty_ratio和vm.dirty_background_ratio在虚拟机中不宜调大,否则脏页堆积会放大写入延迟。 - 大页支持:ASM实例本身内存占用不大,但开启透明大页能减少页表扫描开销。
如果你的目标是跑一个稳定的测试环境,优先考虑RDM物理映射;如果只是学习ASM命令,VMFS虚拟磁盘完全够用,不用一上来就折腾RDM,配置复杂度会吃掉学习时间。
Oracle ASM虚拟机故障排查:磁盘组无法挂载怎么办
虚拟机环境下,磁盘组无法挂载的故障比物理机更常见,原因通常不是Oracle数据库本身,而是虚拟磁盘配置、udev规则或权限没做好。
常见错误与日志路径
ASM告警日志一般在$ORACLE_BASE/diag/asm/+asm/+ASM/trace/alert_+ASM.log,看到ORA-15032、ORA-15040这类错误时,先别急着重建磁盘组,按下面顺序排查。
- 确认磁盘是否在线:
ls -l /dev/asm - 确认磁盘头是否有效:
kfed read /dev/asm-data1 - 确认grid用户权限:
ls -l /dev/asm-data1,所有者应为grid,组为asmadmin - 确认ASM资源状态:
crsctl stat res -t
实操排查顺序
- 查控制器共享:
lsscsi -g列出所有SCSI设备,确认共享盘出现在每个节点上,且SCSI ID一致。 - 查udev绑定:执行
udevadm test /sys/block/sdb模拟udev事件,看规则是否生成/dev/asm-data1。 - 查磁盘头:
kfed read /dev/asm-data1如果报KFED-00303,说明磁盘头损坏或路径不是ASM磁盘。 - 查ASM实例:
sqlplus / as sysasm登录,执行SELECT name,state,type,total_mb,free_mb FROM v$asm_diskgroup; - 查单个磁盘状态:
SELECT path,name,header_status,mode_status,state FROM v$asm_disk;
如果磁盘状态是MISSING,多半是共享控制器或磁盘路径变化导致,先回到虚拟化层确认磁盘在线,再恢复udev规则,ASM磁盘组多数能重新挂载,不需要重建。
在虚拟机中部署Oracle ASM,核心不是装数据库,而是搞定共享磁盘的控制器、盘模式和udev绑定,把这三个环节做对,绝大多数安装和挂载问题在启动阶段就会被挡在门外。
Q&A
Oracle ASM虚拟机安装步骤中最容易卡在哪一步?
最容易卡在共享磁盘配置,VMware下没有把SCSI总线共享打开,或磁盘没有设为独立持久模式,会导致后续节点看不到盘或ASM报磁盘组不一致,udev规则权限写错也是高频问题,grid用户必须对/dev/asm-有读写权限。
虚拟机配置Oracle ASM磁盘用udev还是ASMLib?
学习和测试环境优先用udev,ASMLib需要额外安装内核模块,版本匹配比较麻烦,而udev规则透明,排查路径直观,也不会在虚拟机里引入额外的内核依赖,生产物理机用ASMLib的情况仍然存在,但虚拟机环境不推荐。
Oracle ASM虚拟机性能对比物理机差距大吗?
差距主要体现在随机写入和多节点并发写入场景,虚拟化层增加了软件栈深度,会把短小I/O的时延放大,顺序只读和单实例顺序写入时,差距相对较小,虚拟机适合练手和功能验证,不适合直接承载高并发生产库。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/641097.html





