33.6K
本指南解释了 Libvirt 中的存储池和卷以及如何使用更改 KVM libvirt 默认存储池位置 处女座 程序, 虚拟经理 和 座舱 在 Linux.
Libvirt 通过存储池和卷在 KVM 主机系统上提供存储管理。
存储池是在 KVM 主机上分配给虚拟机使用的一定数量的存储空间。 存储池被划分为多个存储卷,并作为块设备分配给虚拟机。
换句话说,存储池就是KVM主机系统上的存储资源,可以用来存储卷。 存储卷是可以分配给虚拟机的存储设备。
存储卷可以是块设备,例如 example 分区、逻辑卷或文件。 附加到来宾计算机的虚拟硬盘、cd/dvd/软盘设备和 ISO 映像都是存储卷的示例。
没有存储池就没有存储卷。 首先,您需要创建一个存储池,然后在池中创建存储卷。
默认情况下,所有使用 libvirt 创建的虚拟机都存储在 /var/lib/libvirt/images/
地点。 这是 Libvirt VM 镜像的默认存储池。
存储池的类型
存储池可以是以下类型之一:
- 目录池——使用目录作为存放图像文件的池。 这些文件可以是有效的卷格式类型之一,例如 raw、qcow、qcow2、dmg、vmdk、vpc 或 ISO 映像。
- 文件系统池——使用块设备(例如分区或 LVM 组)作为池而不是现有已安装文件系统上的使用目录。
- 网络文件系统池——使用网络文件系统(例如
cifs
,glusterfs
,nfs
等)作为存储存储卷的池。 它不需要目录或块设备,而是需要网络主机和共享目录的路径。 - 逻辑卷池——使用 LVM 卷组作为存储卷的池。
- 磁盘池 – 使用物理磁盘作为池。 可以通过向磁盘添加分区来创建卷。
- iSCSI 池 – 使用 iSCSI 目标存储卷。 所有卷都应预先分配到 iSCSI 服务器上。
- iSCSI 直接池——这是 iSCSI 池的变体。 它不使用 iscsiadm,而是使用
libiscsi
. 它需要一个主机、一个作为目标 IQN 的路径和一个启动器 IQN。 - SCSI 池 – 以几乎与 iSCSI 目标相同的方式使用 SCSI 主机总线适配器。
- 多路径池——目前不支持多路径。
- RBD 池——此存储驱动程序提供了一个池,其中包含 RADOS 池中的所有 RBD 映像。 RBD(RADOS Block Device)是 Ceph 分布式存储项目的一部分。
- Sheepdog 池——使用 Sheepdog Cluster 作为存储卷的池。
- Gluster 池——使用 Gluster 分布式文件系统作为池。
- ZFS 池——使用 ZFS 文件系统作为池。
- vstorage 池——使用 Virtuozzo 分布式软件定义存储作为池。
出于本指南的目的,我们将使用 Directory pool
.
1. 更改 KVM Libvirt 默认存储池位置
如前所述,所有 KVM/Libvirt 映像都存储在 /var/lib/libvirt/images/
默认位置。 由于这个位置位于 rootfs
分区,您可能希望将其移动到其他位置,例如 example $HOME
目录。
我们可以使用更改 KVM Libvirt VM 映像的默认位置 virsh
命令行程序及其图形前端称为 虚拟经理,并且 座舱 网络控制台。
首先,我们将看到如何使用更改 Libvirt 默认存储池路径 virsh
程序。
1.1. 使用 virsh 程序更改 KVM Libvirt 默认存储池位置
1.1.1. 登录到您的 KVM 主机系统并关闭所有正在运行的客户机。
要查找正在运行的虚拟机列表,只需执行以下操作:
$ virsh list --all
如果有任何 VM 正在运行,则关闭。
$ virsh shutdown <虚拟机名称>
1.1.2. 列出 KVM 主机中所有已配置的存储池:
$ virsh pool-list
示例输出:
Name State Autostart default active no
如您所见,我只有一个存储池,即 default
. 它是在我们安装时自动创建的 kvm/libvirt
.
1.1.3. 让我们使用命令查看默认存储池的详细信息:
$ virsh pool-info default
示例输出:
Name: default UUID: 76f47a3c-7656-4c34-9ab5-c87e5136d532 State: running Persistent: yes Autostart: no Capacity: 369.22 GiB Allocation: 65.60 GiB Available: 303.62 GiB
上面的输出列出了存储池的名称、UUID、状态、持久性、自动启动、容量、存储池的已分配空间和剩余可用空间等详细信息。
由于我们要更改存储池的路径,因此我们也需要找到它。
1.1.4. 要显示默认存储池的路径,我们使用 grep 命令与 virsh
如下所示:
$ virsh pool-dumpxml default | grep -i path
示例输出:
<path>/var/lib/libvirt/images</path>
正如您在上面的输出中看到的,默认存储池是 /var/lib/libvirt/images/
. 我们将在后续步骤中更改它。
1.1.5. 列出存储在默认存储池中的所有现有 VM 映像,使用 virsh
如下所示:
$ virsh vol-list default | grep "/var/lib/libvirt/images/"
示例输出:
archlinux.img /var/lib/libvirt/images/archlinux.img
我有一个拱门 Linux 默认存储池中的虚拟机映像。
1.1.6. 使用以下命令停止并取消定义默认存储池:
$ virsh pool-destroy default
$ virsh pool-undefine default
1.1.7. 使用命令编辑默认存储池:
$ virsh pool-edit default
这将在您的默认编辑器中打开 VM 的 XML 文件。
找到读取的行 "<path>/var/lib/libvirt/images</path>"
在下面 target
指令并将其更改为您选择的新路径。
就我而言,我改变了 <path>
元素来自 /var/lib/libvirt/images
到 /home/sk/.local/share/libvirt/images
.
<pool type="dir">
<name>default</name>
<uuid>76f47a3c-7656-4c34-9ab5-c87e5136d532</uuid>
<capacity unit="bytes">396452147200</capacity>
<allocation unit="bytes">71178977280</allocation>
<available unit="bytes">325273169920</available>
<source>
</source>
<target>
<path>/home/sk/.local/share/libvirt/images</path>
<permissions>
<mode>0755</mode>
<owner>1000</owner>
<group>1000</group>
<label>unconfined_u:object_r:svirt_home_t:s0</label>
</permissions>
</target>
</pool>
只要确保新路径存在即可。 如果存在,只需创建它并为新路径目录分配足够的权限。 保存文件并关闭它。
提示:
如果由于任何原因不存在默认存储池,您可以创建一个如下所示:
$ virsh pool-define-as --name default --type dir --target /home/sk/.local/share/libvirt/images/
将存储路径替换为您自己的。
1.1.8. 最后,启动默认存储池:
$ virsh pool-start default
1.1.9. 将存储池设置为在系统启动时自动启动:
$ virsh pool-autostart default
1.1.10。 使用命令验证 libvirt 存储池路径是否已更改:
$ virsh pool-dumpxml default | grep -i path
您现在应该看到新路径。
/home/sk/.local/share/libvirt/images
从现在开始,虚拟映像将保存在新的存储池中。
1.1.11。 检查存储池状态:
$ virsh pool-list Name State Autostart ------------------------------- default active yes
1.1.12。 重启 libvirtd 服务:
$ sudo systemctl restart libvirtd
1.1.13。 我们需要做最后一件事。 将所有 VM 映像从旧存储路径复制到新存储路径:
$ sudo mv /var/lib/libvirt/images/archlinux.qcow2 /home/sk/.local/share/libvirt/images/
全做完了!
这就是我们使用命令行将 KVM Libivrt 默认存储池位置更改为新位置的方式 Virsh
程序。 如您所见,更改 KVM/Libvirt 来宾的默认存储路径相当容易!
现在让我们看看如何使用名为的图形应用程序更改 Libvirt 默认存储池路径 Virt-manager
.
1.2. 使用 Virt-manager 更改 KVM Libvirt 默认存储池位置
虚拟经理是 Virtual Machine Manager 的缩写,是一个图形用户界面应用程序,用于通过 libvirt
. 换句话说,Virt-manager 只是一个图形化的前端 libvirt
.
1.2.1. 打开 Virt-manager 应用程序。 右键单击 QEMU/KVM,然后单击 细节 选项。
您也可以点击 编辑-> 连接细节 从 Virt-manager 界面。
1.2.2. 在下面 贮存 部分,您将看到默认的存储池位置。
1.2.3. 点击 停止池 进而 删除池 左下方窗格中的选项。
这将停用并删除默认池。
1.2.4. 点击 加号 (+) 在左下方的窗格中签名以创建一个新的存储池供虚拟机使用。
Enter 存储池的名称(例如 default
在我的情况下)。 选择池的类型。 在我们的例子中,我选择了 文件系统目录. 指定目标位置并单击完成。
1.2.5. 现在新的存储是活动的。 检查 自动启动 框以在系统启动时自动启动新的存储池。
1.2.6. 将所有 VM 映像从旧存储目录移动到新目录。
$ sudo mv /var/lib/libvirt/images/archlinux.qcow2 /home/sk/.local/share/libvirt/images/
1.2.7. 最后,重启 libvirtd 服务:
$ sudo systemctl restart libvirtd
1.3. 使用 Cockpit 更改 KVM Libvirt 默认存储池位置
座舱 是一个免费的基于 Web 的服务器管理工具,用于监视和管理 Linux 服务器通过网络浏览器。
1.3.1 打开您的 Web 浏览器并通过导航到 Cockpit 控制台登录 https://localhost:9090 或者 https://IP-地址:9090 从地址栏。
1.3.2. 点击 虚拟机 左窗格中的选项卡。 在右侧,单击 存储池 选项。
1.3.3. 在存储池部分下,您将看到默认存储池。 单击小箭头展开存储池选项卡并单击 停用 和 删除 纽扣。
笔记: 由于我已经更改了默认存储位置,因此它显示了新路径。 在您的系统中,它将显示旧的默认路径,即 /var/lib/libvirt/images
.
1.3.4. Enter 存储池名称、类型和目标路径,然后单击 创造. 确保选中启动复选框。
1.3.5. 点击 启用 按钮启动池。
1.3.6. 将所有 VM 映像从旧存储目录移动到新目录。
$ sudo mv /var/lib/libvirt/images/archlinux.qcow2 /home/sk/.local/share/libvirt/images/
1.3.7. 重启 libvirtd 服务:
$ sudo systemctl restart libvirtd
故障排除
更改存储池路径后,启动虚拟机时可能会遇到以下错误:
Failed to start domain 'Archlinux_default' error: Cannot access storage file '/home/sk/.local/share/libvirt/images/Archlinux_default.img' (as uid:107, gid:107): Permission denied.
这是因为 qemu
用户可能没有对存储目录的读取权限。 要修复它,请参考以下链接:
- [Solved] 无法访问存储文件,KVM Libvirt 中的权限被拒绝错误
结论
在本指南中,我们讨论了一个重要的 KVM/Libvirt 主题—— 存储池. 我们了解了什么是存储池和卷,然后如何使用三个程序更改 kvm libvirt 默认存储池位置,即 VIrsh、Virt-manager 和 Cockpit。 希望你觉得这个有用。
资源: