libvirt
Libvirt は、仮想マシンや、ストレージやネットワークインターフェイスの管理などの他の仮想化機能を管理する便利な方法を提供するソフトウェアのコレクションです。これらのソフトウェアには、長期的に安定した C API、デーモン (libvirtd)、およびコマンドラインユーティリティ (virsh) が含まれます。libvirt の主な目標は、KVM/QEMU, Xen, LXC, OpenVZ, VirtualBox ハイパーバイザーなど、複数の異なる仮想化プロバイダー/ハイパーバイザーを管理する単一の方法を提供することです。
- libvirt の主な特徴は以下の通りです:
- VM 管理: 起動・停止・一時停止・保存・復旧・移行などの様々なドメイン操作。ディスク・ネットワークインターフェイス・メモリ・CPU など多数のデバイスのホットプラグ制御。
- リモートマシンのサポート: libvirt デーモンが走ってるマシンなら libvirt の機能は全て使うことができます。リモートマシンも例外ではありません。リモートで接続するための様々なネットワーク転送をサポートしています。一番シンプルなのは SSH で、細かい設定を必要としません。
- ストレージ管理: libvirt デーモンを動かしているホストを使って様々なタイプのストレージを管理できます: 様々なフォーマットのファイルイメージを作成 (qcow2, vmdk, raw, ...)、NFS 共有のマウント、既存の LVM ボリュームグループの列挙、新しい LVM ボリュームグループや論理ボリュームの作成、ディスクデバイスのパーティション、iSCSI 共有のマウントなど。
- ネットワークインターフェイス管理: libvirt デーモンを動かしているホストを使って物理・論理ネットワークインターフェイスを管理できます。既存のインターフェイスを列挙するだけでなく、インターフェイス・ブリッジ・仮想 LAN・ボンドデバイスを設定 (作成) できます。
- 仮想 NAT とルートベースネットワーク: libvirt デーモンを動かしているホストを使って仮想ネットワークを管理・作成できます。Libvirt の仮想ネットワークはファイアウォールのルールを使うことでルーターとして動作し、VM からホストマシンのネットワークに透過的にアクセスすることを可能にします。
目次
インストール
デーモン・クライアントアーキテクチャをとっているため、libvirt をインストールする必要があるのは仮想化システムをホストするマシンだけです。サーバーとクライアントは同じ物理マシンにすることができます。
サーバー
libvirt パッケージと、どれか一つハイパーバイザをインストールしてください:
- libvirt KVM/QEMU ドライバー は基本の libvirt ドライバーなので KVM が有効になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは QEMU の記事を見て下さい。
- 他にも仮想化バックエンドとして LXC, VirtualBox, Xen などが存在します。インストール方法はそれぞれのページを参照してください。
他にサポートされているハイパーバイザは こちら に記載されています。
ネットワークに接続するために、以下をインストールしてください:
- デフォルト の NAT/DHCP ネットワークの場合 ebtables と dnsmasq。
- ブリッジネットワークの場合 bridge-utils。
- SSH によるネットワーク管理の場合 openbsd-netcat。
クライアント
クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。
- virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
- virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
- virt-viewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
- gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
- virt-manager-qt5AUR[リンク切れ: パッケージが存在しません] は virt-manager の Qt 版です。
- libvirt-sandboxAUR はアプリケーションのサンドボックスツールキットです。
libvirt に対応しているソフトウェアのリストは こちら にあります。
設定
システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。
認証を設定
libvirt: Connection authentication より:
- libvirt デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである
/etc/libvirt/libvirtd.conf
で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところnone
,polkit
,sasl
の中から選べます。
libvirt は依存パッケージとして polkit をインストールするので、unix_sock_auth
パラメータのデフォルト値としては polkit が使われます (ソース)。また、ファイルベースのパーミッションを使うこともできます。
libvirt グループの使用
ユーザーが libvirt デーモンにアクセスできるようにする最も簡単な方法は、メンバーを libvirt
ユーザーグループ に追加することです。
libvirt
グループのメンバーは、デフォルトで RW デーモンソケットにパスワードなしでアクセスできます。
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 ソケットに接続する時にユーザーのパスワードを入力するように求められます。
libvirt 1.2.16 から libvirt
グループのメンバーはデフォルトで RW デーモンソケットにパスワードを入力しなくてもアクセスすることができます [1]。libvirt グループを作成してユーザーをグループに追加するのが一番簡単です。RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:
/etc/polkit-1/rules.d/50-libvirt.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 グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:
/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
と virtlogd.service
を起動してください。任意で libvirtd.service
を有効化してください。libvirtd.service
が有効化された場合、virtlogd.socket
と virtlockd.socket
も有効化されるため、virtlogd.service
を有効化する必要はありません。
TCP/IP ソケットの暗号化の解除
/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"
ホストネームを使って仮想マシンにアクセス
ブリッジネットワークを使ってホストからゲストにアクセスするには、libvirt に含まれている libvirt
NSS モジュールを有効にしてください。
/etc/nsswitch.conf
を編集:
/etc/nsswitch.conf
hosts: files libvirt dns myhostname
テスト
システムレベルでデーモンが正しく動作しているかテスト:
$ virsh -c qemu:///system
ユーザーセッションで libvirt が正しく動作するかテスト:
$ virsh -c qemu:///session
管理
Libvirt の管理は3つのツールで行うことができます: 一つは GUI virt-manager
で、二つはコマンドラインツールです: virsh
と guestfish
(libguestfs に含まれています)。
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
virt-manager を使って新しいプールを作成
まず、既存のサーバーに接続してください。そこで、右クリックして Details を選んで下さい。Storage に行き左下の + アイコンを押して下さい。それからはウィザードに従って下さい。
ストレージボリューム
プールを作成したら、プールの中にボリュームを作成することができます。新しいドメイン (仮想マシン) を作成する場合、ドメインの作成時にボリュームを作成できるのでこの手順はスキップできます。
virsh を使って新しいボリュームを作成
ボリュームの作成、確認、リサイズ、削除:
$ virsh vol-create-as poolname volumename 10GiB --format aw|bochs|raw|qcow|qcow2|vmdk $ virsh vol-upload --pool poolname volumename volumepath $ 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
ドメイン
libvirt では仮想マシンはドメインと呼ばれます。コマンドラインから使う場合、virsh
でドメインを確認・作成・停止・シャットダウンできます。virt-viewer
を使って virsh
で起動したドメインを確認することも可能です。ドメインの作成は virt-manager
でグラフィカルに行うか virt-install
(virt-install パッケージに含まれているコマンドラインプログラム) を使います。
新しいドメインを作成するときは、インストールメディアを使用します。ドメインの作成後にロードします。ストレージプールから .iso
を参照したり、光学ドライブを参照することができます。
有効または無効なドメインを確認:
# virsh list --all
virt-install を使って新しいドメインを作成
ドメイン (仮想マシン) を細かく設定したい場合、virt-manager を使って新しいドメインを作成する方が簡単です。しかしながら、基本的な設定は virt-install
で行うことができます。最低でも指定する必要があるのは --name
, --memory
, ゲストストレージ (--disk
, --filesystem
または --nodisks
), インストール方法 (.iso
または CD) です。オプションについて詳しくは virt-install(1) を見てください。
Arch Linux のインストール (2GiB, qcow2 フォーマットのボリューム作成; ユーザーネットワーク):
$ 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=qcow2 \ --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
既存のボリュームをインポート:
$ 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 Type を kvm に設定してください。追加のハードウェア設定が必要な場合、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
ネットワーク
デフォルトでは、libvird
systemd サービスが起動すると、default という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。
他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:
- bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで固定ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインをシステムレベルで動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法はネットワークブリッジを参照。作成後、ゲストの
.xml
設定ファイルで指定する必要があります。 - network — 仮想ネットワーク。他のドメインと共有することができます。ホストが動的ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
- macvtap — ホストの物理インターフェイスに直接接続。
- user — ローカルのネットワーク。ユーザーセッションの場合に使って下さい。
virsh
にはネットワークを作成するための様々なオプションが存在していますが、(virt-manager
などの) グラフィカルユーザーインターフェイスを使ったり virt-install でドメインを作成するときにネットワーク接続を作成する方が簡単です。
VM の IP アドレスは、次の方法で取得できます (default
ネットワークに接続し、dhcp 経由で IP アドレスを受信する場合):
$ virsh net-dhcp-leases default
コマンド (default
を VM が接続しているネットワーク名に置き換えます)、または VM で qemu-guest-agent
が実行されている場合は、次のようにします:
$ virsh domifaddr --source agent $vm
$vm
を実際の仮想マシン名 (またはドメイン ID) に置き換えます。
ネットワークの管理と変更
仮想ネットワークを変更するには、仮想ネットワークの基本的なコマンドラインの使用法 ガイドを読むことを強くお勧めします。 libvirt wiki から。使用方法の詳細については、libvirt Networking wiki を読むことをお勧めします。
IPv6
設定ツールを使って IPv6 アドレスを追加した際に、以下のようなエラーが表示されることがあります:
Check the host setup: enabling IPv6 forwarding with RA routes without accept_ra set to 2 is likely to cause routes loss. Interfaces to look at: eth0
以下のファイルを作成することで問題を解決できます (eth0
は物理インターフェイスの名前に置き換えてください):
/etc/sysctl.d/libvirt-bridge.conf
net.ipv6.conf.eth0.accept_ra = 2
設定したらマシンを再起動してください。
Macvtap
macvtap ネットワークを設定するには、まず次のファイルを作成します。
macvtap.xml
<network> <name>macvtap-net</name> <forward mode='bridge'> <interface dev='eth0'/> </forward> </network>
次に、ネットワークを定義して有効にします。
$ virsh net-define macvtap.xml $ virsh net-autostart macvtap-net $ virsh net-start macvtap-net
これで、ネットワーク macvtap-net
が利用可能になり、再起動しても維持されます。eth0
を介して外部ネットワークにブリッジされます。
スナップショット
スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。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=true
や rsync -S
を使ってオリジナルのイメージをコピーしてオリジナルのイメージをスナップショットにマージできます:
# virsh blockpull --domain domain --path /vms/domain.snapshot1
domain.snapshot1
が新しいボリュームになります。マージが完了したらオリジナルのボリューム (domain.img
とスナップショットのメタデータは削除できます。virsh blockcommit
が blockpull
と反対の動作をするようになる予定ですが現在開発中です (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
VirtualBox ハイパーバイザに接続 (libvirt における VirtualBox のサポートはまだ安定していないため libvirtd がクラッシュする可能性があります):
$ virsh --connect vbox:///system
ネットワークの設定:
$ virsh -c qemu:///system net-list --all $ virsh -c qemu:///system net-dumpxml default
フック
フックは、libvirt デーモンの起動および実行中に発生するさまざまなイベントによってトリガーされるスクリプトです。 これらは、ネットワークのセットアップやメモリの予約など、ゲストの起動の準備に必要なコマンドを実行するために使用できます。
次のフックが存在します:
- daemon - トリガー: 開始、シャットダウン、リロード
- qemu - トリガー: 準備、準備、開始、開始、停止、リリース、移行、復元、再接続、接続
- lxc - トリガー: 準備、開始、開始、停止、解放、再接続
- libxl - トリガー: 準備、開始、開始、停止、リリース移行、再接続
- network - トリガー: 開始、開始、停止、ポート作成、更新、ポート削除
各フックとトリガーの詳細については、libvirt ドキュメント を参照してください。
フックを作成する
フックは、/etc/libvirt/hooks
にあるスクリプトによって表されます。フォルダーが存在しない場合は、作成する必要があります。
各フックは、同じ名前のこのフォルダー (例: /etc/libvirt/hooks/qemu
) またはサブフォルダー (例: /etc/libvirt/hooks/qemu.d/
) 後者にはさまざまなスクリプトを含めることができ、それらはすべてトリガーポイントで実行されます。スクリプトは他のスクリプトと同様に実行されるため、使用するコマンドインタープリタの宣言から開始する必要があります (例: #!/bin/bash
)
スクリプトは libvirt ユーザー (chown +x /etc/libvirt/hooks/qemu
) によって実行可能である必要があります。
トリガー ポイントが満たされるたびに、スクリプトが実行されます。たとえば、デーモンスクリプトは、システムの起動/停止サイクルで、起動時とシャットダウン時に少なくとも 2 回実行されます。特定の時点でのみコマンドを実行するには、スクリプトに条件を実装する必要があります。これを行うために、libvirt は現在のトリガー条件を識別するために使用できるパラメーターを渡します。
libvirt のドキュメントによると、これらのパラメータは次のように定義されています:
- パラメータ 1: 操作に関与するオブジェクトの名前
- パラメータ 2: 実行される操作の名前
- パラメータ 3: サブオペレーションに名前を付ける場合に使用されます
- パラメータ 4: 必要に応じて追加の引数
引数のいずれかが適用できない場合は、ダッシュが渡されます。
サンプル
qemu ゲストを起動するたびに、リソースが割り当てられる前にコマンドを実行するには、qemu フックを使用します。この時点で、libvirt は次のようにフックを実行します: /etc/libvirt/hooks/qemu <guest_name> prepare begin -
このスクリプトは次のようになります:
/etc/libvirt/hooks/qemu
#!/bin/bash guest_name="$1" libvirt_task="$2" if [ "$libvirt_task" = "prepare" ]; then <run some important code here> fi
ゲストが停止している場合、同じスクリプトが実行されますが、今回はデーモンが次のようなコマンドを開始します: /etc/libvirt/hooks/qemu <guest_name> stop end -
Sharing data between host and guest
Virtio-FS
The description here will use hugepages to enable the usage of shared folders. Sharing files with Virtio-FS lists an overview of the supported options to enable filesharing with the guest.
First you need to enable hugepages which are used by the virtual machine:
/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = nr_hugepages
To determine the number of hugepages needed check the size of the hugepages:
$ grep Hugepagesize /proc/meminfo
The number of hugepages is memory size of virtual machine / Hugepagesize. Add to this value some additional pages. You have to reboot after this step, so that the hugepages are allocated.
Now you have to prepare the configuration of the virtual machine:
# virsh edit name_of_virtual_machine
<domain> ... <memoryBacking> <hugepages/> </memoryBacking> ... <cpu ...> <numa> <cell memory='memory size of virtual machine' unit='KiB' memAccess='shared'/> </numa> </cpu> ... <devices> ... <filesystem type='mount' accessmode='passthrough'> <driver type='virtiofs'/> <source dir='path to source folder on host'/> <target dir='mount_tag'/> </filesystem> ... </devices> </domain>
It is necessary to add the NUMA definition so that the memory access can be declared as shared. id and cpus values for NUMA will be inserted by virsh.
It should now be possible to mount the folder in the shared machine:
# mount -t virtiofs mount_tag /mnt/mount/path
Add the following fstab entry to mount the folder automatically at boot:
/etc/fstab
... mount_tag /mnt/mount/path virtiofs rw,noatime,_netdev 0 0
9p
File system directories can be shared using the 9P protocol. Details are available in QEMU's documentation of 9psetup.
Configure the virtual machine as follows:
<domain> ... <devices> ... <filesystem type="mount" accessmode="mapped"> <source dir="/path/on/host"/> <target dir="mount_tag"/> </filesystem> </devices> </domain>
Boot the guest and mount the shared directory from it using:
# mount -t 9p -o trans=virtio,version=9p2000.L mount_tag /path/to/mount_point/on/guest
See https://docs.kernel.org/filesystems/9p.html for more mount options.
To mount it at boot, add it to the guest's fstab:
/etc/fstab
... mount_tag /path/to/mount_point/on/guest 9p trans=virtio,version=9p2000.L 0 0
The module for the 9p transport (i.e. 9pnet_virtio
for trans=virtio
) will not be automatically loaded, so mounting the file system from /etc/fstab
will fail and you will encounter an error like 9pnet: Could not find request transport: virtio
. The solution is to preload the module during boot:
/etc/modules-load.d/9pnet_virtio.conf
9pnet_virtio
Samba / SMB
An other easy way to share data between guest and host is to use the smb protocol. While performance and latency may not be as good as in the other described ways, its sufficient for simple tasks like transfering simple files like images or documents from and to the guest.
The smb server can be set up directly on either the host, or the guest, for example using Samba, eliminating the need for a dedicated file server. Windows guests have the ability to create smb shares included right after installation (Microsoft Supportpage).
One possible way to access the share under linux (either from the host, or from the guest, depending, where you have installed your server) is to create an entry in your fstab. The samba package is required.
/etc/fstab
#Accessing a samba share on my vm from the host //my_vm/my_share /home/archuser/my_vm cifs _netdev,noauto,nofail,user,credentials=/home/archuser/.config/my_vm.key,gid=1000,uid=984 0 0
_netdev,noauto,nofail
ensures that the share is only mounted when needed without causing issues if the vm is not booted. user,credentials=/home/user/.config/my_vm.key,gid=1000,uid=984
gives you the ability to mount the share on the fly while first accessing it, without needing a password.
UEFI サポート
Libvirt は QEMU と OVMF で UEFI 仮想マシンをサポートしています。
edk2-ovmf パッケージをインストールしてください。
その後 libvirtd
を再起動してください。
これで UEFI 仮想マシンを作成する準備が整いました。virt-manager で新しい仮想マシンを作成してください。'新しい仮想マシンの作成' ウィザードの最後のページで、以下のようにしてください:
- 'インストールの前に設定をカスタマイズする' をクリックして '完了' を選択してください。
- '概要' タブで 'ファームウェア' フィールドを変更して 'UEFI x86_64' オプションを選択してください。
- 'インストールの開始' をクリックしてください。
- 起動画面で linuxefi コマンドによってインストーラーが起動され、システムの中で efibootmgr を実行することで UEFI OS が実行していることが確認できます。
詳しくは fedora の wiki ページ を参照。
ヒントとテクニック
Python 接続コード
libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.py
に python2 API が提供されます。
一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/
にあります。
#! /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
Advanced Format 4K ネイティブディスク
ディスクを Advanced Format 4Kn ディスクにするには、物理セクターサイズと論理セクターサイズの両方を 4 KiB に設定する必要があります。virtio-blk および virtio-scsi の場合、これは、<blockio> element 例えば:
# virsh edit name_of_virtual_machine
<domain> ... <devices> ... <disk type='file' device='disk'> .. <blockio logical_block_size='4096' physical_block_size='4096'/> </disk> ... </devices> </domain>
QEMU のコマンド
Libvirt は、VM を実行している基盤となる QEMU インスタンスに QEMU コマンド ライン引数を渡すことができます。 この機能は、libvirt が QEMU 機能 を (まだ) 提供していない場合に非常に役立ちます。例については、Intel GVT-g の記事全体を参照してください。
QEMU 用の VM XML スキーマを変更する
これは、QEMU 固有の要素を有効にするために機能します。
$ virsh edit vmname
<domain type='kvm'>
から
$ virsh edit vmname
<domain xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' type='kvm'>
QEMU コマンドライン引数
libvirt では、空白で区切られた QEMU コマンドライン引数を個別に指定する必要があります。
それらを挿入する正しい場所は、<domain>
要素の最後、つまり </domain>
終了タグの真上です。
-display gtk,gl=es,zoom-to-fit=off
になります。
$ virsh edit vmname
... </devices> <qemu:commandline> <qemu:arg value="-display"/> <qemu:arg value="gtk,gl=es,zoom-to-fit=off"/> </qemu:commandline> </domain>
トラブルシューティング
システムインスタンスの PulseAudio
PulseAudio デーモンは通常のユーザーアカウントで動作し、同じユーザーからの接続だけを許可します。libvirt を使って root で QEMU を動作させた場合は困ることになります。通常ユーザーで QEMU を動作させるには /etc/libvirt/qemu.conf
を編集して user
オプションでユーザー名を指定してください:
user = "dave"
また、PulseAudio バックエンドを使用してサーバーに接続するように QEMU を設定する必要があります。virsh edit
を使ってデーモンの設定に以下のセクションを追加してください:
<qemu:commandline> <qemu:env name='QEMU_AUDIO_DRV' value='pa'/> <qemu:env name='QEMU_PA_SERVER' value='/run/user/1000/pulse/native'/> </qemu:commandline>
1000
はあなたのユーザー ID に置き換えてください。
遅延設定 (マイクロ秒単位) は省略できますが、デフォルトを使用するとパチパチ音が発生する可能性があります。
ハイパーバイザーの CPU 使用率
virt-manager によって生成されたデフォルトの VM 構成では、QEMU プロセスによって CPU 使用率がかなり高くなる (10 〜 20%) 可能性があります。 VM をヘッドレスモードで実行する予定がある場合は、不要なデバイスの一部を削除することを検討してください。
virt-manager で仮想マシンの一時停止を解除できない
qcow2 などのディスクイメージ形式を使用している場合は、指定された仮想容量があり、必要なものだけを保存するため、ホストパーティションにイメージ用のスペースが必要です。VM を起動しようとしたときに I/O 関連のエラーが発生した場合は、仮想ディスクイメージを保持するホストパーティションがいっぱいである可能性があります。ホスト上で df -h
を実行すると、利用可能な空き領域の量を確認できます。
この場合、スペースを解放する方法については、システムメンテナンス#ファイルシステムの掃除を参照してください。
リダイレクト USB デバイスが virt-manager でグレー表示される
USB デバイスのリダイレクト メニュー項目がグレー表示されている場合は、次のハードウェアが VM 用に設定されていることを確認してください:
- USB コントローラー
- 1 つ以上の USB リダイレクタ
Error starting domain: Requested operation is not valid
仮想マシンを開こうとすると、このエラーがポップアップ表示される場合があります。これは、既存の仮想マシンを開こうとすると、libvirt が使用できないデフォルトのネットワークを検索しようとするためです。これを利用できるようにするには、ネットワークインターフェイスを自動起動して、コンピュータを再起動するたびにネットワークインターフェイスが常にアクティブになるようにする必要があります。libvirt ネットワーキングページ を参照してください。
次のコマンドを使用して、ネットワークインターフェイスの名前を確認します:
# virsh net-list --all
ネットワークインターフェースを自動起動するには:
# virsh net-autostart name_of_the_network
ネットワークインターフェースを起動するには:
# virsh net-start name_of_the_network
仮想マネージャーのエラー 'Virt Manager doesn't have search permissions'
仮想マシンファイルとインストール ISO が含まれるフォルダーが libvirt-qemu
グループによって所有されていることを確認してください。
$ sudo chown -R $USER:libvirt-qemu /path/to/virtual/machine