libvirt

提供: ArchWiki
2015年8月31日 (月) 18:16時点におけるKusakata (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

関連記事

libvirt: The virtualization API より:

Libvirt は仮想マシンや、ストレージ・ネットワークインターフェイスの管理などの仮想化機能を管理するための便利な手段を提供するソフトウェアのコレクションです。ソフトウェアには API ライブラリ、デーモン (libvirtd)、コマンドラインユーティリティ (virsh) が含まれています。
libvirt の目標は様々な仮想化プロバイダ/ハイパーバイザーを管理する共通の手段を提供することにあります。
libvirt の主な特徴は以下の通りです:
  • VM 管理: 起動・停止・一時停止・保存・復旧・移行などの様々なドメイン操作。ディスク・ネットワークインターフェイス・メモリ・CPU など多数のデバイスのホットプラグ制御。
  • リモートマシンのサポート: libvirt デーモンが走ってるマシンなら libvirt の機能は全て使うことができます。リモートマシンも例外ではありません。リモートで接続するための様々なネットワーク転送をサポートしています。一番シンプルなのは SSH で、細かい設定を必要としません。
  • ストレージ管理: libvirt デーモンを動かしているホストを使って様々なタイプのストレージを管理できます: 様々なフォーマットのファイルイメージを作成 (qcow2, vmdk, raw, ...)、NFS 共有のマウント、既存の LVM ボリュームグループの列挙、新しい LVM ボリュームグループや論理ボリュームの作成、ディスクデバイスのパーティション、iSCSI 共有のマウントなど。
  • ネットワークインターフェイス管理: libvirt デーモンを動かしているホストを使って物理・論理ネットワークインターフェイスを管理できます。既存のインターフェイスを列挙するだけでなく、インターフェイス・ブリッジ・仮想 LAN・ボンドデバイスを設定 (作成) できます。
  • 仮想 NAT とルートベースネットワーク: libvirt デーモンを動かしているホストを使って仮想ネットワークを管理・作成できます。Libvirt の仮想ネットワークはファイアウォールのルールを使うことでルーターとして動作し、VM からホストマシンのネットワークに透過的にアクセスすることを可能にします。

libvirt には KVM/QEMU, Xen, LXC, OpenVZ, VirtualBox などの仮想化バックエンドを、リモート・ローカルを問わず管理するために、統一の抽象化レイヤーが備わっています (その他)。

長期的に安定した C の API を用意することで、様々なツールlibvirtd デーモンに接続して多数の仮想化エンジンを管理することが可能です。libvirt デフォルトのクライアントは virsh と呼ばれています。

インストール

デーモン・クライアントアーキテクチャをとっているため、libvirt をインストールする必要があるのは仮想化システムをホストするマシンだけです。サーバーとクライアントは同じ物理マシンにすることができます。

サーバー

libvirt パッケージと、どれか一つハイパーバイザーをインストールしてください:

  • 2015年2月1日現在、libvirtd を起動するには qemu をインストールする必要があります (FS#41888 を参照)。libvirt KVM/QEMU ドライバー は基本の libvirt ドライバーなので KVM が有効になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは QEMU の記事を見て下さい。
  • 他にも仮想化バックエンドとして LXC, VirtualBox, Xen などが存在します。インストール方法はそれぞれのページを参照してください。
ノート: libvirt LXC ドライバーlxc に含まれている LXC のユーザースペースツールに依存していません。そのため、このドライバーを使う場合はパッケージをインストールする必要はありません。
警告: Xen のサポートはデフォルトでは利用できない状態になっています。ABS を使って libvirtPKGBUILD を修正して --without-xen オプションを外してビルドする必要があります。

他にサポートされているハイパーバイザーは こちら に記載されています。

ネットワークに接続するために、以下をインストールしてください:

クライアント

クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。

  • virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
  • virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
  • virtviewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
  • gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。

libvirt に対応しているソフトウェアのリストは こちら にあります。

設定

システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。

ノート: ユーザーセッションの管理をする場合、デーモンの設定は必要ありません。ただし、認証はローカルに限定され、フロントエンドは libvirtd デーモンのローカルインスタンスを起動します。

認証を設定

libvirt: Connection authentication より:

libvirt デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである /etc/libvirt/libvirtd.conf で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところ none, polkit, sasl の中から選べます。

libvirt は依存パッケージとして polkit をインストールするので、unix_sock_auth パラメータのデフォルト値としては polkit が使われます (ソース)。また、ファイルベースのパーミッションを使うこともできます。

polkit を使う

libvirt デーモンは /usr/share/polkit-1/actions/org.libvirt.unix.policy で2つの polkit アクションを提供します:

  • 完全なアクセス管理のための org.libvirt.unix.manage (RW デーモンソケット)
  • アクセスの監視のための org.libvirt.unix.monitor (読み取り専用ソケット).

RW デーモンソケットのデフォルトポリシーを使うには管理者として認証する必要があります。sudo 認証と似ていますが、クライアントアプリケーションを root で動かす必要があるというわけではありません。また、デフォルトポリシーではどんなアプリケーションでも RO ソケットに接続することはできます。

Arch では wheel グループのユーザーを管理者として認識します: これは /etc/polkit-1/rules.d/50-default.rules で定義されています (Polkit#管理者の識別 を参照)。そのためユーザーを wheel グループに追加さえすれば、新しいグループやルールファイルを作成する必要はありません。(virt-manager などで) RW ソケットに接続する時にユーザーのパスワードを入力するように求められます。

ノート: パスワードの入力を要求するときは認証エージェントを使用します。コンソールを使っている場合、デフォルトの pkttyagent エージェントが上手く動作しないことがあります。
ヒント: 認証でパスワードを入力しなくてもよいように設定したい場合、Polkit#パスワードプロンプトの迂回 を見て下さい。

RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:

/etc/polkit-1/rules.d/49-org.libvirt.unix.manager.rules
/* Allow users in kvm group to manage the libvirt
daemon without authentication */
polkit.addRule(function(action, subject) {
    if (action.id == "org.libvirt.unix.manage" &&
        subject.isInGroup("kvm")) {
            return polkit.Result.YES;
    }
});

そしてユーザーkvm グループに追加して再ログインしてください。kvm は好きなグループに置き換えることができます (例: libvirt)、グループが存在することと、ユーザーがグループに属していることを確認してください (詳しくはユーザーとグループを参照)。グループの変更を適用するには再ログインが必要です。

ファイルベースのパーミッションで認証

libvirt グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:

/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"

ガイドによっては libvird の特定のディレクトリのパーミッションを変更すると管理がしやすくなると書かれていることがありますが、パッケージをアップデートする際に変更したパーミッションは元に戻ってしまうので注意してください。システムディレクトリを編集するときは、root ユーザーを使うようにしてください。

デーモンを起動

systemd を使って libvirtd.service を起動・有効化してください。

TCP/IP ソケットの暗号化の解除

警告: この設定をすると、信頼されたネットワーク内における、リモートドメインの接続速度が向上します。セキュリティ的には完全な無防備なので注意してください。テスト目的であったり、セキュアでプライベート、信頼されたネットワークでおいてのみ使って下さい。SASL を有効にしないため、全ての TCP 通信はクリアテキストになります。通常はどんなときでも SASL を有効にするようにしてください。

/etc/libvirt/libvirtd.conf を編集:

/etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
auth_tcp=none

また、/etc/conf.d/libvirtd を編集してサーバーをリスニングモードで起動する必要があります:

/etc/conf.d/libvirtd
LIBVIRTD_ARGS="--listen"

テスト

システムレベルでデーモンが正しく動作しているかテスト:

$ virsh -c qemu:///system

ユーザーセッションで libvirt が正しく動作するかテスト:

$ virsh -c qemu:///session

管理

Libvirt の管理は3つのツールで行うことができます: 一つは GUI virt-manager で、二つはコマンドラインツールです: virshguestfish (libguestfsAUR に含まれています)。

virsh

virsh はゲストドメイン (仮想マシン) の管理のためのプログラムですが、仮想化管理のスクリプトにも使えます。ほとんどの virsh コマンドは実行するのに root 権限を必要とします。ただしドメインの作成や実行などは (VirtualBox と同じように) 通常ユーザーで実行することができます。

Virsh にはインタラクティブなターミナルが含まれており、コマンドを何も指定しないで実行したときに起動します (オプションは指定することができます): virsh。インタラクティブターミナルはタブ補完をサポートしています。

コマンドラインから:

$ virsh [option] <command> [argument]...

インタラクティブターミナルから:

virsh # <command> [argument]...

ヘルプを見るには:

$ virsh help [option*] or [group-keyword*]

ストレージプール

プールはストレージボリュームを保存しておく場所です。libvirt におけるボリュームは、他のハイパーバイザーでは"仮想ディスク"または"仮想マシンイメージ"と定義されていることがあります。プールの場所はディレクトリでも、ネットワークファイルシステムでも、パーティションでもかまいません (LVM を含む)。プールは有効・無効を切り替えたり領域を予約することができます。

システムレベルでは、デフォルトで /var/lib/libvirt/images/ が有効になります。ユーザーセッションでは virt-manager$HOME/VirtualMachines を作成します。

有効または無効なストレージプールを確認:

$ virsh pool-list --all

virsh を使って新しいプールを作成

ストレージプールを追加したい場合、以下がコマンド形式、ディレクトリの追加、LVM ボリュームの追加の例です:

$ virsh pool-define-as name type [source-host] [source-path] [source-dev] [source-name] [<target>] [--source-format format]
$ virsh pool-define-as poolname dir - - - - /home/username/.local/libvirt/images
$ virsh pool-define-as poolname fs - -  /dev/vg0/images - mntpoint

上記のコマンドはプールの情報を定義します。ビルドするには:

$ virsh pool-build     poolname
$ virsh pool-start     poolname
$ virsh pool-autostart poolname

削除するには:

$ virsh pool-undefine  poolname
ヒント: LVM ストレージプールの場合:
  • ボリュームグループはストレージプール専用にするほうが良いでしょう。
  • LVM ボリュームグループの名前はプールの名前と変えて下さい。ストレージプールを削除したときに LVM グループも削除されてしまいます。

virt-manager を使って新しいプールを作成

まず、既存のサーバーに接続してください。そこで、右クリックして Details を選んで下さい。Storage に行き左下の + アイコンを押して下さい。それからはウィザードに従って下さい。

ストレージボリューム

プールを作成したら、プールの中にボリュームを作成することができます。新しいドメイン (仮想マシン) を作成する場合、ドメインの作成時にボリュームを作成できるのでこの手順はスキップできます。

virsh を使って新しいボリュームを作成

ボリュームの作成、確認、リサイズ、削除:

$ virsh vol-create-as      poolname volumename 10GiB
$ virsh vol-list           poolname
$ virsh vol-resize  --pool poolname volumename 12GiB
$ virsh vol-delete  --pool poolname volumename
$ virsh vol-dumpxml --pool poolname volumename  # for details.

virt-manager の補助記憶

新しいバージョンの virt-manager では新しいディスクを作成するときに補助記憶を指定することができます。新しい仮想システムをプロビジョニングする場合にベースイメージを基にして新しいドメインを作ることができるため、時間と容量の両方を節約できてとても便利です。ただし現在のバージョンの virt-manager にはバグ (https://bugzilla.redhat.com/show_bug.cgi?id=1235406) が存在し、補助イメージが qcow2 タイプの場合に virt-manager が間違ったタイプの補助イメージを選択してしまいます。この場合、補助タイプとして raw が選択されます。補助記憶から新しいイメージが読み取れなくなり、補助記憶を用意する意味が完全に失われます。

この問題の回避策として qemu-img を使うことで直接補助記憶を指定することができます。バグが修正されるまでは、補助記憶を使いたい場合、以下のコマンドを使って下さい:

$ qemu-img create -f qcow2 -o backing_file=<path to backing image>,backing_fmt=qcow2 <disk name> <disk size>

作成したイメージを新しいドメインのベースとすることで COW ボリュームとして補助記憶が使用され時間と容量が節約されます。

ドメイン

libvirt では仮想マシンはドメインと呼ばれます。コマンドラインから使う場合、virsh でドメインを確認・作成・停止・シャットダウンできます。virt-viewer を使って virsh で起動したドメインを確認することも可能です。ドメインの作成は virt-manager でグラフィカルに行うか virt-install (virt-manager パッケージに含まれているコマンドラインプログラム) を使います。

新しいドメインを作成するときは、インストールメディアを使用します。ドメインの作成後にロードします。ストレージプールから .iso を参照したり、光学ドライブを参照することができます。

有効または無効なドメインを確認:

# virsh list --all
ノート: SELinux はデフォルトで /var/lib/libvirt/images/ にボリュームが保存されることを必要とします。SELinux を使っていてボリュームに問題が起こる場合、ボリュームがそのディレクトリにあるか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。

virt-install を使って新しいドメインを作成

ドメイン (仮想マシン) を細かく設定したい場合、virt-manager を使って新しいドメインを作成する方が簡単です。しかしながら、基本的な設定は virt-install で行うことができます。最低でも指定する必要があるのは --name, --memory, ゲストストレージ (--disk, --filesystem または --nodisks), インストール方法 (.iso または CD) です。

Arch Linux のインストール (2GiB, raw フォーマットのボリューム作成; ユーザーネットワーク):

$ virt-install  \
  --name arch-linux_testing \
  --memory 1024             \ 
  --vcpus=2,maxvcpus=4      \
  --cpu host                \
  --cdrom $HOME/Downloads/arch-linux_install.iso \
  --disk size=2,format=raw  \
  --network user            \
  --virt-type kvm

Fedora testing (Xen ハイパーバイザー, 非デフォルトのプール, オリジナルの表示を使わない):

$ virt-install  \
  --connect xen:///     \
  --name fedora-testing \
  --memory 2048         \
  --vcpus=2             \
  --cpu=host            \
  --cdrom /tmp/fedora20_x84-64.iso      \
  --os-type=linux --os-variant=fedora20 \
  --disk pool=testing,size=4            \
  --network bridge=br0                  \
  --graphics=vnc                        \
  --noautoconsole
$ virt-viewer --connect xen:/// fedora-testing

Windows:

$ virt-install \
  --name=windows7           \
  --memory 2048             \
  --cdrom /dev/sr0          \
  --os-variant=win7         \
  --disk /mnt/storage/domains/windows7.qcow2,size=20GiB \
  --network network=vm-net  \
  --graphics spice
ヒント: --os-variant の引数を取得するには osinfo-query --fields=name,version os を実行してください。ドメインの仕様を定義するのに役立ちます。ただし、--memory--disk を入力する必要があります。仕様が必要な場合は適当な /usr/share/libosinfo/db/oses/os.xml を見て下さい。インストール後、VirtIO ドライバー が含まれている Spice Guest Tools をインストールすると良いでしょう。Windows の VirtIO ネットワークドライバーは virtio-winAUR にもあります。ドライバーはゲストの .xml 設定のデバイスセクションに <model type='virtio' /> で指定します。詳細は QEMU の記事を読んで下さい。

既存のボリュームをインポート:

$ virt-install  \
  --name demo  \
  --memory 512 \
  --disk /home/user/VMs/mydisk.img \
  --import

virt-manager を使って新しいドメインを作成

まずハイパーバイザーに接続します (例: QEMU/KVM システムまたはユーザーセッション)。接続を右クリックして New を選択して、ウィザードに従って下さい。

  • ステップ4 で、Allocate entire disk now のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に注意してください、VM にディスク容量を追加で割り当てるほうが簡単だからです。
  • ステップ5 では、Advanced options を開いて Virt Typekvm に設定してください。追加のハードウェア設定が必要な場合、Customize configuration before install オプションを選んで下さい。

ドメインの管理

ドメインを起動:

$ virsh start domain
$ virt-viewer --connect qemu:///session domain

ドメインを上品にシャットダウン、または強制的にオフにする:

$ virsh shutdown domain
$ virsh destroy  domain

libvirtd の起動時にドメインを自動実行:

$ virsh autostart domain
$ virsh autostart domain --disable

ホストのシャットダウン時にドメインもシャットダウン:

libvirt-guests.service systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。サービスのオプションは /etc/conf.d/libvirt-guests をチェックしてください。

ドメインの設定を編集:

$ virsh edit domain
ノート: QEMU によって直接起動した仮想マシンは libvirt ツールで管理できません。

ネットワーク

デフォルトでは、libvird systemd サービスが起動すると、default という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。

他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:

  • bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで固定ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインをシステムレベルで動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法はネットワークブリッジを参照。作成後、ゲストの .xml 設定ファイルで指定する必要があります。
  • network — 仮想ネットワーク。他のドメインと共有することができます。ホストが動的ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
  • macvtap — ホストの物理インターフェイスに直接接続。
  • user — ローカルのネットワーク。ユーザーセッションの場合に使って下さい。

virsh にはネットワークを作成するための様々なオプションが存在していますが、(virt-manager などの) グラフィカルユーザーインターフェイスを使ったり virt-install でドメインを作成するときにネットワーク接続を作成する方が簡単です。

ノート: libvirt は dnsmasq で DHCP や DNS を管理し、仮想ネットワークごとにインスタンスを起動します。また、適切なルーティングが行われるように iptables ルールを追加して、ip_forward カーネルパラメータを有効にします。

スナップショット

スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。OS の"クリーン"なコピーを保存することから、ドメインが破壊される前にドメインの状態を保存することまで、様々な理由で使われます。スナップショットは一意な名前で識別されます。

スナップショットはボリュームの中に保存されるためボリュームが次の形式である必要があります: qcow2 または raw。スナップショットは差分を使用するので大量の容量を使用することはありません。

スナップショットの作成

スナップショットが取得されると新しいブロックデバイスとして保存されオリジナルのスナップショットはオフラインになります。スナップショットは他のスナップショットから選択したりマージすることができます (ドメインをシャットダウンする必要はありません)。

動作中のドメインのボリュームを確認 (動作中のドメインは virsh list で確認できます):

# virsh domblklist domain
 Target     Source
 ------------------------------------------------
 vda        /vms/domain.img

ボリュームの物理プロパティを確認するには:

# qemu-img info /vms/domain.img
 image: /vms/domain.img
 file format: qcow2
 virtual size: 50G (53687091200 bytes)
 disk size: 2.1G
 cluster_size: 65536

disk-only スナップショットを作成 (--atomic オプションはスナップショットの作成が失敗した場合にボリュームに変更が加わっていないことを確認します):

# virsh snapshot-create-as domain snapshot1 --disk-only --atomic

スナップショットを確認:

# virsh snapshot-list domain
 Name                 Creation Time             State
 ------------------------------------------------------------
 snapshot1           2012-10-21 17:12:57 -0700 disk-snapshot

cp -sparse=truersync -S を使ってオリジナルのイメージをコピーしてオリジナルのイメージをスナップショットにマージできます:

# virsh blockpull --domain domain --path /vms/domain.snapshot1

domain.snapshot1 が新しいボリュームになります。マージが完了したらオリジナルのボリューム (domain.img とスナップショットのメタデータは削除できます。virsh blockcommitblockpull と反対の動作をするようになる予定ですが現在開発中です (snapshot-revert 機能を含む、来年リリース予定)。

他の管理

非デフォルトのハイパーバイザーに接続:

$ virsh --connect xen:///
virsh # uri
xen:///

SSH で QEMU ハイパーバイザーに接続してログイン:

$ virsh --connect qemu+ssh://username@host/system
$ LIBVIRT_DEBUG=1 virsh --connect qemu+ssh://username@host/system

SSH でグラフィカルコンソールに接続:

$ virt-viewer  --connect qemu+ssh://username@host/system domain
$ virt-manager --connect qemu+ssh://username@host/system domain
ノート: (Arch 以外の) RHEL リモートサーバーに接続するときに問題が発生する場合、FS#30748FS#22068 に書かれている方法を試してみて下さい。

VirtualBox ハイパーバイザーに接続 (libvirt における VirtualBox のサポートはまだ安定していないため libvirtd がクラッシュする可能性があります):

$ virsh --connect vbox:///system

ネットワークの設定:

$ virsh -c qemu:///system net-list --all
$ virsh -c qemu:///system net-dumpxml default

Python 接続コード

libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.pypython2 API が提供されます。

一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/ にあります。

qemuopenssh を使う非公式のサンプル:

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import sys
import libvirt
if (__name__ == "__main__"):
   conn = libvirt.open("qemu+ssh://xxx/system")
   print "Trying to find node on xxx"
   domains = conn.listDomainsID()
   for domainID in domains:
       domConnect = conn.lookupByID(domainID)
       if domConnect.name() == 'xxx-node':
           print "Found shared node on xxx with ID " + str(domainID)
           domServ = domConnect
           break

参照