QEMU使用Qemu-Guest-Agent传输文件、执行指令等


简介

之前介绍过qemu传输文件,使用的挂载 / samba方式 :Qemu和宿主机不使用外网进行文件传输。

这是一种方式,这里还有另一种方式:使用Qemu-Guest-Agent,后面简称qga

官网介绍:https://www.qemu.org/docs/master/interop/qemu-ga.html


安装

这里有一篇参考文章,会比我下面介绍的相对复杂一点,但也可以完成操作。

参考文章:https://www.easystack.cn/doc/ComputingService/6.1.1/zh-cn/FAQs/DeployQGA.html

一、Linux的Qemu机器

直接install命令即可,查看上面的参考链接即可。

二、Windows的Qemu机器

Windows的Qemu机器:需要安装好virtio-serial driver,下面详细介绍一下:

首先下载该文件(1积分),这个文件我已经测试了Windows7-10、Centos7-8、Ubuntu16-24可用:Qemu-Guest-Agnet整理包

这是一个Windows整理后的qga包,包含amd64.zip和qemu-ga.zip两个文件,请都解压出来。

1、amd64:首先安装证书,管理员运行cmd,命令:pnputil -I -a vioser.inf

2、qemu-ga:将qemu-ga目录放到C:\Program Files下,管理员运行cmd,命令:qemu-ga -s install

3、然后检查【服务】,是否包含以下两个服务,如果存在,则说明安装成功,将两个内容全部设置为自动启动
QEMU Guest Agent
QEMU Guest Agent VSS Provider

4、验证
转为qcow2上传到linux服务器,运行以下指令(假设该qcow2文件名字为Windows10.qcow2)
运行以下内容

qemu-system-x86_64 -name test -hda Windows10.qcow2 -m 4096M -smp cpus=2,sockets=1 -enable-kvm -netdev user,id=net0 -device e1000,netdev=net0 -chardev socket,path=/tmp/test.sock,server=on,wait=off,id=qga0 -device virtio-serial -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 -machine usb=on -device usb-tablet

成功开机后,有可能QEMU Guest Agent服务并没有成功运行,那么此时到【服务】中手动开启,如果能手动开启成功,则没问题(下次就能自动开启了)。

此时,使用命令socat - unix-connect:/tmp/test.sock,连接上以后,输入一些命令测试一下,如:{"execute":"guest-info"}


使用

前面安装没问题以后,就可以用代码去连接socket文件并执行内容了。这里写几个demo

1、获取系统信息

import asyncio
import json

class QEMUGuestAgent(object):
    endpoint: str

    def __init__(self, endpoint):
        self.endpoint = endpoint
        
    async def execute(self, command, timeout=2.0):
        try:
            reader, writer = await asyncio.open_unix_connection(self.endpoint)
            writer.write(json.dumps(command).encode())
            response = await asyncio.wait_for(reader.readline(), timeout)
            writer.close()
            return json.loads(response)
        except ConnectionAbortedError:
            print("ConnectionAbortedError: QEMU Agent功能未开启")
            return {}
        except asyncio.TimeoutError:
            print("TimeoutError: Agent 未安装或运行")
            return {}
        
    async def get_osinfo(self):
        """
        查询虚拟机操作系统版本
        :param command:
        :return:
        """
        command = {
            "execute": "guest-get-osinfo"
        }
        return await self.execute(command)

async def main():
    if __name__ == '__main__':
        qga = QEMUGuestAgent("/tmp/test.sock")
        rv = await qga.get_osinfo()
        print(rv)

2、上传文件

import asyncio
import json


class QEMUGuestAgent(object):
    endpoint: str

    def __init__(self, endpoint):
        self.endpoint = endpoint

    async def execute(self, command, timeout=2.0):
        try:
            reader, writer = await asyncio.open_unix_connection(self.endpoint)
            writer.write(json.dumps(command).encode())
            response = await asyncio.wait_for(reader.readline(), timeout)
            writer.close()
            return json.loads(response)
        except ConnectionAbortedError:
            print("ConnectionAbortedError: QEMU Agent功能未开启")
            return {}
        except asyncio.TimeoutError:
            print("TimeoutError: Agent 未安装或运行")
            return {}

    async def open_file(self, path, mode="r"):
        # 1. 获取文件句柄
        command = {
            "execute": "guest-file-open",
            "arguments": {
                "path": path,
                "mode": mode
            }
        }
        rv = await self.execute(command)
        # TODO: 判断返回值, 文件不存在会报错
        fd = rv['return']
        return fd


async def main():
    if __name__ == '__main__':
        qga = QEMUGuestAgent("/tmp/test.sock")
        fd = await qga.open_file("C:\\cccc\\1111.txt", mode="w")

其他的比如下载文件、在qemu内执行指令等功能参考:https://www.qemu.org/docs/master/interop/qemu-ga-ref.html。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885578.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师——计算机网络

📔个人主页📚:秋邱-CSDN博客☀️专属专栏✨:软考——软件设计师🏅往期回顾🏆:🌟其他专栏🌟:C语言_秋邱 一、OSI/ RM七层模型(⭐⭐⭐) ​ 层次 名称 主要功…

