KVM
目录
简介
KVM,Kernel-based Virtual Machine,是一种内置于 Linux 内核中的管理程序。它的目的类似于 Xen,但运行起来要简单得多。与原生 QEMU 使用仿真不同,KVM 是 QEMU 的一种特殊运行模式,它通过内核模块使用 CPU 扩展(HVM)进行虚拟化。
openSUSE 有一份十分详细的虚拟化文档,涵盖在 openSUSE 上使用 KVM/Xen 的方方面面。如果你想要使用 KVM ,那你一定不能错过这篇官方指南:
- openSUSE Leap 15.3 - Virtualization Guide(该文档也适用于 tumbleweed 等分支版本)
如果你需要一个快速的图形化配置指南,你可以继续阅读本文。
检查可用性
打开终端,运行如下指令:
sudo LC_ALL=C lscpu | grep Virtualization
检查输出结果,例如:
Virtualization: VT-x
对于 Intel 处理器来说是 VT-x ,对于 AMD 处理器来说是 AMD-V ;否则你的机器不支持虚拟化。
安装必要的包
打开 YaST ,点击虚拟化,然后点击 安装 Hypervisor 和工具 。勾选 KVM 工具 和 KVM 服务器,然后等到 YaST 自动安装并校验所有包;如果你已经安装了 KVM 相关组件,那相应的选项会变成不可点击的灰色。
加入用户组
为避免每次启动都需要输入密码,请加入 libvirt 用户组:
sudo usermod -aG libvirt <UserName> #将 <UserName> 替换为你的用户名
新建虚拟机
virt-manager
,如果你在开始菜单中找不到该程序,可以直接在终端中输入并启动该管理器。首先,打开开始菜单,搜索 KVM,找到 虚拟系统管理器,(你可以将其添加到收藏夹以便于使用。)点击启动该程序(需要 root 权限); 然后,点击 文件 下方的电脑小图标,创建虚拟机:
然后,勾选本地安装介质(计算机架构默认是 x86_64),你也可以选择网络安装,但是你必须保证 ISO 文件的镜像下载地址是正确无误的。
在步骤 2 中,点击 浏览 ,在弹出的 定位 ISO 介质卷 窗口中,点击 本地浏览 ,在文件管理器中找到你下载的镜像。然后点击 前进 ,进入步骤 3
在步骤 3 中,你可以调整虚拟机可以使用的内存大小和 CPU 数(你可以使用默认值),点击 前进 ,进入步骤 4
在步骤 4 中,你可以调整虚拟机的存储空间,你可以使用默认值(KVM 创建的储存类似于 VirtualBox 的动态分配的 VDI),点击 前进 ,进入步骤 5,然后点击完成(KVM 会在配置完成后自动启动虚拟机的安装,但你可以在步骤 5 勾选默认未勾选的配置选项,在自动启动安装前进行对虚拟机的自定义配置)。
接下来的操作步骤请参考具体的系统安装教程。
自定义虚拟机位置
KVM 虚拟机文件默认的存放位置是 /var/lib/libvirt/images
在新建虚拟机的步骤 4 中,勾选 选择或创建自定义储存,然后点击下方的 管理,
在弹出的 定位或创建储存卷 窗口中,点击左下角的 + ,进行添加池,
再在又弹出的 添加新储存池 窗口中,将目标路径更改为你所希望虚拟机存放的文件夹的路径,池的类型默认是文件系统目录,你应当命名一个可以和其他池区分彼此的名称,然后点击保存。
点击右侧的池列表,选择你刚刚创建的池,然后点击 详情 页中的 +,创建新卷,名称自选,容量调节为你认为合适的值或默认值。点击完成。
然后选择你新建的卷,进入下一步。
关闭虚拟机
你需要打开虚拟机管理器,右键点击正在运行虚拟机,然后选择 关机 ,如果关不掉(可以考虑强制关机,但是会丢失数据),你应当用鼠标双击正在运行的虚拟机,打开虚拟机的虚拟屏幕,在虚拟机内执行关机操作。
或者
sudo virsh list #列出正在运行的虚拟机 sudo virsh shutdown <guestname> #关闭正在运行的虚拟机,如 sudo virsh shutdown opensusejeos
保存/重载虚拟机
如果你需要保存当前虚拟机的进度以便于下次启动虚拟机的时候继续工作,你应当点击菜单栏中 关闭虚拟机 按钮右侧的倒三角符号,展开菜单,然后选择 保存 。这样 KVM 会把虚拟机的内存保存到储存中,并自动关闭虚拟机。
- 注意,在保存虚拟机后,请勿重启虚拟机或者启动虚拟机,以免发生因为同步错误而导致重载失败。
点击打开虚拟系统管理器,双击你之前保存的虚拟机,在弹出的窗口中(显示客户机未运行),点击左上方的 虚拟机,在展开的菜单中,点击恢复,进行虚拟机的重载。
删除虚拟机
右键点击所要删除的虚拟机,默认删除的只有虚拟机的文件,用于安装系统的源镜像默认不会删除。
一些常见问题
虚拟网络未激活
如果默认的虚拟网络丢失之后,可以采用下面的方法重新加载和激活:
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 虚拟机会自动捕获点击虚拟屏幕的鼠标光标,如果你需要取消该操作,可以使用 L-Ctrl + L-Alt 快捷键组合取消鼠标捕获。
虚拟机的储存管理
本节内容详见:Managing Storage
池与卷
打开 虚拟系统管理器,单击你的虚拟机,点击上方的 编辑 ,然后点击 连接详情,在弹出的新窗口中,点击 储存 ,然后你可以看到如下的界面:
如上图,左侧是池的管理界面,右侧是卷的管理界面。
左下角的四个按钮分别是,新建池、启动池、停止池、删除池;具有新建、启用、停止(屏蔽)和删除池的功能。如果你想要使用某个卷,那卷所在的池必须处于活动状态。
在界面的 卷 字样的右侧,有三个按钮分别是,创建新卷、刷新卷列表和删除卷;用于新建和删除卷,与刷新列表。
- 管理器可能不会自动刷新卷列表,这时你需要手动刷新列表。
- 勾选 引导时,可以让虚拟机在启动时就能自动挂载卷。
存储卷
存储卷是可以分配给客户的存储设备 -- 虚拟磁盘或 CD/DVD/软盘镜像。在物理上(在虚拟机主机服务器上),它可以是一个块设备(分区、逻辑卷等)或一个文件。
存储池
存储池是虚拟机主机服务器上的一种存储资源,可以用来存储卷,类似于台式机的网络存储。物理上它可以是以下类型之一:
- 文件系统目录 (dir):一个用于存放图像文件的目录。文件可以是支持的磁盘格式之一(raw 或 qcow2),或 ISO 映像。
- 物理磁盘设备(disk):使用一个完整的物理磁盘作为存储。为添加到池中的每个卷创建一个分区。
- 预格式化块设备 (fs):指定一个与文件系统目录池相同的分区(用于存放镜像文件的目录)。与使用文件系统目录的唯一区别是,libvirt 会负责挂载设备。
……
池管理
虚拟机管理器的 存储管理器 可让你在池中创建或删除卷。您也可以暂时停用或永久删除现有的存储池。SUSE 目前不支持更改池的基本配置。
其他类型
Typedisk 目标路径。设备所在的目录。默认值/dev 通常适合。 Format(格式):设备分区表的格式。设备分区表的格式。使用自动通常应该可以。如果不行,请在虚拟机主机服务器上运行命令 parted -l 获取所需格式。 源路径:设备的路径。设备的路径。建议使用来自 /dev/disk/by-* 的设备名称,而不是简单的 /dev/sdX,因为后者可以改变(例如,在添加或删除硬盘时)。您需要指定类似于整个磁盘的路径,而不是磁盘上的分区(如果存在)。 构建池。激活此选项可格式化设备。请小心使用 -- 设备上的所有数据都将丢失!
Typefs 目标路径。VM 主机服务器文件系统上的挂载点。 格式:设备的文件系统格式。设备的文件系统格式。默认值 auto 应该可以使用。 源路径:设备文件的路径。设备文件的路径。建议使用来自 /dev/disk/by-* 的设备名称,而不是 /dev/sdX,因为后者可能会改变(例如,在添加或删除硬盘时)。
……
创建卷
你可以使用存储管理器创建新卷,或在向客户机添加新存储设备时创建。无论哪种情况,请从左侧面板选择存储池,然后单击创建新卷。
然后为映像指定名称并选择映像格式。SUSE 目前仅支持 raw 或 qcow2 映像。后一个选项在基于 LVM 组的池上不可用。
在 容量 旁边,指定磁盘镜像允许达到的最大大小。除非您使用的是 qcow2 映像,否则您还可以为储存卷配额设置一个应初始分配的数值。如果这两个值不同(和池的可用空间相比),就会创建一个按需增长的映像文件(类似 VirtualBox 的动态 VDI)。
对于 qcow2 镜像,你可以使用 后备储存 ,指定另一个卷,然后,新创建的 qcow2 镜像将只记录对基础镜像所做的更改。
点击完成,开始创建卷。
注意!
- 删除基于本地文件系统目录、本地分区或磁盘的存储池不会影响当前连接到客户机的这些池中卷的可用性。
- 如果删除池,位于 iSCSI、SCSI、LVM 组或网络导出目录类型的池中的卷将变得无法从 VM 客户机访问。虽然卷本身不会被删除,但 VM 主机服务器将不再能访问资源。
- 在创建足够的新池或直接从主机系统挂载/访问这些资源时,iSCSI/SCSI 目标或网络导出目录上的卷将重新变得可访问。
- 删除基于 LVM 组的存储池时,LVM 组定义将被清除,并且 LVM 组将在主机系统上不再存在。该配置不可恢复,并且该池中的所有卷都将丢失。
为虚拟机扩充存储空间 —— KVM 虚拟机存储管理简单实例
- 假设现有一个虚拟磁盘空间为 20 GB 的虚拟机,需要将存储空间增加 100 GB。
打开虚拟机的连接详情,在存储页面找到空闲空间大于 100 GB 的池,创建新卷。
在虚拟机的硬件详情中,使用刚刚创建的新卷添加新的存储硬件,其余值设置为默认值。
启动系统后,可以在文件管理器中看到新添加的存储硬件,但是不能直接使用。
打开 YaST ,启动磁盘分区模块 ,选中新添加的 100 GB 磁盘,执行格式化操作(分区角色选择为数据和 ISV 应用程序,文件系统为 XFS)。
打开终端,执行如下的指令:
sudo chown -R 用户名:用户组 目录 # 例如:sudo chown -R bh:users /run/media/bh
用户名为非 root 用户名,用户组通常是 users ,目录则具体取决于磁盘挂载在哪个目录之下。
导出/导入虚拟机
导出
- 本节假定你尚未更改虚拟机磁盘默认的保存位置;
- 需要备份两个文件;
- 本节操作推荐在终端中进行。
假定现在,你有一个名为 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