私はカスタム OS に取り組んでおり、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
?
編集:私のコマンドは次のとおりです(私は R/W 権限を持っています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
出力なしで正常に実行されます。
OSはUbuntu 14.04 x64です。
答え1
これが私の簡単ではない解決策です:しないカーネル NBD ドライバーに接続しますqemu-nbd
。動作する場合でも、非常に脆弱な場合があります。この方法で、いくつかのプロセスを恐ろしい「中断不可能なスリープ」状態に閉じ込めることができました。(おそらくどこかで競合状態が発生しています。)
nbdfuse
代わりに、ネブキットプロジェクト。 を使用すると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
基本的にはルートですが。