我想创建一个存储池对于 virt-manager 的 qcow2 映像在我的主目录中但我收到一个奇怪的错误:
Error creating pool: Could not define storage pool: XML error: name /home/matthias/virtual-guests/virt-manager cannot contain '/'
问题
- 我的主目录中是否有可能拥有存储池?
- 我是否需要 virt-manager 的特殊权限才能访问该目录?
完整错误追溯
Traceback (most recent call last): File "/usr/share/virt-manager/virtManager/asyncjob.py", line 89, in cb_wrapper callback(asyncjob, *args, **kwargs) File "/usr/share/virt-manager/virtManager/createpool.py", line 442, in _async_pool_create poolobj = self._pool.install(create=True, meter=meter, build=build) File "/usr/share/virt-manager/virtinst/storage.py", line 531, in install raise RuntimeError(_("Could not define storage pool: %s") % str(e)) RuntimeErError creating pool: Could not define storage poror: Could not define storage pool: XML error: name /home/matthias/virtual-guests/virt-manager cannot contain '/'
答案1
您可以创建池,但需要考虑一些事项。
“名称”必须不包含特殊字符,例如“/”。如果您想创建一个 /tmp/test 池,您可以将其命名为“测试“(在第 1 步(共 2 步))并赋予其路径“/tmp/测试“(在第 2 步(共 2 步)),它就会起作用。
如果你走得太不常见,apparmor 会阻止你,默认情况下允许的路径有限,如果你在某个时候超出了这些路径virt-aa-助手将无法再访问这些文件。但这是必要的,以便它能够允许每个客户自定义配置文件进行访问。查看现有规则
/etc/apparmor.d/usr.lib.libvirt.virt-aa-helper
并通过查看 /etc/apparmor.d/local/README 添加自定义规则/etc/apparmor.d/local/usr.lib.libvirt.virt-aa-helper
以了解更多信息。有些池类型尚无法由 apparmor 处理。virt-manager 的默认池类型将是“目录“这样就没问题了。但还有更高级的类型,例如“lvm 组“,对于这些类型,无法为客人即时创建apparmor规则(参见此错误),在这些情况下,您需要通过更改来允许您需要的额外路径
/etc/apparmor.d/abstractions/libvirt-qemu
。
答案2
答案3
在另一个分区上创建 qcow2 磁盘映像文件
本指南已在 Ubuntu 22.04 LTS、22.10、23.04、23.10 上测试。
自动将目录链接到块(自动分区挂载)
1. 创建新目录
$ sudo mkdir /media/username
$ sudo mkdir /media/username/Shared
$ sudo mkdir /media/username/Shared/kvm
重要的!目录名 kvm 采用小写字母。
2. 运行 blkid 命令显示有关可用块设备的信息。您将需要通用唯一标识符 (UUID)
$ sudo blkid
结果看起来应该是这样的:
/dev/sda1: LABEL="Ubuntu" UUID="azazazaz-azaz-azaz-azaz-azazazazazaz" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Ubuntu" PARTUUID="a1a1a1a1-a1a1-a1a1-a1a1-a1a1a1a1a1a1"
/dev/sda2: LABEL="Shared" UUID="abababab-abab-abab-abab-abababababab" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Shared" PARTUUID="a2a2a2a2-a2a2-a2a2-a2a2-a2a2a2a2a2a2"
3.编辑 fstab 文件。
$ sudo nano /etc/fstab
在 fstab 文件中添加以下两行正确的 UUID:
# Shared
UUID=abababab-abab-abab-abab-abababababab /media/username/Shared ext4 defaults 0 2
最终结果应该是这样的:
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/nvme0n1p3 during installation
UUID=azazazaz-azaz-azaz-azaz-azazazazazaz / ext4 errors=remount-ro 0 1
# Shared
UUID=abababab-abab-abab-abab-abababababab /media/username/Shared ext4 defaults 0 2
4.运行mount -a
命令
$ sudo mount -a
可能的问题:
- 模拟器可能没有路径“/media/username/Shared/kvm/Disk.qcow2”的搜索权限
- 启动域时出错:无法访问存储文件“/media/username/Shared/kvm/Disk.qcow2”(作为 uid:10101,gid:101):权限被拒绝
5.修复权限问题
$ sudo chown root:root '/media'
$ sudo chmod 775 '/media'
$ sudo chown root:root '/media/username'
$ sudo chmod 775 '/media/username'
$ sudo chown username:username '/media/username/Shared'
$ sudo chmod 775 '/media/username/Shared'
$ sudo chown username:username '/media/username/Shared/kvm'
$ sudo chmod 777 '/media/username/Shared/kvm'
更改 libvirt 的默认存储池
6. 列出当前池
$ virsh pool-list
您应该看到以下文本:
Name State Autostart
-------------------------------------------
default active yes
7. 销毁默认池。
$ virsh pool-destroy default
您应该看到以下文本:Pool default broken
8. 取消定义池
$ virsh pool-undefine default
您应该看到以下文本:Pool default has been undefined
9. 定义一个名为“default”的新池
$ virsh pool-define-as --name default --type dir --target /media/username/Shared/kvm
您应该看到以下文本:Pool default defined
10. 将池设置为在 libvirt 守护进程启动时启动
$ virsh pool-autostart default
您应该看到以下文本:池默认标记为自动启动
11. 启动池
$ virsh pool-start default
您应该看到以下文本:Pool default started
12.检查池的状态
$ virsh pool-list
您应该看到以下文本:
Name State Autostart
-------------------------------------------
default active yes
现在,在创建虚拟机时,虚拟机管理器会将 qcow2 文件保存到 /media/username/Shared/kvm 目录中。
创建新的客户机或 qcow2 文件
13. 运行 virt-manager
$ virt-manager
14.为虚拟机创建磁盘映像或创建新机器。
答案4
就我而言,这是一个错误 - 不是特别明显。我试图在目录中创建存储池,所以dir:Filesystem Directory
有两个步骤:
- 您指定
type
和name
,但这里name
不是路径。 例子:test
- 下一步,
Target Path
这将为您提供建议路径/var/lib/libvirt/images/**test**. Simple **change**
/var/lib/libvirt/imagesto whatever you want. Example:
/libvirt-images-pool2/(which will result in
/libvirt-images-pool2/test```
注意:您可能需要摆弄所有权和权限,但我认为一旦您单击完成,libvirt 就会修复它们。
希望它能够对某人有所帮助。