Vagrant up 卡在“Waiting for domain to get an IP address…”是因 DHCP 响应慢、网卡未就绪或内存不足;需禁用 IP 等待、分配 4GB 内存与 2 CPU、改用静态 IP 网络,并正确配置 Oracle RPM 自动安装与监听器。
为什么 vagrant up 卡在 “Waiting for domain to get an IP address…”
oracle 安装对网络和资源要求高,vagrant 默认的 libvirt 或 virtualbox provider 在无配置干预时,常因 dhcp 响应慢、网卡未就绪或内存不足导致超时失败。这不是 oracle 的问题,而是 vagrant 底层等待机制过于激进。
- 在
Vagrantfile中显式禁用等待 IP:添加config.vm.provider "virtualbox" do |vb|; vb.customize ["modifyvm", :id, "--nictype1", "virtio"]; end(VirtualBox)或改用libvirt的network_name配置固定桥接 - Oracle 虚拟机至少分配 4GB 内存和 2 CPU,
vb.memory = 4096和vb.cpus = 2必须写死,否则oracle-database-preinstall包会拒绝启动服务 - 避免使用
private_network自动 DHCP 模式;改用public_network或 host-only 网络 + 静态 IP,例如:config.vm.network "private_network", ip: "192.168.56.101"
Oracle RPM 包怎么自动安装又不卡在交互式提示
Oracle 官方 RPM(如 oracle-database-preinstall-7、oracle-database-ee-19c)默认运行时会触发 systemd 服务启用、内核参数写入、用户组创建等操作,但 Vagrant shell provisioner 若未设好执行时机和环境,极易因权限、PATH 或 SELinux 状态失败。
- 必须用
privileged: true运行 shell provisioner,否则sysctl -p和usermod会静默失败 - 禁用交互的关键是预设响应:在安装前运行
echo "y" | /etc/init.d/oracle-database configure(19c)或设置ORACLE_INSTALL_AUTO=true环境变量 - 不要直接
yum install -y后立刻调runInstaller;先执行/etc/init.d/oracle-database configure完成基础初始化,再用sudo -u oracle /opt/oracle/product/19c/dbhome_1/runInstaller -ignorePrereqFailure -waitforcompletion -silent -responseFile /vagrant/db.rsp
vagrant reload --provision 重跑时 Oracle 实例反复重建怎么办
Vagrant 默认每次 --provision 都会重新执行所有 shell 脚本,而 Oracle 安装脚本不具备幂等性 —— 第二次执行会报 ORA-01017: invalid username/password 或 database already exists,甚至破坏监听器配置。
- 在 provisioner 脚本开头加判断:
if [ -f /opt/oracle/diag/rdbms/orcl ]; then echo "DB already installed"; exit 0; fi - 把数据库创建逻辑(
dbca)和监听器启动(lsnrctl start)拆到独立脚本,并用test -S /var/tmp/.oracle/sEXTPROC1521检查监听是否已运行 - 关键路径如
/opt/oracle/oradata必须挂载为 synced folder 或使用libvirt的storage_pool持久化,否则vagrant destroy后数据全丢,重装又从头来
如何让宿主机直连 192.168.56.101:1521 而不配 TNSNAMES
Vagrant 的端口转发默认只映射 SSH(22),Oracle 监听器默认绑定在虚拟机内网地址且未开放防火墙,宿主机 telnet 通不了 1521 是常态,不是连接串写错了。
- 在
Vagrantfile加端口转发:config.vm.network "forwarded_port", guest: 1521, host: 1521, protocol: "tcp",但注意这仅适用于 VirtualBox;libvirt 需配合public_network+ iptables 开放 - Oracle 监听器必须监听
*或具体 IP(非localhost):检查$ORACLE_HOME/network/admin/listener.ora中LISTENER的(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) - CentOS/RHEL 8+ 默认启用 firewalld,必须在 provisioner 中运行:
sudo firewall-cmd --permanent --add-port=1521/tcp && sudo firewall-cmd --reload
真正麻烦的不是部署脚本写几行,而是 Oracle 对内核参数、SELinux 状态、文件句柄数、swap 分区这些底层条件极其敏感,Vagrant 把它们全藏在 box 里,一不留神就卡在 silent install 的最后一步 —— 连 sqlplus / as sysdba 都进不去。










