Ubuntu

如何在 SMB/CIFS 網路共享上使用 QEMU/KVM 虛擬機磁碟映像:權限被拒絕

  • December 1, 2020

環境

  • SMB 網路共享temp掛載如下,登錄使用者dave
sudo mount -t cifs -o username=dave,vers=3.11,uid=dave,gid=dave //nas/temp /media/nas/temp
  • 有效的temp掛載文件夾權限:
$ ls -al /media/nas/
drwxr-xr-x 2 dave dave    0 Nov 30 10:14 temp/
  • libvirtd 以 root 身份執行:
$ ps aux | grep libvirt 
root         902  0.0  0.2 1559756 42420 ?       Ssl  Nov29   0:06 /usr/sbin/libvirtd
  • virt-manager(我使用的 libvirt 前端)以使用者dave權限執行:
  • 原版的,未改動的 QEMU 配置
  • 使用者dave已被添加到組中libvirt,並且如此kvm所述(作業系統為 Ubuntu 20.04):
sudo adduser `id -un` libvirt
sudo adduser `id -un` kvm
  • libvirt URI 是qemu:///system

問題

dave我可以temp直接從 shell 或 Files 應用程序寫入/讀取。共享所有者設置為uid=dave,gid=dave,即屬於kvm和的使用者libvirt使用本地 磁碟映像路徑執行 VM.qcow2沒有問題。在 virt-manager 中,我可以定義/media/nas/temp為儲存池(包含圖像的目錄)。

但是,只要我想在 中放置或創建此磁碟映像文件/media/nas/temp,就會觸發“權限被拒絕”錯誤。據我所知,虛擬機qemu:///system被實例化並以root. 這不應以任何方式影響已配置的網路共享所有者。我嘗試sudo su並檢查過,我能夠以/media/nas/temproot身份寫入。

另一種直接觸發錯誤的方法(從 virt-manager 輸出複制)是:

/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K

問題

我真的很想了解權限問題以及如何解決它。這裡有什麼問題?

詳細錯誤資訊

嘗試創建新的.qcow2磁碟映像觸發器:

創建卷時出錯:無法創建儲存卷’ubuntu20.04’:‘內部錯誤:子程序(/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas /temp/ubuntu20.04 20971520K)意外退出狀態1:qemu-img:/media/nas/temp/ubuntu20.04:無法寫入qcow2標頭:權限被拒絕’

回溯(最後一次呼叫):文件“/usr/share/virt-manager/virtinst/storage.py”,第 682 行,在 install vol = self.pool.createXML(xml, createflags) 文件“/usr/lib/ python3/dist-packages/libvirt.py",第 3535 行,如果 ret 為 None,則在 createXML 中:raise libvirtError(‘virStorageVolCreateXML() failed’, pool=self) libvirt.libvirtError: internal error: Child process (/usr/bin/ qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K) 意外退出狀態 1: qemu-img: /media/nas/temp/ubuntu20.04:無法寫入 qcow2 標頭:權限被拒絕

在處理上述異常的過程中,又出現了一個異常:

回溯(最後一次呼叫):文件“/usr/share/virt-manager/virtManager/asyncjob.py”,第 75 行,在 cb_wrapper 回調(asyncjob,*args,**kwargs)文件“/usr/share/virt -manager/virtManager/createvol.py",第 339 行,在 _async_vol_create vol.install(meter=meter) 文件 “/usr/share/virt-manager/virtinst/storage.py”,第 691 行,在安裝中引發 RuntimeError(“無法創建儲存卷” RuntimeError: 無法創建儲存卷 ‘ubuntu20.04’: ‘內部錯誤: 子程序 (/usr/bin/qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1, lazy_refcounts /media/nas/temp/ubuntu20.04 20971520K)意外退出狀態1:qemu-img:/media/nas/temp/ubuntu20.04:無法寫入qcow2標頭:權限被拒絕’

更新:我進一步嘗試過的

  • journalctl -xf通過(除了上面的消息)搜尋其他錯誤類型
  • cat /var/log/syslog | grep DENIED | grep libvirt通過(無)搜尋被拒絕的操作
  • 通過實驗禁用 AppArmor systemctl stop apparmor- 無效果
  • 在其他本地文件夾中成功創建圖像/var/lib/libvirt/images/

更新 2:使用nobrl掛載選項

如果我使用nobrl掛載選項(感謝 rudib)與所有者仍然uid=dave,gid=dave如下:

sudo mount -t cifs -o username=dave,vers=3.11,uid=dave,gid=dave,nobrl //nas/temp /media/nas/temp

,即可成功創建儲存卷(virt-manager 嚮導中的第 4/5 步)。儘管在步驟 5/5 中,我現在收到另一個“權限被拒絕”錯誤:

無法完成安裝:‘內部錯誤:qemu 意外關閉了監視器:2020-12-01T06:03:01.710704Z qemu-system-x86_64:-blockdev {“node-name”:“libvirt-2-format”,“re​​ad -only”:false,“driver”:“qcow2”,“file”:“libvirt-2-storage”,“backing”:null}:無法重新打開文件:權限被拒絕’

回溯(最後一次呼叫):文件“/usr/share/virt-manager/virtManager/asyncjob.py”,第 75 行,在 cb_wrapper 回調(asyncjob,*args,**kwargs)文件“/usr/share/virt -manager/virtManager/createvm.py”,第 2089 行,在 _do_async_install guest.installer_instance.start_install(guest,meter=meter) 文件“/usr/share/virt-manager/virtinst/install/installer.py”,第 542 行,在 start_install 域 = self._create_guest(文件“/usr/share/virt-manager/virtinst/install/installer.py”,第 491 行,在 _create_guest 域 = self.conn.createXML(install_xml 或 final_xml,0)文件“/ usr/lib/python3/dist-packages/libvirt.py",第 4034 行,如果 ret 為 None:raise libvirtError(‘virDomainCreateXML() failed’, conn=self) libvirt.libvirtError:內部錯誤:qemu 意外關閉監視器:2020-12-01T06:03:01.710704Z qemu-system-x86_64:-blockdev {“node-name”:“libvirt-2-format”,“re​​ad-only”:false,“driver”:“qcow2”,“file”:“libvirt- 2-storage”,“backing”:null}:無法重新打開文件:權限被拒絕

未指定uidgid導致以下權限:

$ ll /media/nas/
drwxr-xr-x 2 root  root     0 Dez  1 07:01 temp/

,錯誤和以前一樣。

**注意:**遠端掛載的活動卷可能會導致一些問題並增加延遲

qemu-img 似乎無法處理作為cifs. 該標誌nobrl應該解決這個問題:

mount -t cifs -o username=dave,vers=3.11,nobrl,uid=libvirt-qemu //nas/temp /media/nas/temp

在創建圖像期間qemu:///system uid=libvirt-qemu似乎不需要以rootvirt-manager身份執行。qemu-img create但是,由於qemu:///system機器是在 qemu 使用者下啟動的(libvirt-qemu

$$ Ubuntu, Debian $$或者qemu $$ Fedora $$),當共享剛剛以 root 身份掛載時,您將收到另一個權限被拒絕錯誤。

nobrl
Do not send byte range lock requests to the server. This is
necessary for certain applications that break with cifs style
mandatory byte range locks (and most cifs servers do not yet support
requesting advisory byte range locks).

使用時selinux,可能需要設置 sebool virt_use_samba

引用自:https://unix.stackexchange.com/questions/622194