2016年5月7日土曜日

virt-managerをroot以外の一般ユーザーで使う

virt-managerを一般ユーザーで使う
virt-manager(QEMU/KVM仮想マシン)はデフォルトで、QEMUハイパーバイザに「システム接続」しリソースへのアクセス権を取得する。rootで「システム接続」することが一般的だが、仮想サーバーとして使うわけでもないので、一般ユーザーで運用したい。 というわけで、virt-managerを一般ユーザーで運用する方法をまとめた。

一般ユーザーでのqemu-systemの権限エラー
virt-managerはデフォルトでは、一般ユーザーでイメージディスクの作成等ができない。一般ユーザーからゲストOSのインストールを行おうとすると、以下のようなPermission deniedのエラーが出る。
インストールを完了できません: '内部エラー: process exited while connecting to monitor: 2016-05-05T08:57:02.803493Z
qemu-system-x86_64: -drive file=/var/lib/libvirt/images/winxp.raw,format=raw,if=none,id=drive-ide0-0-0:
Could not open '/var/lib/libvirt/images/winxp.raw': Permission denied'


QEMU, libvirtのパーミッション設定
QEMU, libvirtのパーミッションの設定を変更することで、エラーが出なくなり、ゲストOSのインストールができるようになる。パーミッション関連の説明は、openSUSEのドキュメンテーション「openSUSE 13.1: 第6章 接続と権限」に詳しく記載されており、以下の設定については、
を参考にした。openSUSEのデフォルトの設定と、他のディストリビューションのデフォルトの設定の違いはあるので、その点には注意する。

QEMUの設定
一般ユーザーが「システム接続」できるように設定を変更する。

/etc/libvirt/qemu.confを、以下のように3行編集する。
# vim /etc/libvirt/qemu.conf

...
# The user for QEMU processes run by the system instance. It can be
# specified as a user name or as a user id. The qemu driver will try to
# parse this value first as a name and then, if the name doesn't exist,
# as a user id.
#
# Since a sequence of digits is a valid user name, a leading plus sign
# can be used to ensure that a user id will not be interpreted as a user
# name.
#
# Some examples of valid values are:
#
#       user = "qemu"   # A user named "qemu"
#       user = "+0"     # Super user (uid=0)
#       user = "100"    # A user named "100" or a user with uid=100
#
user = "ユーザー名" ←「ユーザー名」は普段使う一般ユーザーのユーザー名に変える。

# The group for QEMU processes run by the system instance. It can be
# specified in a similar way to user.
group="libvirt" ←グループをlibvirtに変える。

# Whether libvirt should dynamically change file ownership
# to match the configured user/group above. Defaults to 1.
# Set to 0 to disable file ownership changes.
dynamic_ownership = 1 ←コメントアウトを解除。
...

さらに、デバイスファイル/dev/kvmを利用できるように、kvmグループに一般ユーザーを追加する。「ユーザー名」は普段使う一般ユーザーのユーザー名に変える。libvirtグループへの追加は、次のlibvirtの設定とともに行う。
# gpasswd -a ユーザー名 kvm

ディスクイメージのファイルは、仮想マシンを起動していない時はrootが所有者となる。
$ ls -ld /var/lib/libvirt/images/winxp.raw 

-rw------- 1 root root 64424509440  5月  7 16:01 /var/lib/libvirt/images/winxp.raw

仮想マシンを起動すると、起動した一般ユーザー、libvirtグループが所有者となる。
$ ls -ld /var/lib/libvirt/images/winxp.raw 

-rw------- 1 ユーザー名 libvirt 64424509440  5月  7 16:01 /var/lib/libvirt/images/winxp.raw

libvirtの設定
デフォルトでlibvirtは、認証システムとしてPolicyKitを採用している。ここでは、PolicyKitによる認証を使わず、ファイルのパーミッションベースで管理する方法を採る。

まず、libvirt グループのユーザーが仮想マシンを管理できるように、ファイルベースのパーミッションを定義する。/etc/libvirt/libvirtd.confの以下の行のコメントアウトを解除する。auth_unix_ro = "none"でソケットの読み込み時、auth_unix_rw = "none"でソケットの読み書き時の認証を行わないようにしている。
# vim /etc/libvirt/libvirtd.conf

...
unix_sock_group = "libvirt"
...
unix_sock_ro_perms = "0777"  # set to 0770 to deny non-group libvirt users
...
unix_sock_rw_perms = "0770"
...
auth_unix_ro = "none"
...
auth_unix_rw = "none"
...

次に、一般ユーザーとして使用しているユーザーを、libvirtグループに追加する。「ユーザー名」は普段使う一般ユーザーのユーザー名に変える。
# gpasswd -a ユーザー名 libvirt

libvirtdデーモンを起動する。
# systemctl start libvirtd.service
# systemctl enable libvirtd.service

設定を反映させるため、PCの再起動を行う。

一般ユーザーのホームディレクトリにイメージディスクを保存する
/var/lib/libvirt/images以外の保存先で、権限のエラー
/var/lib/libvirt/images以外のディレクトリに、イメージディスクのファイルを保存すると、以下のようなエラーが出る。例えば、ホームディレクトリに保存先を作った場合:
エミュレーターはパス'/home/ユーザー名/ディレクトリ名/winxp.raw'を検索する権限を持っていません。
今すぐこれを訂正しますか。


The emulator may not have search permissions for the path '/home/ユーザー名/ディレクトリ名/winxp.raw'.
Do you want to correct this now?


libvirtのデフォルトのイメージディスクの保存先は、/var/lib/libvirt/imagesになっている。SELinuxを有効にしていると、/var/lib/libvirt/images以外のディレクトリへのイメージーファイルの保存が禁止される。このような経緯から、/var/lib/libvirt/imagesが保存先として推奨されていると思われる。

イメージの保存先を一般ユーザーのホームディレクトリに変更する
現在使用している環境では、SELinuxは使用していないが、念の為/var/lib/libvirt/imagesが保存先となるようにした。ただし、rootディレクトリの容量を確保していないため、ホームディレクトリにディスクイメージの保存先(/home/ユーザー名/VirtManagerImages)を作り、/var/lib/libvirt/imagesにシンボリックリンクをはることにした。
# mv /var/lib/libvirt/images /home/ユーザー名/VirtManagerImages
# ln -s /home/ユーザー名/VirtManagerImages /var/lib/libvirt/images

セキュリティ的には良くないのかもしれないが、これで運用する。


参考:
[1]openSUSE 13.1: KVM を利用した仮想化
[2]How to use virt-manager as a non-root user? - Ask Fedora: Community Knowledge Base and Support Forum
[3]6.2. virt-manager を使用してゲストを作成 - Red Hat Customer Portal
[4]Storing virtual disk images in a customized location - IBM Knowledge Center

スポンサーリンク

スポンサーリンク

0 件のコメント:

コメントを投稿