我正在開發一個自訂作業系統,make
我為建立新磁碟映像編寫的配方需要sudo
將虛擬 HDD 映像連接/斷開到裝置/dev/nbdN
。因為我不想sudo
在食譜中使用,所以我一直在使用sudo make disk
。
我以為我可以將自己添加到disk
群組中(如圖stat /dev/nbd0
所示,文件的 UID 是root
,GID 是),這樣我就可以在沒有 的情況下disk
附加和分離設備,但它仍然不起作用(是的,我已經註銷並且重新登錄,並在群組中顯示我)。/dev/nbdN
sudo
id
disk
我是否仍然必須root
讓ioctl
呼叫成功(如果我不這樣做,這似乎就是失敗的地方root
)?或者qemu-nbd
我需要做其他一些特定的事情來避免使用root
?
編輯:我的命令是這樣的(我有讀取/寫入權限hda.qcow2
):
$ qemu-nbd -c /dev/nbd0 hda.qcow2
輸出是這樣的:
/build/buildd/qemu-2.0.0+dfsg/nbd.c:nbd_init():L504: Failed to set NBD socket
/build/buildd/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed
運行相同的命令可以sudo
成功執行,但沒有輸出。
作業系統是 Ubuntu 14.04 x64。
答案1
這是我的非直接解決方案:不連接qemu-nbd
到內核 NBD 驅動程式。即使它有效,它也可能非常脆弱:我設法以這種方式將幾個進程陷入可怕的「不間斷睡眠」狀態。 (可能是某個地方的競爭條件。)
相反,使用nbdfuse
來自NBD套件專案.使用nbdfuse
,您可以透過您選擇的目錄下的虛擬檔案節點提供影像的內容。使用方法如下:
mkdir ~/tmp
nbdfuse ~/tmp/image --socket-activation qemu-nbd hda.qcow2 &
該圖像現在可在 處取得~/tmp/image
。如果要存取特定分區,可以透過以下方式過濾 NBD 連線來實現nbdkit
:
mkdir ~/tmp
qemu-nbd --socket="$PWD/qemu-img.sock" hda.qcow2 &
nbdfuse ~/tmp/part1 --command \
nbdkit -s nbd socket=qemu-nbd.sock \
--filter=partition partition=1 &
這使得分區在 處可用~/tmp/part1
。
完成影像處理後,請fusermount -u
在目錄上使用。
答案2
你需要CAP_SYS_ADMIN
(參見nbd_ioctl()),例如將其授予二進位檔案:setcap 'cap_sys_admin=ep' qemu-nbd
- 雖然CAP_SYS_ADMIN
基本上是根。