libvirt
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 パッケージと、どれか一つハイパーバイザをインストールしてください:
- 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
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-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 でドメインを作成するときにネットワーク接続を作成する方が簡単です。
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
設定したらマシンを再起動してください。
スナップショット
スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。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>
Troubleshooting
PulseAudio on system instance
The PulseAudio daemon normally runs under your regular user account, and will only accept connections from the same user. This can be a problem if QEMU is being run as root through libvirt. To run QEMU as a regular user, edit /etc/libvirt/qemu.conf
and set the user
option to your username.
user = "dave"
You will also need to tell QEMU to use the PulseAudio backend and identify the server to connect to. Add the following section to your domain configuration using virsh edit
.
<audio id="1" type="pulseaudio" serverName="/run/user/1000/pulse/native"> <input latency="20000"/> <output latency="20000"/> </audio>
1000
is your user id. Change it if necessary.
You can omit the latency settings (in microseconds) but using the defaults might result in crackling.
Hypervisor CPU use
Default VM configuration generated by virt-manager may cause rather high (10-20%) CPU use caused by the QEMU process. If you plan to run the VM in headless mode, consider removing some of the unnecessary devices.
Virtual machine cannot be un-paused on virt-manager
If you are using a disk image format such as qcow2 which has a specified virtual capacity, but only stores what is needed, then you need to have space on the host partition for the image to grow. If you see I/O related errors when attempting to start the VM, it's possible that the host partition holding the virtual disk image is full. You can run df -h
on the host to verify how much free space is available.
If this is the case, see System maintenance#Clean the filesystem for ways to free up space.
Redirect USB Device is greyed out in virt-manager
If the Redirect USB Device menu item is greyed out, check that the following hardware is configured for the VM:
- A USB Controller.
- One or more USB Redirectors.
Error starting domain: Requested operation is not valid
When you try to open a virtual machine this error may pop up. This is because when you try to open a existing virtual machine libvirt tries to search for the default network which is not available. To make it available you have to autostart your network interface so that whenever your restart your computer your network interface is always active. See libvirt networking page.
Look at the name of your network interface with the following command:
# virsh net-list --all
To autostart your network interface:
# virsh net-autostart name_of_the_network
To start your network interface:
# virsh net-start name_of_the_network
Virt Manager Error 'Virt Manager doesn't have search permissions'
Ensure the folder containing your virtual machine files and installation ISO are owned by the libvirt-qemu
group
$ sudo chown -R $USER:libvirt-qemu /path/to/virtual/machine
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 に置き換えてください。