docker下载mysql时出现Unable to pull mysql:latest (HTTP code 500) server error 问题

报错 Unable to pull mysql:latest (HTTP code 500) server error - Get “https://registry-1.docker.io/v2/”: EOF 解决方法 将VPN开到Global模式 解决啦

Could not retrieve https://npm.taobao.org/mirrors/node/index.json. 报错解决

Could not retrieve https://npm.taobao.org/mirrors/node/index.json. 报错解决 1.问题原因及解约 今天使用nvm下载不同版本的nodejs的时候报错了 C:\Users\1> nvm list availableCould not retrieve https://npm.taobao.org/mirrors/node/index.json.提示无法检索地址&…

Oracle控制文件全部丢失如何使用RMAN智能恢复?

1.手动删除所有控制文件模拟故障产生 2.此时启动数据库发现控制文件丢失 3.登录rman 4.列出故障 list failure; 5.让RMAN列举恢复建议 advise failure; 6.使用RMAN智能修复 repair failure;

基于Springboot+Vue的基于协同过滤算法的个性化音乐推荐系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

Ubuntu Server 20.04 64bit定时备份MySQL8.0.36数据库数据

一、编写sh脚本 常见备份命令介绍 我选用的是mysqldump命令,命令使用简介 [root]> mysqldump -helpUsage: mysqldump [OPTIONS] database_name [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all…

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展,人们对足球俱乐部的需求日益增加,加快了足球健身俱乐部的发展,足球俱乐部管理工作日益繁忙,传统的管理方式已经无法满足足球俱乐部管理需求,因此,为了提高足球俱乐部管理效率…

VMware Aria Automation Orchestrator 8.18 发布,新增功能概览

VMware Aria Automation Orchestrator 8.18 - 现代工作流程自动化平台 请访问原文链接:https://sysin.org/blog/vmware-aria-automation-orchestrator/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 现代工作流程…

超强大的 Nginx 可视化管理工具

今天给大家介绍一款 Nginx 可视化管理界面,非常好用,小白也能立马上手。 nginx-proxy-manager 是一个反向代理管理系统,它基于 NGINX,具有漂亮干净的 Web UI。还可以获得受信任的 SSL 证书,并通过单独的配置、自定义和…

SUP-NeRF-ECCV2024数据集: 单目3D对象重建的新突破

2024-09-25,由Bosch Research North America和Michigan State University联合发布的SUP-NeRF,是一个基于单目图像进行3D对象重建的新型方法。一个无缝集成姿态估计和物体重建的统一网格。 ECCV:欧洲计算机视觉会议的缩写,它是计算…

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7,yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…

CSS 效果:实现动态展示双箭头

最近写了一段 CSS 样式,虽然不难,但实现过程比较繁琐。这个效果结合了两个箭头,一个突出,一个内缩,非常适合用于步骤导航或选项卡切换等场景。样式不仅仅是静态的,还可以通过点击 click 或者 hover 事件&am…

肺癌影像智能诊断项目

1 项目背景 肺癌是发病率和死亡率增长最快、对人类健康和生命威胁最大的恶性肿瘤之一,近50年来许多国家都报道肺癌的发病率和死亡率均明显增高。据国家癌症中心统计,我国肺癌发病人数和死亡人数已连续10年位居恶性肿瘤之首,每年新发肺癌约78.7万人,因肺癌死亡约63.1万人。早…

深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制

我的主页:2的n次方_ 1. JVM 内存区域划分 程序计数器(空间比较小)。保存了下一条要执行的指令的地址(指向元数据区指令的地址)堆。JVM 最大的空间,new 出来的对象都在堆上栈。函数中的局部变量&#x…

SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器

SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。 从RequestMappingHandlerMapping寻找: AbstractHandle…

unity一键注释日志和反注释日志

开发背景:游戏中日志也是很大的开销,虽然有些日志不打印但是毕竟有字符串的开销,甚至有字符串拼接的开销,有些还有装箱和拆箱的开销,比如Debug.Log(1) 这种 因此需要注释掉,当然还需要提供反注释的功能&am…

Spring1

1.Spring系统架构图 (1)核心层 Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块 (2)AOP层 AOP:面向切面编程,它依赖核心层容器,目的是==在不改变原有代码的前提下对其进行功能增强== Aspects:AOP是思想,Aspects是对AOP思想的具体实现 (3)数据…

C语言进阶版第14课—内存函数

文章目录 1. memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 模拟实现memcpy函数 2. memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 3. memset函数4. memcmp函数 1. memcpy函数的使用和模拟实现 1.1 memcpy函数的使用 memcpy函数的原形voi…

虚商目前有哪些业务痛点?

虚拟运营商当前面临的业务痛点主要集中在市场竞争、运营成本、技术依赖、用户体验及政策监管等方面。 一、市场竞争激烈 1、竞争者数量增加: 随着市场准入门槛的降低,越来越多的企业进入虚拟运营商市场导致市场竟争日益激烈。为了争夺市场份额,企业不得不…

SRC漏洞挖掘 | 针对Spring-Boot 框架漏洞的初探

💗想加内部圈子,请联系我! 💗文章交流,请联系我!🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 一个想当文人的黑客 ,很高兴认识大家~ ✨主…