OpenNebula:问题排查与修复

问题 1:用户认证失败

错误信息

1
User couldn't be authenticated, aborting call

原因分析

  • 用户密码修改后,~/.one/one_auth 文件未同步更新
  • 认证文件权限不正确
  • OpenNebula 服务未正确加载新凭证

解决方案

1
2
3
4
5
6
7
8
9
10
11
# 1. 更新认证文件
echo "username:new_password" > ~/.one/one_auth

# 2. 设置正确权限
chmod 600 ~/.one/one_auth

# 3. 验证认证
oneuser show <username>

# 4. 重启服务(如果需要)
sudo systemctl restart opennebula opennebula-sunstone

预防措施

1
2
# 使用 oneuser passwd 命令修改密码
oneuser passwd <username> <new_password>

问题 2:虚拟机卡在 HOLD 状态

现象描述

  • 虚拟机创建后一直处于 HOLD 状态
  • 无法自动转为 PENDING 或 RUNNING

原因分析

  1. 资源不足(CPU、内存、存储)
  2. 网络配置问题
  3. 调度策略限制
  4. 模板配置错误

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 手动部署虚拟机
onevm deploy <vm_id> <host_id>

# 2. 检查资源状态
onehost list
onedatastore list

# 3. 查看虚拟机错误信息
onevm show <vm_id> --xml | xmllint --xpath '/VM/HISTORY_RECORDS/HISTORY[last()]/MESSAGE/text()' -

# 4. 释放资源保留
onevm delete <vm_id>

预防措施

1
2
3
4
5
6
7
8
9
10
# 配置自动部署策略
sudo nano /etc/one/sched.conf

# 修改配置示例
DEFAULT_SCHED = [
policy = 1
]

# 重启调度服务
sudo systemctl restart opennebula-scheduler

问题 3:VNC 端口冲突

现象描述

  • 虚拟机启动失败
  • 日志显示 VNC 端口已被占用

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1. 释放被占用的端口
sudo netstat -tulnp | grep 59[0-9][0-9]
sudo kill -9 <process_id>

# 2. 修改虚拟机 VNC 端口
onevm update <vm_id>
# 在模板中添加:
GRAPHICS = [
TYPE = "vnc",
PORT = "590X" # 替换为可用端口
]

# 3. 重新创建虚拟机
onevm delete <vm_id>
onevm create <template_file>

预防措施

1
2
3
4
5
6
7
8
9
# 配置 VNC 端口范围
sudo nano /etc/one/oned.conf

# 修改配置
PORT_RANGE = "5900-5999"
MAX_PORT = 100

# 重启服务
sudo systemctl restart opennebula

问题 4:虚拟机无法连接网络

现象描述

  • 虚拟机启动后无法访问网络
  • 无法通过 SSH 连接

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 检查虚拟网络
onevnet list
onevnet show <vnet_id>

# 2. 验证 DHCP 服务
ps aux | grep dhcp

# 3. 检查防火墙规则
sudo iptables -L -n -v

# 4. 重启网络服务
onevnet update <vnet_id>

网络配置模板示例

1
2
3
4
5
6
7
8
9
10
11
NAME = "Private Network"
TYPE = FIXED

BRIDGE = br0

# 地址范围
AR = [
TYPE = "IP4",
IP = "192.168.1.100",
SIZE = "100"
]

问题 5:存储空间不足

现象描述

  • 虚拟机创建失败
  • 日志显示 “No space left on device”

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 检查存储空间
onedatastore list
df -h /var/lib/one/datastores

# 2. 清理旧镜像
for i in $(onedatastore show 0 | grep image | awk '{print $1}'); do
oneimage delete $i
done

# 3. 扩展存储空间
onedatastore update 0
# 修改容量参数
DS_MAD_CONF = [
CAPACITY = "1024" # 单位 MB
]

# 4. 添加新数据存储
onedatastore create new_datastore.conf

问题 6:虚拟机启动超时

现象描述

  • 虚拟机停留在 PROLOG 状态
  • 超时后转为 FAILED 状态

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 增加超时时间
onevm update <vm_id>
# 添加配置:
PROLOG_TIMEOUT = 600 # 单位秒

# 2. 检查存储访问
ls -l /var/lib/one/datastores

# 3. 验证 NFS 挂载
showmount -e <nfs_server>

# 4. 重启虚拟机
onevm restart <vm_id>

高级调试技巧

日志分析

1
2
3
4
5
6
7
8
# 查看实时日志
tail -f /var/log/one/oned.log

# 过滤错误信息
grep -i error /var/log/one/oned.log

# 查看虚拟机部署日志
onevm show <vm_id> --xml | xmllint --xpath '/VM/HISTORY_RECORDS/HISTORY[last()]/MESSAGE/text()' -

数据库维护

1
2
3
4
5
6
7
8
# 备份数据库
mysqldump -u oneadmin -p opennebula > one_backup.sql

# 修复数据库
mysqlcheck -u oneadmin -p --auto-repair opennebula

# 优化数据库
mysqlcheck -u oneadmin -p --optimize opennebula

最佳实践建议

  1. 定期维护

    1
    2
    3
    4
    5
    # 每周清理旧虚拟机
    onevm list | grep 'fai\|done' | awk '{print $1}' | xargs -I{} onevm delete {}

    # 每月优化数据库
    echo "OPTIMIZE TABLES;" | mysql -u oneadmin -p opennebula
  2. 监控设置

    1
    2
    3
    4
    5
    # 安装监控插件
    sudo yum install opennebula-monitord

    # 配置告警
    sudo nano /etc/one/monitord.conf
  3. 备份策略

    1
    2
    3
    4
    5
    # 每日备份配置
    0 2 * * * tar czf /backup/one_config_$(date +\%F).tar.gz /etc/one

    # 每周全量备份
    0 3 * * 0 mysqldump -u oneadmin -p opennebula > /backup/one_db_$(date +\%F).sql

故障排查流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
graph TD
A[问题发生] --> B{状态检查}
B -->|HOLD| C[手动部署]
B -->|PROLOG| D[检查存储]
B -->|BOOT| E[检查网络]
B -->|FAILED| F[查看日志]
C --> G[解决]
D --> G
E --> G
F -->|资源不足| H[扩容]
F -->|配置错误| I[修改模板]
H --> G
I --> G
G --> Z[问题解决]