KVM
测试版本
推荐条目
简介
Kernel-based Virtual Machine(基于内核的虚拟机,即 KVM)是一种内置于 Linux 内核中的虚拟机管理程序(hypervisor)。它的目的类似于 Xen,但运行起来要简单得多。与原生 QEMU 使用仿真不同,KVM 是 QEMU 的一种特殊运行模式,它通过内核模块使用 CPU 扩展(HVM)进行虚拟化。
openSUSE 有一份十分详细的虚拟化文档,涵盖在 openSUSE 上使用 KVM/Xen 的方方面面。如果你想要使用 KVM ,那你一定不能错过这篇官方指南:
- openSUSE Leap 15.5 - Virtualization Guide(该文档也适用于 tumbleweed 等分支版本)
如果你需要一个快速的图形化配置指南,你可以继续阅读本文。
如果出现问题,你可以使用 btrfs 快照回滚系统,详见:SDB:Snapper_Tutorial
初始化
检查可用性
KVM 需要设备支持硬件虚拟化功能,请打开终端,运行下列指令:
sudo LC_ALL=C lscpu | grep Virtualization
检查输出结果,例如:
Virtualization: VT-x Virtualization: AMD-V
对于 Intel 处理器来说是 VT-x
,对于 AMD 处理器来说是 AMD-V
;否则你的机器不支持虚拟化。
安装必要的包
打开 YaST ,点击虚拟化,然后点击 安装 Hypervisor 和工具 。勾选 KVM 工具 和 KVM 服务器,然后等到 YaST 自动安装并校验所有包;如果你已经安装了 KVM 相关组件,那相应的选项会变成不可点击的灰色。
或者使用下列命令:
sudo zypper install -t pattern kvm_server kvm_tools
加入用户组
安装完成后,请加入 libvirt 用户组:
sudo usermod -aG libvirt $USER
然后重启或注销后再重新登录系统
管理存储池
KVM 通过 pool(池)管理虚拟机的磁盘镜像文件和 ISO 镜像文件。KVM 虚拟机文件默认的存放位置是 /var/lib/libvirt/images
。
openSUSE 的 KVM 的图形化前端叫 virt-manager
,它在开始菜单中叫虚拟系统管理器。如果你找不到这个应用,可以在终端中直接启动它:
$ virt-manager
首先,打开开始菜单,搜索 KVM,找到 虚拟系统管理器,(你可以将其添加到收藏夹以便于使用。)点击启动该程序:
点击 编辑 > 连接详情 > 存储 进入存储池管理页面:
然后点击左下方的 ➕ 按钮新建一个池,修改池的名字以及路径:
为了方便管理,推荐新建两个池,第一个池的路径是你用于存放各种系统 ISO 安装介质的文件夹。第二个池用于存放虚拟机文件(一般是 qcow2 文件)。
要移除一个池,你需要通过左下方的按钮,先 停止池,然后再 删除池。KVM 会自动创建 default 池,即便你已经删除了它,它会将虚拟机的文件存放到这个池中。因此,在创建虚拟机或额外的磁盘设备时,如果根目录存储空间不够大,请新建一个具有足够空间的池,以避免出现因为虚拟机不断运行导致磁盘镜像文件大小不断变大,触发根目录存储空间不足或虚拟机出现故障的情况。
新建虚拟机
步骤1:点击虚拟系统管理器的 文件 下方的 ➕ 按钮,创建虚拟机:
选择 本地安装介质,点击 Forward(下一步):
步骤 2:点击 浏览,在弹出的 定位 ISO 介质卷 窗口中,点击刚刚新建的 ISO 存储池,选中要安装的 ISO 介质,然后点击 Choose Volume 完成选择。然后点击 Forward(下一步):
步骤 3:你可以调整虚拟机可以使用的内存大小和 CPU 数(你可以使用默认值),点击 Forward(下一步),进入步骤 4:
步骤 4:此时,你需要创建虚拟机使用的磁盘镜像。如果你的根目录空间足够大,可以直接调整磁盘镜像的大小,然后点击 Forward(下一步)进入步骤 5。
如果你的存储空间不足,则需要选择 选择或创建自定义存储,然后点击 管理 进入存储池管理页面:
选择你用于保存磁盘镜像文件的存储池,然后点击详情页的 ➕,新建一个存储卷,再修改文件大小:
点击 完成,然后选中新建的文件,点击 Choose Volume 完成磁盘镜像的创建:
步骤 5:最后显示的系统概况页面,如果你认为没有问题,点击 完成 立即开始安装系统。如果你需要编辑某些硬件(如网卡),则需要勾选 在安装前自定义配置:
关闭虚拟机
虚拟系统管理器的 退出 表示关闭 KVM 主程序,关闭 则表示仅关闭虚拟系统管理器,但未停止运行的虚拟机会在后台运行。
关闭虚拟机的详情页面并不会关闭虚拟机,通过虚拟系统管理器启动的虚拟机可能不会自动弹出详情页,你可以双击虚拟机打开虚拟机的图形界面。你可以右键点击正在运行虚拟机,然后选择 关机 ,如果关不掉(可以考虑强制关机,但是会丢失数据),你应当用鼠标双击正在运行的虚拟机,打开虚拟机的屏幕,在虚拟机内执行关机操作。
或者运行:
sudo virsh list #列出正在运行的虚拟机 sudo virsh shutdown <guestname> #关闭正在运行的虚拟机,如 sudo virsh shutdown opensusejeos
保存/重载虚拟机
如果你需要保存当前虚拟机的进度以便于下次启动虚拟机的时候继续工作,你应当点击菜单栏中 关闭虚拟机 按钮右侧的倒三角符号,展开菜单,然后选择 保存 。这样 KVM 会把虚拟机的内存保存到储存中,并自动关闭虚拟机。
- 注意,在保存虚拟机后,请勿重启虚拟机或者启动虚拟机,以免发生因为同步错误而导致重载失败。
点击打开虚拟系统管理器,双击你之前保存的虚拟机,在弹出的窗口中(显示客户机未运行),点击左上方的 虚拟机,在展开的菜单中,点击恢复,进行虚拟机的重载。
删除虚拟机
右键点击所要删除的虚拟机,默认删除的只有虚拟机的文件,用于安装系统的源镜像默认不会删除。
与虚拟机共享文件
- virtiofs 是一个共享文件系统,允许虚拟机访问主机上的目录树。
- 另见:Sharing files with Virtiofs
Windows
除了常见的 SMB 网络共享,你也可以通过 virtiofs 创建共享文件夹供 Windows 虚拟机使用。
首先,在虚拟机安装完毕后,在虚拟机关机的情况下,打开虚拟机的详情页,点击 内存,勾选 Enable shared memory:
然后,点击左下角的 添加新硬件,选择 文件系统,驱动程序保持默认(即 virtiofs),将 源路径 修改为你要与虚拟机共享的文件夹路径,将 目标路径 命名为你想要的名称,例如 sharing-folder,然后点击 完成:
然后,
- 下载最新的稳定版 WinFSP MSI 安装包(也可从 https://winfsp.dev/rel/ 获取)
- 下载稳定版的 virtio-win-guest-tools.exe
准备一个 U 盘,插入电脑,将下载好的文件存入 U 盘,点击虚拟机详情页面左下角的 添加新硬件,选择 USB 主机设备,选择你刚刚插入的 U 盘,将此 USB 设备添加至虚拟机。注意,如果你不清楚需要添加哪个 USB 设备,可以将 U 盘拔出,然后再打开 USB 主机设备 添加页面,通过对比列表的变更,就能确定哪个是你的 U 盘。另外,添加至虚拟机的 U 盘会被虚拟机独占,你只能在虚拟机关机后才能重新读写 U 盘。
当然如果你的网络可以正常下载上述的两个软件包,那么你可以在虚拟机中直接安装它们。
然后启动 Windows 虚拟机,将 U 盘内的两个安装包拷贝至虚拟机。首先安装 WinFSP:
安装时,选择 Core,然后安装应用。
再安装 virtio-win-guest-tools.exe:
安装时,选择安装的内容是 Viofs。
安装完成后,重启系统。
重启后,打开 Windows 的设备管理器,正常情况下,你能够看到一个由 Red Hat Inc. 签名,名为 VirtIO FS Device 的驱动:
然后按下 Win + R 打开 CMD,输入并运行 services.msc
。找到 VirtIO-FS Service,启动该服务。你可以将它的启动类型设置为自动。
然后你就能在文件管理器看到共享的文件夹,它的盘符一般是 Z。
Linux
virtiofsd
,YaST2 一般会自动安装这个软件包。在虚拟机安装完成后,关闭虚拟机,依照上文启用 Enable shared memory,并添加 文件系统。
然后启动虚拟机,在虚拟机中以 root 权限运行:
# mount -t virtiofs mount_tag /mnt/mount/path
mount_tag
是上文中设定的 目标路径,/mnt/mount/path
则是你要挂载 virtiofs 的路径,例如:
sudo mount -t virtiofs sharing-folder /mnt #将 sharing-folder 文件夹挂载到 /mnt
然后你就能在挂载点看到共享的文件夹了。
制作 ISO 文件
你可以将特定的文件/文件夹打包成 ISO 文件,作为一个 SATA CDROM 存储设备添加到虚拟机中。
$ mkisofs -o 文件名.iso /文/件/路/径
文件的路径可以是绝对路径,也可以是相对路径。例如:
poplar@c004-h1:~/Others/kvm> ls base-tool virtio-win-guest-tools.exe winfsp-2.0.23075.msi poplar@c004-h1:~/Others/kvm> mkisofs -o driver.iso ./base-tool Setting input-charset to 'UTF-8' from locale. 94.11% done, estimate finish Tue Sep 24 12:33:25 2024 Total translation table size: 0 Total rockridge attributes bytes: 0 Total directory bytes: 0 Path table size(bytes): 10 Max brk space used 0 15969 extents written (31 MB)
3D 加速
要使用 3D 图形加速,首先,将虚拟机关机。
然后,你需要先将虚拟机的 显示协议 Spice 的 监听类型 修改为 无。然后勾选下方的 OpenGL,并选择合适的硬件:
最后修改 显卡,将类型更换为 Virtio,并勾选 3D 加速:
然后重启虚拟机。
如果在使用独显进行 3D 加速后遇到虚拟机无法正常显示内容的情况,可以考虑使用核显进行 3D 加速。
一些常见问题
显示界面太小无法看清文字
启动虚拟机后,可能会出现虚拟机的显示界面很小(尤其是你在使用高分屏的时候)。这时,点击虚拟机菜单栏中的 查看,将 缩放显示 调整为 总是;这样虚拟机的画面就会自动根据窗口大小进行缩放了。
适用于 Windows KVM 虚拟机的驱动
你在找的东西就是上文的 virtio-win-guest-tools.exe
,或者说下文的 virtio-win-*.iso
。
托盘图标
托盘图标可以清晰地显示 KVM 是否正在运行。
要启用托盘图标,你需要先打开虚拟机系统管理器,点击菜单栏的 编辑 > Preferences,勾选 启用系统托盘图标。
虚拟机全屏显示
虚拟机切换至全屏的按钮在右上方,切换至全屏后,如果要退出全屏,请将鼠标移动至屏幕正上方,会出现一个退出按钮:
虚拟网络未激活
如果默认的虚拟网络丢失之后,可以采用下面的方法重新加载和激活:
virsh net-define /usr/share/libvirt/networks/default.xml
标记默认网络自动启动:
virsh net-autostart default
启动默认网络:
sudo virsh net-start default
你也可以在虚拟系统管理器的 连接详情 > 虚拟网络 页面中,删除旧的网络,然后添加新的网络。并为虚拟机添加一个使用这个新网络连接的网络设备。
USB 设备重定向错误
如果你参照网上教程或者官方手册后,依旧无法使用 USB 重定向把 U 盘重定向到虚拟机中。你可以采取如下操作,将 USB 设备直接装入虚拟机:
首先,打开虚拟机页面,点击左上方小电脑图标(显示图形控制台)右侧的感叹号(显示虚拟硬件详情)
然后,点击左下角的 添加硬件,在弹出的 添加新虚拟硬件 窗口的左侧列表中选择 USB 主机设备,接着在右侧列表中点击你的 U 盘(例如:002:002 SanDisk. Ultra Flair,这些 USB 主机设备的名称都可以很容易地和你的物理硬件一一对应。),点击完成。
然后你就可以在虚拟机中看到新添加的可移动储存设备。
- 该操作无需重启虚拟机
- 官方手册与之不同之处在于选择设备的时候是选择 USB 重定向
- 在虚拟机硬件详情页面右键删除你新添加的 USB 主机设备即可将 USB 设备从虚拟机中释放出来。
可参考的其他解决方案:
鼠标捕获
KVM 虚拟机会自动捕获点击虚拟屏幕的鼠标光标,如果你需要取消该操作,可以使用 左 Ctrl + 左 Alt 快捷键组合取消鼠标捕获。
按下快捷键释放鼠标后,如果鼠标没有正常显示,导致无法离开虚拟机管理器,你可以按下 Alt + Tab 快捷键切换应用程序。
Windows 虚拟机分辨率无法调节
新安装的 windows 虚拟机可能会出现无法调节显示分辨率,你可以参考上文安装 win-guest-tools.exe。
另外,值得注意的一点是,开发者还提供了 ISO 文件格式的驱动文件(virtio-win-*.iso
)。你可以把这个 ISO 文件作为一个 SATA CDROM 的存储设备添加到虚拟机中。
导出/导入虚拟机
导出
- 本节假定你尚未更改虚拟机磁盘默认的保存位置;
- 需要备份两个文件;
- 本节操作推荐在终端中进行。
现在假定你有一个名为 win10 的虚拟机需要导出到另一台电脑,或者只是备份。
首先,确定 win10 已经关闭:
sudo virsh list
如果输出结果有 win10 的值,请使用下列指令关闭虚拟机:
sudo virsh shutdown win10
然后,输出配置信息至指定的用户目录( sudo virsh dumpxml <guestname> > <dir>/<filename>
):
sudo virsh dumpxml win10 > ~/win10.xml #将 win10 的配置信息导出到用户目录;xml 文件包含了该虚拟机的磁盘文件保存位置
然后把虚拟机的磁盘复制到指定目录(sudo scp <dir> <dir>
):
sudo scp /var/lib/libvirt/images/win10.qcow2 ~ #将 win10 的硬盘复制到用户目录
导入
然后把虚拟机的磁盘复制到指定目录(sudo scp <dir> <dir>
):
sudo scp ~/win10.qcow2 /var/lib/libvirt/images/ #将 win10 的硬盘复制到默认目录
导入 xml 配置(sudo virsh define ./<filename>
):
sudo virsh define ~/./win10.xml
启动 win10
sudo virsh start win10
手动导入
如果无法通过 xml 文件导入虚拟机,那么你可以在新建虚拟机时,选择 导入现有的磁盘映像,然后选择对应的操作系统版本,接着按照上文的步骤进行操作即可。