web-dev-qa-db-ja.com

root以外のユーザーのXenlibvirtアクセス

XenとlibvirtをCentOS6.6マシンにインストールしました。すべてのツール(virt-manager、virshなど)はrootとして(直接またはSudo経由で)完全に機能しますが、別のユーザーに接続を許可できません(接続に失敗しました/ DBusエラー)。

私の構成

グループを作成し、polkitを介してこれを許可することにより、ユーザーアクセスを許可する手順に従ったので、次のようにしました。

groupadd virtadmin
usermod -a -G virtadmin davec

また、KVMグループ(どこかに提案があります)に自分自身を追加しました。グループが作成され、id出力としてその中にいます:

uid=500(davec) gid=500(davec) groups=500(davec),36(kvm),501(virtadmin)

Polkitでこれを許可するために、ファイル/etc/polkit-1/localauthority/50-local.d/50-libvert-remote-access.pklacontentを追加しました。

Remote libvirt SSH access]
Identity:unix-group:virtadmin
Action:org.libvirt.unix.manage
ResultAny=yes
ResultInactive=yes
ResultActive=yes

これが機能しなかった後、いくつかのグーグルで、新しいpolkitバージョン(0.96があると言われています)はルールベースのアプローチを使用していると言われたので、/ etc/polkit-1/rules.dフォルダーも作成して、ファイルを追加しました80-libvirt-manage.rulesには以下が含まれます:

polkit.addRule(function(action, subject) {
  if (action.id == "org.libvirt.unix.manage" && 
  subject.local && 
  subject.active && 
  subject.isInGroup("virtadmin")) {
      return polkit.Result.YES;
  }
});

これらに問題がある可能性がありますが、ログが見つからないか、テスト/検証/監視しているように見えます。

したがって、私が見つけたドキュメントによると、そのセットアップで、ユーザーdavecはlibvirtにアクセスし、virshまたはvirt-managerを実行できるはずです。

エラー

[davec@polar rules.d]$ virsh -c xen:///
error: failed to connect to the hypervisor
error: internal error: DBus support not compiled into this binary

これは、virt-managerが接続しようとしたときに表示されるエラーとまったく同じです。

DBusエラーに関するオンライン情報のほとんどは、ハイパーバイザーの実行中/接続中の誰かの問題を示していますが、ルートは完全に接続しています。

[davec@polar rules.d]$ Sudo virsh -c xen:///
Welcome to virsh, the virtualization interactive terminal.

まったく同じことがSSH接続にも当てはまります(SSHはxen + ssh URIを使用するときにトンネルするだけなので驚くことではありません)、rootはroot以外で機能しますが、グループが追加されたユーザーは機能しません。

間違いなくそれは単純なことで、私はばかですが...グーグルが私の友達ではない数日後。どんな助けでも本当に感謝します。

答え

賞金を獲得するc4f4t0rの正しい(そして受け入れられた)答えについては以下を参照してくださいが、これを読んでいる人の情報については、polkitとは何の関係もありません構成/コンパイルされていないようです/私のlibvirtdでの作業。

組み込みのアクセス許可(ソケットアクセス許可)の問題でした。

3
Dave C

私はあなたがこのようにできると思います:

/etc/libvirt/libvirtd.conf

unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
auth_unix_rw = "none"

その後、libvirtdデーモンを再起動します

2
c4f4t0r

これは私のために働いた:

unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
unix_sock_dir = "/var/run/libvirt"
auth_unix_rw = "none"
0
suresh