Dosyalar
kvm-manager/scripts/install-guest-agent.sh
T
admin dbba1694d8 feat: 优化虚拟机列表,支持多主机聚合显示
- 新增 /vm/list-all API 聚合所有主机虚拟机
- parse_vm_info 支持 include_ip 参数控制IP获取
- VMList 添加主机选择器,显示宿主机列
- 修复 API 路径 /host/list -> /hosts/list
- 新增启动脚本 scripts/start.sh
- 新增 Guest Agent 安装脚本 scripts/install-guest-agent.sh
- 更新 README 文档
2026-05-07 14:52:45 +08:00

167 satır
4.6 KiB
Bash
Çalıştırılabilir Dosya
Ham Suçlama Geçmiş

Bu dosya muğlak Evrensel Kodlu karakter içeriyor
Bu dosya, başka karakterlerle karıştırılabilecek evrensel kodlu karakter içeriyor. Eğer bunu kasıtlı olarak yaptıysanız bu uyarıyı yok sayabilirsiniz. Gizli karakterleri göstermek için Kaçış Karakterli düğmesine tıklayın.
#!/bin/bash
# KVM 虚拟机 QEMU Guest Agent 一键安装脚本
# 用法: ./install-guest-agent.sh [VM_NAME]
set -e
AGENT_XML="/tmp/ga-channel.xml"
CONTROLLER_XML="/tmp/ga-controller.xml"
# 检查 virtio-serial controller 是否存在
check_controller() {
local vm="$1"
if virsh dumpxml "$vm" | grep -q "type='virtio-serial'"; then
return 0 # 存在
fi
return 1 # 不存在
}
# 添加 virtio-serial controller
add_controller() {
local vm="$1"
cat > "$CONTROLLER_XML" << 'EOF'
<controller type='virtio-serial' index='0'/>
EOF
virsh attach-device "$vm" "$CONTROLLER_XML" --config 2>/dev/null || true
rm -f "$CONTROLLER_XML"
}
# 添加 guest agent channel
add_channel() {
local vm="$1"
cat > "$AGENT_XML" << 'EOF'
<channel type='unix'>
<source mode='bind'/>
<target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>
EOF
virsh attach-device "$vm" "$AGENT_XML" --live --config 2>/dev/null
rm -f "$AGENT_XML"
}
# 安装 guest agent 到虚拟机内部
install_agent_in_vm() {
local vm="$1"
echo "安装 Guest Agent 到 $vm ..."
# 获取虚拟机 IP(用于 SSH
local ip=""
if command -v virsh &>/dev/null; then
ip=$(virsh domifaddr "$vm" 2>/dev/null | grep -oP '(\d+\.){3}\d+' | head -1)
fi
if [ -z "$ip" ]; then
echo " 无法获取 $vm 的 IP 地址,跳过 Agent 安装"
echo " 请手动在虚拟机内执行以下命令安装 Agent:"
echo " CentOS/RHEL: yum install qemu-guest-agent"
echo " Ubuntu/Debian: apt install qemu-guest-agent"
return 0
fi
# 尝试 SSH 连接并安装
ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 "$ip" "command -v yum &>/dev/null && yum install -y qemu-guest-agent || (command -v apt &>/dev/null && apt update && apt install -y qemu-guest-agent) || echo 'Agent 安装失败,请手动安装'" 2>/dev/null || true
}
# 单个虚拟机配置
setup_one_vm() {
local vm="$1"
echo "=========================================="
echo "配置虚拟机: $vm"
# 检查虚拟机是否存在
if ! virsh domstate "$vm" &>/dev/null; then
echo " 错误: 虚拟机 $vm 不存在"
return 1
fi
local state=$(virsh domstate "$vm")
echo " 当前状态: $state"
# 检查是否已有 guest-agent channel
if virsh dumpxml "$vm" | grep -q "org.qemu.guest_agent"; then
echo " ✓ Guest Agent channel 已配置,跳过"
if [ "$state" = "running" ]; then
echo " 检测 Guest Agent 连接状态..."
virsh qemu-agent-command "$vm" '{"execute":"guest-info"}' 2>/dev/null && echo " ✓ Guest Agent 运行正常" || echo " ✗ Guest Agent 未响应"
fi
return 0
fi
# 检查 controller
if ! check_controller "$vm"; then
echo " 添加 virtio-serial 控制器..."
add_controller "$vm"
echo " ✓ 控制器添加成功(需要重启生效)"
else
echo " ✓ virtio-serial 控制器已存在"
fi
# 添加 channel
echo " 添加 Guest Agent channel..."
if add_channel "$vm"; then
echo " ✓ Channel 配置成功"
else
echo " ✗ Channel 配置失败(虚拟机可能需要关机)"
echo " 建议: virsh shutdown $vm && virsh edit $vm"
return 1
fi
# 如果运行中,尝试安装 Agent
if [ "$state" = "running" ]; then
install_agent_in_vm "$vm"
fi
echo "=========================================="
echo ""
}
# 批量配置所有运行中的虚拟机
setup_all_vms() {
echo "===== 批量配置所有虚拟机 ====="
echo ""
local vms=$(virsh list --all --name 2>/dev/null)
if [ -z "$vms" ]; then
echo "没有找到虚拟机"
return
fi
for vm in $vms; do
# 跳过模板和特殊虚拟机
[[ "$vm" =~ ^(Template|base|.*-template)$ ]] && continue
setup_one_vm "$vm"
done
echo "===== 配置完成 ====="
echo ""
echo "提示: 如果 Guest Agent 未响应,请重启虚拟机:"
echo " virsh reboot <VM_NAME>"
}
# 主程序
main() {
echo "=========================================="
echo " KVM Guest Agent 一键安装脚本"
echo "=========================================="
echo ""
if [ -z "$1" ]; then
echo "用法:"
echo " $0 <VM_NAME> # 配置单个虚拟机"
echo " $0 --all # 配置所有虚拟机"
echo ""
echo "示例:"
echo " $0 myvm"
echo " $0 --all"
echo ""
setup_all_vms
elif [ "$1" = "--all" ]; then
setup_all_vms
else
setup_one_vm "$1"
fi
}
main "$@"