不使用 sudo 的“qemu-nbd --create”

不使用 sudo 的“qemu-nbd --create”

我正在開發一個自訂作業系統,make我為建立新磁碟映像編寫的配方需要sudo將虛擬 HDD 映像連接/斷開到裝置/dev/nbdN。因為我不想sudo在食譜中使用,所以我一直在使用sudo make disk

我以為我可以將自己添加到disk群組中(如圖stat /dev/nbd0所示,文件的 UID 是root,GID 是),這樣我就可以在沒有 的情況下disk附加和分離設備,但它仍然不起作用(是的,我已經註銷並且重新登錄,並在群組中顯示我)。/dev/nbdNsudoiddisk

我是否仍然必須rootioctl呼叫成功(如果我不這樣做,這似乎就是失敗的地方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基本上是根。

相關內容