我想創建一個儲存池對於 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/usr.lib.libvirt.virt-aa-helper
查看 /etc/apparmor.d/local/README 新增自訂規則以了解更多資訊。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
您應該收到以下文字:池預設已損壞
8.取消池的定義
$ virsh pool-undefine default
您應該得到以下文字:池預設值已未定義
9. 定義一個名為「default」的新池
$ virsh pool-define-as --name default --type dir --target /media/username/Shared/kvm
您應該得到以下文字:池預設已定義
10. 將池設定為在 libvirt 守護程式啟動時啟動
$ virsh pool-autostart default
您應該得到以下文字:池預設標記為自動啟動
11.啟動池
$ virsh pool-start default
您應該收到以下文字:池預設已啟動
12.檢查池的狀態
$ virsh pool-list
您應該得到以下文字:
Name State Autostart
-------------------------------------------
default active yes
現在,在建立虛擬機器時,Virtual Machine Manager 會將 qcow2 檔案儲存到 /media/username/Shared/kvm 目錄中。
建立新的來賓電腦或 qcow2 文件
13.運行virt-manager
$ virt-manager
14. 為虛擬機器建立磁碟映像或建立新機器。
答案4
就我而言,這是一個錯誤——不是特別明顯。我試圖在目錄中建立儲存池,所以dir:Filesystem Directory
有 2 個步驟:
- 您指定
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 就會修復它們。
希望它能幫助別人。