sudo なしの "qemu-nbd --create"

sudo なしの "qemu-nbd --create"

私はカスタム 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_ADMINnbd_ioctl())、たとえばバイナリに付与することによって:setcap 'cap_sys_admin=ep' qemu-nbd-CAP_SYS_ADMIN基本的にはルートですが。

関連情報