如何在 SMB/CIFS 網路共享上使用 QEMU/KVM 虛擬機磁碟映像:權限被拒絕
環境
- 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/temp
root身份寫入。另一種直接觸發錯誤的方法(從 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”,“read -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”,“read-only”:false,“driver”:“qcow2”,“file”:“libvirt- 2-storage”,“backing”:null}:無法重新打開文件:權限被拒絕
未指定
uid
並gid
導致以下權限:$ 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
,可能需要設置 seboolvirt_use_samba
。