这是一个非常实际且关键的问题!我们来一步步分析 "物理主机关机 → 重启" 对 嵌套虚拟机 + DevStack 的影响,并给出完整的恢复操作指南。
🧩 场景回顾
- 物理主机(Host) :运行 Linux(如 Ubuntu)
- 虚拟机(VM) :在 Host 上通过 KVM/QEMU、VirtualBox 或 VMware 创建
- DevStack:部署在该 VM 内部(单节点 OpenStack 开发环境)
✅ 典型拓扑:
你的笔记本/服务器→KVM 虚拟机 (192.168.122.30)→DevStack (Keystone/Nova/Neutron...)
🔌 一、关机对各层的影响
| 组件 | 关机时状态 | 开机后状态 | 是否自动恢复 |
|---|---|---|---|
| 物理主机 | 正常关机 | 需手动开机 | ❌ |
| 虚拟机(VM) | 被强制断电(除非优雅关机) | 默认不会自动启动 | ❌(需配置) |
| DevStack 服务 | 进程被 kill | 不会自动启动(即使 VM 启动) | ❌(需手动或配置 systemd) |
⚠️ 关键结论 :
物理机重启后,VM 和 DevStack 都不会自动恢复运行!你需要手动干预。
🛠️ 二、开机后的完整恢复步骤
✅ 步骤 1:启动虚拟机(VM)
情况 A:你使用 libvirt/KVM(virsh)
python
# 查看 VM 状态
virsh list --all
# 启动 VM(假设名字是 devstack-vm)
virsh start devstack-vm
# (可选)设置开机自启(推荐!)
virsh autostart devstack-vm
💡
autostart会让 VM 在 物理机启动后自动运行(但 DevStack 服务仍需单独处理)。
情况 B:你使用 VirtualBox
bash
VBoxManage startvm "devstack-vm" --type headless
情况 C:你使用 VMware Workstation / ESXi
- 手动点击"开机"
- 或在 ESXi 中设置"随主机启动"
✅ 步骤 2:登录虚拟机,检查 DevStack 服务状态
perl
ssh stack@192.168.122.30 # 或你的 VM IP
检查 systemd 服务(现代 DevStack 默认方式):
perl
# 查看所有 DevStack 服务状态
systemctl list-units | grep devstack
# 检查 Keystone 是否运行
systemctl is-active devstack@keystone
❌ 如果返回
inactive,说明服务未启动。
✅ 步骤 3:启动 DevStack 服务
方式 A:如果你使用 systemd 模式(推荐)
只需启动所有 DevStack 服务:
perl
# 启动所有 DevStack 服务
sudo systemctl start 'devstack@*'
# 验证
systemctl status devstack@keystone devstack@nova-api
✅ 优势:服务会按依赖顺序启动,日志可通过
journalctl查看。
方式 B:如果你使用 传统模式(非 systemd)
需要重新运行 DevStack 脚本:
bash
cd ~/devstack
./rejoin-stack.sh # 重新 attach 到已存在的服务(如果支持)
# 或
./stack.sh # 重新完整部署(较慢,但可靠)
⚠️ 注意:
./stack.sh会重建数据库和网络,可能导致之前创建的虚拟机丢失!
✅ 步骤 4:验证 OpenStack 功能
bash
source ~/devstack/openrc admin admin
# 测试认证
openstack token issue
# 查看虚拟机(如果之前有)
openstack server list
# 访问 Dashboard
curl -s http://localhost:8080/dashboard | head -5
🔄 三、如何实现"全自动恢复"?(高级建议)
如果你希望 物理机重启后,VM 和 DevStack 全自动恢复,可以这样做:
1. 让 VM 开机自启
- KVM/libvirt :
virsh autostart devstack-vm - VirtualBox:需写 systemd 服务或 cron job
- VMware:在虚拟机设置中启用"随主机启动"
2. 让 DevStack 服务随 VM 启动
在 VM 内部执行:
bash
# 启用所有 DevStack 服务的开机自启
sudo systemctl enable 'devstack@*'
✅ 这样,VM 启动后,systemd 会自动拉起 Keystone、Nova、Neutron 等服务。
3. (可选)添加健康检查脚本
创建一个监控脚本 /usr/local/bin/check-devstack.sh:
bash
#!/bin/bash
if ! systemctl is-active --quiet devstack@keystone; then
sudo systemctl start 'devstack@*'
fi
并通过 cron 每分钟检查一次。
⚠️ 四、注意事项与风险
| 风险 | 说明 | 建议 |
|---|---|---|
| IP 变更 | VM 重启后 IP 可能变化(如果 DHCP) | 使用静态 IP 或更新 local.conf 中的 HOST_IP |
| 数据库损坏 | 强制断电可能导致 MariaDB 损坏 | 尽量优雅关机;定期备份 /opt/stack/data/ |
| 网络重置 | Neutron 的 Linux Bridge/OVS 可能需重建 | DevStack 通常能自动恢复,若不行则 ./stack.sh |
| 资源不足 | 物理机内存不足导致 VM 无法启动 | 确保 Host 有足够资源(建议 ≥16GB RAM) |
ip变更问题解决
针对ip可能变化,做了以下配置 在 libvirt/KVM 中绑定 MAC → IP(适合 KVM 用户)
步骤 1:获取 VM 的 MAC 地址
perl
virsh dumpxml devstack-vm | grep "mac address" # 输出:<mac address='52:54:00:a1:b2:c3'/>
步骤 2:编辑 libvirt 网络配置(通常是 default 网络)
arduino
virsh net-edit default
在 <ip> 段内添加 <host> 条目:
xml
<network> <name>default</name> <bridge name='virbr0'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'/> <!-- 添加这一行 --> <host mac='52:54:00:a1:b2:c3' ip='192.168.122.30'/> </dhcp> </ip> </network>
步骤 3:重启网络
sql
virsh net-destroy default virsh net-start default
📌 五、最佳实践总结
| 操作 | 命令/配置 |
|---|---|
| 1. VM 开机自启 | virsh autostart devstack-vm |
| 2. DevStack 服务自启 | sudo systemctl enable 'devstack@*' |
| 3. 启用 journald 持久化 | sudo mkdir -p /var/log/journal |
| 4. 使用静态 IP | 在 VM 网络配置中固定 IP |
| 5. 关机前优雅停止 | 在 VM 中执行 ./unstack.sh(可选但推荐) |
💡 理想流程 :
物理机关机 → VM 自动保存状态(或优雅关机)→ 物理机开机 → VM 自动启动 → DevStack 服务自动恢复 → 一切如常!
✅ 最终答案
物理服务器关机再开机后:
虚拟机不会自动启动 (除非你配置了
autostart)DevStack 服务不会自动运行(即使 VM 启动了)
你需要手动:
- 启动虚拟机
- 在 VM 中启动 DevStack 服务(
sudo systemctl start 'devstack@*')为避免每次手动操作,建议配置:
- VM 开机自启
- DevStack 服务开机自启
这样,重启物理机后,DevStack 环境就能"无缝恢复"了!