KVM-VMI项目编译安装全过程,包含所遇问题及解决措施
以下步骤是我一步步尝试经历了多种报错解决之后摸索出来的参考KVM-VMI项目的官方文档https://kvm-vmi.github.io/kvm-vmi/master/setup.html中科院DAMS实验室的文档https://dams.net.cn/book/2025/lab6/里面有配套的虚拟化安全有关的实验适合刚入门的学习我学习是以中科院DAMS实验室的文档为主KVM-VMI项目为辅https://web.archive.org/web/20220331032239/https://hvmi.github.io/blog/2020/08/10/getting-started-on-kvm.html注实验过程中一定要留好快照报错的时候你把环境搅得一塌糊涂的时候你会发现太重要了在学习虚拟化安全的过程中我将会分享我自己的学习笔记包括虚拟化安全知识的基础学习、实验过程、深度理解计算机系统CSAPP这本书的学习实验6所在的环境KVM-VMI项目克隆的完整步骤https://blog.csdn.net/2201_76139143/article/details/159314344?spm1001.2014.3001.5502在kvm-vmi目录下执行1切换到kvmi-v7分支检查本地远程所有分支git branch -a切换分支# 切换到 kvmi-v7 分支本地无该分支时会自动创建并关联远程 git checkout kvmi-v7查看是否切换成功git branch更新子模块有的时候一次不成功可以多次执行不会在下载已经下载完成的了# 初始化更新所有递归子模块适配 kvmi-v7 分支的版本 git submodule update --init --recursive无输出代表模块是最新版本无需进行额外操作会出现qemu下面的roms/vgabios模块的报错问题直接更改qemu目录下.gitmodules文件中这个模块的地址为https://github.com/qemu/vgabios.git再执行git submodule sync再重新递归更新子模块就成功了1、安装kvm整个过程在kvm目录下执行1安装所需依赖sudo apt-get install bc fakeroot flex bison libelf-dev libssl-dev dwarves2cd kvm # 先给权限避免因为权限报错 chmod x scripts/*.sh chmod x scripts/*/*.sh make distclean # 清理之前的编译残留避免配置冲突 cp /boot/config-$(uname -r) .config make olddefconfig # 用当前内核配置为基础将新选项设为默认值 # 先给权限 # 给 config 工具添加执行权限核心修复 chmod x scripts/config ./scripts/config --enable KVM ./scripts/config --enable KVM_INTEL ./scripts/config --enable KVM_AMD ./scripts/config --enable KVM_INTROSPECTION ./scripts/config --disable TRANSPARENT_HUGEPAGE ./scripts/config --enable REMOTE_MAPPING ./scripts/config --disable SYSTEM_TRUSTED_KEYS ./scripts/config --disable SYSTEM_REVOCATION_KEYS # 这个是给内核名称加kvmi后缀的只有setup中提到了我没执行 ./scripts/config --set-str CONFIG_LOCALVERSION -kvmi # 这两个只有setup中提到了unbuntu 22.04兼容性我的是20.04不需要 ./scripts/config --enable PREEMPT ./scripts/config --disable NET_VENDOR_NETRONOME3编译打包make -j$(nproc) bindeb-pkg生成 Debian 格式的内核包会在上级目录生成 .deb 文件中间有交互的按回车就行4sudo dpkg -i ../linux-image-5.4.24_5.4.24*deb注意文件名可能因编译环境略有不同可用ls ../linux-image*.deb确认实际文件名后再安装因为我没有加-kvmi所以要将-kvmi去掉加了可以很直观的直到哪一个是自己编译的虚拟机内核5重启要选择自己编译的内核uname -a能得到5.4.24(kvmi v7)虽然没有显示kvmi v7 但是我检查了自己更新子模块的时候是在kvm-vmi目录下执行的当时处理qemu模块其它模块都同步成功了。后来qemu也同步成功了所以没有什么问题2、安装qemu1关闭apparmorsudo service apparmor stop2安装依赖sudo apt-get install libpixman-1-dev pkg-config zlib1g-dev libglib2.0-dev dh-autoreconf libspice-server-dev3配置、建立和安装qemucd qemu ./configure --target-listx86_64-softmmu --enable-spice --prefix/usr/local --python/usr/bin/python3 # 我的python路径找不到所以我多家了一个python路径 make -j4 sudo make install4验证/usr/local/bin/qemu-system-x86_64 --version这个版本和官方给的版本一致3、准备一个域The Virtual Machine should be available in libvirt。就是执行 virsh list --all 的时候可以看到自己的虚拟机。1使用virt-manager创建虚拟机① 安装依赖sudo apt update sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager② 加入libvirt组sudo usermod -aG libvirt $USER # 相当于给你的账号 “登记” 到 libvirt 权限组里从此你的账号永久拥有管理虚拟机的权限资格 newgrp libvirt # 相当于 “立即激活” 这个权限资格让当前打开的终端马上用上 libvirt 组的权限 # 永久生效重启之后无需重复执行 # 取消这两条指令 sudo gpasswd -d $USER libvirt newgrp 关机重启一次③ 准备系统iso具体步骤在创建并启动Windows虚拟机部分④ 启动virt-manager利用其安装Windows虚拟机具体步骤在利用virt-manager创建虚拟机部分virt-manager安装之后关机2配置xml文件给虚拟机加了一个监控接口使外部的设备可以实时调试、监控虚拟机sudo virsh edit win7-i686出现问题1这个问题的解决办法在下面配置xml文件时libvirt没有执行/usr/local/bin/qemu-system-x86_64的权限问题的分析与解决保存退出3验证配置# 检查 XML 配置是否合法 sudo virsh define /etc/libvirt/qemu/你的Win7虚拟机名.xml启动虚拟机验证配置无错误sudo virsh start win7-i686出现问题2这是为什么报错的原因还有一个原因就是qemu的版本太老了不支持USB重定向所以在安装配置虚拟机的时候要选择移除如果安装好了也没关系直接利用virt-manager图形界面移除就好选中USB Redirector 1→ 点Remove选中USB Redirector 2→ 点Remove出现问题3自己编译的 QEMU 版本太新 / 太旧不支持 libvirt 自动给你选的机器型号 pc-i440fx-focal可以使用以下命令查看qemu支持的机器型号/usr/local/bin/qemu-system-x86_64 -M help原来xml配置为os type archi686 machinepc-i440fx-focalhvm/type boot devhd/ /os改为os type archx86_64 machinepc-i440fx-2.12hvm/type boot devhd/ /os出现问题4自己编译的 QEMU 关闭了 seccomp 安全沙箱功能但 libvirt 仍然强制要求开启它 → 冲突 → 启动失败。更改qemu.conf文件关闭libvirt的沙箱功能sudo nano /etc/libvirt/qemu.conf将原来的 1改为0并去掉# seccomp_sandbox 0# 查看虚拟机状态 sudo virsh domstate 你的Win7虚拟机名 # 显示 running 即为正常正常安全关机 sudo virsh shutdown win7-i686 这个需要等一会因为关机需要一个过程强制关机 sudo virsh destroy win7-i686重启虚拟机 sudo virsh reboot win7-i6864、安装libkvmicd kvm-vmi/libkvmi ./bootstrap # 准备编译环境生成 configure ./configure # 检查环境生成编译说明书 make sudo make install之后启动虚拟机win7-i686测试运行cd libkvmi/examples ./hookguest-libkvmi /tmp/introspector成功5、安装libvmi1安装依赖sudo apt-get install build-essential gcc libtool cmake pkg-config check libglib2.0-dev libvirt-dev flex bison libjson-c-dev2编译安装cd kvm-vmi/libvmi mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX/usr/local -DENABLE_KVMON -DENABLE_XENOFF -DENABLE_BAREFLANKOFF make -j2 sudo make installJSON profilesTO use all the features of LibVMI, you need a Rekall/Volatility profile.1先将 kvm-vmi/libvmi/etc/libvmi-example.conf 复制到 /etc/libvmi.confsudo cp ~/Desktop/v/kvm-vmi/libvmi/etc/libvmi-example.conf /etc/libvmi.conf然后将虚拟机名字改为其中对应的名字。这里我们使用 Windows7 虚拟机32位所以就将虚拟机名字改为 win7-i686与配置文件对应修改配置文件使其与虚拟机名字对应亦可sudo nano /etc/libvmi.conf运行 LibVMI 自带工具提取目标 Windows 虚拟机的内核的GUID和PE_HEADER这个文件在libvmi/build/examples目录下examples/vmi-win-guid name win7-i686 /tmp/introspector记录输出中的 Kernel filename和 PDB GUID。Windows Kernel found 0x3c16000 Version: 32-bit Windows 7 PE GUID: 4ce78a06404000 PDB GUID: 00625d7d36754cbeba4533ba9a0f3fe22 Kernel filename: ntkrnlmp.pdb Multi-processor without PAE Signature: 17744. Machine: 332. # of sections: 22. # of symbols: 0. Timestamp: 1290242566. Characteristics: 258. Optional header size: 224. Optional header type: 0x10b Section 1: .text Section 2: _PAGELK Section 3: POOLMI Section 4: POOLCODE Section 5: .data Section 6: ALMOSTRO Section 7: SPINLOCK Section 8: PAGE Section 9: PAGELK Section 10: PAGEKD Section 11: PAGEVRFY Section 12: PAGEHDLS Section 13: PAGEBGFX Section 14: PAGEVRFB Section 15: .edata Section 16: PAGEDATA Section 17: PAGEKDD Section 18: PAGEVRFC Section 19: PAGEVRFD Section 20: INIT Section 21: .rsrc Section 22: .reloc拦截并显示CR3事件examples/cr3-event-example win7-i686 /tmp/introspectorWaiting for events... CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 CR3 write happened: Value0x7fc7c000 CR3 write happened: Value0x185000 ...打印虚拟机中运行的进程列表examples/vmi-process-list -n win7-i686 -s /tmp/introspectorLibVMI Suggestion: set win_ntoskrnl0x3c16000 in libvmi.conf for faster startup. LibVMI Suggestion: set win_kdbg0x121c28 in libvmi.conf for faster startup. LibVMI Suggestion: set win_kdvb0x83d37c28 in libvmi.conf for faster startup. Process listing for VM win7-i686 (id1) [ 4] System (struct addr:85c3bd40) [ 264] smss.exe (struct addr:86cfac48) [ 348] csrss.exe (struct addr:874b0570) [ 396] wininit.exe (struct addr:87149200) [ 404] csrss.exe (struct addr:874116a0) [ 432] winlogon.exe (struct addr:85cae4b0) [ 484] services.exe (struct addr:875c5318) [ 500] lsass.exe (struct addr:875cd030) [ 508] lsm.exe (struct addr:875cea78) [ 612] svchost.exe (struct addr:8766ad40) [ 684] svchost.exe (struct addr:86e32620) [ 768] svchost.exe (struct addr:876af030) [ 816] svchost.exe (struct addr:876c4c88) [ 840] svchost.exe (struct addr:876d2ac0) [ 996] svchost.exe (struct addr:876fe8b8) [ 1084] svchost.exe (struct addr:87812498) [ 1220] spoolsv.exe (struct addr:86dde030) [ 1268] svchost.exe (struct addr:8786b898) [ 1652] taskhost.exe (struct addr:875698e0) [ 1812] dwm.exe (struct addr:8656a360) [ 1828] explorer.exe (struct addr:87953828) [ 1024] SearchIndexer. (struct addr:86cf3630) [ 1156] svchost.exe (struct addr:879d5030) [ 1932] sppsvc.exe (struct addr:8758b3b0) [ 544] svchost.exe (struct addr:86dfa820)2用 Volatility3 生成 JSON 配置先不配置git clone https://github.com/volatilityfoundation/volatility3 cd volatility3 virtualenv -p python3 venv source venv/bin/activate (venv) $ pip install -e . (venv) $ python volatility/framework/symbols/windows/pdbconv.py -o profile.json -p Kernel filename -g PDB GUIDDebug output先不进行这里我还未尝试如果你需要调试 LibVMI 运行时行为可以通过 CMake 开启调试选项并用环境变量控制输出1编译时开启调试选项cd build cmake .. -DVMI_DEBUG(VMI_DEBUG_KVM | VMI_DEBUG_DRIVER) make sudo make installVMI_DEBUG_KVM开启 KVM 相关调试日志VMI_DEBUG_DRIVER开启驱动层调试日志可在libvmi/debug.h中查看所有可用调试常量2运行时启用调试输出可选通过环境变量LIBVMI_DEBUG1LIBVMI_DEBUG1 ./build/examples/vmi-process-list -n winxp -j /etc/libvmi/winxp-profile.json-n winxp目标虚拟机名称-j /etc/libvmi/winxp-profile.json指定之前生成的 JSON 配置文件创建并启动Windows虚拟机下载Windows镜像复制链接ed2k://|file|cn_windows_7_professional_with_sp1_x86_dvd_622569.iso|2651877376|56C4B513A6109715CD2BEBFBA80370A0|/在迅雷里下载下载之后哈希校验直接在Windows终端校验Get-FileHash -Path .\cn_windows_7_professional_with_sp1_x86_dvd_622569.iso -Algorithm SHA1Win7原版|MSDN Windows7 SP1官方原版ISO镜像下载全版本 - 知乎以下过程我没有进行是在另一个实验中进行的1、创建磁盘文件qemu-img create -f qcow2 win7.img 25G2、启动虚拟机qemu-system-x86_64 -cpu host -smp 2 -m 2048 --enable-kvm -hda win7.img -cdrom win7.iso -vga virtio -boot orderd3、借用gvncview连接虚拟机gvncviewer 127.0.0.1::5900利用virt-manager创建虚拟机新建虚拟机选择iso镜像内存外存磁盘总线网卡添加第二个 CDROM 光驱放 VirtIO 驱动镜像在安装时用来加载磁盘 / 网卡驱动显示器安装现在安装右键点击以太网控制器→ 选择「更新驱动程序软件」 → 「浏览计算机以查找驱动程序软件」先安装「PCI 简易通讯控制器」→ 再安装「PCI 设备」配置xml文件时libvirt没有执行/usr/local/bin/qemu-system-x86_64的权限问题的分析与解决分析意思是libvirt没有执行/usr/local/bin/qemu-system-x86_64的权限另外-rwxr-xr-x 1 root root 13918384 3月 22 11:34 /usr/local/bin/qemu-system-x86_64表示其它用户和所属组都没有写的权限文件所属组和所属用户都是root为什么libvirt不能执行查看系统所有用户cat passwd发现有libvirt-qemu用户但是没有qemu用户查看libvirt的配置文件 发现默认示例配置是user qemu不用担心这个配置完全不生效因为被注释了# 查看 libvirt QEMU 驱动的默认配置 sudo virsh capabilities | grep -A5 qemu | grep user没有输出改变libvirt的配置也不行将用户和组前的root #去掉不行、添加libvirt-qemu也不行、qemu用户也试了也不行sudo nano /etc/libvirt/qemu.conf # 编辑 sudo systemctl restart libvirtd # 重启使生效也不行libvirt-qemu有权限执行软链接也没有用证明不是路径的问题是文件本身的问题 可是文件本身也没问题有权限没有隐形标记我关闭sudo service apparmor stop之后还是不能执行确认已关闭apparmorsudo service apparmor status我也查看了文件本身没有 AppArmor/SELinux 隐形标记**解决办法1**将qemu-system-x86_64名字和路径改为和qemu-system-i686一致qemu-system-i686备份解决了权限的问题发现这个也可以解决问题最后和最终方法的走向是一致的步骤 1备份系统默认 QEMU关键可回滚sudo mv /usr/bin/qemu-system-i386 /usr/bin/qemu-system-i386.bak步骤 2替换为你的 KVM-VMI 版 QEMU# 复制自定义 QEMU 到系统默认路径改名适配 sudo cp /usr/local/bin/qemu-system-x86_64 /usr/bin/qemu-system-i386 # 重置权限确保 libvirt 能执行 sudo chmod 755 /usr/bin/qemu-system-i386 sudo chown root:root /usr/bin/qemu-system-i386 # 验证替换成功显示你的 KVM-VMI 版本 /usr/bin/qemu-system-i386 --version步骤 3修改 XMLvirsh edit win7-i686步骤 4启动虚拟机验证出现问题virsh start win7-i686但是又会出现新的问题意思是当前版本的 QEMU你编译的 KVM-VMI 2.11.93 旧版不支持 USB 重定向功能所以 libvirt 启动虚拟机时拒绝执行。解决办法2降级 libvirt 来兼容旧版 QEMU不建议卸载前先备份虚拟机配置关键virsh dumpxml win7-i686 ~/win7-backup.xml卸载当前libvirtsudo apt remove --purge libvirt-daemon-system libvirt-clients libvirt0 sudo apt autoremove源码编译安装# 下载 libvirt 5.6.0和 KVM-VMI v7 分支最兼容的版本 wget https://libvirt.org/sources/libvirt-5.6.0.tar.xz tar -xf libvirt-5.6.0.tar.xz cd libvirt-5.6.0 ---------------------------- # 解决依赖问题 sudo apt update # 安装 gnutls 开发包包含 pkg-config 模块 升级 gnutls 1 sudo apt install -y libgnutls28-dev libgnutls30 gnutls-bin 2 sudo apt install -y libnl-3-dev libnl-route-3-dev libnl-genl-3-dev 3 sudo apt install -y libxml2-dev libxml2 4 sudo apt install -y xsltproc libxslt1-dev 5 sudo apt install -y libdevmapper-dev 6 sudo apt install -y libpciaccess-dev ---------------------------- # 配置编译关闭不需要的功能专注 KVM ./configure --prefix/usr --sysconfdir/etc --localstatedir/var --enable-kvm --disable-xen --disable-lxc --disable-openvz make -j$(nproc) sudo make install # 重启服务 sudo systemctl restart libvirtd # systemd 服务文件未被正确识别但 libvirt 5.6.0 已安装成功 # 验证版本 libvirtd --version恢复虚拟机配置无需重装系统直接导入virsh define ~/win7-backup.xml接下来会出现一系列的问题编辑/启动虚拟机和之前完全一样数据不丢失# 现在探测机制宽松不会触发 Permission denied virsh edit win7-i686 virsh start win7-i686最终解决办法推荐这个1.查看usr/local/bin/qemu-system-x86_64的真实权限ls -l /usr/local/bin/qemu-system-x86_64-rwxr-xr-x 1 root root 13918384 3月 22 11:34 /usr/local/bin/qemu-system-x86_64判断所属用户、所属组均为root2.永久允许libvirt使用 /usr/local/bin/qemu-system-x86_64 直接编辑apparmorsudo nano /etc/apparmor.d/usr.sbin.libvirtd在文件中找到一段类似这样的内容/usr/bin/* PUx,将以下命令添加到附近/usr/local/bin/* PUx,保存退出重启sudo systemctl reload apparmor sudo systemctl restart libvirtd3.编辑libvirt的qemu全局配置sudo nano /etc/libvirt/qemu.conf添加user “root”group “root”qemu_binary “/usr/local/bin/qemu-system-x86_64”security_driver “none” 关闭 libvirt 安全限制dynamic_ownership 0 禁止自动改文件权限4.重启libvirt生效sudo systemctl stop libvirtd libvirtd.socket libvirtd-ro.socket libvirtd-admin.socket sudo systemctl disable libvirtd.socket sudo systemctl enable libvirtd sudo systemctl start libvirtd之后关闭虚拟机重启安装virsh1、sudo apt install libvirt-clients2、之后在执行sudo virsh list --all的时候遇到了以下问题3、检查libvirtd服务未安装sudo systemctl status libvirtd4、安装# 1. 先确保安装了完整的 libvirt 组件如果没装的话 sudo apt update sudo apt install -y libvirt-daemon-system libvirt-clients qemu-kvm # 2. 启动并设置开机自启 sudo systemctl start libvirtd sudo systemctl enable libvirtd # 3. 再次检查状态应该显示 active (running) sudo systemctl status libvirtd问题1、这个分支在哪里切换是在kvm目录下切换还是在kvm-vmi目录下切换我在kvm目录下切换会出现编译打包错误的问题因此我实在kvm-vmi目录下切换的2、我觉得我应该看着一部分