agent的用途是虚拟机和主机之间传输文件和执行文件
和虚拟机之间的通信是通过无效的操作码(invalid opcodes)
Windows
可以在guest/win文件夹下找到windows的Guest Agent
编译Guest Agent
可能需要安装mingw-w64包,比如在Ubuntu或Debian上:
apt-get install gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-i686-dev mingw-w64-tools gcc-mingw-w64-x86-64 mingw-w64-x86-64-dev g++-mingw-w64-x86-64
直接用make来编译,它会产生两个文件:win_agent_32.exe和win_agent_64.exe分别对应32位和64位的windows客户机
编译测试文件
为了编译测试文件,直接使用提供的Makefile:
make test_32
make test_64
Linux
可以在guest/linux文件夹下找到linux的Guest Agent
编译Guest Agent
可能需要安装如下包,比如在Ubuntu或Debian上:
apt-get install libc6-dev-i386
直接用make来编译,它会产生两个文件:linux_agent_32.exe和linux_agent_64.exe分别对应32位和64位的linux客户机
编译测试文件
为了编译测试文件,直接使用提供的Makefile:
make 32bit_test
make 64bit_test
用法
配置Guest Agent
- 在pyrebox.conf配置文件中增加plugins.guest_agent: True
- (可选)修改你的Guest Agent文件名字
- 在pyrebox.conf中增加agent配置
- 适当调整配置(如果修改了文件名字)
- 保持agent的配置文件一直存在并保持最新。这个文件会在编译过程中自动产生
- 将对应的Guest Agent(32或64)拷贝到客户虚拟机中,并且保证它的名字和配置文件中声明的名字一样
-
一定要拷进去,并且放到自启动的文件夹下,方法见最下面
-
- 启动agent(你可以配置虚拟机,使得每次启动系统的时候自动一起启动agent)
- 一旦agent启动后,就可以进行快照
在pyrebox.conf中配置agent的示例:
[AGENT]
name: win_agent_64.exe
conf: win_agent_64.exe.conf
使用Guest Agent
在脚本中:
- 在pyrebox.conf配置文件中增加plugins.guest_agent: True或者,
- 在模块中增加一个叫requirements的成员,这个成员包含一系列需要的插件或者脚本,例如:requirements = ["plugins.guest_agent"]
- 在脚本中导入插件: from plugins.guest_agent import guest_agent
- 使用该类的公共接口和Guest Agent进行交互(guest_agent是GuestAgentPlugin的单例实例),详见API
在shell中:
- 如果没有脚本加载guest_agent插件,则需要通过在pyrebox.conf配置文件中增加plugins.guest_agent: True来确保被加载
- 使用全局成员agent和Guest Agent进行交互,agent是GuestAgentPlugin的单例实例,详见API
只用这样:
> agent.copy_file(src_path, dest_path)
> agent.execute_file(path, args=[], env={}, exit_afterwards=False)
示例
示例脚本中提供了一个自定义的命令,这个命令记录了怎么在pyrebox脚本中使用agent。
requirements = ["plugins.guest_agent"]成员允许你具体说明脚本需要加载Guest Agent插件才能运行。
将win_agent_32.exe拷贝进pyrebox的qemu的方法:
先进入虚拟环境
1 . 安装qemu的工具,apt install qemu-utils
2 . 然后进入pyrebox的文件夹中执行以下命令:qemu-img create -f raw usb_image_template.img 256M,这样一来就创建了一个usb镜像模版
3 . 启动pyrebox的qemu虚拟机,记得启动qemu时要加-usb参数来允许虚拟机支持外部usb设备。虚拟机启动后执行:
(qemu) drive_add 0 if=none,id=stick,file=usb_image_template.img,format=raw
(qemu) device_add usb-storage,id=stick,drive=stick
4 . 执行以上命令后会在虚拟机里显示有一个usb设备被识别,但是在我的电脑里面看不到这个磁盘,这时需要对这个usb设备分配区域和格式化
5 . 这时进入控制面板->管理工具->计算机管理下的磁盘管理,可以看到那个名字叫做磁盘1的那个usb设备,而且设备的251MB空间都是未指派的状态
6 . 右键那块未指派的空间,选择新建磁盘分区,下一步,选择扩展磁盘分区,下一步直到完成,这样未指派的空间就变成了绿色的可用空间
7 . 继续选择那块可用空间,选择新建逻辑驱动器,一直下一步直到,在格式化分区中选择“按下面的设置格式化这个磁盘分区”,我的文件系统选的是FAT32,然后勾选了下面的执行快速格式化,直到完成。usb设备被格式化成功后,从可用空间,变成了新加卷,这时可以在我的电脑里面看到模拟的u盘
8 . 在右下角选择“安全删除USBMass Storage Device - 驱动器E”,然后安全移除了硬件
9 . 然后在qemu命令中执行以下命令来移除模拟u盘:(qemu) device_del stick
10 . 如果不太确定有没有移除usb设备,可以在qemu环境中用命令info usb查看usb设备状况,什么都没有就是安全移除了
11 . usb_image_template.img就成为了一个有用的usb模拟设备模版,要好好保存留作备用
12 . 将上面的模板拷贝成一个新文件叫做usb_image.img,然后挂载并修改这个新文件
13 . 挂载的注意事项:
命令:mount-o loop,offset=xxx usb_image.img /mnt/location
这个命令中的偏移offset = xxx是需要手动计算的,计算方法:
1 . 先用fdisk查看img文件的信息:fdisk-l usb_image.img
2 . 可以看到block-size是512,然后start-block是16128,所以偏移是16128 x 512 = 8257536,这个数字替换上面的xxx
这样一来就成功将mnt/location文件夹挂在到虚拟的usb镜像上
3 . 此时就可以把win_agent_32.exe拷贝到mnt/location文件夹下
4 . 然后取消挂载:umount /mnt/location,这样挂载就完成了
14 . 然后再将已经把文件拷贝进去的虚拟u盘和客户虚拟机连接:
(qemu) drive_add 0 if=none,id=stick,file=usb_image.img
执行完这一句会提示一句警告,意思是没有指定镜像的格式,自动检测镜像格式会很危险:
Imageformat was not specified
不用管它,只要最后一行是OK就行
(qemu) device_add usb-storage,id=stick,drive=stick
15 . 此时就可以在虚拟机上看到存放着目标文件的u盘了,就可以将u盘文件拷贝到虚拟机上了
16 . 还是安全弹出u盘,再用(qemu) device_del stick卸载一下
17 . 然后把win_agent_32.exe放到系统自启动文件夹里即可,这样每次系统启动了就会自动调用这个可执行文件