如何更改 KVM Libvirt 默认存储池位置

本指南解释了什么是 Libvirt 中的存储池和卷,以及如何使用更改 KVM libvirt 默认存储池位置 维尔什 程序, 虚拟管理器座舱 在 Linux 中。

Libvirt 中的存储池和卷

Libvirt 通过存储池和卷在 KVM 主机系统上提供存储管理。

存储池是分配在 KVM 主机上供虚拟机使用的存储量。 存储池被划分为存储卷,并作为块设备分配给虚拟机。

换句话说,存储池是 KVM 主机系统上可用于存储卷的存储资源。 并且存储卷是可以分配给虚拟机的存储设备。

存储卷可以是块设备,例如 example 分区、逻辑卷或文件。 附加到来宾计算机的虚拟硬盘、cd/dvd/软盘设备和 ISO 映像都是存储卷的示例。

没有存储池就没有存储卷。 首先,您需要创建一个存储池,然后在池内创建存储卷。

默认情况下,使用 libvirt 创建的所有虚拟机都存储在 /var/lib/libvirt/images/ 地点。 这是 Libvirt VM 映像的默认存储池。

存储池的类型

存储池可以是以下类型之一:

  1. 目录池 – 将目录用作托管图像文件的池。 这些文件可以是有效的卷格式类型之一,例如 raw、qcow、qcow2、dmg、vmdk、vpc 或 ISO 映像。
  2. 文件系统池 – 使用块设备(例如分区或 LVM 组)作为池,而不是现有已安装文件系统上的使用目录。
  3. 网络文件系统池 – 使用网络文件系统(例如 cifs, glusterfs, nfs 等)作为存储存储卷的池。 它需要网络主机和共享目录的路径,而不是目录或块设备。
  4. 逻辑卷池 – 使用 LVM 卷组作为存储卷的池。
  5. 磁盘池 – 使用物理磁盘作为池。 可以通过向磁盘添加分区来创建卷。
  6. iSCSI 池 – 使用 iSCSI 目标存储卷。 所有卷都应在 iSCSI 服务器上预先分配。
  7. iSCSI 直接池 – 这是 iSCSI 池的一种变体。 它不使用 iscsiadm,而是使用 libiscsi. 它需要一个主机、一个作为目标 IQN 的路径和一个启动器 IQN。
  8. SCSI 池 – 以几乎与 iSCSI 目标相同的方式使用 SCSI 主机总线适配器。
  9. 多路径池 – 目前不支持多路径。
  10. RBD 池 – 此存储驱动程序提供了一个池,其中包含 RADOS 池中的所有 RBD 映像。 RBD(RADOS 块设备)是 Ceph 分布式存储项目的一部分。
  11. Sheepdog pool – 使用 Sheepdog Cluster 作为存储卷的池。
  12. Gluster 池 – 使用 Gluster 分布式文件系统作为池。
  13. ZFS 池 – 使用 ZFS 文件系统作为池。
  14. 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 主机系统并关闭所有正在运行的来宾。

要查找正在运行的 VM 列表,只需执行以下操作:

$ virsh list --all

如果有任何 VM 正在运行,则关闭。

$ virsh 关闭 <虚拟机名称>

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
显示 libvirt 默认存储池的详细信息

上面的输出列出了存储池的名称、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

我在默认存储池中有一个 Arch 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 命令更改 KVM Libvirt 默认存储池位置

只要确保新路径存在即可。 如果存在,只需创建它并为新路径目录分配足够的权限。 Save 文件和 close 它。

提示:

如果由于某种原因不存在默认存储池,您可以创建一个,如下所示:

$ 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 并单击 细节 选项。

查看 KVM 连接详情查看 KVM 连接详情

您也可以点击 编辑-> 连接详细信息 从 Virt-manager 界面。

1.2.2。 在下面 贮存 部分,您将看到默认存储池位置。

KVM Libvirt 默认存储池位置KVM Libvirt 默认存储池位置

1.2.3。 点击 停止池 进而 删除池 左下窗格中的选项。

停止并删除 KVM Libvirt 默认存储池停止并删除 KVM Libvirt 默认存储池

这将停用并删除默认池。

1.2.4。 点击 加号 (+) 在左下方窗格上签名以创建新的存储池以供虚拟机使用。

Enter 存储池的名称(例如 default 在我的情况下)。 选择池的类型。 在我们的例子中,我选择了 文件系统目录. 指定目标位置并单击完成。

创建新的 KVM Libvirt 存储池创建新的 KVM Libvirt 存储池

1.2.5。 现在新的存储处于活动状态。 检查 自动启动 框以在系统引导时自动启动新的存储池。

新的 KVM Libvirt 存储池位置新的 KVM Libvirt 存储池位置

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 的服务器管理工​​具,用于通过 Web 浏览器监控和管理 Linux 服务器。

1.3.1 打开您的 Web 浏览器并通过导航至登录 Cockpit 控制台 https://localhost:9090 或者 https://IP 地址:9090 从地址栏。

登录 Cockpit Web 控制台登录 Cockpit Web 控制台

1.3.2. 点击 虚拟机 左侧窗格中的选项卡。 在右侧,单击 存储池 选项。

转到 Cockpit 中的存储池部分转到 Cockpit 中的存储池部分

1.3.3. 在存储池部分下,您将看到默认存储池。 单击小箭头展开存储池选项卡,然后单击 停用删除 纽扣。

在 Cockpit 中停用和删除默认存储池在 Cockpit 中停用和删除默认存储池

笔记: 由于我已经更改了默认存储位置,因此它显示了新路径。 在您的系统中,它将显示旧的默认路径,即 /var/lib/libvirt/images.

1.3.4。 Enter 存储池名称、类型和目标路径,然后单击 创造. 确保选中启动复选框。

在 Cockpit 中创建新的 KVM Libvirt 存储池在 Cockpit 中创建新的 KVM Libvirt 存储池

1.3.5。 点击 启用 按钮启动池。

在 Cockpit 中激活 KVM Libvirt 存储池在 Cockpit 中激活 KVM Libvirt 存储池

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 主题 – 存储池. 我们了解了什么是存储池和卷,然后了解了如何使用 VIrsh、Virt-manager 和 Cockpit 三个程序更改 kvm libvirt 默认存储池位置。 希望您觉得这个有帮助。

资源:

特色图片由 穆罕默德·哈桑关注.