仮想化管理ガイド
仮想環境の管理
概要
第1章 サーバーのベストプラクティス
- SELinux を Enforcing モードで実行します。setenforce コマンドを使用して、SELinux が Enforcing モードで実行するように設定します。
# setenforce 1
- AutoFS、NFS、FTP、HTTP、NIS、telnetd、sendmail などの不要なサービスを削除または無効にします。
- サーバー上にはプラットフォームの管理に必要な最低限のユーザーアカウントのみを追加します。不要なユーザーアカウントは削除してください。
- ホストでは不必要なアプリケーションは実行しないようにしてください。ホストでアプリケーションを実行すると仮想マシンのパフォーマンスに影響を与えるため、その影響がサーバーの安定性に及ぶ可能性があります。サーバーがクラッシュする可能性のあるアプリケーションでも、サーバー上のすべての仮想マシンがダウンします。
- 仮想マシンのインストールおよびイメージには集中管理できる場所を使用します。仮想マシンのイメージは
/var/lib/libvirt/images/
に格納します。仮想マシンのイメージをこれ以外のディレクトリーに格納する場合は、そのディレクトリーを SELinux ポリシーに追加し、インストールを開始する前にラベルの再設定を必ず行ってください。集中管理ができる共有可能なネットワークストレージの使用を強くお勧めします。
第2章 sVirt
非仮想化環境
非仮想化環境では、ホスト物理マシンは互いに物理的に分離されており、各ホスト物理マシンには、Web サーバーや DNS サーバーなどのサービスで設定される自己完結型の環境があります。これらのサービスは、独自のユーザー空間、ホストの物理マシンのカーネルおよび物理ハードウェアに直接通信し、サービスをネットワークに直接提供します。以下のイメージは、仮想化されていない環境を表しています。
- ??????
- ユーザー空間: 全ユーザーモードのアプリケーションと一部のドライバーが実行されるメモリー領域。
- ???
- Web アプリ (Web アプリケーションサーバー): ブラウザーからアクセスできる Web コンテンツを配信します。
- ??????
- ホストカーネル: ホストの物理マシンの特権付きカーネル、カーネル拡張、およびほとんどのデバイスドライバーを実行するために厳密に予約されます。
- ???
- DNS サーバー: DNS レコードを格納し、ユーザーが IP アドレスの代わりに論理名を使用して Web ページにアクセスできるようにします。
仮想化環境
仮想化環境では、複数の仮想オペレーティングシステムを、ホスト物理マシン上にある単一のカーネルで実行できます。以下のイメージは、仮想化環境を表しています。
2.1. セキュリティーおよび仮想化
2.2. sVirt のラベル付け
# ps -eZ | grep qemu system_u:system_r:svirt_t:s0:c87,c520 27950 ? 00:00:17 qemu-kvm
# ls -lZ /var/lib/libvirt/images/* system_u:object_r:svirt_image_t:s0:c87,c520 image1
SELinux コンテキスト | タイプ/説明 |
---|---|
system_u:system_r:svirt_t:MCS1 | ゲスト仮想マシンのプロセス。MCS1 はランダムな MCS フィールドです。約 500,000 個のラベルがサポートされます。 |
system_u:object_r:svirt_image_t:MCS1 | ゲスト仮想マシンのイメージ。これらのイメージの読み取り/書き込みができるのは、同じ MCS フィールドを持つ svirt_t プロセスのみです。 |
system_u:object_r:svirt_image_t:s0 | ゲスト仮想マシンの共有の読み取り/書き込みコンテンツ。すべての svirt_t プロセスは svirt_image_t:s0 ファイルに書き込むことができます。 |
第3章 仮想マシンのクローン作成
- クローン は、1 台の仮想マシンのインスタンスです。クローンを使用すると、同じ仮想マシンのネットワークを設定したり、別の宛先に配布したりできます。
- テンプレート は、クローン作成のソースとして使用するように設計された仮想マシンのインスタンスです。テンプレートから複数のクローンを作成し、各クローンにマイナーな変更を加えることができます。これは、この変更がシステムに与える影響を確認する際に役立ちます。
- プラットフォームレベルの情報および設定には、仮想化ソリューションが仮想マシンに割り当てたものが含まれます。例には、ネットワークインターフェイスカード (NIC) の数と、その MAC アドレスが含まれます。
- ゲストオペレーティングシステムレベル情報および設定には、仮想マシン内で設定されたものが含まれます。例には SSH 鍵が含まれます。
- アプリケーションレベル情報および設定には、仮想マシンにインストールされているアプリケーションで設定したものが含まれます。例には、アクティベーションコードおよび登録情報が含まれます。注記情報およびアプローチは各アプリケーションに固有のものであるため、本章には、アプリケーションレベルの削除に関する情報は記載されていません。
3.1. クローンを作成する仮想マシンの準備
手順3.1 クローンを作成する仮想マシンの準備
仮想マシンのセットアップ
- クローンまたはテンプレートに使用する仮想マシンを構築します。
- クローンに必要なソフトウェアをインストールします。
- オペレーティングシステムに一意でない設定を設定します。
- 固有でないアプリケーション設定を設定します。
ネットワーク設定を削除します。
- 以下のコマンドを使用して、永続的な udev ルールを削除します。
# rm -f /etc/udev/rules.d/70-persistent-net.rules
注記udev ルールを削除しない場合は、最初の NIC の名前が eth0 ではなく eth1 になります。 /etc/sysconfig/network-scripts/ifcfg-eth[x]
で以下の編集を行い、ifcfg スクリプトから一意のネットワークの詳細を削除します。- HWADDR 行および Static 行を削除します。注記HWADDR が新しいゲストの MAC アドレスと一致しない場合、ifcfg は無視されます。したがって、ファイルから HWADDR を削除することが重要です。
DEVICE=eth[x] BOOTPROTO=none ONBOOT=yes #NETWORK=10.0.1.0 <- REMOVE #NETMASK=255.255.255.0 <- REMOVE #IPADDR=10.0.1.20 <- REMOVE #HWADDR=xx:xx:xx:xx:xx <- REMOVE #USERCTL=no <- REMOVE # Remove any other *unique* or non-desired settings, such as UUID.
- HWADDR または一意の情報が含まれていない DHCP 設定が残っていることを確認します。
DEVICE=eth[x] BOOTPROTO=dhcp ONBOOT=yes
- ファイルに以下の行が含まれていることを確認します。
DEVICE=eth[x] ONBOOT=yes
- 以下のファイルが存在する場合は、そのファイルに同じ内容が含まれていることを確認してください。
/etc/sysconfig/networking/devices/ifcfg-eth[x]
/etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
注記NetworkManager または特殊な設定を仮想マシンで使用した場合は、追加の固有情報が ifcfg スクリプトから削除されていることを確認してください。
登録の詳細を削除します。
- 以下のいずれかを使用して、登録の詳細を削除します。
- Red Hat Network (RHN) 登録済みゲスト仮想マシンの場合は、以下のコマンドを実行します。
# rm /etc/sysconfig/rhn/systemid
- Red Hat Subscription Manager (RHSM) の登録済みゲスト仮想マシンの場合は、次のコマンドを使用します。
- 元の仮想マシンを使用しない場合は、以下のコマンドを実行します。
# subscription-manager unsubscribe --all # subscription-manager unregister # subscription-manager clean
- 元の仮想マシンを使用する場合は、次のコマンドのみを実行します。
# subscription-manager clean
注記元の RHSM プロファイルはポータルに残ります。
その他の固有の詳細の削除
- 次のコマンドを使用して、sshd の公開鍵と秘密鍵のペアを削除します。
# rm -rf /etc/ssh/ssh_host_*
注記ssh キーを削除すると、このホストを信頼しない ssh クライアントの問題が回避されます。 - 複数のマシンで実行している場合に、競合する可能性があるその他のアプリケーション固有の識別子や設定を削除します。
次回のシステムの起動時に設定ウィザードを実行するように仮想マシンを設定します。
- 以下のいずれかの方法で、仮想マシンを次回起動したときに、関連する設定ウィザードが実行されるように設定します。
- Red Hat Enterprise Linux 6 以前の場合は、以下のコマンドを使用して、root ファイルシステムに .unconfigured という名前の空のファイルを作成します。
# touch /.unconfigured
- Red Hat Enterprise Linux 7 の場合は、次のコマンドを実行して、最初の起動ウィザードおよび初期設定ウィザードを有効にします。
# sed -ie 's/RUN_FIRSTBOOT=NO/RUN_FIRSTBOOT=YES/' /etc/sysconfig/firstboot # systemctl enable firstboot-graphical # systemctl enable initial-setup-graphical
注記次回の起動時に実行するウィザードは、仮想マシンから削除された設定によって異なります。また、クローンの初回ブートでは、ホスト名を変更することが推奨されます。
3.2. 仮想マシンのクローン作成
3.2.1. virt-clone を使用したゲストのクローン作成
--orginal
のみが必要です。オプションの一覧を表示するには、次のコマンドを実行します。
# virt-clone --help
例3.1 virt-clone を使用したゲストのクローン作成
# virt-clone --original demo --auto-clone
例3.2 virt-clone を使用したゲストのクローン作成
# virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/xen/images/newdemo.img --file /var/lib/xen/images/newdata.img
3.2.2. virt-manager を使用したゲストのクローン作成
手順3.2 virt-manager を使用した仮想マシンのクローンの作成
virt-manager を開く
virt-manager を起動します。 メニューおよび サブメニューから アプリケーションを起動します。または、root で virt-manager を実行します。Virtual Machine Manager にあるゲスト仮想マシンの一覧から、クローンを作成するゲスト仮想マシンを選択します。クローンを作成するゲスト仮想マシンを右クリックし、を選択します。Clone Virtual Machine ウィンドウが開きます。図3.1 Clone Virtual Machine ウィンドウ
クローンの設定
- クローンの名前を変更する場合は、クローンの新しい名前を入力します。
- ネットワーク設定を変更する場合は、Details を選択します。クローンの新しい MAC アドレスを入力します。OK をクリックします。
図3.2 Change MAC Address ウィンドウ
- クローンを作成したゲスト仮想マシンのディスクごとに、次のいずれかのオプションを選択します。
Clone this disk
- ディスクは、クローンとして作成されたゲスト仮想マシンのクローンとして作成されます。Share disk with guest virtual machine name
- ディスクは、クローンを作成されるゲスト仮想マシンとそのクローンで共有されます。Details
- ストレージパスの変更 画面を開きます。これにより、ディスクへの新しいパスの選択が可能になります。図3.3 Change
storage path
ウィンドウ
ゲスト仮想マシンのクローンを作成する
Clone をクリックします。
第4章 KVM のライブマイグレーション
- 負荷分散: ゲスト仮想マシンは、ホスト物理マシンが過負荷になった場合、または別のホスト物理マシンが十分に活用されていない場合に、使用率の低いホスト物理マシンに移動できます。
- ハードウェア独立性: ホストの物理マシンでハードウェアデバイスをアップグレード、追加、または削除する必要がある場合、ゲスト仮想マシンを他のホストの物理マシンに安全に移動できます。つまり、ゲスト仮想マシンでは、ハードウェアの改善のためのダウンタイムが発生しません。
- 省エネ: ゲスト仮想マシンを他のホスト物理マシンに再配布できるため、電源をオフにして、低使用期間でエネルギーを節約し、コストを削減できます。
- 地理的な移行: 待ち時間を短縮するため、または深刻な状況では、ゲスト仮想マシンを別の場所に移動できます。
4.1. ライブマイグレーションの要件
移行の要件
- 次のいずれかのプロトコルを使用して、共有ストレージにインストールされたゲスト仮想マシン。
- ファイバーチャネルベースの LUN
- iSCSI
- FCoE
- NFS
- GFS2
- SCSI RDMA プロトコル (SCSI RCP) - Infiniband アダプターおよび 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル
- 移行プラットフォームおよびバージョンは、テーブル 表4.1「ライブマイグレーションの互換性」 に対して確認する必要があります。また、Red Hat Enterprise Linux 6 は、共有ストレージ上の raw イメージと qcow2 イメージを使用したゲスト仮想マシンのライブマイグレーションをサポートしていることにも注意してください。
- 両方のシステムで、適切な TCP/IP ポートが開いている必要があります。ファイアウォールが使用されている場合は、詳細なポート情報の https://access.redhat.com/site/documentation/ で見つかる 『Red Hat Enterprise Linux Virtualization セキュリティーガイド』 を参照してください。
- 共有ストレージメディアをエクスポートする別のシステム。ストレージは、移行に使用される 2 つのホストマシンのいずれかに配置しないでください。
- 共有ストレージは、移行元システムと移行先システムの同じ場所にマウントする必要があります。マウントするディレクトリー名は同じである必要があります。別のパスを使用してイメージを保持することもできますが、推奨されません。virt-manager を使用して移行を行う場合は、パス名が同じである必要があることに注意してください。ただし、virsh を使用して移行を実行する場合は、移行を実行するときに --xml オプションまたはプリフックを使用して、さまざまなネットワーク設定とマウントディレクトリーを使用できます。共有ストレージがなくても、オプション --copy-storage-all (非推奨) を使用して移行を成功させることができます。prehooks の詳細は、 libvirt.org を参照してください。XML オプションの詳細については、20章ドメイン XML の操作 を参照してください。
- パブリックブリッジ + タップネットワーク内の既存のゲスト仮想マシンで移行を試みる場合、移行元と移行先のホスト物理マシンは同じネットワークに配置する必要があります。この手順を行わないと、ゲストの仮想マシンネットワークが移行後に動作しません。
- Red Hat Enterprise Linux 5 および 6 では、KVM ゲスト仮想マシンのデフォルトのキャッシュモードが
none
に設定されているため、ディスクの状態に一貫性がありません。キャッシュオプションをnone
(たとえば、virsh attach-disk cache none を使用) に設定すると、O_DIRECT
フラグを使用してゲスト仮想マシンのファイルが開かれます (オープン システムコールを呼び出す場合)。つまり、ホストの物理マシンのキャッシュを回避し、ゲスト仮想マシンでキャッシュのみを提供します。キャッシュモードをnone
に設定すると、不整合の問題が回避され、使用すると、仮想マシンのライブマイグレーションが可能になります。キャッシュをnone
に設定する方法は、「ゲストへのストレージデバイスの追加」 を参照してください。
libvirtd
サービスが有効になっていて (#chkconfig libvirtd on)、実行されている (#service libvirtd start) ことを確認してください。また、効果的に移行する機能は、/etc/libvirt/libvirtd.conf
設定ファイルのパラメーターの設定に依存することに注意してください。
手順4.1 libvirtd.conf の設定
libvirtd.conf
を開くには、root で次のコマンドを実行する必要があります。# vim /etc/libvirt/libvirtd.conf
- 必要に応じてパラメーターを変更し、ファイルを保存します。
libvirtd
サービスを再起動します。# service libvirtd restart
4.2. ライブマイグレーションと Red Hat Enterprise Linux バージョンの互換性
移行の方法 | リリースタイプ | 例 | ライブ移行のサポート | 注記 |
---|---|---|---|---|
前方 | メジャーリリース | 5.x → 6.y | サポート対象外 | |
前方 | マイナーリリース | 5.x → 5.y (y>x, x>=4) | 完全対応 | 問題がある場合は報告する必要があります |
前方 | マイナーリリース | 6.x → 6.y (y>x, x>=0) | 完全対応 | 問題がある場合は報告する必要があります |
後方 | メジャーリリース | 6.x → 5.y | サポート対象外 | |
後方 | マイナーリリース | 5.x → 5.y (x>y,y>=4) | サポート対象 | 既知の問題は、移行に関する問題のトラブルシューティング を参照してください。 |
後方 | マイナーリリース | 6.x → 6.y (x>y, y>=0) | サポート対象 | 既知の問題は、移行に関する問題のトラブルシューティング を参照してください。 |
移行に関する問題のトラブルシューティング
- SPICE の問題: Red Hat Enterprise Linux 6.0→6.1 からの移行時に、SPICE に互換性のない変更があることが判明しました。このような場合、クライアントは切断してから再接続し、オーディオとビデオが一時的に失われる可能性があります。これは一時的なものであり、すべてのサービスが再開されます。
- USB の問題: Red Hat Enterprise Linux 6.2 は、移行サポートを含む USB 機能を追加しましたが、USB デバイスをリセットし、デバイス上で実行されているアプリケーションを中止させる特定の警告がないわけではありません。この問題は Red Hat Enterprise Linux 6.4 で修正され、今後のバージョンでは発生しません。6.4 よりも前のバージョンでこれが発生するのを防ぐには、USB デバイスが使用されている間は移行を行いません。
- 移行プロトコルの問題 - 後方移行が "unknown section error" で終了する場合は、一時的なエラーである可能性があるため、移行プロセスを繰り返すことで問題を修復できます。そうでない場合は、問題を報告してください。
ネットワークストレージの設定
共有ストレージを設定し、共有ストレージにゲスト仮想マシンをインストールします。
4.4. virsh を使用した KVM のライブ移行
# virsh migrate --live GuestName DestinationURL
-live
オプションが削除される可能性があることに注意してください。追加オプションは、「virsh migrate コマンドの追加オプション」 に一覧表示されています。
GuestName
パラメーターは、移行するゲスト仮想マシンの名前を表します。
DestinationURL
パラメーターは、移行先ホストの物理マシンの接続 URL です。移行先システムで同じバージョンの Red Hat Enterprise Linux を実行し、同じハイパーバイザーを使用し、libvirt を実行している必要があります。
DestinationURL
パラメーターには、以下のセマンティクスがあります。
- 通常の移行:
DestinationURL
は、ソースゲスト仮想マシンから見たターゲットホスト物理マシンの URL です。 - ピアツーピアの移行:
DestinationURL
は、移行元ホストの物理マシンから表示されるターゲットホストの物理マシンの URL です。
/etc/hosts
ファイルに移行先ホストの物理マシンのエントリーが必要です。次の例に示すように、宛先ホストの物理マシンの IP アドレスとホスト名をこのファイルに入力し、宛先ホストの物理マシンの IP アドレスとホスト名を置き換えます。
10.0.0.20 host2.example.com
例:virsh を使用したライブマイグレーション
この例では、host1.example.com
から host2.example.com
に移行します。使用環境に合わせて、ホストの物理マシン名を変更します。この例では、guest1-rhel6-64
という名前の仮想マシンを移行します。
ゲスト仮想マシンが実行していることを確認します。
移行元システムで、host1.example.com
を実行し、guest1-rhel6-64
が実行していることを確認します。[root@host1 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
ゲスト仮想マシンの移行
次のコマンドを実行して、ゲスト仮想マシンを移行先host2.example.com
にライブ移行します。リンク先の URL の末尾に/system
を追加し、フルアクセスが必要であることを libvirt に指示します。# virsh migrate --live
guest1-rhel6-64 qemu+ssh://host2.example.com/system
コマンドを入力すると、インストール先システムの root パスワードを求められます。待機
負荷やゲスト仮想マシンのサイズによっては、移行に時間がかかる場合があります。virsh はエラーのみを報告します。ゲスト仮想マシンは、完全に移行するまで、移行元ホストの物理マシンで実行し続けます。注記移行中、完了率インジケーターの数は、プロセスが完了する前に複数回減少する可能性があります。これは、移行の開始後に変更されたソースメモリーページを再度コピーする必要があるため、全体的な進行状況の再計算が原因で発生します。したがって、この動作は予期されたものであり、移行に問題があることを示すものではありません。ゲスト仮想マシンが移行先ホストに到達していることを確認する
宛先システムhost2.example.com
から、guest1-rhel6-64
が実行されていることを確認します。[root@host2 ~]# virsh list Id Name State ---------------------------------- 10 guest1-rhel6-64 running
virsh dumpxml Guest1 > Guest1.xml virsh -c qemu+ssh://<target-system-FQDN> define Guest1.xml virsh undefine Guest1
4.4.1. virsh を使用した移行に関する追加のヒント
- 手順4.1「libvirtd.conf の設定」 の説明に従って、libvirtd.conf ファイルを開きます。
- Processing controls のセクションを探します。
################################################################# # # Processing controls # # The maximum number of concurrent client connections to allow # over all sockets combined. #max_clients = 20 # The minimum limit sets the number of workers to start up # initially. If the number of active clients exceeds this, # then more threads are spawned, upto max_workers limit. # Typically you'd want max_workers to equal maximum number # of clients allowed #min_workers = 5 #max_workers = 20 # The number of priority workers. If all workers from above # pool will stuck, some calls marked as high priority # (notably domainDestroy) can be executed in this pool. #prio_workers = 5 # Total global limit on concurrent RPC calls. Should be # at least as large as max_workers. Beyond this, RPC requests # will be read into memory and queued. This directly impact # memory usage, currently each request requires 256 KB of # memory. So by default upto 5 MB of memory is used # # XXX this isn't actually enforced yet, only the per-client # limit is used so far #max_requests = 20 # Limit on concurrent requests from a single client # connection. To avoid one client monopolizing the server # this should be a small fraction of the global max_requests # and max_workers parameter #max_client_requests = 5 #################################################################
max_clients
およびmax_workers
パラメーターの設定を変更します。両方のパラメーターの番号が同じであることが推奨されます。max_clients
は、移行ごとに 2 つのクライアント (各側に 1 つ) を使用します。max_workers
は、実行フェーズ中に移行元で 1 つのワーカーと、移行先で 0 のワーカーを使用し、終了フェーズ中に移行先でワーカーを 1 つ使用します。重要max_clients
パラメーターおよびmax_workers
パラメーターの設定は、libvirtd サービスへのゲスト仮想マシンのすべての接続の影響を受けます。つまり、同じゲスト仮想マシンを使用しているユーザーで、同時に移行を実行しているすべてのユーザーは、max_clients
およびmax_workers
パラメーター設定で設定される制限にも古いことになります。このため、同時ライブマイグレーションを実行する前に、最大値を慎重に検討する必要があります。- ファイルを保存し、サービスを再起動します。注記起動したにもかかわらず認証されていない ssh セッションが多すぎるために、移行接続が切断する場合があります。デフォルトでは、
sshd
で許可されるセッションは 10 セッションのみで、常に "pre-authenticated state" となります。この設定は、sshd 設定ファイル (ここでは/etc/ssh/sshd_config
) のMaxStartups
パラメーターで制御されます。これには調整が必要な場合があります。この制限は DoS 攻撃 (および一般的なリソースの過剰使用) を防ぐために設定されているため、このパラメーターの調整は慎重に行ってください。この値を高く設定しすぎると、目的が無効になります。このパラメーターを変更するには、ファイル/etc/ssh/sshd_config
を変更し、MaxStartups 行の先頭から#を削除して、10
(デフォルト値) をより大きな数値に変更します。必ず保存して、sshd
サービスを再起動してください。詳細は、sshd_config
の man ページを参照してください。
4.4.2. virsh migrate コマンドの追加オプション
--live
のほかに、virsh migrate では以下のオプションを利用できます。
--direct
- 直接移行に使用されます。--p2p
- ピアツーピア移行に使用されます。--tunnelled
- トンネル化された移行に使用されます。--persistent
- ドメインを移行先ホストの物理マシンの永続状態に残します。--undefinesource
- ソースホストの物理マシンのゲスト仮想マシンを削除します。--suspend
- ドメインを移行先ホストの物理マシンの一時停止状態のままにします。--change-protection
- 移行の進行中に、互換性のない設定変更がドメインに行われないように強制します。ハイパーバイザーによるサポートがある場合にこのオプションが暗黙的に有効になりますが、ハイパーバイザーに変更保護の対応がない場合に明示的に使用して移行を拒否できます。--unsafe
- すべての安全手順を無視して、強制的に移行を実行します。--verbose
- 移行の進行状況を表示します。--abort-on-error
- 移行プロセス中にソフトエラー (I/O エラーなど) が発生すると移行を取り消します。--migrateuri
: 通常省略される移行 URI です。--domain
[string]- ドメイン名、ID、または uuid--desturi
[string]: クライアント (通常の移行) またはソース (p2p 移行) から見た宛先ホスト物理マシンの接続 URI--migrateuri
: 移行 URI。通常は省略できます。--timeout
[seconds]- ライブマイグレーションカウンターが N 秒を超えるとゲスト仮想マシンを強制的に中断します。ライブマイグレーションでのみ使用できます。タイムアウトが開始されると、一時停止されたゲスト仮想マシンで移行が続行されます。--dname
[string] - 移行時にゲスト仮想マシンの名前を新規の名前に変更します (サポートされている場合)。--xml
- 指定されたファイル名を使用して、宛先で使用する別の XML ファイルを提供できます。このファイル名は、基となるストレージへのアクセスで、ソースと宛先の名前の相違を考慮するなど、ホスト固有のドメイン XML の部分にさらに多くの変更を加えます。このオプションは通常、省略されます。
4.5. virt-manager を使用した移行
virt-manager を開く
virt-manager を開きます。メインメニューバーから → → を選択して、virt-manager を起動します。図4.1 virt-Manager のメインメニュー
ターゲットホストの物理マシンへの接続
図4.2 Add Connection ウィンドウの表示
接続の追加
Add Connection ウィンドウが表示されます。図4.3 ターゲットホストの物理マシンへの接続の追加
以下の詳細を入力します。- Hypervisor: を選択します。
- Method: 接続方法を選択します。
- Username: リモートホストの物理マシンのユーザー名を入力します。
- Hostname: リモートホストの物理マシンのホスト名を入力します。
図4.4 パスワードを入力
ゲスト仮想マシンの移行
ソースホスト物理マシン内のゲストのリストを開き (ホスト名の左側にある小さな三角形をクリック)、移行するゲスト (この例では guest1-rhel6-64) を右クリックして、 をクリックします。図4.5 移行するゲストの選択
図4.6 移行先ホストの物理マシンの選択と、移行プロセスの開始
進捗ウィンドウが表示されます。図4.7 進捗ウィンドウ
virt-manager は、移行先ホストで実行されている、新しく移行されたゲスト仮想マシンを表示するようになりました。これで、ソースホストの物理マシンで実行されていたゲスト仮想マシンがシャットオフ状態で一覧表示されます。図4.8 移行先ホストの物理マシンで実行している移行ゲスト仮想マシン
オプション: ホストの物理マシンのストレージの詳細を表示します。
図4.9 ストレージの詳細
このホストは、以下の XML 設定で定義されています。図4.10 宛先ホスト物理マシンの XML 設定
<pool type='iscsi'> <name>iscsirhel6guest</name> <source> <host name='virtlab22.example.com.'/> <device path='iqn.2001-05.com.iscsivendor:0-8a0906-fbab74a06-a700000017a4cc89-rhevh'/> </source> <target> <path>/dev/disk/by-path</path> </target> </pool> ...
第5章 ゲストのリモート管理
5.1. SSH を使用したリモート管理
- 仮想マシンを管理するには、リモートマシンへの root ログインアクセスが必要です。
- 初期接続の設定プロセスが遅くなる可能性があります。
- すべてのホストまたはゲストでユーザーのキーを取り消す標準または簡単な方法はありません。
- SSH は、リモートマシンの数が多いと適切にスケーリングされません。
- openssh
- openssh-askpass
- openssh-clients
- openssh-server
virt-manager 用にパスワードを使用しないまたはパスワードを使用したSSH アクセスの設定
以下の手順は、ゼロから開始しており、SSH キーが設定されていないことを前提としています。SSH 鍵を設定して別のシステムにコピーしている場合は、この手順をスキップできます。
オプション: ユーザーの変更
必要に応じてユーザーを変更します。この例では、ローカルの root ユーザーを使用して、その他のホストとローカルホストをリモートで管理します。$ su -
SSH 鍵ペアの生成
virt-manager が使用されているマシンで公開鍵ペアを生成します。この例では、~/.ssh/
ディレクトリーのデフォルトの鍵の場所を使用します。# ssh-keygen -t rsa
リモートホストへの鍵のコピー
パスワードなしのリモートログイン、またはパスフレーズを使用したリモートログインでは、管理対象システムに SSH 鍵を配布する必要があります。ssh-copy-id コマンドを使用して、指定したシステムアドレス (この例ではroot@host2.example.com
) の root ユーザーにキーをコピーします。# ssh-copy-id -i ~/.ssh/id_rsa.pub root@host2.example.com root@host2.example.com's password:
次に、ssh root@host2.example.com コマンドを使用してマシンにログインし、.ssh/authorized_keys
ファイルをチェックインして予期しないキーが追加されていないことを確認します。必要に応じて、その他のシステムに対して繰り返します。オプション: パスフレーズを ssh-agent に追加します。
以下の手順では、既存の ssh-agent にパスフレーズを追加する方法について説明します。ssh-agent が実行されていない場合、実行に失敗します。エラーや競合を回避するには、SSH パラメーターが正しく設定されていることを確認してください。詳細は、『Red Hat Enterprise Linux 導入ガイド』 を参照してください。必要に応じて、SSH キーのパスフレーズを ssh-agent に追加します。ローカルホストで次のコマンドを使用して、パスフレーズ (存在する場合) を追加し、パスワードなしのログインを有効にします。# ssh-add ~/.ssh/id_rsa
SSH キーがリモートシステムに追加されます。
libvirt デーモン (libvirtd
)
libvirt
デーモンは、仮想マシンを管理するインターフェイスを提供します。管理が必要なすべてのリモートホストに libvirtd
デーモンをインストールして実行する必要があります。
$ ssh root@somehost # chkconfig libvirtd on # service libvirtd start
libvirtd
と SSH を設定すると、仮想マシンにリモートでアクセスして管理できるようになります。この時点で、VNC でゲストにアクセスできるようになるはずです。
virt-manager を使用したリモートホストへのアクセス
リモートホストは、virt-manager GUI ツールで管理できます。SSH キーは、パスワードを使用しないログインを機能させるために、virt-manager を実行しているユーザーに属している必要があります。
- virt-manager を起動します。
図5.1 Add Connection メニュー
- ドロップダウンメニューを使用してハイパーバイザータイプを選択し、チェックボックスをクリックして Connection (この場合は Remote tunnel over SSH) を開き、必要な と を入力して をクリックします。
5.2. TLS および SSL でのリモート管理
手順5.1 TLS 管理用の認証局 (CA) 鍵の作成
- 始める前に、certtool ユーティリティーがインストールされていることを確認してください。そうでない場合は、以下を行います。
# yum install gnutls-utils
- 次のコマンドを使用して、秘密鍵を生成します。
# certtool --generate-privkey > cakey.pem
- キーが生成されたら、次のステップは、キーが自己署名できるように署名ファイルを作成することです。作成するには、署名の詳細が含まれるファイルを作成し、
ca.info
という名前を付けます。このファイルには、以下の内容を記述する必要があります。# vim ca.info
cn = Name of your organization ca cert_signing_key
- 以下のコマンドを使用して自己署名キーを生成します。
# certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
ファイルが生成されたら、rm コマンドを使用して ca.info ファイルを削除できます。生成プロセスの結果として生成されるファイルの名前はcacert.pem
です。このファイルは公開鍵 (証明書) です。読み込んだcakey.pem
は秘密鍵です。このファイルは共有スペースに保存しないでください。この鍵は秘密鍵を保持します。 /etc/pki/CA/cacert.pem
ディレクトリー内のすべてのクライアントとサーバーにcacert.pem
認証局証明書ファイルをインストールして、CA によって発行された証明書が信頼できることを通知します。このファイルの内容を表示するには、次のコマンドを実行します。# certtool -i --infile cacert.pem
これは、CA の設定に必要なものです。クライアントとサーバーの証明書を発行するために必要となるため、CA の秘密鍵を安全に保持します。
手順5.2 サーバー証明書の発行
qemu://mycommonname/system
を使用してサーバーに接続するため、CN フィールドは同一である必要があります (mycommoname)。
- サーバーの秘密鍵を作成します。
# certtool --generate-privkey > serverkey.pem
- 最初に
server.info
というテンプレートファイルを作成して、CA の秘密鍵の署名を生成します。CN がサーバーのホスト名と同じに設定されていることを確認します。organization = Name of your organization cn = mycommonname tls_www_server encryption_key signing_key
- 次のコマンドを使用して証明書を作成します。
# certtool --generate-certificate --load-privkey serverkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \ --template server.info --outfile servercert.pem
- これにより、2 つのファイルが生成されます。
- serverkey.pem - サーバーの秘密鍵
- servercert.pem - サーバーの公開鍵
秘密鍵の場所は、秘密にしておきます。ファイルの内容を表示するには、以下のコマンドを実行します。# certtool -i --inifile servercert.pem
このファイルを開く場合、CN=
パラメーターは先に設定した CN と同じでなければなりません。(例:mycommonname
) - 次の場所にある 2 つのファイルをインストールします。
serverkey.pem
- サーバーの秘密鍵。このファイルは、/etc/pki/libvirt/private/serverkey.pem
に置きます。servercert.pem
- サーバーの証明書。サーバーの/etc/pki/libvirt/servercert.pem
にインストールします。
手順5.3 クライアント証明書の発行
- すべてのクライアント (つまり、virt-manager などの libvirt にリンクされているプログラム) について、X.509 識別名 (DN) が適切な名前に設定された証明書を発行する必要があります。これは、企業レベルで決定する必要があります。たとえば、以下の情報が使用されます。
C=USA,ST=North Carolina,L=Raleigh,O=Red Hat,CN=name_of_client
このプロセスは、以下の例外を除き、手順5.2「サーバー証明書の発行」 と非常に似ています。 - 以下のコマンドを使用して秘密鍵を作成します。
# certtool --generate-privkey > clientkey.pem
- 最初に
client.info
という名前のテンプレートファイルを作成して、CA の秘密鍵の署名を生成します。ファイルには以下の内容が含まれている必要があります (フィールドは、お住まいの地域/場所に合わせてカスタマイズする必要があります)。country = USA state = North Carolina locality = Raleigh organization = Red Hat cn = client1 tls_www_client encryption_key signing_key
- 次のコマンドを使用して、証明書に署名します。
# certtool --generate-certificate --load-privkey clientkey.pem --load-ca-certificate cacert.pem \ --load-ca-privkey cakey.pem --template client.info --outfile clientcert.pem
- クライアントマシンに証明書をインストールします。
# cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem # cp clientcert.pem /etc/pki/libvirt/clientcert.pem
5.3. トランスポートモード
Transport Layer Security (TLS)
Transport Layer Security TLS 1.0 (SSL 3.1) が認証され、暗号化された TCP/IP ソケット。通常はパブリックポート番号をリッスンします。これを使用するには、クライアント証明書とサーバー証明書を生成する必要があります。標準のポートは 16514 です。
UNIX ソケット
UNIX ドメインソケットは、ローカルマシンでのみアクセスできます。ソケットは暗号化されず、UNIX の権限または SELinux を使用して認証を行います。通常のソケット名は /var/run/libvirt/libvirt-sock
および /var/run/libvirt/libvirt-sock-ro
です (読み取り専用接続の場合)。
SSH
SSH (Secure Shell Protocol) 接続で転送されます。Netcat が必要です (ncパッケージ) がインストールされています。libvirt デーモン (libvirtd) は、リモートマシンで実行している必要があります。SSH アクセスには、ポート 22 を開いておく必要があります。ある種の SSH キー管理 (たとえば、ssh-agentユーティリティー) を使用する必要があります。そうしないと、パスワードの入力を求められます。
ext
ext
パラメーターは、libvirt のスコープ外の方法でリモートマシンに接続できる外部プログラムに使用されます。このパラメーターはサポートされていません。
TCP
暗号化されていない TCP/IP ソケット。実稼働環境での使用は推奨されていないため、これは通常無効になっていますが、管理者はこれをテストしたり、信頼できるネットワークで使用したりできます。デフォルトのポートは 16509 です。
リモート URI
URI (Uniform Resource Identifier) は、virsh および libvirt がリモートホストに接続するために使用します。URI は、virsh コマンドの --connect パラメーターとともに使用して、リモートホストで単一コマンドまたは移行を実行することもできます。リモート URI は、通常のローカル URI を取得し、ホスト名またはトランスポート名を追加することで形成されます。特別な場合として、remote の URI スキームを使用すると、リモートの libvirtd サーバーで、最適なハイパーバイザードライバーをプローブするように指示されます。これは、ローカル接続の NULL URI を渡すことに相当します。
driver[+transport]://[username@][hostname][:port]/path[?extraparameters]
- qemu://hostname/
- xen://hostname/
- xen+ssh://hostname/
リモート管理パラメーターの例
- SSH トランスポートと SSH ユーザー名
virtuser
を使用して、host2
という名前のリモート KVM ホストに接続します。それぞれの connect コマンドは connect [<name>] [--readonly] です。ここで、<name> はここで説明する有効な URI です。virsh connect コマンドの詳細については、「connect」 を参照してください。qemu+ssh://virtuser@hot2/
- TLS を使用して、
host2
という名前のホスト上のリモートの KVM ハイパーバイザーに接続します。qemu://host2/
テスト例
- 標準以外の UNIX ソケットを使用して、ローカルの KVM ハイパーバイザーに接続します。この場合は、UNIX ソケットの完全パスが明示的に指定されています。
qemu+unix:///system?socket=/opt/libvirt/run/libvirt/libvirt-sock
- 暗号化されていない TCP/IP 接続を使用して、ポート 5000 の IP アドレス 10.1.1.10 のサーバーに libvirt デーモンを接続します。これは、デフォルト設定でテストドライバーを使用します。
test+tcp://10.1.1.10:5000/default
追加の URI パラメーター
リモートの URI には、追加のパラメーターを追加できます。以下の表 表5.1「追加の URI パラメーター」 では、認識されるパラメーターを説明します。その他のパラメーターはすべて無視されます。パラメーター値は URI エスケープする必要があります (つまり、パラメーターおよび特殊文字が URI 形式に変換される前に疑問符 (?) が追加されることを意味します)。
名前 | トランスポートモード | 説明 | 使用例 |
---|---|---|---|
name | すべてのモード | リモートの virConnectOpen 関数に渡される名前。名前は、通常、リモートの URI から transport、hostname、port number、username、および追加のパラメーターを削除して生成されますが、非常に複雑なケースでは、名前を明示的に指定することをお勧めします。 | name=qemu:///system |
command | ssh と ext | 外部コマンド。ext トランスポートの場合はこれが必要です。ssh の場合、デフォルトは ssh です。コマンド用に PATH が検索されます。 | command=/opt/openssh/bin/ssh |
socket | unix と ssh | UNIX ドメインソケットへのパスで、デフォルトを上書きします。ssh トランスポートの場合は、これがリモートの netcat コマンド (netcat を参照) に渡されます。 | socket=/opt/libvirt/run/libvirt/libvirt-sock |
netcat | ssh |
netcat コマンドを使用して、リモートシステムに接続できます。デフォルトの netcat パラメーターは nc コマンドを使用します。SSH トランスポートの場合、libvirt は以下の形式を使用して SSH コマンドを構築します。
command -p port [-l username ] hostname
netcat -U ソケット
port 、username 、および hostname パラメーターは、リモート URI の一部として指定できます。command 、netcat 、および socket は、他の追加パラメーターから取得されます。
| netcat=/opt/netcat/bin/nc |
no_verify | tls | ゼロ以外の値に設定すると、サーバーの証明書のクライアントチェックが無効になります。クライアントの証明書または IP アドレスのサーバーチェックを無効にするには、libvirtd 設定を変更する必要があります。 | no_verify=1 |
no_tty | ssh | 0 以外の値に設定すると、リモートマシンに自動的にログインできない場合に ssh がパスワードを要求できなくなります。ターミナル へのアクセスがない場合は、これを使用します。 | no_tty=1 |
第6章 KVM でのオーバーコミット
6.1. メモリーのオーバーコミット
6.2. 仮想 CPU のオーバーコミット
第7章 KSM
qemu-kvm
プロセスからメモリーのみが継承されます。ゲスト仮想マシンが実行されると、ゲストが同じオペレーティングシステムまたはアプリケーションを実行しているときに、ゲスト仮想マシンのオペレーティングシステムイメージのコンテンツを共有できます。
/sys/kernel/mm/ksm/merge_across_nodes
を 0
に変更して、NUMA ノード間でページがマージされないようにします。カーネルメモリーが計算した統計情報は、ノード間での大量のマージ後にはそれぞれの間で相反する場合があります。そのため、KSM デーモンが大量のメモリーをマージすると、numad が混乱する可能性があります。システムに未使用のメモリーが大量にあると、KSM デーモンをオフにして無効にすることでパフォーマンスが高まる場合があります。NUMA の詳細は、『Red Hat Enterprise Linux パフォーマンスチューニングガイド』 を参照してください。
ksm
サービスは、KSM カーネルスレッドを開始および停止します。ksmtuned
サービスはksm
を制御し、調整し、同じページのマージを動的に管理します。ksmtuned
サービスはksm
を開始し、メモリー共有が必要ない場合はksm
サービスを停止します。ksmtuned
サービスは、retune
新しいゲストが作成または破棄されたときに実行するパラメーター。
KSM サービス
ksm
サービスは qemu-kvm パッケージに含まれています。KSM は、Red Hat Enterprise Linux 6 ではデフォルトでオフになっています。ただし、Red Hat Enterprise Linux 6 を KVM ホスト物理マシンとして使用する場合は、ksm/ksmtuned
サービスによってオンにされる可能性があります。
ksm
サービスが開始されていない場合、KSM は 2000 ページのみを共有します。このデフォルトは低く、メモリー節約の利点は限られています。
ksm
サービスが開始されると、KSM はホスト物理マシンシステムのメインメモリーの最大半分を共有します。ksm
サービスを開始して、KSM がより多くのメモリーを共有できるようにしてください。
# service ksm start Starting ksm: [ OK ]
ksm
サービスは、デフォルトの起動シーケンスに追加できます。chkconfig コマンドを使用して、ksm
サービスを永続化します。
# chkconfig ksm on
KSM チューニングサービス
ksmtuned
サービスにはオプションがありません。ksmtuned
サービスは、ksm
をループして調整します。さらに、ゲスト仮想マシンが作成または破棄されると、ksmtuned
サービスに libvirt から通知されます。
# service ksmtuned start Starting ksmtuned: [ OK ]
ksmtuned
サービスは、retune
パラメーターを使用して調整できます。retune
パラメーターは、チューニング機能を手動で実行するように ksmtuned
に指示します。
thres
: アクティベーションキーのしきい値 (kbytes)KSM サイクルは、全thres
プロセス RSZ の合計にシステムメモリーの合計にqemu-kvm
値が追加されるとトリガーされます。このパラメーターは、KSM_THRES_COEF
で定義されたパーセンテージの kbytes と同じです。
/etc/ksmtuned.conf
ファイルは、ksmtuned
サービスの設定ファイルです。以下のファイル出力は、デフォルトの ksmtuned.conf
ファイルです。
# Configuration file for ksmtuned. # How long ksmtuned should sleep between tuning adjustments # KSM_MONITOR_INTERVAL=60 # Millisecond sleep between ksm scans for 16Gb server. # Smaller servers sleep more, bigger sleep less. # KSM_SLEEP_MSEC=10 # KSM_NPAGES_BOOST is added to thenpages
value, whenfree memory
is less thanthres
. # KSM_NPAGES_BOOST=300 # KSM_NPAGES_DECAY Value given is subtracted to thenpages
value, whenfree memory
is greater thanthres
. # KSM_NPAGES_DECAY=-50 # KSM_NPAGES_MIN is the lower limit for thenpages
value. # KSM_NPAGES_MIN=64 # KSM_NAGES_MAX is the upper limit for thenpages
value. # KSM_NPAGES_MAX=1250 # KSM_TRES_COEF - is the RAM percentage to be calculated in parameterthres
. # KSM_THRES_COEF=20 # KSM_THRES_CONST - If this is a low memory system, and thethres
value is less thanKSM_THRES_CONST
, then resetthres
value toKSM_THRES_CONST
value. # KSM_THRES_CONST=2048 # uncomment the following to enable ksmtuned debug information # LOGFILE=/var/log/ksmtuned # DEBUG=1
KSM 変数とモニターリング
KSM は、監視データを /sys/kernel/mm/ksm/
ディレクトリーに保存します。このディレクトリー内のファイルは、カーネルによって更新される、KSM の使用状況と統計の正確な記録です。
/etc/ksmtuned.conf
ファイルの設定可能な変数でもあります。
/sys/kernel/mm/ksm/
ファイル
- full_scans
- フルスキャンが実行されます。
- pages_shared
- 共有されたページの総数。
- pages_sharing
- 現在共有されているページ。
- pages_to_scan
- スキャンされていないページ。
- pages_unshared
- 共有されなくなったページ。
- pages_volatile
- 揮発性ページの数。
- run
- KSM プロセスが実行されているかどうか。
- sleep_millisecs
- スリープのミリ秒。
DEBUG=1
行が /etc/ksmtuned.conf
ファイルに追加された場合、KSM チューニングアクティビティーは /var/log/ksmtuned
ログファイルに保存されます。ログファイルの場所は、LOGFILE
パラメーターを使用して変更することができます。ログファイルの場所を変更することはお勧めできません。SELinux 設定の特別な設定が必要になる場合があります。
KSM の非アクティブ化
KSM にはパフォーマンスのオーバーヘッドがあり、特定の環境またはホストの物理マシンシステムには大きすぎる可能性があります。
ksmtuned
および ksm
サービスを停止することで非アクティブ化できます。サービスを停止すると KSM が非アクティブになりますが、再起動後も持続しません。
# service ksmtuned stop Stopping ksmtuned: [ OK ] # service ksm stop Stopping ksm: [ OK ]
# chkconfig ksm off # chkconfig ksmtuned off
第8章 高度なゲスト仮想マシン管理
8.1. コントロールグループ (cgroup)
8.2. Huge Page のサポート
はじめに
x86 CPU は通常、4kB ページのメモリーに対応しますが、Huge Page と呼ばれる大容量のページを使用できます。KVM ゲストは、Transaction Lookaside Buffer (TLB) に対する CPU キャッシュヒットを増やすことでパフォーマンスを向上させるために、Huge Page メモリーサポートを使用してデプロイできます。特に大容量メモリーとメモリーを大量に消費するワークロードなど、Huge Page によってパフォーマンスが大幅に向上する可能性があります。Red Hat Enterprise Linux 6 は、Huge Page を使用してページサイズを大きくすることにより、大量のメモリーをより効果的に管理できます。
Transparent Huge Pages
Transparent Huge Page (THP) は、アプリケーションに必要な TLB エントリーを減らすカーネル機能です。また、すべての空きメモリーをキャッシュとして使用するようにすることで、パフォーマンスが向上します。
qemu.conf
ファイルに特別な設定は必要ありません。/sys/kernel/mm/redhat_transparent_hugepage/enabled
が always に設定されている場合、Huge Page はデフォルトで使用されます。
hugetlbfs
機能の使用は妨げられません。ただし、hugetlbfs が使用されていない場合、KVM は通常の 4kB ページサイズの代わりに透過的な巨大ページを使用します。
8.3. Hyper-V ハイパーバイザーでのゲスト仮想マシンとしての Red Hat Enterprise Linux の実行
- VMBUS プロトコルのアップグレード - VMBUS プロトコルが Windows 8 レベルにアップグレードされました。この作業の一環として、ゲストで利用可能な全仮想 CPU で VMBUS 割り込みを処理できるようになりました。さらに、Red Hat Enterprise Linux ゲスト仮想マシンと Windows ホストの物理マシン間のシグナルプロトコルが最適化されています。
- 合成フレームバッファードライバー - Red Hat Enterprise Linux デスクトップユーザー向けのグラフィックパフォーマンスと優れた解決策を提供します。
- ライブ仮想マシンのバックアップサポート: ライブの Red Hat Enterprise Linux ゲスト仮想マシンの中断のないバックアップサポートをプロビジョニングします。
- 固定サイズの Linux VHD 動的拡張 - ライブマウントされた固定サイズ Red Hat Enterprise Linux VHD の拡張を可能にします。
8.4. ゲスト仮想マシンのメモリー割り当て
- バイトの場合は
b
またはbytes
になります。 - キロバイトの場合は、
KB
になります (10 3 または 1,000 バイトのブロック) - キビバイトの場合は
k
またはKiB
(2 10 または 1024 バイトのブロック) MB
メガバイトの場合 (10 6 または 1,000,000 バイトのブロック)- メビバイトの場合は
M
またはMiB
(220 または 1,048,576 バイトのブロック) GB
(ギガバイト) (109 または 1,000,000,000 バイトのブロック)- ギビバイトの場合は
G
またはGiB
(30 または 1,073,741,824 バイトのブロック) - エクサバイトの場合は
TB
(1012 または 1,000,000,000,000 バイト のブロック) - テビバイトの場合は
T
またはTiB
(2 40 または 1,099,511,627,776 のブロック)
memory unit
により決定されます。デフォルトは、測定単位としての KiB (キビバイト) になります。この値は、210 または 1024 バイトのブロックで乗算されます。
dumpCore
を使用して、ゲスト仮想マシンのメモリーを、生成されるコアダンプ (dumpCore='on'
) に含めるか (dumpCore='off'
) 含まないかを制御できます。デフォルト設定はon
したがって、パラメーターがに設定されていない場合off
、ゲスト仮想マシンのメモリーはコアダンプファイルに含まれます。
currentMemory
属性は、ゲスト仮想マシンの実際のメモリー割り当てを決定します。この値は最大割り当てよりも低くなり、ゲスト仮想マシンのメモリーを即座にバルーンアップすることができます。これを省略すると、デフォルトでは memory 要素と同じ値に設定されます。unit 属性の動作は、メモリーと同じです。
<domain> <memory unit='KiB' dumpCore='off'>524288</memory> <!-- changes the memory unit to KiB and does not allow the guest virtual machine's memory to be included in the generated coredump file --> <currentMemory unit='KiB'>524288</currentMemory> <!-- makes the current memory unit 524288 KiB --> ... </domain>
8.5. ゲスト仮想マシンの自動起動
TestServer
を設定して、ホストの物理マシンのブート時に自動的に起動します。
# virsh autostart TestServer
Domain TestServer marked as autostarted
--disable
パラメーターを使用します。
# virsh autostart --disable TestServer
Domain TestServer unmarked as autostarted
8.6. ゲスト仮想マシンの SMART ディスク監視の無効化
# service smartd stop # chkconfig --del smartd
8.7. VNC サーバーの設定
~/.vnc/xstartup
ファイルを作成してから編集し、vncserver が起動するたびに GNOME セッションを開始します。vncserver スクリプトの初回実行時に、VNC セッションに使用するパスワードの入力が求められます。vnc サーバーファイルの詳細は、『Red Hat Enterprise Linux インストールガイド』 を参照してください。
8.8. 新しい一意の MAC アドレスの生成
macgen.py
として保存します。これで、そのディレクトリーから ./macgen.py を使用してスクリプトを実行でき、新しい MAC アドレスが生成されます。出力の例を以下に示します。
$ ./macgen.py 00:16:3e:20:b0:11
#!/usr/bin/python # macgen.py script to generate a MAC address for guest virtual machines # import random # def randomMAC(): mac = [ 0x00, 0x16, 0x3e, random.randint(0x00, 0x7f), random.randint(0x00, 0xff), random.randint(0x00, 0xff) ] return ':'.join(map(lambda x: "%02x" % x, mac)) # print randomMAC()
8.8.1. ゲスト仮想マシン用に新しい MAC を生成する別の方法
# echo 'import virtinst.util ; print\ virtinst.util.uuidToString(virtinst.util.randomUUID())' | python # echo 'import virtinst.util ; print virtinst.util.randomMAC()' | python
#!/usr/bin/env python # -*- mode: python; -*- print "" print "New UUID:" import virtinst.util ; print virtinst.util.uuidToString(virtinst.util.randomUUID()) print "New MAC:" import virtinst.util ; print virtinst.util.randomMAC() print ""
8.9. ゲスト仮想マシンの応答時間の改善
- 深刻なオーバーコミットされたメモリー。
- プロセッサーの使用率が高いオーバーコミットメモリー
- その他の (qemu-kvm プロセスではない) は、ホストの物理マシンのプロセスがビジー状態または停止している。
8.10. libvirt での仮想マシンタイマー管理
<clock>
要素は、ゲスト仮想マシンのクロックをホスト物理マシンのクロックと同期させる方法を決定するために使用されます。clock 要素には以下の属性があります。
offset
は、ゲスト仮想マシンのクロックがホストの物理マシンのクロックからどのようにオフセットされるかを決定します。offset 属性には、以下の値を使用できます。表8.1 offset 属性値 値 説明 utc ゲスト仮想マシンのクロックは、起動時に UTC に同期されます。 localtime ゲスト仮想マシンのクロックは、起動時にホストの物理マシンの設定済みタイムゾーンに同期されます (存在する場合)。 timezone ゲスト仮想マシンのクロックは、 timezone
属性で指定された特定のタイムゾーンに同期されます。variable ゲスト仮想マシンクロックは UTC の任意のオフセットに同期されます。UTC との相対的なデルタは、 adjustment
属性を使用して秒単位で指定します。ゲスト仮想マシンは、時間の経過とともにリアルタイムクロック (RTC) を自由に調整でき、次の再起動後にそれが受け入れられることを期待しています。これは、utc
モードとは対照的に、リブートごとに RTC の調整が失われます。注記値 utc は、デフォルトで仮想マシンのクロックオフセットとして設定されます。ただし、ゲスト仮想マシンのクロックを localtime の値で実行している場合は、ゲスト仮想マシンのクロックをホスト物理マシンのクロックと同期させるため、クロックオフセットを変更して別の値にする必要があります。timezone
属性は、ゲスト仮想マシンクロックに使用されるタイムゾーンを決定します。adjustment
属性は、ゲスト仮想マシンのクロック同期にデルタを提供します。秒単位で、UTC との相対パスになります。
例8.1 常に UTC に同期する
<clock offset="utc" />
例8.2 常にホストの物理マシンのタイムゾーンに同期する
<clock offset="localtime" />
例8.3 任意のタイムゾーンへの同期
<clock offset="timezone" timezone="Europe/Paris" />
例8.4 UTC + 任意のオフセットに同期する
<clock offset="variable" adjustment="123456" />
8.10.1. クロックのタイマー子要素
name
のみが必要で、他のすべての属性は任意です。
name
属性は使用する時間ソースの型を決定し、以下のいずれかになります。
値 | 説明 |
---|---|
pit | Programmable Interval Timer - 周期的な割り込みがあるタイマーです。 |
rtc | Real Time Clock - 周期的な割り込みがある継続的に実行するタイマー。 |
tsc | Time Stamp Counter: リセットしてからのティック数をカウント、割り込みなし。 |
kvmclock | KVM クロック: KVM ゲスト仮想マシンの推奨されるクロックソース。KVM pvclock または kvm-clock を使用すると、ゲスト仮想マシンがホストの物理マシンのウォールクロックタイムを読み取ることができます。 |
8.10.2. track
track
属性はタイマーによって追跡されるものを指定します。rtc
の名前の値にのみ有効です。
値 | 説明 |
---|---|
boot | 古い ホストの物理マシン オプションに対応します。これはサポート対象外の追跡オプションです。 |
guest | RTC は常にゲスト仮想マシンの時間を追跡します。 |
wall | RTC は常にホスト時間を追跡します。 |
8.10.3. tickpolicy
tickpolicy
属性は、ゲスト仮想マシンにティックを渡すために使用されるポリシーを割り当てます。以下の値を使用できます。
値 | 説明 |
---|---|
delay | 通常のレートで配信を継続します (ティックが遅れます)。 |
catchup | キャッチアップするために、より高いレートで配信されます。 |
merge | ティックが 1 つのティックにマージされます。 |
discard | 不明なティックはすべて破棄されます。 |
8.10.4. 頻度、モード、および表示
frequency
属性は固定頻度を設定するために使用されます。Hz で測定されます。この属性は、name
要素に tsc
の値がある場合にのみ関連します。他のすべてのタイマーは固定周波数 (pit
、rtc
) で動作します。
mode
は、タイムソースがゲスト仮想マシンに公開される方法を決定します。この属性は、tsc
の name 値にのみ関係します。その他のタイマーは常にエミュレートされます。コマンドは以下のようになります。<timer name='tsc' frequency='NNN' mode='auto|native|emulate|smpsafe'/>モードの定義は表に記載されます。
値 | 説明 |
---|---|
auto | TSC が不安定である場合はネイティブで、ネイティブの TSC アクセスを許可します。 |
native | 常にネイティブ TSC アクセスを許可します。 |
エミュレート | 常に TSC をエミュレートします。 |
smpsafe | 常に TSC およびインロック SMP をエミュレートします。 |
present
は、ゲスト仮想マシンに表示されるデフォルトのタイマーセットを上書きするために使用されます。
値 | 説明 |
---|---|
はい | このタイマーがゲスト仮想マシンに表示されるよう強制します。 |
いいえ | このタイマーをゲスト仮想マシンに表示しないように強制します。 |
8.10.5. クロック同期の使用例
例8.5 RTC および PIT タイマーとローカルタイムに同期されるクロック
<clock offset="localtime"> <timer name="rtc" tickpolicy="catchup" track="guest virtual machine" /> <timer name="pit" tickpolicy="delay" /> </clock>
- ゲスト仮想マシンには 1 つの CPU のみを指定可能
- APIC タイマーを無効にする必要があります (noapictimer コマンドラインオプションを使用)
- ゲストで NoHZ モードを無効にする必要があります (nohz = off コマンドラインオプションを使用)
- ゲストでは高解像度タイマーモードを無効にする必要があります (highres = off コマンドラインオプションを使用)
- PIT クロックソースは、高解像度タイマーモードまたは NoHz モードと互換性がありません。
8.11. PMU を使用したゲスト仮想マシンのパフォーマンスの監視
# yum install perf.
8.12. ゲスト仮想マシン電源管理
... <pm> <suspend-to-disk enabled='no'/> <suspend-to-mem enabled='yes'/> </pm> ...
pm
S3 (ディスクへのサスペンド) および S4 (メモリーへのサスペンド) ACPI スリープ状態の BIOS サポートを有効 (はい) または無効 (いいえ) にします。何も指定しないと、ハイパーバイザーはデフォルト値のままになります。
第9章 ゲスト仮想マシンデバイスの設定
- Emulated devices は、実際のハードウェアを模倣する純粋な仮想デバイスであり、未変更のゲストオペレーティングシステムは標準のインボックスドライバーを使用して動作できるようにします。Red Hat Enterprise Linux 6 は、216 virtio デバイスまで対応します。
- VirtIO devices は、仮想マシンで最適に動作するように設計された仮想デバイスです。VirtIO デバイスはエミュレートされたデバイスと似ていますが、Linux 以外の仮想マシンには、デフォルトで必要となるドライバーは含まれません。Virtual Machine Manager (virt-manager) や Red Hat Virtualization Hypervisor などの仮想化管理ソフトウェアは、サポートされている Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 6 は、最大 700 の scsi ディスクに対応します。
- 割り当てられたデバイス は、仮想マシンに公開される物理デバイスです。このメソッドは passthrough としても知られています。デバイスの割り当てにより、仮想マシンはさまざまなタスクで PCI デバイスに排他的にアクセスできるようになり、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように見え、動作します。Red Hat Enterprise Linux 6 は、仮想マシンごとに割り当てられたデバイスを最大 32 個までサポートします。
/etc/security/limits.conf
で設定され、/etc/libvirt/qemu.conf
でオーバーライドできます)。他の制限要因には、仮想バスで利用可能なスロット数や、sysctl で設定されたオープンファイルのシステム全体の制限が含まれます。
allow_unsafe_interrupts
vfio_iommu_type1
モジュールへのオプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。これは、以下を含む /etc/modprobe.d
に .conf ファイル (local.conf
など) を追加することで、永続的に実行できます。
options vfio_iommu_type1 allow_unsafe_interrupts=1または sysfs エントリーを使用して動的に同じことを行います。
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts
9.1. PCI デバイス
手順9.1 PCI デバイス割り当てのための Intel システムの準備
Intel VT-d 仕様を有効にする
Intel VT-d 仕様では、物理デバイスを仮想マシンに直接割り当てるハードウェアサポートが提供されます。この仕様は、Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するために必要です。Intel VT-d 仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。これらの仕様を表示するのに使用される用語はメーカーにより異なります。適切な用語は、システムの製造元のドキュメントを参照してください。カーネルで Intel VT-d をアクティブにします。
/etc/sysconfig/grub
ファイル内の GRUB_CMDLINX_LINUX 行の末尾に、引用符で囲んでintel_iommu=on
パラメーターおよび iommu=pt パラメーターを追加して、カーネル内で Intel VT-d をアクティブにします。以下は、Intel VT-d を有効にした修正grub
です。GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01 vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/ rhcrashkernel-param || :) rhgb quiet intel_iommu=on"
設定ファイルの再生成
以下を実行して /etc/grub2.cfg を再生成します。grub2-mkconfig -o /etc/grub2.cfg
UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg
であることに注意してください。使用準備完了
システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。
手順9.2 PCI デバイス割り当て用の AMD システムの準備
AMD IOMMU 仕様を有効にする
Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するには、AMD IOMMU の仕様が必要です。この仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。IOMMU カーネルサポートの有効化
システムの起動時に AMD IOMMU 仕様が有効になるように、/etc/sysconfig/grub
の GRUB_CMDLINX_LINUX 行の末尾に引用符で囲ってamd_iommu=on
を追加します。設定ファイルの再生成
以下を実行して /etc/grub2.cfg を再生成します。grub2-mkconfig -o /etc/grub2.cfg
UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg
であることに注意してください。使用準備完了
システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。
9.1.1. virsh を使用した PCI デバイスの割り当て
pci_0000_01_00_0
、および完全に仮想化されたゲストマシン guest1-rhel6-64 を持つ PCIe ネットワークコントローラーを使用します。
手順9.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て
デバイスの識別
まず、仮想マシンへのデバイス割り当てに指定されている PCI デバイスを特定します。使用可能な PCI デバイスの一覧を表示する場合は、lspci コマンドを実行します。grep を使用して、lspci の出力を絞り込むことができます。この例では、以下の出力で強調表示されているイーサネットコントローラーを使用します。# lspci | grep Ethernet 00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection 01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
このイーサネットコントローラーは、短い識別子00:19.0
で表示されます。この PCI デバイスを仮想マシンに割り当てるには、virsh が使用する完全な ID を確認する必要があります。これを行うには、virsh nodedev-list コマンドを使用して、ホストマシンに接続されている特定タイプ (pci
) のデバイスをすべて一覧表示します。次に、使用するデバイスの短い識別子にマップする文字列の出力を調べます。この例では、短い識別子00:19.0
を使用して、イーサネットコントローラーにマップする文字列を示しています。この例では、:
と.
が、完全な識別子では、文字はアンダースコアに置き換えられます。# virsh nodedev-list --cap pci pci_0000_00_00_0 pci_0000_00_01_0 pci_0000_00_03_0 pci_0000_00_07_0 pci_0000_00_10_0 pci_0000_00_10_1 pci_0000_00_14_0 pci_0000_00_14_1 pci_0000_00_14_2 pci_0000_00_14_3 pci_0000_00_19_0 pci_0000_00_1a_0 pci_0000_00_1a_1 pci_0000_00_1a_2 pci_0000_00_1a_7 pci_0000_00_1b_0 pci_0000_00_1c_0 pci_0000_00_1c_1 pci_0000_00_1c_4 pci_0000_00_1d_0 pci_0000_00_1d_1 pci_0000_00_1d_2 pci_0000_00_1d_7 pci_0000_00_1e_0 pci_0000_00_1f_0 pci_0000_00_1f_2 pci_0000_00_1f_3 pci_0000_01_00_0 pci_0000_01_00_1 pci_0000_02_00_0 pci_0000_02_00_1 pci_0000_06_00_0 pci_0000_07_02_0 pci_0000_07_03_0
使用するデバイスにマップする PCI デバイス番号を記録します。これは別の手順で必要になります。デバイス情報の確認
ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。virsh nodedev-dumpxml pci_0000_00_19_0 <device> <name>pci_0000_00_19_0</name> <parent>computer</parent> <driver> <name>e1000e</name> </driver> <capability type='pci'> <domain>0</domain> <bus>0</bus> <slot>25</slot> <function>0</function> <product id='0x1502'>82579LM Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <iommuGroup number='7'> <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/> </iommuGroup> </capability> </device>
注記IOMMU グループは、IOMMU からの視認性とデバイスの分離に基づいて決定されます。各 IOMMU グループには、1 つ以上のデバイスを含めることができます。複数のデバイスが存在する場合は、グループ内のすべてのデバイスがゲストに割り当てられるため、IOMMU グループ内のすべてのエンドポイントが要求されます。これは、追加のエンドポイントをゲストに割り当てるか、virsh nodedev-detach を使用してホストドライバーから外すことで実行できます。1 つのグループに含まれるデバイスが複数のゲストに分割されたり、ホストとゲストが分割されたりすることはありません。PCIe root ポート、スイッチポート、ブリッジなどのエンドポイント以外のデバイスは、ホストドライバーから分離しないでください。また、エンドポイントの割り当てに影響を及ぼしません。IOMMU グループ内のデバイスは、virsh nodedev-dumpxml 出力の IOMMU グループセクションを使用して決定できます。グループの各メンバーは、別のアドレスフィールドで提供されます。この情報は、sysfs で以下を使用して取得することもできます。$ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
この出力の例を以下に示します。0000:01:00.0 0000:01:00.1
ゲストに 0000.01.00.0 のみを割り当てるには、ゲストを起動する前に、使用されていないエンドポイントをホストから分離する必要があります。$ virsh nodedev-detach pci_0000_01_00_1
必要な設定の詳細を決定する
設定ファイルに必要な値は、virsh nodedev-dumpxml pci_0000_00_19_0 コマンドの出力を参照してください。この例のデバイスは、bus = 0、slot = 25、および function = 0 の値を持ちます。10 進数の設定では、この 3 つの値が使用されます。bus='0' slot='25' function='0'
設定の詳細の追加
virsh edit を実行し、仮想マシン名を指定し、<source>
セクションにデバイスエントリーを追加して、PCI デバイスをゲスト仮想マシンに割り当てます。# virsh edit guest1-rhel6-64 <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0' bus='0' slot='25' function='0'/> </source> </hostdev>
または、virsh attach-device を実行して、仮想マシンの名前とゲストの XML ファイルを指定します。virsh attach-device guest1-rhel6-64
file.xml
仮想マシンの起動
# virsh start guest1-rhel6-64
9.1.2. virt-manager を使用した PCI デバイスの割り当て
手順9.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て
ハードウェア設定を開く
ゲスト仮想マシンを開き、をクリックして、仮想マシンに新しいデバイスを追加します。図9.1 仮想マシンのハードウェア情報ウィンドウ
PCI デバイスの選択
左側の Hardware 一覧から PCI Host Device を選択します。未使用の PCI デバイスを選択します。別のゲストが使用している PCI デバイスを選択すると、エラーが発生する可能性があります。この例では、予備の 82576 ネットワークデバイスが使用されています。Finish を選択して設定を完了します。図9.2 Add new virtual hardware ウィザード
新しいデバイスの追加
セットアップが完了し、ゲスト仮想マシンが PCI デバイスに直接アクセスできるようになりました。図9.3 仮想マシンのハードウェア情報ウィンドウ
9.1.3. virt-install を使用した PCI デバイスの割り当て
--host-device
パラメーターを使用します。
手順9.5 virt-install を使用した、仮想マシンへの PCI デバイスの割り当て
デバイスの識別
ゲスト仮想マシンにデバイス割り当てに指定されている PCI デバイスを特定します。# lspci | grep Ethernet 00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection 01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
virsh nodedev-list コマンドは、システムに接続されているすべてのデバイスの一覧を表示し、各 PCI デバイスを文字列で識別します。出力を PCI デバイスのみに制限するには、次のコマンドを実行します。# virsh nodedev-list --cap pci pci_0000_00_00_0 pci_0000_00_01_0 pci_0000_00_03_0 pci_0000_00_07_0 pci_0000_00_10_0 pci_0000_00_10_1 pci_0000_00_14_0 pci_0000_00_14_1 pci_0000_00_14_2 pci_0000_00_14_3 pci_0000_00_19_0 pci_0000_00_1a_0 pci_0000_00_1a_1 pci_0000_00_1a_2 pci_0000_00_1a_7 pci_0000_00_1b_0 pci_0000_00_1c_0 pci_0000_00_1c_1 pci_0000_00_1c_4 pci_0000_00_1d_0 pci_0000_00_1d_1 pci_0000_00_1d_2 pci_0000_00_1d_7 pci_0000_00_1e_0 pci_0000_00_1f_0 pci_0000_00_1f_2 pci_0000_00_1f_3 pci_0000_01_00_0 pci_0000_01_00_1 pci_0000_02_00_0 pci_0000_02_00_1 pci_0000_06_00_0 pci_0000_07_02_0 pci_0000_07_03_0
PCI デバイス番号を記録します。この番号は他の手順で確認する必要があります。ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。# virsh nodedev-dumpxml pci_0000_01_00_0 <device> <name>pci_0000_01_00_0</name> <parent>pci_0000_00_01_0</parent> <driver> <name>igb</name> </driver> <capability type='pci'> <domain>0</domain> <bus>1</bus> <slot>0</slot> <function>0</function> <product id='0x10c9'>82576 Gigabit Network Connection</product> <vendor id='0x8086'>Intel Corporation</vendor> <iommuGroup number='7'> <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/> </iommuGroup> </capability> </device>
注記IOMMU グループに複数のエンドポイントがあり、そのすべてがゲストに割り当てられていない場合は、ゲストを起動する前に次のコマンドを実行して、ホストからその他のエンドポイントの割り当てを手動で解除する必要があります。$ virsh nodedev-detach pci_0000_00_19_1
IOMMU グループの詳細は、「virsh を使用した PCI デバイスの割り当て」 の 注記 を参照してください。デバイスの追加
virshnodedev コマンドから出力された PCI 識別子を--host-device
パラメーターの値として使用します。virt-install \ --name=guest1-rhel6-64 \ --disk path=/var/lib/libvirt/images/guest1-rhel6-64.img,size=8 \ --nonsparse --graphics spice \ --vcpus=2 --ram=2048 \ --location=http://example1.com/installation_tree/RHEL6.0-Server-x86_64/os \ --nonetworks \ --os-type=linux \ --os-variant=rhel6 --host-device=pci_0000_01_00_0
インストールを完了する
ゲストのインストールを完了します。PCI デバイスはゲストに接続する必要があります。
9.1.4. 割り当てられた PCI デバイスの取り外し
手順9.6 virsh を使用したゲストからの PCI デバイスの切り離し
デバイスの取り外し
次のコマンドを使用して、ゲストの XML ファイルから PCI デバイスを削除し、ゲストから PCI デバイスを切り離します。# virsh detach-device name_of_guest file.xml
デバイスをホストに再接続します (オプション)。
デバイスがmanaged
モードにある場合は、この手順を省略します。デバイスは自動的にホストに戻ります。デバイスがmanaged
モードを使用していない場合は、以下のコマンドを使用して PCI デバイスをホストマシンに再接続します。# virsh nodedev-reattach device
たとえば、pci_0000_01_00_0
デバイスーをホストコンピューターに再接続するには、次のコマンドを実行します。virsh nodedev-reattach pci_0000_01_00_0
これで、デバイスがホストで使用できるようになります。
手順9.7 virt-manager を使用したゲストからの PCI デバイスの切り離し
仮想ハードウェアの詳細画面を開きます。
virt-manager で、デバイスを含む仮想マシンをダブルクリックします。Show virtual hardware details ボタンを選択すると、仮想ハードウェアの一覧が表示されます。図9.4 仮想ハードウェアの詳細ボタン
デバイスを選択して削除する
左側のパネルにある仮想デバイスの一覧から、取り外す PCI デバイスを選択します。図9.5 取り外す PCI デバイスの選択
9.1.5. PCI ブリッジの作成
9.1.6. PCI パススルー
<source>
要素で指定される PCI ネットワークデバイスは、ジェネリックデバイスパススルーを使用してゲストに直接割り当てられます。このデバイスの MAC アドレスは、最初にオプションで設定された値に設定され、そのデバイスの MAC アドレスがオプションで指定された virtualport 要素を使用して 802.1Qbh 対応スイッチに関連付けられます (<type='direct'>
ネットワークデバイスの場合は、上記の仮想ポートの例を参照してください)。標準的なシングルポートの PCI イーサネットカードドライバー設計の制限により、この方法で割り当てることができるのは Single Root I/O Virtualization (SR-IOV) virtual function (VF) デバイスのみとなります。標準的なシングルポートの PCI または PCIe イーサネットカードをゲストに割り当てる場合は、従来の <hostdev>
デバイス定義を使用します。
<type='hostdev'>
インターフェイスは name 属性を持つオプションのドライバーサブ要素を持つことができます vfio に設定します。従来の KVM デバイス割り当てを使用するには、名前を kvm に設定できます (または、現在、<driver ='kvm'>
がデフォルトであるため、単に <driver>
要素を省略します)。
<hostdev>
デバイスの機能と非常に似ています。相違点は、パススルーデバイスに MAC アドレスと<virtualport>
を指定できることです。これらの機能が必要ない場合、SR-IOV をサポートしない標準のシングルポート PCI、PCIe、または USB ネットワークカードを使用している場合 (したがって、ゲストドメインに割り当てられた後、リセット中に設定された MAC アドレスが失われます)、または 0.9.11 より前のバージョンの libvirt を使用している場合は、<interface type='hostdev'/>
の代わりに、標準の <hostdev>
を使用してデバイスをゲストに割り当てる必要があります。
図9.6 PCI デバイスの割り当ての XML 例
<devices> <interface type='hostdev'> <driver name='vfio'/> <source> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </source> <mac address='52:54:00:6d:90:02'> <virtualport type='802.1Qbh'> <parameters profileid='finance'/> </virtualport> </interface> </devices>
9.1.7. SR-IOV デバイスを使用した PCI 割り当て (パススルー) の設定
<hostdev>
要素を使用して割り当てることができますが、SR-IOV VF ネットワークデバイスには永続的な一意の MAC アドレスがないため、ホストの物理マシンを再起動するたびにゲスト仮想マシンのネットワーク設定を再設定する必要があります。これを解決するには、VF をホスト物理マシンに割り当てる前に MAC アドレスを設定する必要があり、ゲスト仮想マシンが起動するたびにこれを設定する必要があります。この MAC アドレスやその他のオプションを割り当てるには、手順9.8「SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定」の手順を参照してください。
手順9.8 SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定
<mac>
、<vlan>
、および <virtualport>
要素は <hostdev>
の有効な子ではないため、<hostdev>
要素は MAC アドレス割り当て、vLAN タグ ID 割り当て、仮想ポート割り当てなどの機能固有の項目には使用できないことに注意してください。これらは <インターフェイス>
で有効であるため、新しいインターフェイスタイプのサポートが追加されました (<interface type='hostdev'>
)。この新しいインターフェイスデバイスタイプは、<インターフェイス>
と <hostdev>
のハイブリッドとして動作します。そのため、libvirt は、ゲスト仮想マシンに PCI デバイスを割り当てる前に、ゲスト仮想マシンの XML 設定ファイルに示されているネットワーク固有のハードウェア/スイッチを初期化します (MAC アドレスの設定、vLAN タグの設定、802.1Qbh スイッチへの関連付けなど)。vLAN タグの設定に関する詳細は、「vLAN タグの設定」 を参照してください。
ゲスト仮想マシンをシャットダウンします。
virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。# virsh shutdown guestVM
情報の収集
<interface type='hostdev'>
を使用するには、SR-IOV 対応のネットワークカード、Intel VT-d 拡張機能または AMD IOMMU 拡張機能に対応するホストの物理マシンハードウェアが必要で、割り当てる VF の PCI アドレスを把握している必要があります。編集する XML ファイルを開く
# virsh save-image-edit コマンドを実行し、XML ファイルを編集用に開きます (詳細は 「ドメイン XML 設定ファイルの編集」 を参照してください)。ゲスト仮想マシンを以前の実行状態に復元する必要があるため、この場合は--running
が使用されます。この例の設定ファイルの名前は guestVM.xml です。ゲスト仮想マシンの名前は guestVM です。# virsh save-image-edit guestVM.xml
--running
guestVM.xmlがデフォルトのエディターで開きます。XML ファイルの編集
設定ファイル (guestVM.xml) を更新して、以下のような<devices>
エントリーが表示されるようにします。図9.7 hostdev インターフェイスタイプのサンプルドメイン XML
<devices> ... <interface type='hostdev' managed='yes'> <source> <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well--> </source> <mac address='52:54:00:6d:90:02'/> <!--sets the mac address--> <virtualport type='802.1Qbh'> <!--sets the virtual port for the 802.1Qbh switch--> <parameters profileid='finance'/> </virtualport> <vlan> <!--sets the vlan tag--> <tag id='42'/> </vlan> </interface> ... </devices>
MAC アドレスを指定しないと、その他のタイプのインターフェイスデバイスと同様に、MAC アドレスが自動的に生成されることに注意してください。また、<virtualport>
要素は、802.11Qgh ハードウェアスイッチ(802.11Qbg)に接続する場合にのみ使用されます。"VEPA")スイッチは現在サポートされていません。ゲスト仮想マシンの再起動
virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。# virsh start guestVM
ゲスト仮想マシンは起動時に、設定された MAC アドレスを持つ、物理ホストマシンのアダプターにより提供されたネットワークデバイスを認識します。この MAC アドレスは、ゲスト仮想マシンやホストの物理マシンを再起動しても変更されません。
9.1.8. SR-IOV 仮想機能のプールからの PCI デバイス割り当ての設定
- 指定の VF は、ゲスト仮想マシンが起動したときにいつでも利用できる必要があります。つまり、管理者は、各 VF を 1 つのゲスト仮想マシンに永続的に割り当てる必要があります (または、各ゲスト仮想マシンの設定ファイルを変更して、ゲスト仮想マシンが起動するたびに現在使用されていない VF の PCI アドレスを指定します)。
- ゲスト仮想マシンを別のホスト物理マシンに移動する場合は、そのホスト物理マシンのハードウェアが PCI バス上の同じ場所にある必要があります (または、ゲスト仮想マシンの設定を起動前に変更する必要があります)。
手順9.9 デバイスプールの作成
ゲスト仮想マシンをシャットダウンします。
virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン、再起動、および強制シャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。# virsh shutdown guestVM
設定ファイルの作成
任意のエディターを使用して、/tmp
ディレクトリーに XML ファイル (名前は passthrough.xml など) を作成します。pf dev='eth3'
を、ご使用の SR-IOV デバイスの PF の netdev 名に置き換えてください。以下は、ホスト物理マシンの "eth3' にある physical function (PF) を持つ SR-IOV アダプターのすべての VF のプールを使用できるようにするネットワーク定義の例です。図9.8 サンプルのネットワーク定義ドメイン XML
<network> <name>passthrough</name> <!--This is the name of the file you created--> <forward mode='hostdev' managed='yes'> <pf dev='myNetDevName'/> <!--Use the netdev name of your SR-IOV devices PF here--> </forward> </network>
新しい XML ファイルの読み込み
/tmp/passthrough.xml を、前の手順で作成した XML ファイルの名前と場所に置き換え、次のコマンドを実行します。# virsh net-define /tmp/passthrough.xml
ゲストの再起動
以下の passthrough.xml を、前の手順で作成した XML ファイルの名前に置き換えます。# virsh net-autostart passthrough # virsh net-start passthrough
ゲスト仮想マシンの再起動
virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。# virsh start guestVM
デバイスのパススルーの開始
表示されているデバイスは 1 つだけですが、libvirt は、ゲスト仮想マシンが次のようなドメイン XML のインターフェイス定義で初めて起動されたときに、その PF に関連付けられているすべての VF のリストを自動的に取得します。図9.9 インターフェイスネットワーク定義のサンプルドメイン XML
<interface type='network'> <source network='passthrough'> </interface>
検証
ネットワークを使用する最初のゲストを起動したら、virsh net-dumpxml passthrough コマンドを実行し、これを確認できます。以下のような出力が得られます。図9.10 XML ダンプファイルのpassthroughコンテンツ
<network connections='1'> <name>passthrough</name> <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid> <forward mode='hostdev' managed='yes'> <pf dev='eth3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/> <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/> </forward> </network>
9.2. USB デバイス
9.2.1. ゲスト仮想マシンへの USB デバイスの割り当て
- USB パススルーを使用する - これにより、デバイスが、ゲスト仮想マシンをホストしているホストの物理マシンに物理的に接続されます。この場合は SPICE は必要ありません。ホストの USB デバイスは、コマンドラインまたは virt-manager を使用してゲストに渡すことができます。virt manager の方向については、「ゲスト仮想マシンへの USB デバイスの接続」 を参照してください。注記virt-manager は、ホットプラグまたはホットアンプラグデバイスに使用しないでください。USB デバイスをホットプラグまたはホットアンプラグする場合は、手順14.1「ゲスト仮想マシンが使用するホットプラグ USB デバイス」 を参照してください。
- USB リダイレクトの使用 - USB リダイレクトは、データセンターで実行されているホスト物理マシンがある場合に最適です。ユーザーは、ローカルマシンまたはシンクライアントからゲスト仮想マシンに接続します。このローカルマシンには SPICE クライアントがあります。ユーザーは、任意の USB デバイスをシンクライアントに接続できます。SPICE クライアントは、デバイスをデータセンターのホスト物理マシンにリダイレクトするため、シンクライアントで実行しているゲスト仮想マシンで使用できます。virt-manager を使用した USB リダイレクトの手順については、「ゲスト仮想マシンへの USB デバイスの接続」 を参照してください。TCP プロトコルを使用した USB リダイレクトはできないことに注意してください (BZ#1085318 を参照)。
9.2.2. USB デバイスリダイレクトの制限の設定
-device usb-redir
に渡します。filter プロパティーは、フィルタールールで設定される文字列を取ります。ルールの形式は以下のとおりです。
<class>:<vendor>:<product>:<version>:<allow>
-1
の値を使用して、特定のフィールドに任意の値を受け入れるように指定します。同じコマンドラインで、| を区切り文字として使用し、複数のルールを使用できます。
例9.1 Windows ゲスト仮想マシンを使用したリダイレクトを制限する例
- Windows 7 ゲスト仮想マシンを準備します。
- 以下のコード抜粋をゲスト仮想マシンのドメイン xml ファイルに追加します。
<redirdev bus='usb' type='spicevmc'> <alias name='redir0'/> <address type='usb' bus='0' port='3'/> </redirdev> <redirfilter> <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/> <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/> </redirfilter>
- ゲスト仮想マシンを起動し、次のコマンドを実行して設定の変更を確認します。
#ps -ef | grep $guest_name
-device usb-redir,chardev=charredir0,id=redir0,/ filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
- USB デバイスをホストの物理マシンに接続し、virt-manager を使用してゲスト仮想マシンに接続します。
- メニューでをクリックすると、Some USB devices are blocked by host policy というメッセージが表示されます。 をクリックして確定し、続行します。フィルターが有効になります。
- フィルターが正しくキャプチャーされていることを確認するには、USB デバイスのベンダーと製品を確認してから、USB リダイレクトを可能にするために、テストの仮想マシンのドメイン XML で次の変更を行います。
<redirfilter> <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/> <usbdev allow='no'/> </redirfilter>
- ゲスト仮想マシンを再起動してから、virt-viewer を使用してゲスト仮想マシンに接続します。これで、USB デバイスはトラフィックをゲスト仮想マシンにリダイレクトするようになります。
9.3. デバイスコントローラーの設定
図9.11 仮想コントローラーのドメイン XML の例
... <devices> <controller type='ide' index='0'/> <controller type='virtio-serial' index='0' ports='16' vectors='4'/> <controller type='virtio-serial' index='1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </controller> ... </devices> ...
<controller type>
があり、これは次のいずれかになります。
- ide
- fdc
- scsi
- sata
- usb
- ccid
- virtio-serial
- pci
<controller>
要素には必須の属性 <controller index>
があります。これは、バスコントローラーが発生した順序を表す 10 進数の整数です (<address>
要素のコントローラー属性で使用されます)。<controller type ='virtio-serial'>
には、追加のオプション属性 (ports
および vectors
) が 2 つあります。これは、コントローラーを介して接続できるデバイスの数を制御します。Red Hat Enterprise Linux 6 は、デバイスあたり 32 を超えるベクターの使用をサポートしていないことに注意してください。よりベクトルを使用すると、ゲスト仮想マシンの移行でエラーが発生します。
<controller type ='scsi'>
の場合、以下の値を持つことができる任意の属性model
モデルがあります。
- auto
- buslogic
- ibmvscsi
- lsilogic
- lsisas1068
- lsisas1078
- virtio-scsi
- vmpvscsi
<controller type ='usb'>
の場合、以下の値を持つことができる任意の属性model
モデルがあります。
- piix3-uhci
- piix4-uhci
- ehci
- ich9-ehci1
- ich9-uhci1
- ich9-uhci2
- ich9-uhci3
- vt82c686b-uhci
- pci-ohci
- nec-xhci
<model='none'>
を使用できます。 .
<address>
は、「デバイスのアドレスの設定」 に示したセマンティクスを使用して、コントローラーとマスターバスの正確な関係を指定できます。
<driver>
は、ドライバー固有のオプションを指定できます。現在、コントローラーのキューの数を指定する属性キューのみをサポートしています。パフォーマンスを最適化するには、vCPU の数に一致する値を指定することが推奨されます。
<master>
があります。コンパニオンコントローラーはマスターと同じバスにあるため、コンパニオン index
は等しい値になります。
図9.12 USB コントローラーのドメイン XML の例
... <devices> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0' bus='0' slot='4' function='7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/> </controller> ... </devices> ...
model
属性があります。
- pci-root
- pcie-root
- pci-bridge
- dmi-to-pci-bridge
pci-root
および pcie-root
) には、64 ビット PCI ホールの大きさ (キロバイト単位、または pcihole64
の unit
属性で指定された単位) を指定するオプションの pcihole64
要素があります。一部のゲスト仮想マシン (Windows Server 2003) は、unit
が無効になっていない限り (0 unit='0'
に設定)、クラッシュを引き起こす可能性があります。
index='0'
を使用する pci-root コントローラーは自動追加され、PCI デバイスを使用する必要があります。pci-root にはアドレスがありません。PCI ブリッジは、model='pci-root'
が提供する 1 つのバスに収まらないデバイスが多すぎる場合、または 0 を超える PCI バス番号が指定されている場合に自動追加されます。PCI ブリッジは手動で指定することもできますが、そのアドレスには、指定されている PCI コントローラーが提供する PCI バスのみが表示されるようにしてください。PCI コントローラーインデックスにギャップがあると、設定が無効になる場合があります。以下の XML サンプルは、<devices>
セクションに追加できます。
図9.13 PCI ブリッジのドメイン XML の例
... <devices> <controller type='pci' index='0' model='pci-root'/> <controller type='pci' index='1' model='pci-bridge'> <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='off'/> </controller> </devices> ...
index='0'
を使用する pcie-root コントローラーはドメインの設定に自動的に追加されます。pcie-root にはアドレスはありませんが、31 スロット (1-31 の番号) を提供し、PCIe デバイスの接続にのみ使用できます。pcie-root コントローラーを持つシステムで標準的な PCI デバイスを接続するには、model='dmi-to-pci-bridge'
を持つ pci コントローラーが自動的に追加されます。dmi-to-pci-bridge コントローラーは、(pcie-root が提供するように) PCIe スロットに接続し、それ自体で 31 個の標準的な PCI スロットを提供します (これはホットプラグできません)。ゲストシステムにホットプラグ可能な PCI スロットを確保するために、pci-bridge コントローラーも自動的に作成され、自動作成された dmi-to-pci-bridge コントローラーのスロットの 1 つに接続されます。PCI アドレスが libvirt により自動決定されるすべてのゲストデバイスは、この pci-bridge デバイスに配置されます。
図9.14 PCIe (PCI express) のようなドメイン XML
... <devices> <controller type='pci' index='0' model='pcie-root'/> <controller type='pci' index='1' model='dmi-to-pci-bridge'> <address type='pci' domain='0' bus='0' slot='0xe' function='0'/> </controller> <controller type='pci' index='2' model='pci-bridge'> <address type='pci' domain='0' bus='1' slot='1' function='0'/> </controller> </devices> ...
9.4. デバイスのアドレスの設定
<address>
サブ要素があります。入力でアドレス (またはアドレス内の任意の属性) が省略された場合 libvirt は適切なアドレスを生成します。レイアウトをさらに制御する必要がある場合は明示的なアドレスが必要になります。<address>
要素を含むドメイン XML デバイスの例は、図9.6「PCI デバイスの割り当ての XML 例」 を参照してください。
type
があります。特定のデバイスに使用するアドレスの選択は、デバイスやゲスト仮想マシンのアーキテクチャーによって一部が制約されます。たとえば、<disk>
デバイスは type='drive'
を使用し、<console>
デバイスは i686 または x86_64 ゲスト仮想マシンアーキテクチャー で type='pci'
を使用します。各アドレスタイプには、表に記載されているように、バス上のどこにデバイスを配置するかを制御するオプションの属性がさらにあります。
アドレスの種類 | 説明 |
---|---|
type='pci' | PCI アドレスには、以下の追加属性があります。
|
type='drive' | ドライブアドレスには、以下の追加属性があります。
|
type='virtio-serial' | 各 virtio-serial アドレスには、以下の追加属性があります。
|
type='ccid' | スマートカード用の CCID アドレスには、以下の追加属性があります。
|
type='usb' | USB アドレスには、以下の追加属性があります。
|
type='isa' | ISA アドレスには、以下の追加属性があります。
|
9.5. ゲスト仮想マシンでのストレージコントローラーの管理
- virtio-scsi コントローラーを介して仮想ハードドライブまたは CD を接続します。
- QEMU scsi-block デバイスを介してホストからゲストに物理 SCSI デバイスをパススルーします。
- ゲストごとに数百台のデバイスを使用できるようにします。virtio-blk の 28 デバイスの制限からの改善。
手順9.10 仮想 SCSI コントローラーの作成
- ゲスト仮想マシン (
Guest1
) の設定を表示し、以前から存在している SCSI コントローラーを検索します。# virsh dumpxml Guest1 | grep controller.*scsi
デバイスコントローラーが存在する場合は、このコマンドにより、次のような行が 1 つ以上出力されます。<controller type='scsi' model='virtio-scsi' index='0'/>
- 前の手順でデバイスコントローラーが表示されなかった場合は、以下の手順に従って、新しいファイルにデバイスコントローラーの説明を作成し、仮想マシンに追加します。
- 新しいファイルに
<controller>
要素を書き込んでデバイスコントローラーを作成し、このファイルに XML 拡張子で保存します。virtio-scsi-controller.xml
など。<controller type='scsi' model='virtio-scsi'/>
virtio-scsi-controller.xml
で作成したデバイスコントローラーをゲスト仮想マシン (例: Guest1) に関連付けます。# virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
この例では、--config
オプションはディスクと同じように動作します。詳細は、手順13.2「ゲストへの物理ブロックデバイスの追加」 を参照してください。
- 新しい SCSI ディスクまたは CD-ROM を追加します。新しいディスクは、「 ゲストへのファイルベースストレージの追加」 セクションおよび 「ゲストへのハードドライブおよびその他のブロックデバイスの追加」 セクションの方法を使用して追加できます。SCSI ディスクを作成する場合は、sd で始まるターゲットデバイス名を指定します。
# virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
ゲスト仮想マシンのドライバーのバージョンによっては、実行中のゲスト仮想マシンで新しいディスクがすぐに検出されない場合があります。『Red Hat Enterprise Linux Storage Administration Guide』 の手順に従います。
9.6. 乱数ジェネレーター (RNG) デバイス
virtio-rng
は、仮想 RNG (random number generator) デバイスであり、RNG データをゲスト仮想マシンのオペレーティングシステムにフィードします。これにより、要求に応じてゲスト仮想マシンに新しいエントロピーを提供します。
virtio-rng
が有効になっている場合、chardev はゲスト仮想マシンの /dev/hwrng/
の場所に作成されます。次に、この文字 dev を開いて読み取り、ホストの物理マシンからエントロピーをフェッチできます。ゲスト仮想マシンのアプリケーションが virtio-rng デバイスからのランダム性を透過的に使用することで利益を得るには、/dev/hwrng/
からの入力をゲスト仮想マシンのカーネルエントロピープールに中継する必要があります。これは、この場所の情報が rgnd デーモン (rng-tools 内に含まれている) と結合されている場合に実行できます。
/dev/random
ファイルにルーティングされます。このプロセスは、Red Hat Enterprise Linux 6 ゲスト仮想マシンで手動で行います。
# rngd -b -r /dev/hwrng/ -o /dev/random/
viorng
をインストールする必要があります。インストールが完了すると、仮想 RNG デバイスは Microsoft が提供する CNG(手動生成)API を使用して機能します。ドライバーがインストールされると、virtrng
デバイスが RNG プロバイダーのリストに表示されます。
手順9.11 コマンドラインツールでの virtio-rng の実装
- ゲスト仮想マシンをシャットダウンします。
- ターミナルウィンドウで、virsh edit domain-name コマンドを使用して、目的のゲスト仮想マシンの XML ファイルを開きます。
<devices>
要素を編集して、以下の内容を追加します。... <devices> <rng model='virtio'> <rate period="2000" bytes="1234"/> <backend model='random'>/dev/random</backend> <source mode='bind' service='1234'> <source mode='connect' host='192.0.2.1' service='1234'> </backend> </rng> </devices> ...
第10章 qemu-img および QEMU ゲストエージェント
/usr/share/doc/qemu-*/README.systemtap
。
10.1. qemu-img の使用
チェック
ディスクイメージの filename で整合性チェックを実行します。
# qemu-img check -f qcow2 --output=qcow2 -r all filename-img.qcow2
qcow2
および vdi
形式のみが整合性チェックに対応します。
-r
を使用すると、チェック中に見つかった不整合を修復しようとしますが、-r leaks
クラスターのリークで使用されると修復され、-r all
ですべての種類のエラーが修正されます。これには、間違った修正を選択したり、すでに発生している可能性のある破損の問題を隠したりするリスクがあることに注意してください。
Commit
指定したイメージファイル (filename) に記録された変更を、qemu-img commit コマンドでファイルのベースイメージにコミットします。オプションで、ファイルのフォーマットタイプ (format) を指定します。
# qemu-img commit [-fformat
] [-tcache
] filename
convert
convert
オプションは、認識されているイメージ形式を別のイメージ形式に変換するために使用されます。
# qemu-img convert [-c] [-p] [-fformat
] [-tcache
] [-Ooutput_format
] [-ooptions
] [-Ssparse_size
] filename output_filename
-p
パラメーターはコマンドの進捗を示し (すべてのコマンドではなく任意)、-S
フラグは、ディスクイメージに含まれる sparse file の作成を許可します。ゼロのみを含む (何も含まない) 物理ブロックを除いて、あらゆる目的のスパースファイルは標準ファイルのように機能します。オペレーティングシステムがこのファイルを認識すると、たとえ実際にはディスクを使用していなくても、存在しているものとして扱われ、実際のディスク領域を消費します。ゲスト仮想マシン用のディスクを作成する場合に特に役立ちます。これにより、ディスクに必要なディスク領域よりもはるかに多くのディスク領域が使用されるようになります。たとえば、10Gb のディスクイメージで -S を 50Gb に設定すると、実際には 10Gb しか使用されていなくても、そのディスク領域の 10Gb は 60Gb に見えます。
filename
形式を使用して、ディスクイメージ output_filename
をディスクイメージ output_format
に変換します。ディスクイメージは、-c
オプションで圧縮するか、-o encryption
を設定して -o
オプションで暗号化できます。-o
パラメーターで使用できるオプションは、選択した形式とは異なることに注意してください。
qcow2
形式のみが暗号化または圧縮をサポートします。qcow2
暗号化は、安全な 128 ビット鍵で AES 形式を使用します。qcow2
圧縮は読み取り専用であるため、圧縮したセクターが qcow2
形式から変換されると、非圧縮データとして新しい形式に書き込まれます。
Create
サイズsize
、フォーマットformat
、新しいディスクイメージの ファイル名を作成します。
# qemu-img create [-fformat
] [-o options] filename [size
][preallocation
]
-o backing_file=filename
で指定されている場合は、イメージ自体とベースイメージの違いのみが記録されます。バッキングファイルは、commit コマンドを使用しない限り変更されません。この場合、サイズの指定は必要ありません。
-o preallocation=off|meta|full|falloc
が含まれます。事前に割り当てられたメタデータを持つイメージは、イメージよりも大きくなります。ただし、イメージサイズが大きくなると、イメージのサイズが大きくなるとパフォーマンスが向上します。
full
割り当ての使用には、イメージのサイズが大きい場合に時間がかかる可能性があることに注意してください。完全な割り当てと時間が経つ必要がある場合、フラックを使用 falloc
時間を節約できます。
Info
info パラメーターは、ディスクイメージのfilenameに関する情報を表示します。info オプションの形式は、以下のとおりです。
# qemu-img info [-f format] filename
qcow2
イメージが使用している領域を表示します。これは、qemu-img を実行して行います。使用中のイメージが、qemu-img check コマンドで qemu-img info コマンドの出力と一致するイメージであることを確認できます。「qemu-img の使用」 を参照してください。
# qemu-img info /dev/vg-90.100-sluo/lv-90-100-sluo image: /dev/vg-90.100-sluo/lv-90-100-sluo file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 0 cluster_size: 65536
マップ
# qemu-img map [-f format] [--output=output_format] filename コマンドは、イメージファイル名のメタデータとそのバッキングファイルチェーンをダンプします。具体的には、このコマンドは、指定されたファイルのすべてのセクターの割り当て状態を、それをバッキングファイルチェーンに割り当てる最上位のファイルとともにダンプします。たとえば、c.qcow2 → b.qcow2 → a.qcow2 などのチェーンがある場合、a.qcow2 が元のファイルである場合、b.qcow2 は a.qcow2 に加えられた変更で、c.qcow2 は b.qcow2 のデルタファイルになります。このチェーンが作成されると、イメージファイルは通常のイメージデータを保存し、どのファイルの場所とそれがファイルに保存されるかに関する情報も保存されます。この情報は、イメージのメタデータと呼ばれます。-f
フォーマットオプションは、指定されたイメージファイルのフォーマットです。raw、qcow2、vhdx、vmdk などの形式を使用できます。可能な出力オプションには、human
と json
の 2 つがあります。
human
がデフォルト設定です。人間の目に読みやすくなるように設計されているため、この形式は解析しないでください。明確さと単純さのために、デフォルトのhuman
フォーマットは、ファイルの既知のゼロ以外の領域のみをダンプします。ファイルの既知のゼロの部分は完全に省略され、同様にチェーン全体に割り当てられていない部分も省略されます。コマンドが実行されると、qemu-img 出力は、データを読み取ることができるファイルと、ファイル内のオフセットを識別します。出力は、4 列のテーブルとして表示されます。最初の 3 つは 16 進数です。# qemu-img map -f qcow2 --output=human /tmp/test.qcow2 Offset Length Mapped to File 0 0x20000 0x50000 /tmp/test.qcow2 0x100000 0x80000 0x70000 /tmp/test.qcow2 0x200000 0x1f0000 0xf0000 /tmp/test.qcow2 0x3c00000 0x20000 0x2e0000 /tmp/test.qcow2 0x3fd0000 0x10000 0x300000 /tmp/test.qcow2
json
、つまり JSON (JavaScript Object Notation) は、人間が読むこともできますが、プログラミング言語であるため、解析することも前提に設計されています。たとえば、パーサーで qemu-img map の出力を解析する場合は、オプション--output=json
を使用する必要があります。# qemu-img map -f qcow2 --output=json /tmp/test.qcow2 [{ "start": 0, "length": 131072, "depth": 0, "zero": false, "data": true, "offset": 327680}, { "start": 131072, "length": 917504, "depth": 0, "zero": true, "data": false},
JSON 形式の詳細については、qemu-img (1) の man ページを参照してください。
リベース
イメージのバッキングファイルを変更します。
# qemu-img rebase [-f format] [-t cache] [-p] [-u] -b backing_file [-F backing_format] filename
qcow2
形式のみです。
サイズの変更
サイズ sizeで作成されたかのように、ディスクイメージのfilenameを変更します。バージョンに関係なく、サイズ変更できるのは raw 形式のイメージのみです。Red Hat Enterprise Linux 6.1 以降では、qcow2
フォーマットでイメージを拡大 (縮小はしない) する機能が追加されています。
# qemu-img resize filename size
+
を付けて拡大するか、-
を付けてディスクイメージのサイズをそのバイト数だけ縮小します。ユニットの接尾辞を追加すると、イメージのサイズをキロバイト (K)、メガバイト (M)、ギガバイト (G)、またはテラバイト (T) で設定できます。
# qemu-img resize filename [+|-]size[K|M|G|T]
スナップショット
イメージ (ファイル名) の既存のスナップショット (スナップショット) を一覧表示、適用、作成、または削除します。
# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
サポート対象の形式
qemu-img は、ファイルを次のいずれかのフォーマットに変換するように設計されています。
-
raw
- Raw ディスクイメージ形式 (デフォルト)これは、ファイルベースで最も高速な形式になります。ファイルシステムがホールをサポートしている場合 (たとえば、Linux の ext2 または ext3、Windows の NTFS)、書き込まれたセクターのみがスペースを予約します。qemu-img info を使用して、イメージが使用する実際のサイズを取得するか、Unix/Linux の ls -ls を取得します。Raw イメージは最適なパフォーマンスを提供しますが、Raw イメージで使用できるのは非常に基本的な機能のみです (たとえば、スナップショットは使用できません)。
-
qcow2
- QEMU イメージ形式。最も汎用性が高く、機能セットが最適な形式です。これを使用して、オプションの AES 暗号化、zlib ベースの圧縮、複数の VM スナップショットのサポート、およびホールをサポートしないファイルシステム (Windows 上の非 NTFS ファイルシステム) で役立つ小さなイメージを使用します。この拡張機能セットはパフォーマンスに影響を与えることに注意してください。
raw
、または qcow2
形式に変換するために、以下の形式も認識してサポートします。イメージの形式は、通常、自動的に検出されます。この形式を raw
または qcow2
に変換することに加えて、raw
または qcow2
から元の形式に戻すことができます。
- bochs
- Bochs ディスクイメージ形式。
- cloop
- Linux Compressed Loop イメージ。Knoppix CD-ROM などにある直接圧縮 CD-ROM イメージを再利用する場合にのみ役立ちます。
- cow
- User Mode Linux Copy On Write イメージ形式。cow 形式は、以前のバージョンとの互換性のためにのみ同梱されています。Windows では動作しません。
- dmg
- Mac ディスクイメージフォーマット。
- nbd
- ネットワークブロックデバイス。
- parallels
- Parallels 仮想化ディスクイメージフォーマット。
- qcow
- 古い QEMU イメージフォーマット。古いバージョンとの互換性にのみ含まれます。
- vdi
- Oracle VM VirtualBox ハードディスクイメージ形式。
- vmdk
- VMware 互換のイメージフォーマット (バージョン 1 および 2 の読み取り/書き込みサポート、およびバージョン 3 の読み取り専用サポート)。
- vpc
- WindowsVirtualPC のディスクイメージフォーマット。
vhd
、または Microsoft 仮想ハードディスクイメージフォーマットとも呼ばれます。 - vvfat
- 仮想 VFAT ディスクイメージフォーマット。
10.2. QEMU ゲストエージェント
10.2.1. ゲストエージェントをインストールして有効にする
10.2.2. ゲストエージェントとホスト間の通信の設定
手順10.1 ゲストエージェントとホスト間の通信の設定
ゲスト XML を開きます
QEMU ゲストエージェント設定でゲスト XML を開きます。ファイルを開くにはゲスト名が必要です。ホストマシンでコマンド #virsh list を使用して、認識できるゲストを一覧表示します。この例では、ゲストの名前は rhel6 です。# virsh edit rhel6
ゲスト XML ファイルを編集します
次の要素を XML ファイルに追加し、変更を保存します。図10.1 ゲスト XML を編集して QEMU ゲストエージェントを設定する
<channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/rhel6.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
ゲストでの QEMU ゲストエージェントの起動
まだ行っていない場合は、yum install qemu-guest-agent を使用してゲスト仮想マシンにゲストエージェントをダウンロードしてインストールします。インストールしたら、次のようにサービスを開始します。# service start qemu-guest-agent
10.2.3. QEMU ゲストエージェントの使用
- qemu-guest-agentは、クライアントがチャネルに接続したかどうかを検出することはできません。
- クライアントが、qemu-guest-agent がバックエンドに切断または再接続したかどうかを検出する方法はありません。
- virtio-serial デバイスがリセットされ、qemu-guest-agentチャネルに接続されていない場合 (通常、再起動またはホットプラグが原因)、クライアントからのデータはドロップされます。
- virtio-serial デバイスのリセット後に qemu-guest-agent がチャネルに接続した場合、qemu-guest-agent がまだ実行中か接続中かにかかわらず、クライアントからのデータはキューに入れられます (そして利用可能なバッファーを使い切ると最終的にスロットルに入れられます)。
10.2.4. libvirt での QEMU ゲストエージェントの使用
- virsh shutdown --mode=agent - このシャットダウン方法は、virsh shutdown --mode=acpi よりも信頼性が高くなります。QEMU ゲストエージェントで使用する virsh shutdown は、クリーンな状態で協調ゲストをシャットダウンすることが保証されます。エージェントが存在しない場合、libvirt は代わりに ACPI シャットダウンイベントの挿入に依存する必要がありますが、一部のゲストはそのイベントを無視するため、シャットダウンしません。virsh reboot と同じ構文で使用できます。
- virsh snapshot-create --quiesce - スナップショットが作成される前に、ゲストが I / O を安定した状態にフラッシュできるようにします。これにより、fsck を実行したり、データベーストランザクションの一部を失うことなくスナップショットを使用できます。ゲストエージェントは、ゲストの相互作用を提供することで、高レベルのディスクコンテンツの安定性を実現します。
- virsh setvcpus --guest - CPU をオフラインにするようにゲストに指示します。
- virsh dompmsuspend - ゲストオペレーティングシステムの電源管理機能を使用して、実行中のゲストを優雅に一時停止します。
10.2.5. ゲスト仮想マシンのディスクバックアップの作成
- ファイルシステムアプリケーション/データベースは、作業バッファーを仮想ディスクにフラッシュし、クライアント接続の受け入れを停止します。
- アプリケーションがデータファイルを一貫した状態にします。
- メインフックスクリプトが返されます。
- qemu-ga ファイルシステムをフリーズし、管理スタックがスナップショットを取得します
- スナップショットが確認されました。
- ファイルシステムの機能が再開します。
/etc/qemu-ga/fsfreeze-hook.d/
というラベルが付いた表の行の 表10.1「QEMU ゲストエージェントパッケージの内容」 に一覧表示されている restorecon -FvvR コマンドを実行した後、ファイルシステムノードへのアクセスがすぐに機能するようになります。
File name | 説明 |
---|---|
/etc/rc.d/init.d/qemu-ga | QEMU ゲストエージェントのサービス制御スクリプト (start/stop) |
/etc/sysconfig/qemu-ga | /etc/rc.d/init.d/qemu-ga 制御スクリプトによって読み取られる QEMU ゲストエージェントの設定ファイル。設定は、シェルスクリプトのコメントが記載されたファイルで説明されています。 |
/usr/bin/qemu-ga | QEMU ゲストエージェントのバイナリーファイル。 |
/usr/libexec/qemu-ga/ | フックスクリプトのルートディレクトリー。 |
/usr/libexec/qemu-ga/fsfreeze-hook | メインフックスクリプト。ここでは変更は必要ありません。 |
/usr/libexec/qemu-ga/fsfreeze-hook.d/ | 個々のアプリケーション固有のフックスクリプトのディレクトリー。ゲストシステム管理者は、フックスクリプトを手動でこのディレクトリーにコピーし、適切なファイルモードビットを確認してから、このディレクトリーで restorecon -FvvR を実行する必要があります。 |
/usr/share/qemu-kvm/qemu-ga/ | サンプルスクリプトを含むディレクトリー (サンプル目的のみ)ここに含まれるスクリプトは実行されません。 |
/usr/libexec/qemu-ga/fsfreeze-hook
は、独自のメッセージと、アプリケーション固有のスクリプトの標準出力およびエラーメッセージを、ログファイル /var/log/qemu-ga/fsfreeze-hook.log
に記録します。詳細は、wiki.qemu.org または libvirt.org にあるqemu-guest-agentwiki ページを参照してください。
10.3. Windows ゲストでの QEMU ゲストエージェントの実行
- Windows XP Service Pack 3 (VSS はサポートされていません)
- Windows Server 2003 R2 - x86 および AMD64 (VSS はサポートされていません)
- Windows Server 2008
- Windows Server 2008 R2
- Windows7 - x86 および AMD64
- Windows Server 2012
- Windows Server 2012 R2
- Windows8 - x86 および AMD64
- Windows8.1 - x86 および AMD64
手順10.2 Windows ゲストでの QEMU ゲストエージェントの設定
Red Hat Enterprise Linux ホストマシンを準備します
次のパッケージが Red Hat Enterprise Linux ホスト物理マシンにインストールされていることを確認してください。- virtio-win
usr/share/virtio-win/
にあります。
Windows ゲストのドライバーをコピーするには、次のコマンドを使用して qxl ドライバーの*.iso
ファイルを作成します。# mkisofs -o /var/lib/libvirt/images/virtiowin.iso /usr/share/virtio-win/drivers
Windows ゲストを準備する
virtio-serial をインストールしますドライバーを更新するために Windows ゲストに*.iso
をマウントすることにより、ゲストのドライバー。ゲストを起動し、次に示すようにドライバーの.iso ファイルをゲストに添付します ( hdb という名前のディスクを使用)。# virsh attach-disk guest /var/lib/libvirt/images/virtiowin.iso hdb
Windows のを使用してドライバーをインストールするには、次のメニューに移動します。- virtio-win ドライバーをインストールするには -> > を選択します。
Windows ゲスト XML 設定ファイルを更新します
Windows ゲストのゲスト XML ファイルは、Red Hat Enterprise Linux ホストマシンにあります。このファイルにアクセスするには、Windows ゲスト名が必要です。ホストマシンで #virsh list コマンドを使用して、認識できるゲストを一覧表示します。この例では、ゲストの名前は win7x86 です。#virsh edit win7x86 コマンドを使用して次の要素を XML ファイルに追加し、変更を保存します。ソースソケット名は、この例では win7x86.agent という名前で、ホスト内で一意である必要があることに注意してください。図10.2 Windows ゲスト XML を編集して QEMU ゲストエージェントを設定する
... <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/win7x86.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <channel type='spicevmc'> <target type='virtio' name='com.redhat.spice.0'/> <address type='virtio-serial' controller='0' bus='0' port='2'/> </channel> ...
Windows ゲストを再起動します
Windows ゲストを再起動して、変更を適用します。# virsh reboot win7x86
Windows ゲストで QEMU ゲストエージェントを準備します
Windows ゲストでゲストエージェントを準備するには:最新のものをインストールするvirtio-winパッケージ
Red Hat Enterprise Linux ホストの物理マシンのターミナルウィンドウで次のコマンドを実行して、インストールするファイルを見つけます。以下に示すファイルは、システムが検出したファイルと完全に同じではない場合がありますが、最新の公式バージョンである必要があることに注意してください。# rpm -qa|grep virtio-win virtio-win-1.6.8-5.el6.noarch # rpm -iv virtio-win-1.6.8-5.el6.noarch
インストールが完了したことを確認します
後に virtio-win パッケージのインストールが完了したら、/usr/share/virtio-win/guest-agent/
フォルダーを確認すると、次のような qemu-ga-x64.msi または qemu-ga-x86.msi という名前のファイルが見つかります。# ls -l /usr/share/virtio-win/guest-agent/ total 1544 -rw-r--r--. 1 root root 856064 Oct 23 04:58 qemu-ga-x64.msi -rw-r--r--. 1 root root 724992 Oct 23 04:58 qemu-ga-x86.msi
.msi ファイルをインストールします
Windows ゲスト (たとえば、win7x86) から、ファイルをダブルクリックして qemu-ga-x64.msi または qemu-ga-x86.msi をインストールします。インストールされると、システムマネージャー内の Windows ゲストに qemu-ga サービスとして表示されます。この同じマネージャーを使用して、サービスのステータスを監視できます。
10.3.1. Windows ゲストでの QEMUGuestAgent での libvirt コマンドの使用
- virsh shutdown --mode=agent - このシャットダウン方法は、virsh shutdown --mode=acpi よりも信頼性が高くなります。QEMU ゲストエージェントで使用する virsh shutdown は、クリーンな状態で協調ゲストをシャットダウンすることが保証されます。エージェントが存在しない場合、libvirt は代わりに ACPI シャットダウンイベントの挿入に依存する必要がありますが、一部のゲストはそのイベントを無視するため、シャットダウンしません。virsh reboot と同じ構文で使用できます。
- virsh snapshot-create --quiesce - スナップショットが作成される前に、ゲストが I / O を安定した状態にフラッシュできるようにします。これにより、fsck を実行したり、データベーストランザクションの一部を失うことなくスナップショットを使用できます。ゲストエージェントは、ゲストの相互作用を提供することで、高レベルのディスクコンテンツの安定性を実現します。
- virsh dompmsuspend - ゲストオペレーティングシステムの電源管理機能を使用して、実行中のゲストを優雅に一時停止します。
10.4. デバイスリダイレクトの制限の設定
-device usb-redir
に渡します。filter プロパティーは、フィルタールールで設定される文字列を取ります。ルールの形式は次のとおりです。
<class>:<vendor>:<product>:<version>:<allow>
-1
の値を使用して、特定のフィールドに任意の値を受け入れるように指定します。同じコマンドラインで、| を区切り文字として使用し、複数のルールを使用できます。デバイスがどのフィルタールールにも一致しない場合、リダイレクトは許可されないことに注意してください。
例10.1 Windows ゲスト仮想マシンによるリダイレクトの制限
- Windows 7 ゲスト仮想マシンを準備します。
- 以下のコード抜粋をゲスト仮想マシンの XML ファイルに追加します。
<redirdev bus='usb' type='spicevmc'> <alias name='redir0'/> <address type='usb' bus='0' port='3'/> </redirdev> <redirfilter> <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/> <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/> </redirfilter>
- ゲスト仮想マシンを起動し、次のコマンドを実行して設定の変更を確認します。
# ps -ef | grep $guest_name
-device usb-redir,chardev=charredir0,id=redir0,/ filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
- USB デバイスをホストの物理マシンに接続し、virt-viewer を使用してゲスト仮想マシンに接続します。
- メニューでをクリックすると、一部の USB デバイスはホストポリシーによってブロックされていますというメッセージが表示されます。 をクリックして確定し、続行します。フィルターが有効になります。
- フィルターが正しくキャプチャーされていることを確認するには、USB デバイスのベンダーと製品を確認してから、USB リダイレクトを可能にするために、ホストの物理マシンのドメイン XML で次の変更を行います。
<redirfilter> <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/> <usbdev allow='no'/> </redirfilter>
- ゲスト仮想マシンを再起動してから、virt-viewer を使用してゲスト仮想マシンに接続します。これで、USB デバイスはトラフィックをゲスト仮想マシンにリダイレクトするようになります。
10.5. 仮想 NIC に接続しているホスト物理マシンまたはネットワークブリッジの動的な変更
- 次のような設定で、ゲスト仮想マシンを準備します。
<interface type='bridge'> <mac address='52:54:00:4a:c9:5e'/> <source bridge='virbr0'/> <model type='virtio'/> </interface>
- インターフェイスを更新するために XML ファイルを準備します。
# cat br1.xml
<interface type='bridge'> <mac address='52:54:00:4a:c9:5e'/> <source bridge='virbr1'/> <model type='virtio'/> </interface>
- ゲスト仮想マシンを起動し、ゲスト仮想マシンのネットワーク機能を確認して、ゲスト仮想マシンの vnetX が指定したブリッジに接続されていることを確認します。
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254007da9f2 yes virbr0-nic vnet0 virbr1 8000.525400682996 yes virbr1-nic
- 次のコマンドを使用して、新しいインターフェイスパラメーターでゲスト仮想マシンのネットワークを更新します。
# virsh update-device test1 br1.xml Device updated successfully
- ゲスト仮想マシンで service network restart を実行します。ゲスト仮想マシンは、virbr1 の新しい IP アドレスを取得します。ゲスト仮想マシンの vnet0 が新しいブリッジ (virbr1) に接続されていることを確認します。
# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254007da9f2 yes virbr0-nic virbr1 8000.525400682996 yes virbr1-nic vnet0
第11章 ストレージの概念
11.1. ストレージプール
- virtio-blk = 2^63 バイトまたは 8 エクサバイト (raw ファイルまたはディスクを使用)
- Ext4 = ~ 16TB (4KB のブロックサイズを使用)
- XFS = ~8 エクサバイト
- qcow2 およびホストのファイルシステムでは、非常に大きなイメージサイズを試行する際に、独自のメタデータとスケーラビリティーを評価/調整する必要があります。raw ディスクを使用すると、スケーラビリティーまたは最大サイズに影響を与えるレイヤーが減ります。
/var/lib/libvirt/images/
ディレクトリーをデフォルトのストレージプールとして使用します。デフォルトのストレージプールは、別のストレージプールに変更できます。
- ローカルストレージプール - ローカルストレージプールは、ホストの物理マシンサーバーに直接接続されています。ローカルストレージプールには、ローカルディレクトリー、直接接続されたディスク、物理パーティション、および LVM ボリュームグループが含まれます。これらのストレージボリュームは、ゲスト仮想マシンイメージを格納するか、追加のストレージとしてゲスト仮想マシンに接続されます。ローカルストレージプールはホストの物理マシンサーバーに直接接続されているため、移行や多数のゲスト仮想マシンを必要としない開発、テスト、および小規模な展開に役立ちます。ローカルストレージプールはライブマイグレーションをサポートしていないため、ローカルストレージプールは多くの本番環境には適していません。
- ネットワーク型 (共有) ストレージプール - ネットワーク型ストレージプールには、標準プロトコルを使用してネットワーク上で共有されるストレージデバイスが含まれます。virt-manager を使用してホスト物理マシン間で仮想マシンを移行する場合はネットワークストレージが必要ですが、virsh を使用して移行する場合は任意です。ネットワークストレージプールは libvirt によって管理されます。ネットワークストレージプールでサポートされているプロトコルは次のとおりです。
- ファイバーチャネルベースの LUN
- iSCSI
- NFS
- GFS2
- SCSI RDMA プロトコル (SCSI RCP) - InfiniBand アダプターおよび 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル
11.2. ボリューム
ボリュームの参照
特定のボリュームを参照するには、次の 3 つのアプローチが可能です。
- ボリュームとストレージプールの名前
- ボリュームは、それが属するストレージプールの識別子とともに名前で参照される場合があります。virsh コマンドラインでは、
--pool
storage_pool volume_name の形式を取ります。たとえば、guest_images プールの firstimage という名前のボリュームの場合は以下のようになります。# virsh vol-info --pool guest_images firstimage Name: firstimage Type: block Capacity: 20.00 GB Allocation: 20.00 GB virsh #
- ホスト物理マシンシステム上のストレージへのフルパス
- ボリュームは、ファイルシステム上のフルパスによって参照される場合もあります。このアプローチを使用する場合、プール識別子を含める必要はありません。たとえば、secondimage.img という名前のボリュームは、ホスト物理マシンシステムに /images/secondimage.img として表示されます。このイメージは /images/secondimage.img として参照できます。
# virsh vol-info /images/secondimage.img Name: secondimage.img Type: file Capacity: 20.00 GB Allocation: 136.00 kB
- ユニークなボリュームキー
- 仮想化システムでボリュームが最初に作成されると、一意の識別子が生成され、ボリュームに割り当てられます。一意の識別子は ボリュームキー と呼ばれます。このボリュームキーの形式は、使用するストレージによって異なります。LVM などのブロックベースのストレージで使用する場合、ボリュームキーは次の形式に従う場合があります。
c3pKz4-qPVc-Xf7M-7WNM-WJc8-qSiz-mtvpGn
ファイルベースのストレージで使用する場合、ボリュームキーは代わりにボリュームストレージへのフルパスのコピーである可能性があります。/images/secondimage.img
たとえば、ボリュームキーが Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr:# virsh vol-info Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr Name: firstimage Type: block Capacity: 20.00 GB Allocation: 20.00 GB
- vol-name
- ボリュームパスまたはボリュームキーが指定されている場合は、ボリューム名を返します。
# virsh vol-name /dev/guest_images/firstimage firstimage # virsh vol-name Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
- vol-path
- ボリュームキー、またはストレージプール識別子とボリューム名が指定されている場合は、ボリュームパスを返します。
# virsh vol-path Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr /dev/guest_images/firstimage # virsh vol-path --pool guest_images firstimage /dev/guest_images/firstimage
- vol-key コマンド
- ボリュームパス、またはストレージプール識別子とボリューム名が指定されている場合は、ボリュームキーを返します。
# virsh vol-key /dev/guest_images/firstimage Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr # virsh vol-key --pool guest_images firstimage Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
第12章 ストレージプール
例12.1 NFS ストレージプール
path/to/share
は /vm_data
にマウントする必要があります)。プールが開始すると、libvirt は、システム管理者がログインして mount nfs.example.com:/path/to/share /vmdata を実行した場合と同じように、指定したディレクトリーに共有をマウントします。プールが自動開始するように設定されている場合、libvirt は、libvirt の開始時に指定されたディレクトリーに NFS 共有がマウントされていることを確認します。
12.1. ディスクベースのストレージプール
/dev/sdb
など) への書き込みアクセス権を付与しないでください。パーティション (/dev/sdb1
など) または LVM ボリュームを使用します。
12.1.1. virsh を使用したディスクベースのストレージプールの作成
ディスクに GPT ディスクラベルを作成します
ディスクには、GUID パーティションテーブル (GPT) ディスクラベルを付け直す必要があります。GPT ディスクラベルを使用すると、各デバイスに最大 128 個のパーティションを作成できます。GPT パーティションテーブルは、MS-DOS パーティションテーブルよりもはるかに多くのパーティションのパーティションデータを格納できます。# parted /dev/sdb GNU Parted 2.1 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel New disk label type? gpt (parted) quit Information: You may need to update /etc/fstab. #
ストレージプール設定ファイルを作成します
新規デバイスに必要なストレージプール情報を含む一時的な XML テキストファイルを作成します。ファイルは以下に示す形式で、次のフィールドが含まれている必要があります。- <name>guest_images_disk</name>
name
パラメーターは、ストレージプールの名前を決定します。この例では、以下の例で guest_images_disk という名前を使用しています。- <device path='/dev/sdb'/>
device
パラメーターにpath
属性を指定すると、ストレージデバイスのデバイスパスが指定されます。この例では、デバイス /dev/sdb を使用しています。- <target> <path>/dev</path></target>
- ファイルシステム
target
パラメーターとpath
サブパラメーターは、このストレージプールで作成されたボリュームを接続するホスト物理マシンファイルシステム上の場所を決定します。たとえば、sdb1、sdb2、sdb3 です。以下の例のように /dev/ を使用すると、このストレージプールから作成されたボリュームに /dev/sdb1、/dev/sdb2、/dev/sdb3 としてアクセスできることを意味します。 - <format type='gpt'/>
format
パラメーターは、パーティションテーブルの種類を指定します。この例では、次の例の gpt を使用して、前の手順で作成した GPT ディスクラベルタイプと一致させます。
テキストエディターを使用して、ストレージプールデバイスの XML ファイルを作成します。例12.2 ディスクベースのストレージデバイスストレージプール
<pool type='disk'> <name>guest_images_disk</name> <source> <device path='/dev/sdb'/> <format type='gpt'/> </source> <target> <path>/dev</path> </target> </pool>
デバイスを接続します
前の手順で作成した XML 設定ファイルで virshpool-define コマンドを使用して、ストレージプール定義を追加します。# virsh pool-define ~/guest_images_disk.xml Pool guest_images_disk defined from /root/guest_images_disk.xml # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_disk inactive no
ストレージプールを起動します。
virshpool-start コマンドを使用してストレージプールを開始します。virshpool-list--all コマンドを使用してプールが開始されていることを確認します。# virsh pool-start guest_images_disk Pool guest_images_disk started # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_disk active no
自動起動をオンにします
オンにするautostart
ストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するようにlibvirtd
サービスを設定します。# virsh pool-autostart guest_images_disk Pool guest_images_disk marked as autostarted # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_disk active yes
ストレージプールの設定を確認する
ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のように報告されることを確認しますrunning
。# virsh pool-info guest_images_disk Name: guest_images_disk UUID: 551a67c8-5f2a-012c-3844-df29b167431c State: running Capacity: 465.76 GB Allocation: 0.00 Available: 465.76 GB # ls -la /dev/sdb brw-rw----. 1 root disk 8, 16 May 30 14:08 /dev/sdb # virsh vol-list guest_images_disk Name Path -----------------------------------------
オプション: 一時設定ファイルを削除します
必要がない場合は、一時ストレージプールの XML 設定ファイルを削除します。# rm ~/guest_images_disk.xml
12.1.2. virsh を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
# virsh pool-destroy guest_images_disk
- ストレージプールの定義を削除します。
# virsh pool-undefine guest_images_disk
12.2. パーティションベースのストレージプール
/dev/sdc
) が 1 つの 500GB の ext4 フォーマット済みパーティション (/dev/sdc1
) にパーティション化されています。以下の手順でストレージプールを設定します。
12.2.1. virt-manager を使用したパーティションベースのストレージプールの作成
手順12.1 virt-manager を使用したパーティションベースのストレージプールの作成
ストレージプールの設定を開きます
- virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストの物理マシンを選択します。Edit メニューを開き、Connection Details を選択します。
図12.1 接続の詳細
- Connection Details ウィンドウの Storage タブをクリックします。
図12.2 ストレージタブ
新しいストレージプールを作成します
新しいプールの追加 (パート 1)
+ ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。ストレージプールの fs: Pre-Formatted Block Device に変更します。を選択します。この例では、guest_images_fs という名前を使用します。 を図12.3 ストレージプールの名前とタイプ
新しいプールの追加 (パート 2)
図12.4 ストレージプールのパスと形式
- ターゲットパス
- virt-manager がディレクトリーを作成します。フィールドに、ストレージプールのソースデバイスをマウントする場所を入力します。場所がまだ存在しない場合は、
- 形式
- この例では、デフォルトの Red Hat Enterprise Linux ファイルシステムである ext4 ファイルシステムを使用しています。
- ソースパス
- Source Path フィールドにデバイスを入力します。この例では、/dev/sdc1 デバイスを使用しています。
詳細を確認し、ボタンを押してストレージプールを作成します。
新しいストレージプールを確認します
新しいストレージプールは、数秒後に左側のストレージリストに表示されます。サイズが期待どおりに報告されていることを確認します。この例では 458.20 GB が空き です。フィールドが新しいストレージプールを Active としてレポートしていることを確認します。ストレージプールを選択します。フィールドで、 時チェックボックスをクリックします。これにより、libvirtd
サービスが開始するたびにストレージデバイスが確実に開始されます。図12.5 ストレージリストの確認
これでストレージプールが作成され、Connection Details ウィンドウを閉じます。
12.2.2. virt-manager を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。
図12.6 停止アイコン
- ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。
12.2.3. virsh を使用したパーティションベースのストレージプールの作成
/dev/sdb
など) として割り当てるのに使用しないでください。ゲストには、ディスク全体またはブロックデバイスへの書き込みアクセス権を付与しないでください。この方法は、パーティション (たとえば、/dev/sdb1
) をストレージプールに割り当てる場合にのみ使用してください。
手順12.2 virsh を使用して事前にフォーマットされたブロックデバイスストレージプールを作成する
ストレージプール定義を作成します
virsh pool-define-as コマンドを使用して、新しいストレージプール定義を作成します。事前にフォーマットされたディスクをストレージプールとして定義するには、次の 3 つのオプションを提供する必要があります。- パーティション名
name
パラメーターは、ストレージプールの名前を決定します。この例では、以下の例で guest_images_fs という名前を使用しています。- device
device
パラメーターにpath
属性を指定すると、ストレージデバイスのデバイスパスが指定されます。この例では、パーティション /dev/sdc1 を使用しています。- mountpoint
- フォーマットされたデバイスがマウントされるローカルファイルシステム上の
mountpoint
。マウントポイントディレクトリーが存在しない場合、virsh コマンドでディレクトリーを作成できます。この例では、ディレクトリー /guest_images が使用されています。
# virsh pool-define-as guest_images_fs fs - - /dev/sdc1 - "/guest_images" Pool guest_images_fs defined
これで、新しいプールとマウントポイントが作成されました。新しいプールを確認する
現在のストレージプールを一覧表示します。# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_fs inactive no
マウントポイントを作成します。
virsh pool-build コマンドを使用して、事前にフォーマットされたファイルシステムストレージプールのマウントポイントを作成します。# virsh pool-build guest_images_fs Pool guest_images_fs built # ls -la /guest_images total 8 drwx------. 2 root root 4096 May 31 19:38 . dr-xr-xr-x. 25 root root 4096 May 31 19:38 .. # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_fs inactive no
ストレージプールを起動します。
virsh pool-start コマンドを使用して、ファイルシステムをマウントポイントにマウントし、プールを使用できるようにします。# virsh pool-start guest_images_fs Pool guest_images_fs started # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_fs active no
自動起動をオンにします
デフォルトでは、virsh で定義されたストレージプールは、libvirtd
が起動するたびに自動的に起動するように設定されていません。これを修正するには、virsh pool-autostart コマンドで自動開始を有効にします。ストレージプールは、libvirtd
が起動するたびに自動的に起動するようになりました。# virsh pool-autostart guest_images_fs Pool guest_images_fs marked as autostarted # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_fs active yes
ストレージプールを確認します。
ストレージプールが正しく作成され、報告されたサイズが期待どおりで、状態が running と報告されたことを確認します。ファイルシステムのマウントポイントに lost+found ディレクトリーがあり、デバイスがマウントされていることを確認します。# virsh pool-info guest_images_fs Name: guest_images_fs UUID: c7466869-e82a-a66c-2187-dc9d6f0877d0 State: running Persistent: yes Autostart: yes Capacity: 458.39 GB Allocation: 197.91 MB Available: 458.20 GB # mount | grep /guest_images /dev/sdc1 on /guest_images type ext4 (rw) # ls -la /guest_images total 24 drwxr-xr-x. 3 root root 4096 May 31 19:47 . dr-xr-xr-x. 25 root root 4096 May 31 19:38 .. drwx------. 2 root root 16384 May 31 14:18 lost+found
12.2.4. virsh を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
# virsh pool-destroy guest_images_disk
- オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
# virsh pool-delete guest_images_disk
- ストレージプールの定義を削除します。
# virsh pool-undefine guest_images_disk
12.3. ディレクトリーベースのストレージプール
12.3.1. virt-manager を使用したディレクトリーベースのストレージプールの作成
ローカルディレクトリーを作成します
オプション: ストレージプール用の新しいディレクトリーを作成します
ストレージプール用のディレクトリーをホスト物理マシンに作成します。この例では、/guest virtual machine_images という名前のディレクトリーを使用しています。# mkdir /guest_images
ディレクトリーの所有権を設定する
ディレクトリーのユーザーとグループの所有権を変更します。ディレクトリーは root ユーザーが所有している必要があります。# chown root:root /guest_images
ディレクトリーのアクセス許可を設定する
ディレクトリーのファイル権限を変更します。# chmod 700 /guest_images
変更を確認します。
権限が変更されたことを確認します。出力には、正しく設定された空のディレクトリーが表示されます。# ls -la /guest_images total 8 drwx------. 2 root root 4096 May 28 13:57 . dr-xr-xr-x. 26 root root 4096 May 28 13:57 ..
SELinux ファイルコンテキストを設定する
新しいディレクトリーの正しい SELinux コンテキストを設定します。プールの名前とディレクトリーは一致している必要はないことに注意してください。ただし、ゲスト仮想マシンをシャットダウンすると、libvirt はコンテキストをデフォルト値に戻す必要があります。ディレクトリーのコンテキストによって、このデフォルト値が決まります。ディレクトリー virt_image_t に明示的にラベルを付けることは価値があります。これにより、ゲスト仮想マシンがシャットダウンされると、イメージに virt_image_t というラベルが付けられ、ホスト物理マシンで実行されている他のプロセスから分離されます。# semanage fcontext -a -t virt_image_t '/guest_images(/.*)?' # restorecon -R /guest_images
ストレージプールの設定を開きます
- virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストの物理マシンを選択します。Edit メニューを開き、Connection Details を選択します。
図12.7 接続詳細ウィンドウ
- Connection Details ウィンドウの Storage タブをクリックします。
図12.8 ストレージタブ
新しいストレージプールを作成します
新しいプールの追加 (パート 1)
+ ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。ストレージプールの dir: Filesystem Directory に変更します。を選択します。この例では、guest_images という名前を使用します。 を図12.9 ストレージプールに名前を付ける
新しいプールの追加 (パート 2)
詳細を確認し、ボタンを押してストレージプールを作成します。
新しいストレージプールを確認します
新しいストレージプールは、数秒後に左側のストレージリストに表示されます。サイズが期待どおりに報告されていることを確認します。この例では 36.41 GB の空き 容量です。フィールドが新しいストレージプールを Active としてレポートしていることを確認します。ストレージプールを選択します。フィールドで、 チェックボックスがオンになっていることを確認します。これにより、libvirtd
サービスが開始するたびにストレージプールが確実に開始されます。図12.10 ストレージプール情報を確認します
これでストレージプールが作成され、Connection Details ウィンドウを閉じます。
12.3.2. virt-manager を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。
図12.11 停止アイコン
- ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。
12.3.3. virsh を使用したディレクトリーベースのストレージプールの作成
ストレージプール定義を作成します
virsh pool-define-as コマンドを使用して、新しいストレージプールを定義します。ディレクトリーベースのストレージプールを作成するには、次の 2 つのオプションが必要です。- ストレージプールの nameこの例では、guest_images という名前を使用します。この例で使用されている以降のすべての virsh コマンドは、この名前を使用します。
- ゲストイメージファイルを保存するためのファイルシステムディレクトリーへの path。このディレクトリーが存在しない場合は、virsh が作成します。この例では、/guest_images ディレクトリーを使用しています。
# virsh pool-define-as guest_images dir - - - - "/guest_images" Pool guest_images defined
ストレージプールがリストされていることを確認します
ストレージプールオブジェクトが正しく作成され、状態が次のようにレポートすることを確認しますinactive
。# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images inactive no
ローカルディレクトリーを作成します
次に示すように、virsh pool-build コマンドを使用して、ディレクトリー guest_images のディレクトリーベースのストレージプールを構築します (たとえば)。# virsh pool-build guest_images Pool guest_images built # ls -la /guest_images total 8 drwx------. 2 root root 4096 May 30 02:44 . dr-xr-xr-x. 26 root root 4096 May 30 02:44 .. # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images inactive no
ストレージプールを起動します。
virsh コマンド pool-start を使用して、ディレクトリーストレージプールを有効にします。これにより、プールのボリュームをゲストディスクイメージとして使用できるようになります。# virsh pool-start guest_images Pool guest_images started # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images active no
自動起動をオンにします
オンにするautostart
ストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するようにlibvirtd
サービスを設定します。# virsh pool-autostart guest_images Pool guest_images marked as autostarted # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images active yes
ストレージプールの設定を確認する
ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のようにレポートされることを確認しますrunning
。ゲスト仮想マシンが実行されていない場合でもプールにアクセスできるようにするには、Persistent
がyes
として報告されていることを確認します。サービス開始時にプールを自動的に起動させたい場合は、Autostart
がyes
と報告されていることを確認します。# virsh pool-info guest_images Name: guest_images UUID: 779081bf-7a82-107b-2874-a19a9c51d24c State: running Persistent: yes Autostart: yes Capacity: 49.22 GB Allocation: 12.80 GB Available: 36.41 GB # ls -la /guest_images total 8 drwx------. 2 root root 4096 May 30 02:44 . dr-xr-xr-x. 26 root root 4096 May 30 02:44 .. #
12.3.4. virsh を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
# virsh pool-destroy guest_images_disk
- オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
# virsh pool-delete guest_images_disk
- ストレージプールの定義を削除します。
# virsh pool-undefine guest_images_disk
12.4. LVM ベースのストレージプール
12.4.1. LVM ベースのストレージプールの作成 virt-manager を使用します。
オプション:LVM ボリューム用の新しいパーティションを作成します
これらの手順では、新しいハードディスクドライブに新しいパーティションと LVM ボリュームグループを作成する方法について説明します。警告この手順により、選択したストレージデバイスからすべてのデータが削除されます。新しいパーティションの作成
fdisk コマンドを使用して、コマンドラインから新しいディスクパーティションを作成します。次の例では、ストレージデバイス/dev/sdb
にディスク全体を使用する新しいパーティションを作成しています。# fdisk /dev/sdb Command (m for help):
n
を押して、新しいパーティションを作成します。p
を押して、プライマリーパーティションにします。Command action e extended p primary partition (1-4)
- 使用可能なパーティション番号を選択します。この例では、最初のパーティションは次のように入力して選択されます
1
。Partition number (1-4):
1
Enter
を押して、デフォルトの最初のシリンダーを入力します。First cylinder (1-400, default 1):
- パーティションのサイズを選択します。この例では、
Enter
を押してディスク全体を割り当てています。Last cylinder or +size or +sizeM or +sizeK (2-400, default 400):
t
を押して、パーティションの種類を設定します。Command (m for help):
t
- 前の手順で作成したパーティションを選択します。この例では、パーティション番号は
1
。Partition number (1-4):
1
- Linux LVM パーティションの場合、
8e
を入力します。Hex code (type L to list codes):
8e
- 変更をディスクに書き込んで終了します。
Command (m for help):
w
Command (m for help):q
新しい LVM ボリュームグループを作成する
vgcreate コマンドを使用して新しい LVM ボリュームグループを作成します。この例では、guest_images_lvm という名前のボリュームグループを作成します。# vgcreate guest_images_lvm /dev/sdb1 Physical volume "/dev/vdb1" successfully created Volume group "guest_images_lvm" successfully created
新しい LVM ボリュームグループ guest_images_lvm を、LVM ベースのストレージプールに使用できるようになりました。ストレージプールの設定を開きます
- virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストを選択します。Edit メニューを開き、Connection Details を選択します。
図12.12 接続の詳細
- Storage タブをクリックします。
図12.13 ストレージタブ
新しいストレージプールを作成します
ウィザードを開始します
+ ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。ストレージプールの logical: LVM Volume Group に変更します。また、を選択します。この例では、guest_images_lvm を使用します。次に、 を図12.14 LVM ストレージプールを追加する
新しいプールの追加 (パート 2)
次に、フィールドと フィールドに入力し、 チェックボックスをオンにします。- か、新しいボリュームグループの名前として使用します。デフォルトの形式はフィールドを使用して、既存の LVM ボリュームグループを選択する
/dev/
storage_pool_name。この例では、/dev/guest_images_lvm という名前の新しいボリュームグループを使用しています。 - 既存の LVM ボリュームグループが Source Path フィールドはオプションです。で使用されている場合、新しい LVM ボリュームグループの場合は、Source Path フィールドにストレージデバイスの場所を入力します。この例では、空白のパーティション /dev/sdc を使用しています。
- virt-manager に新しい LVM ボリュームグループを作成するように指示します。既存のボリュームグループを使用している場合は、 チェックボックスを選択しないでください。チェックボックスは、この例では、空白のパーティションを使用して新しいボリュームグループを作成しているため、チェックボックスをオンにする必要があります。
図12.15 ターゲットとソースを追加する
詳細を確認し、ボタンを押して LVM ボリュームグループをフォーマットし、ストレージプールを作成します。フォーマットするデバイスを確認します
警告メッセージが表示されます。図12.16 警告メッセージ
Yes ボタンを押して、ストレージデバイス上のすべてのデータを消去し、ストレージプールを作成します。
新しいストレージプールを確認します
新しいストレージプールは、数秒後に左側のリストに表示されます。詳細が期待どおりであることを確認します。この例では、465.76 GB が空きです。また、フィールドが新しいストレージプールをActive としてレポートしていることを確認します。ストレージプールが libvirtd で自動的に開始されるようにするには、通常、チェックボックスを有効にすることをお勧めします。図12.17 LVM ストレージプールの詳細を確認する
タスクが完了したら、ホストの詳細ダイアログを閉じます。
12.4.2. virt-manager を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。
図12.18 停止アイコン
- ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。
12.4.3. virsh を使用した LVM ベースのストレージプールの作成
/dev/sdc
) からの guest_images_lvm という名前のプールの例を使用します。これは単なる例であり、設定は必要に応じて置き換える必要があります。
手順12.3 virsh を使用した LVM ベースのストレージプールの作成
- プール名 guest_images_lvm を定義します。
# virsh pool-define-as guest_images_lvm logical - - /dev/sdc libvirt_lvm \ /dev/libvirt_lvm Pool guest_images_lvm defined
- 指定された名前に従ってプールを構築します。既存のボリュームグループを使用している場合は、この手順をスキップしてください。
# virsh pool-build guest_images_lvm Pool guest_images_lvm built
- 新しいプールを初期化します。
# virsh pool-start guest_images_lvm Pool guest_images_lvm started
- vgs コマンドを使用してボリュームグループ情報を表示します。
# vgs VG #PV #LV #SN Attr VSize VFree libvirt_lvm 1 0 0 wz--n- 465.76g 465.76g
- 自動的に開始するようにプールを設定します。
# virsh pool-autostart guest_images_lvm Pool guest_images_lvm marked as autostarted
- virsh コマンドを使用して、使用可能なプールを一覧表示します。
# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes guest_images_lvm active yes
- 次のコマンドは、このプール内に 3 つのボリューム (volume1、volume2、および volume3) を作成する方法を示しています。
# virsh vol-create-as guest_images_lvm volume1 8G Vol volume1 created # virsh vol-create-as guest_images_lvm volume2 8G Vol volume2 created # virsh vol-create-as guest_images_lvm volume3 8G Vol volume3 created
- virsh コマンドを使用して、このプールで使用可能なボリュームをリストします。
# virsh vol-list guest_images_lvm Name Path ----------------------------------------- volume1 /dev/libvirt_lvm/volume1 volume2 /dev/libvirt_lvm/volume2 volume3 /dev/libvirt_lvm/volume3
- 次の 2 つのコマンド (lvscan および lvs) は、新しく作成されたボリュームに関する詳細情報を表示します。
# lvscan ACTIVE '/dev/libvirt_lvm/volume1' [8.00 GiB] inherit ACTIVE '/dev/libvirt_lvm/volume2' [8.00 GiB] inherit ACTIVE '/dev/libvirt_lvm/volume3' [8.00 GiB] inherit # lvs LV VG Attr LSize Pool Origin Data% Move Log Copy% Convert volume1 libvirt_lvm -wi-a- 8.00g volume2 libvirt_lvm -wi-a- 8.00g volume3 libvirt_lvm -wi-a- 8.00g
12.4.4. virsh を使用したストレージプールの削除
- 同じプールを使用している他のゲストとの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
# virsh pool-destroy guest_images_disk
- オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
# virsh pool-delete guest_images_disk
- ストレージプールの定義を削除します。
# virsh pool-undefine guest_images_disk
12.5. iSCSI ベースのストレージプール
12.5.1. ソフトウェア iSCSI ターゲットの設定
手順12.4 iSCSI ターゲットの作成
必要なパッケージのインストール
scsi-target-utils パッケージと依存するすべてのパッケージをインストールします。# yum install scsi-target-utils
tgtd サービスを開始します
tgtd サービスは物理マシンの SCSI ターゲットをホストし、iSCSI プロトコルを使用して物理マシンターゲットをホストします。tgtd サービスを開始し、chkconfig コマンドで再起動した後、サービスを永続化します。# service tgtd start # chkconfig tgtd on
オプション:LVM ボリュームを作成する
LVM ボリュームは、iSCSI バッキングイメージに役立ちます。LVM スナップショットとサイズ変更は、ゲスト仮想マシンにとって有益な場合があります。この例では、iSCSI を使用してゲスト仮想マシンをホストするために、RAID5 アレイ上の virtstore という名前の新しいボリュームグループに virtimage1 という名前の LVM イメージを作成します。RAID アレイを作成する
ソフトウェア RAID5 アレイの作成については、『Red Hat Enterprise Linux デプロイメントガイド』 で説明されています。LVM ボリュームグループを作成する
vgcreate コマンドを使用して、virtstore という名前のボリュームグループを作成します。# vgcreate virtstore /dev/md1
LVM 論理ボリュームを作成する
lvcreate コマンドを使用して、サイズが 20GB の virtstore ボリュームグループに virtimage1 という名前の論理ボリュームグループを作成します。# lvcreate --size 20G -n virtimage1 virtstore
新しい論理ボリューム virtimage1 は、iSCSI で使用する準備ができています。
オプション: ファイルベースのイメージを作成します
テストにはファイルベースのストレージで十分ですが、実稼働環境や重要な I/O アクティビティーにはお勧めしません。このオプションの手順では、iSCSI ターゲット用に virtimage2.img という名前のファイルベースのイメージを作成します。イメージの新しいディレクトリーを作成します
イメージを保存するための新しいディレクトリーを作成します。ディレクトリーには正しい SELinux コンテキストが必要です。# mkdir -p /var/lib/tgtd/virtualization
イメージファイルを作成する
サイズが 10GB の virtimage2.img という名前のイメージを作成します。# dd if=/dev/zero of=/var/lib/tgtd/virtualization/virtimage2.img bs=1M seek=10000 count=0
SELinux ファイルコンテキストを設定する
新しいイメージとディレクトリーの正しい SELinux コンテキストを設定します。# restorecon -R /var/lib/tgtd
新しいファイルベースのイメージ virtimage2.img は、iSCSI で使用する準備ができています。
ターゲットを作成する
ターゲットは、XML エントリーを/etc/tgt/targets.conf
ファイルに追加することで作成できます。target
属性には、iSCSI Qualified Name (IQN) が必要です。IQN の形式は次のとおりです。iqn.yyyy-mm.reversed domain name:optional identifier text
詳細は以下のようになります。- yyyy-mmは、デバイスが開始された年と月を表します (例: 2010-05)。
- 逆ドメイン名 は、逆のホスト物理マシンのドメイン名です (たとえば、IQN の server1.example.com は com.example.server1 になります)。と
- オプションの識別子テキスト は、スペースを含まない任意のテキスト文字列であり、管理者がデバイスまたはハードウェアを識別するのに役立ちます。
この例では、server1.example.com のオプションの手順で作成された 2 種類のイメージの iSCSI ターゲットを、オプションの識別子 トライアル を使用して作成します。/etc/tgt/targets.conf
ファイルに以下を追加します。<target iqn.2010-05.com.example.server1:iscsirhel6guest> backing-store /dev/virtstore/virtimage1 #LUN 1 backing-store /var/lib/tgtd/virtualization/virtimage2.img #LUN 2 write-cache off </target>
/etc/tgt/targets.conf
ファイルにdefault-driver iscsi
ドライバータイプを iSCSI として設定する行。ドライバーはデフォルトで iSCSI を使用します。重要この例では、アクセス制御なしでグローバルにアクセス可能なターゲットを作成します。安全なアクセスの実装については、scsi-target-utils を参照してください。tgtd サービスを再起動します
tgtd
サービスを再起動して、設定の変更を再ロードします。# service tgtd restart
iptable の設定
iptables を使用した iSCSI アクセス用にポート 3260 を開きます。# iptables -I INPUT -p tcp -m tcp --dport 3260 -j ACCEPT # service iptables save # service iptables restart
新しいターゲットを確認します
新しいターゲットを表示して、tgt-admin--show コマンドでセットアップが成功したことを確認します。# tgt-admin --show Target 1: iqn.2010-05.com.example.server1:iscsirhel6guest System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: IET 00010000 SCSI SN: beaf10 Size: 0 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: None LUN: 1 Type: disk SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 20000 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /dev/virtstore/virtimage1 LUN: 2 Type: disk SCSI ID: IET 00010002 SCSI SN: beaf12 Size: 10000 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /var/lib/tgtd/virtualization/virtimage2.img Account information: ACL information: ALL
警告ACL リストは all に設定されています。これにより、ローカルネットワーク上のすべてのシステムがこのデバイスにアクセスできるようになります。実稼働環境用にホスト物理マシンアクセス ACL を設定することをお勧めします。オプション: テスト検出
新しい iSCSI デバイスが検出可能かどうかをテストします。# iscsiadm --mode discovery --type sendtargets --portal server1.example.com 127.0.0.1:3260,1 iqn.2010-05.com.example.server1:iscsirhel6guest
オプション: デバイスの接続をテストします
新しいデバイス (iqn.2010-05.com.example.server1:iscsirhel6guest) を接続して、デバイスを接続できるかどうかを判断します。# iscsiadm -d2 -m node --login scsiadm: Max file limits 1024 1024 Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260] Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260] successful.
デバイスの取り外し# iscsiadm -d2 -m node --logout scsiadm: Max file limits 1024 1024 Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260 Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260] successful.
12.5.2. virt-manager への iSCSI ターゲットの追加
手順12.5 virt-manager への iSCSI デバイスの追加
ホスト物理マシンのストレージタブを開きます
Connection Details ウィンドウの Storage タブを開きます。- virt-manager を開きます。
- メインの virt-manager ウィンドウからホスト物理マシンを選択します。Edit menu をクリックして、Connection Details を選択します。
図12.19 接続の詳細
- Storage タブをクリックします。
図12.20 ストレージメニュー
新しいプールの追加 (パート 1)
+ ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。図12.21 iscsi ストレージプールの名前とタイプを追加します
ストレージプールの名前を選択し、タイプを iscsi に変更し、を押して続行します。新しいプールの追加 (パート 2)
このメニューのフィールドを完成させるには、「iSCSI ベースのストレージプール」 と 手順12.4「iSCSI ターゲットの作成」 で使用した情報が必要です。- iSCSI ソースとターゲットを入力します。フォーマットはゲスト仮想マシンによって処理されるため、Format オプションは使用できません。Target Path を編集することはお勧めしません。デフォルトのターゲットパス値
/dev/disk/by-path/
は、そのディレクトリーにドライブパスを追加します。ターゲットパスは、移行するすべてのホスト物理マシンで同じである必要があります。 - iSCSI ターゲットのホスト名または IP アドレスを入力します。この例では
host1.example.com
を使用しています。 - Source Path フィールドに、iSCSI ターゲット IQN を入力します。「iSCSI ベースのストレージプール」 の 手順12.4「iSCSI ターゲットの作成」 を見ると、これは
/etc/tgt/targets.conf ファイル
で追加した情報であることがわかります。この例ではiqn.2010-05.com.example.server1:iscsirhel6guest
を使用しています。 - IQN チェックボックスをオンにして、イニシエータの IQN を入力します。この例では
iqn.2010-05.com.example.host1:iscsirhel6
を使用しています。
図12.22 iscsi ストレージプールを作成する
12.5.3. virt-manager を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。
図12.23 停止アイコン
- ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。
12.5.4. virsh を使用した iSCSI ベースのストレージプールの作成
pool-define-as を使用して、コマンドラインからプールを定義します
ストレージプールの定義は、virsh コマンドラインツールを使用して作成できます。virsh を使用してストレージプールを作成すると、システム管理者がスクリプトを使用して複数のストレージプールを作成する場合に役立ちます。virsh pool-define-as コマンドには、次の形式で受け入れられるいくつかのパラメーターがあります。virsh pool-define-as
name type source-host source-path source-dev source-name
targetパラメーターの説明は次のとおりです。- type
- このプールを特定のタイプ、たとえば iscsi として定義します
- name
- 一意である必要があり、ストレージプールの名前を設定します
- source-host および source-path
- それぞれホスト名と iSCSIIQN
- source-dev および source-name
- これらのパラメーターは iSCSI ベースのプールには必要ありません。フィールドを空白のままにするには、- 文字を使用します。
- target
- ホスト物理マシンに iSCSI デバイスをマウントする場所を定義します
以下の例では、前の手順と同じ iSCSI ベースのストレージプールを作成します。# virsh pool-define-as --name scsirhel6guest --type iscsi \ --source-host server1.example.com \ --source-dev iqn.2010-05.com.example.server1:iscsirhel6guest --target /dev/disk/by-path Pool iscsirhel6guest defined
ストレージプールがリストされていることを確認します
ストレージプールオブジェクトが正しく作成され、状態が次のように報告されることを確認しますinactive
。# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes iscsirhel6guest inactive no
ストレージプールを起動します。
これには、virsh コマンド pool-start を使用します。pool-start は、ディレクトリーストレージプールを有効にし、ボリュームとゲスト仮想マシンに使用できるようにします。# virsh pool-start guest_images_disk Pool guest_images_disk started # virsh pool-list --all Name State Autostart ----------------------------------------- default active yes iscsirhel6guest active no
自動起動をオンにします
オンにするautostart
ストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するようにlibvirtd
サービスを設定します。# virsh pool-autostart iscsirhel6guest Pool iscsirhel6guest marked as autostarted
iscsirhel6guest プールに自動開始が設定されていることを確認します。# virsh pool-list --all Name State Autostart ----------------------------------------- default active yes iscsirhel6guest active yes
ストレージプールの設定を確認する
ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のように報告されることを確認しますrunning
。# virsh pool-info iscsirhel6guest Name: iscsirhel6guest UUID: afcc5367-6770-e151-bcb3-847bc36c5e28 State: running Persistent: unknown Autostart: yes Capacity: 100.31 GB Allocation: 0.00 Available: 100.31 GB
12.5.5. virsh を使用したストレージプールの削除
- 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
# virsh pool-destroy guest_images_disk
- ストレージプールの定義を削除します。
# virsh pool-undefine guest_images_disk
12.6. NFS ベースのストレージプール
12.6.1. virt-manager を使用した NFS ベースのストレージプールの作成
ホスト物理マシンのストレージタブを開きます
Host Details ウィンドウで Storage タブを開きます。- virt-manager を開きます。
- メインの virt-manager ウィンドウからホスト物理マシンを選択します。Edit menu をクリックして、Connection Details を選択します。
図12.24 接続の詳細
- Storage タブをクリックします。
図12.25 ストレージタブ
新しいプールを作成する (パート 1)
+ ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。図12.26 NFS 名とタイプを追加します
ストレージプールの名前を選択し、を押して続行します。新しいプールを作成する (パート 2)
デバイスのターゲットパス、ホスト名、および NFS 共有パスを入力します。Format オプションを NFS または auto (タイプを検出するため) に設定します。ターゲットパスは、移行するすべてのホスト物理マシンで同一である必要があります。NFS サーバーのホスト名または IP アドレスを入力します。この例ではserver1.example.com
を使用しています。NFS パスを入力します。この例では/nfstrial
を使用しています。図12.27 NFS ストレージプールを作成する
12.6.2. virt-manager を使用したストレージプールの削除
- 同じプールを使用している他のゲストとの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。
図12.28 停止アイコン
- ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。
12.7. GlusterFS ストレージプール
12.8. SCSI デバイスでの NPIV 仮想アダプター (vHBA) の使用
12.8.1. vHBA の作成
手順12.6 vHBA の作成
ホストシステムで HBA の場所を特定します。
ホストシステム上の HBA を見つけるには、ホストシステム上の SCSI デバイスを調べ、vport
機能を持つscsi_host
を見つけます。以下のコマンドを実行し、scsi_host
リストを取得します。# virsh nodedev-list --cap scsi_host scsi_host0 scsi_host1 scsi_host2 scsi_host3 scsi_host4
各scsi_host
について、次のコマンドを実行して、デバイス XML の行<capability type='vport_ops'>
を調べます。これは、vport
ケーパビリティを持つscsi_host
を示しています。# virsh nodedev-dumpxml scsi_hostN
HBA の詳細を確認します。
virsh nodedev-dumpxml HBA_device コマンドを実行して、HBA の詳細を表示します。virsh nodedev-dumpxml コマンドからの XML 出力には、フィールドが一覧表示されます<name>
、<wwnn>
、と<wwpn>
、vHBA の作成に使用されます。<max_vports>
の値は、サポートされる vHBA の最大数を示しています。# virsh nodedev-dumpxml scsi_host3 <device> <name>scsi_host3</name> <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path> <parent>pci_0000_10_00_0</parent> <capability type='scsi_host'> <host>3</host> <capability type='fc_host'> <wwnn>20000000c9848140</wwnn> <wwpn>10000000c9848140</wwpn> <fabric_wwn>2002000573de9a81</fabric_wwn> </capability> <capability type='vport_ops'> <max_vports>127</max_vports> <vports>0</vports> </capability> </capability> </device>
この例では、<max_vports>
には、HBA 設定で使用できる仮想ポートが 127 個あることを示しています。<vports>
値は、現在使用されている仮想ポートの数を示します。この値は、vHBA の作成後に更新されます。vHBA ホストデバイスの作成
vHBA ホスト用に次のような XML ファイル (この例では vhba_host3.xml という名前) を作成します。# cat vhba_host3.xml <device> <parent>scsi_host3</parent> <capability type='scsi_host'> <capability type='fc_host'> </capability> </capability> </device>
<parent>
フィールドは、この vHBA デバイスに関連付ける HBA デバイスを指定します。<device>
タグの詳細は、ホスト用の新しい vHBA デバイスを作成するために、次の手順で使用されます。nodedev
XML フォーマットの詳細は、http://libvirt.org/formatnode.htmlを参照してください。vHBA ホストデバイスに新しい vHBA を作成します。
vhba_host3 に vHBA を作成するには、virshnodedev-create コマンドを使用します。# virsh nodedev-create vhba_host3.xml Node device scsi_host5 created from vhba_host3.xml
vHBA の確認
virsh nodedev-dumpxml コマンドを使用して、新しい vHBA の詳細 (scsi_host5
) を確認します。# virsh nodedev-dumpxml scsi_host5 <device> <name>scsi_host5</name> <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path> <parent>scsi_host3</parent> <capability type='scsi_host'> <host>5</host> <capability type='fc_host'> <wwnn>5001a4a93526d0a1</wwnn> <wwpn>5001a4ace3ee047d</wwpn> <fabric_wwn>2002000573de9a81</fabric_wwn> </capability> </capability> </device>
12.8.2. vHBA を使用したストレージプールの作成
- libvirt コードは、virsh コマンドの出力を使用すると、LUN のパスを簡単に見つけることができます。また、
- 仮想マシンの移行には、ターゲットマシンで同じ vHBA 名を持つストレージプールの定義と起動のみが必要です。これを行うには、仮想マシンの XML 設定で、vHBA LUN、libvirt ストレージプール、およびボリューム名を指定する必要があります。例は、「vHBALUN を使用するように仮想マシンを設定する」 を参照してください。
SCSI ストレージプールを作成する
vHBA 設定を作成するには、まず vHBA に基づいて libvirt'scsi'
ストレージプール XML ファイルを以下のフォーマットで作成します。注記手順12.6「vHBA の作成」 で作成した vHBA をホスト名として使用することを確認し、vHBA 名 scsi_hostN を hostN に修正してストレージプール設定に使用します。この例では、vHBA の名前は scsi_host5 であり、Red Hat Enterprise Linux6 libvirt ストレージプールで<adaptername='host5'/>
として指定されています。<path>
の値には、システム上の/dev/disk/by-{path|id|uuid|label} の
いずれかの場所など、安定した場所を使用することをお勧めします。<path>
および<target>
内の要素の詳細は、http://libvirt.org/formatstorage.htmlを参照してください。この例では、'scsi'
ストレージプールの名前は vhbapool_host3.xml です。<pool type='scsi'> <name>vhbapool_host3</name> <uuid>e9392370-2917-565e-692b-d057f46512d6</uuid> <capacity unit='bytes'>0</capacity> <allocation unit='bytes'>0</allocation> <available unit='bytes'>0</available> <source> <adapter name='host5'/> </source> <target> <path>/dev/disk/by-path</path> <permissions> <mode>0700</mode> <owner>0</owner> <group>0</group> </permissions> </target> </pool>
プールを定義する
ストレージプール (この例では vhbapool_host3 という名前) を定義するには、virshpool-define コマンドを使用します。# virsh pool-define vhbapool_host3.xml Pool vhbapool_host3 defined from vhbapool_host3.xml
プールを開始します
次のコマンドでストレージプールを開始します。# virsh pool-start vhbapool_host3 Pool vhbapool_host3 started
自動起動を有効にする
最後に、後続のホストの再起動で仮想マシンで使用する vHBA が自動的に定義されるようにするには、ストレージプールの自動開始機能を設定します (この例では、vhbapool_host3 という名前のプールに対して)。# virsh pool-autostart vhbapool_host3
12.8.3. vHBALUN を使用するように仮想マシンを設定する
利用可能な LUN を見つける
まず、virsh vol-list コマンドを使用して、vHBA で使用可能な LUN のリストを生成します。以下に例を示します。# virsh vol-list vhbapool_host3 Name Path ------------------------------------------------------------------------------ unit:0:4:0 /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0 unit:0:5:0 /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
表示される LUN 名のリストは、仮想マシン設定でディスクボリュームとして使用できます。vHBALUN を仮想マシンに追加します
仮想マシンの XML で指定して、仮想マシン に vHBA LUN を追加します。<disk>
パラメーターに、lun
またはdisk
としてデバイスタイプを指定し- は、
<source>
パラメーターでソースデバイスを指定します。これは、/dev/sdaN
として入力することも、udev によって生成されたシンボリックリンクとして/dev/disk/by-path|by-id|by-uuid|by-label
として入力することもできます。これは、virsh vol-list pool コマンドを実行することで見つけることができます。
以下に例を示します。<disk type='block' device='lun'> <driver name='qemu' type='raw'/> <source dev='/dev/disk/by-path/pci-0000\:04\:00.1-fc-0x203400a0b85ad1d7-lun-0'/> <target dev='sda' bus='scsi'/> </disk>
12.8.4. vHBA ストレージプールを破棄する
# virsh pool-destroy vhbapool_host3
# virsh nodedev-destroy scsi_host5
# virsh nodedev-list --cap scsi_host
scsi_host5
結果のリストに表示されなくなります。
第13章 ボリューム
13.1. ボリュームの作成
# virsh vol-create-as guest_images_disk volume1 8G
Vol volume1 created
# virsh vol-create-as guest_images_disk volume2 8G
Vol volume2 created
# virsh vol-create-as guest_images_disk volume3 8G
Vol volume3 created
# virsh vol-list guest_images_disk
Name Path
-----------------------------------------
volume1 /dev/sdb1
volume2 /dev/sdb2
volume3 /dev/sdb3
# parted -s /dev/sdb print
Model: ATA ST3500418AS (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
2 17.4kB 8590MB 8590MB primary
3 8590MB 17.2GB 8590MB primary
1 21.5GB 30.1GB 8590MB primary
13.2. クローンボリューム
--pool
引数が必要です。コマンドの残りの部分では、クローンを作成するボリューム (volume3) と、クローンを作成した新しいボリュームの名前 (clone1) を指定します。virsh vol-list コマンドは、ストレージプール (guest_images_disk) に存在するボリュームを一覧表示します。
# virsh vol-clone --pool guest_images_disk volume3 clone1 Vol clone1 cloned from volume3 # virsh vol-list guest_images_disk Name Path ----------------------------------------- volume1 /dev/sdb1 volume2 /dev/sdb2 volume3 /dev/sdb3 clone1 /dev/sdb4 # parted -s /dev/sdb print Model: ATA ST3500418AS (scsi) Disk /dev/sdb: 500GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size File system Name Flags 1 4211MB 12.8GB 8595MB primary 2 12.8GB 21.4GB 8595MB primary 3 21.4GB 30.0GB 8595MB primary 4 30.0GB 38.6GB 8595MB primary
13.3. ゲストへのストレージデバイスの追加
13.3.1. ゲストへのファイルベースストレージの追加
手順13.1 ファイルベースのストレージの追加
- ストレージファイルを作成するか、既存のファイル (IMG ファイルなど) を使用します。次のコマンドは両方とも、ゲストの追加ストレージとして使用できる 4GB のファイルを作成することに注意してください。
- ファイルベースのストレージイメージには、事前に割り当てられたファイルをお勧めします。次に示すように、次の dd コマンドを使用して、事前に割り当てられたファイルを作成します。
# dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1M count=4096
- または、事前に割り当てられたファイルの代わりにスパースファイルを作成します。スパースファイルははるかに高速に作成され、テストに使用できますが、データの整合性とパフォーマンスの問題があるため、実稼働環境にはお勧めしません。
# dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1M seek=4096 count=0
- 新しいファイルに <disk> 要素を書き込んで、追加のストレージを作成します。この例では、このファイルは
NewStorage.xml
と呼ばれます。<disk>
要素は、ディスクのソースと仮想ブロックデバイスのデバイス名を記述します。デバイス名は、ゲスト内のすべてのデバイスで一意である必要があり、ゲストが仮想ブロックデバイスを見つけるバスを識別します。次の例では、ソースがFileName.img
という名前のファイルベースのストレージコンテナーである virtio ブロックデバイスを定義しています。<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/FileName.img'/> <target dev='vdb'/> </disk>
デバイス名は hd または sd で始めることもでき、それぞれ IDE と SCSI ディスクを識別します。設定ファイルには、新しいデバイスのバス上の位置を指定する<address>
サブ要素を含めることもできます。virtio ブロックデバイスの場合、これは PCI アドレスである必要があります。<address>
サブ要素を省略すると、libvirt は次に使用可能な PCI スロットを見つけて割り当てることができます。 - 次のように CD-ROM を接続します。
<disk type='file' device='cdrom'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/FileName.img'/> <readonly/> <target dev='hdc'/> </disk >
NewStorage.xml
で定義されたデバイスをゲスト (Guest1
) とともに追加します。# virsh attach-device --config Guest1 ~/NewStorage.xml
注記この変更は、ゲストが破棄されて再起動された後にのみ適用されます。さらに、永続デバイスは、永続ドメイン、つまり virsh define コマンドで設定が保存されたドメインにのみ追加できます。ゲストが実行中で、ゲストが破棄されるまで新しいデバイスを一時的に追加する場合は、-config
オプションを省略します。# virsh attach-device Guest1 ~/NewStorage.xml
注記virsh コマンドを使用すると、XML ファイルを作成しなくても、より単純な構文で限られた数のパラメーターを設定できる attach-disk コマンドを使用できます。attach-disk コマンドは、次に示すように、前述の attach-device コマンドと同様の方法で使用されます。# virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img vdb --cache none --driver qemu --subdriver raw
virsh attach-disk コマンドは--config
オプションも受け入れることに注意してください。- ゲストマシンを起動します (現在実行されていない場合)。
# virsh start Guest1
注記次の手順は Linux ゲスト固有です。他のオペレーティングシステムは、さまざまな方法で新しいストレージデバイスを処理します。その他のシステムについては、そのオペレーティングシステムのドキュメントを参照してください。 ディスクドライブのパーティション分割
これで、ゲストには/dev/vdb
というハードディスクデバイスがあります。。必要に応じて、このディスクドライブをパーティションに分割し、パーティションをフォーマットします。追加したデバイスが表示されない場合は、ゲストのオペレーティングシステムのディスクホットプラグに問題があることを示しています。- 新しいデバイスの fdisk を起動します。
# fdisk /dev/vdb Command (m for help):
- 新しいパーティションのために、
n
と入力します。 - 次のように表示されます。
Command action e extended p primary partition (1-4)
プライマリーパーティションには、p
と入力します。 - 使用可能なパーティション番号を選択します。この例では、
1
を入力して、最初のパーティションを選択します。Partition number (1-4): 1
Enter
を押して、デフォルトの最初のシリンダーを入力します。First cylinder (1-400, default 1):
- パーティションのサイズを選択します。この例では、Enter を押してディスク全体を割り当てます。
Last cylinder or +size or +sizeM or +sizeK (2-400, default 400):
- t を入力して、パーティションタイプを設定します。
Command (m for help): t
- 前の手順で作成したパーティションを選択します。この例では、パーティションが 1 つしか作成されておらず、fdisk がパーティション 1 を自動的に選択したため、パーティション番号は 1 です。
Partition number (1-4): 1
- Linux パーティションの場合は 83 と入力します。
Hex code (type L to list codes): 83
- w と入力して変更を書き込み、終了します。
Command (m for help): w
ext3
ファイルシステムで新しいパーティションをフォーマットします。# mke2fs -j /dev/vdb1
- マウントディレクトリーを作成し、ゲストにディスクをマウントします。この例では、ディレクトリーは myfiles にあります。
# mkdir /myfiles # mount /dev/vdb1 /myfiles
これで、ゲストは追加の仮想化されたファイルベースのストレージデバイスを使用できます。ただし、ゲストの/etc/fstab
ファイルで定義されていない限り、このストレージは再起動後に永続的にマウントされないことに注意してください。/dev/vdb1 /myfiles ext3 defaults 0 0
13.3.2. ゲストへのハードドライブおよびその他のブロックデバイスの追加
手順13.2 ゲストへの物理ブロックデバイスの追加
- この手順では、ホスト物理マシン上のハードドライブをゲストに追加する方法について説明します。これは、CD-ROM、DVD、フロッピーデバイスを含むすべての物理ブロックデバイスに適用されます。ハードディスクデバイスをホストの物理マシンに物理的に接続します。ドライブにデフォルトでアクセスできない場合は、ホスト物理マシンを設定します。
- 次のいずれかを行います。
- 新しいファイルに disk 要素を書き込んで、追加のストレージを作成します。この例では、このファイルは
NewStorage.xml
と呼ばれます。次の例は、ホスト物理マシンパーティション/dev/sr0
用の追加のデバイスベースのストレージコンテナーを含む設定ファイルセクションです。<disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source dev='/dev/sr0'/> <target dev='vdc' bus='virtio'/> </disk>
- 前のセクションの手順に従って、デバイスをゲスト仮想マシンに接続します。または、
virsh attach-disk
示されているように、コマンド:# virsh attach-disk Guest1 /dev/sr0 vdc
次のオプションが使用可能であることに注意してください。- virsh attach-disk コマンドは、図のように
--config
、--type
、および--mode
オプションも受け付けます。# virsh attach-disk Guest1 /dev/sr0 vdc --config --type cdrom --mode readonly
- さらに、
--type
、デバイスがハードディスクの場合は、--type disk
も受け付けます。
- ゲスト仮想マシンには、Linux では
/dev/vdc
(またはゲスト仮想マシン OS が選択するものに応じて同様のもの) または Windows ではD: drive
(たとえば) と呼ばれる新しいハードディスクデバイスがあります。これで、ゲスト仮想マシンのオペレーティングシステムの標準手順に従って、ゲスト仮想マシンからディスクを初期化できます。例は、手順13.1「ファイルベースのストレージの追加」 を参照してください。警告ゲストにブロックデバイスを追加するときは、セキュリティー上の考慮事項に必ず従ってください。この情報については、『Red Hat Enterprise Linux 仮想化セキュリティーガイド』 を参照してください。https://access.redhat.com/site/documentation/。重要ゲスト仮想マシンには、ディスク全域、またはブロックデバイス全域 (例:/dev/sdb
) への書き込みアクセス権を付与しないでください。ブロックデバイス全域にアクセスを持つゲスト仮想マシンは、ボリュームラベルを修正できる場合があり、これがホスト物理マシンシステムの攻撃に使用される可能性があります。パーティション (例:/dev/sdb1
) または LVM ボリュームを使用して、この問題を回避してください。
13.4. ボリュームの削除と削除
# virsh vol-delete --pool guest_images volume1 Vol volume1 deleted
第14章 virsh を使用したゲスト仮想マシンの管理
14.1. 一般的なコマンド
14.1.1. help
$ virsh help pool
Storage Pool (help keyword 'pool'):
find-storage-pool-sources-as find potential storage pool sources
find-storage-pool-sources discover potential storage pool sources
pool-autostart autostart a pool
pool-build build a pool
pool-create-as create a pool from a set of args
pool-create create a pool from an XML file
pool-define-as define a pool from a set of args
pool-define define (but don't start) a pool from an XML file
pool-delete delete a pool
pool-destroy destroy (stop) a pool
pool-dumpxml pool information in XML
pool-edit edit XML configuration for a storage pool
pool-info storage pool information
pool-list list pools
pool-name convert a pool UUID to pool name
pool-refresh refresh a pool
pool-start start a (previously defined) inactive pool
pool-undefine undefine an inactive pool
pool-uuid convert a pool name to pool UUID
$ virsh help vol-path
NAME
vol-path - returns the volume path for a given volume name or key
SYNOPSIS
vol-path <vol> [--pool <string>]
OPTIONS
[--vol] <string> volume name or key
--pool <string> pool name or uuid
14.1.2. 終了して終了します
$ virsh exit
$ virsh quit
14.1.3. version
$ virsh version
Compiled against library: libvirt 1.1.1
Using library: libvirt 1.1.1
Using API: QEMU 1.1.1
Running hypervisor: QEMU 1.5.3
14.1.4. 引数の表示
--shell
オプションを使用すると、出力は必要に応じて一重引用符で囲まれるため、シェルコマンドでの再利用に適しています。--xml
オプションを使用すると、出力は XML ファイルでの使用に適したものになります。たとえば、virsh echo --shell "hello world" というコマンドは、出力 'hello world'
を送信します。
14.1.5. connect
- xen:/// - ローカルの Xen ハイパーバイザーに接続します。
- qemu:///system- ルートとしてローカルで QEMU および KVM ドメインを監視するデーモンに接続します。
- xen:///session- ユーザーとしてローカルでユーザーの QEMU および KVM ドメインのセットに接続します。
- lxc:/// - ローカルの Linux コンテナーに接続します。
$ virsh connect {name|URI}
{name}
は、ハイパーバイザーのマシン名 (ホスト名) または URL (virsh uri コマンドの出力) です。読み取り専用接続を開始するには、上記のコマンドに --readonly
を追加します。URI の詳細については、リモート URI を参照してください。URI がわからない場合は、virsh uri コマンドを実行すると以下のようなメッセージが表示されます。
$ virsh uri
qemu:///session
14.1.6. 基本情報の表示
- $ hostname- ハイパーバイザーのホスト名を表示します
- $ sysinfo- 利用可能な場合、ハイパーバイザーのシステム情報の XML 表現を表示します
14.1.7. NMI の挿入
$ virsh inject-nmi guest-1
14.2. virsh を使用したデバイスの接続および更新
手順14.1 ゲスト仮想マシンが使用するホットプラグ USB デバイス
- 次のコマンドを使用して、接続する USB デバイスを見つけます。
# lsusb -v idVendor 0x17ef Lenovo idProduct 0x480f Integrated Webcam [R5U877]
- XML ファイルを作成し、論理名 (
usb_device.xml
など) を付けます。検索で表示されたとおりにベンダー ID と製品 ID をコピーしてください。図14.1 USB デバイスの XML スニペット
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x17ef'/> <product id='0x480f'/> </source> </hostdev> ...
- 次のコマンドでデバイスを接続します。
# virsh attach-device rhel6
--file usb_device.xml
--config
この例では、rhel6 はゲスト仮想マシンの名前であり、usb_device.xml は前の手順で作成したファイルです。次回の再起動時に変更を有効にする場合は、--config
オプションを使用します。この変更を永続的にする場合は、--persistent
オプションを使用します。変更を現在のドメインで有効にする場合は、--current
オプションを使用します。詳細については、Virsh の man ページを参照してください。 - デバイスを切り離す (ホットアンプラグ) 場合は、次のコマンドを実行します。
# virsh detach-device rhel6
--file usb_device.xml
この例では、rhel6 はゲスト仮想マシンの名前であり、usb_device.xml は前の手順で添付したファイルです。
14.3. インターフェイスデバイスの接続
--live-
- 実行中のドメインから値を取得します--config
- システムの次回起動時に使用する値を取得します。--current-
- 現在のドメインの状態に応じて値を取得します--persistent-
- オフラインドメインの場合は--config
のように動作し、実行中のドメインの場合は--live
のように動作します。--target
- ゲスト仮想マシンのターゲットデバイスを示します。--mac-
- これを使用して、ネットワークインターフェイスの MAC アドレスを指定します--script
- これは、デフォルトのパスの代わりに、ブリッジを処理するスクリプトファイルへのパスを指定します。--model-
- これを使用してモデルタイプを指定します。--inbound
- インターフェイスの着信帯域幅を制御します。指定できる値は、average
、peak
、およびburst
です。--outbound
- インターフェイスのアウトバウンド帯域幅を制御します。指定できる値は、average
、peak
、およびburst
です。
network
、またはデバイスへの bridge
を示すブリッジのいずれかです。source はデバイスのソースです。接続したデバイスを削除する場合は、virsh detach-device を実行します。
14.4. CDROM のメディアの変更
# change-media domain path source --eject
--insert
--update
--current
--live
--config
--force
--path
- ディスクデバイスの完全修飾パスまたはターゲットが含まれる文字列--source
- メディアのソースが含まれる文字列--eject-
- メディアを排出します--insert
- メディアを挿入します--update-
- メディアを更新します--current
---live
および--config
のいずれかまたは両方を指定できます。これは、ハイパーバイザードライバーの実装に依存します。--live-
- 実行中のドメインのライブ設定を変更します--config-
- 永続的な設定を変更し、次回の起動時に影響が観察されます--force-
- メディアの変更を強制します
14.5. ドメインコマンド
14.5.1. 起動時に自動的に開始されるドメインの設定
--disable
オプションを使用すると、自動起動が無効になります。
# virsh autostart rhel6
# virsh autostart rhel6 --disable
14.5.2. ゲスト仮想マシンのシリアルコンソールの接続
--force
オプションは、コンソール接続を強制するか、disconnect と一緒に使用すると、接続を切断します。--safe
オプションを使用すると、安全なコンソール処理がサポートされている場合にのみゲストが接続できます。
$ virsh console virtual_machine --safe
14.5.3. XML ファイルを使用したドメインの定義
14.5.4. ドメインの説明とタイトルの編集と表示
# virsh desc [domain-name] [[--live
] [--config
] | [--current
]] [--title
] [--edit
] [--new-desc
New description or title message]
--live
または --config
は、このコマンドがドメインのライブ定義または永続定義のどちらで機能するかを選択します。--live
と --config
の両方が指定されている場合、最初に --config
オプションが実装され、コマンドに入力された説明が、ライブ設定と永続設定設定の両方に適用される新しい設定設定になります。--current
オプションは、現在の状態の設定を変更または取得し、永続的ではありません。--live
、--config
、--current の
いずれも指定されていない場合、--current
オプションが使用されます。--edit
オプションは、現在の説明またはタイトルの内容を含むエディターを開き、内容を後で保存することを指定します。--title
オプションを使用すると、ドメインのタイトルフィールドのみが表示または変更され、説明は含まれません。また、コマンドで --edit
も --new-desc
も使用されていない場合は、説明のみが表示され、変更できません。
$ virsh desc testvm--current
--title
TestVM-4F--new-desc
Guest VM on fourth floor
14.5.5. デバイスブロック統計の表示
--human
オプションを使用します。
# virsh domblklist rhel6 Target Source ------------------------------------------------ vda /VirtualMachines/rhel6.img hdc - # virsh domblkstat --human rhel6 vda Device: vda number of read operations: 174670 number of bytes read: 3219440128 number of write operations: 23897 number of bytes written: 164849664 number of flush operations: 11577 total duration of reads (ns): 1005410244506 total duration of writes (ns): 1085306686457 total duration of flushes (ns): 340645193294
14.5.6. ネットワーク統計の取得
# domifstat rhel6 eth0
14.5.7. ドメインの仮想インターフェイスのリンク状態の変更
# domif-setlink [domain][interface-device][state]{--config
}
--config
オプションを使用する必要があることに注意してください。互換性の理由から、--persistent
は --config
のエイリアスであることに注意してください。interface device は、インターフェイスのターゲット名または MAC アドレスにすることができます。
# domif-setlink rhel6 eth0 up
14.5.8. ドメインの仮想インターフェイスのリンク状態の一覧表示
--config
オプションを使用する必要があることに注意してください。互換性の理由から、--persistent
は --config
のエイリアスであることに注意してください。interface device は、インターフェイスのターゲット名または MAC アドレスにすることができます。
# domif-getlink rhel6 eth0 up
14.5.9. ネットワークインターフェイスの帯域幅パラメーターの設定
#virsh domiftune domain interface-device [[--config] [--live] | [--current]] [--inbound average,peak,burst] [--outbound average,peak,burst]
--config
、--live
、--current
の機能は 「スケジュールパラメーターの設定」 と同じです。制限が指定されていない場合は、現在のネットワークインターフェイス設定をクエリーします。それ以外の場合は、以下のオプションで制限を変更します。
- <interface-device> これは必須であり、ドメインのネットワークインターフェイスの帯域幅パラメーターを設定またはクエリーします。interface-device は、インターフェイスのターゲット名 (<target dev='name'/>) または MAC アドレスにすることができます。
--inbound
または--outbound
が指定されていない場合、このコマンドは帯域幅設定をクエリーして表示します。それ以外の場合は、インバウンドまたはアウトバウンドの帯域幅を設定します。average、peak、burst は、attach-interface コマンドの場合と同じです。「インターフェイスデバイスの接続」 を参照してください。
14.5.10. 実行中のドメインのメモリー統計の取得
--period
オプションを使用するには、秒単位の期間が必要です。このオプションを 0 より大きい値に設定すると、バルーンドライバーは追加の統計を返します。これは、後続の domemstat コマンドにより表示されます。--period
オプションを 0 に設定すると、バルーンドライバーの収集は停止しますが、バルーンドライバーの統計情報はクリアされません。バルーンドライバーの収集期間を設定するために --period
オプションも設定しないと、--live
、--config
、--current
オプションを使用することはできません。--live
オプションが指定されている場合、実行中のゲストの収集期間のみが影響を受けます。--config
オプションを使用すると、永続ゲストの次回の起動に影響します。--current
オプションを使用すると、現在のゲストの状態に影響します
--live
オプションおよび --config
オプションの両方を使用できますが、--current
は使用できません。オプションが指定されていない場合、ゲストの状態によって動作が異なります。
#virsh domemstat rhel6 --current
14.5.11. ブロックデバイスのエラーの表示
# virsh domblkerror rhel6
14.5.12. ブロックデバイスのサイズの表示
# virsh domblkinfo rhel6
14.5.13. ドメインに関連付けられたブロックデバイスの表示
--inactive
--details
は、指定されたドメインに関連付けられているすべてのブロックデバイスのテーブルを表示します。
--inactive
を指定すると、次回のシステムの起動時に使用されるデバイスが結果に表示されます。また、ドメインで現在使用中のデバイスは表示されません。--details
を指定すると、ディスクのタイプとデバイス値がテーブルに含まれます。この表に表示される情報は、 domblkinfo および snapshot-create で使用できます。
#domblklist rhel6 --details
14.5.14. ドメインに関連付けられた仮想インターフェイスの表示
--inactive
オプションを使用できます。
--inactive
を指定すると、次回のシステムの起動時に使用されるデバイスが結果に表示されます。また、ドメインで現在使用中のデバイスは表示されません。
14.5.15. blockcommit を使用してバッキングチェーンを短縮する
base ← snap1 ← snap2 ← active.
手順14.2 virsh blockcommit
- 以下のコマンドを実行します。
# virsh blockcommit $dom $disk -base snap1 -top snap2 -wait -verbose
snap2 の内容が snap1 に移動し、以下のような結果になります。base ← snap1 ← active.Snap2 が無効になり、削除できるようになりました。警告blockcommit は-base
オプションに依存するすべてのファイルを破壊します (-top
オプションに依存するファイル以外は、それらのファイルがベースを指すようになったため)。これを回避するには、複数のゲストが共有するファイルに変更をコミットしないでください。-verbose
オプションにより、進捗状況を画面上に出力することができます。
14.5.16. ブロックプルを使用してバッキングチェーンを短縮する
- バッキングイメージチェーンからのデータをイメージに入力して、イメージをフラット化します。これにより、イメージファイルは自己完結型になり、背面イメージに依存しなくなり、以下のようになります。
- 前: base.img ← Active
- 後: base.img がゲストで使用されなくなり、Active にすべてのデータが含まれるようになりました。
- バッキングイメージチェーンの一部を平坦化します。これを使用すると、スナップショットをトップレベルイメージに平坦化し、以下のようになります。
- 前: base ← sn1 ←sn2 ← active
- 後: base.img ← active.アクティブには、sn1 および sn2 のすべてのデータが含まれるようになりました。また、ゲストでは sn1 も sn2 も使用されないことに注意してください。
- ディスクイメージを、ホストの新しいファイルシステムに移動します。これにより、ゲストの実行中にイメージファイルを移動できます。以下のようになります。
- 前 (元のイメージファイル) -
/fs1/base.vm.img
- 後:
/fs2/active.vm.qcow2
が新しいファイルシステムになり、/fs1/base.vm.img
が使用されなくなります。
- コピー後のストレージ移行を使用したライブマイグレーションに役立ちます。ディスクイメージは、ライブマイグレーションの完了後に、移行元ホストから移行先ホストにコピーされます。要するに、こういうことです: 前:
/source-host/base.vm.img
後:/destination-host/active.vm.qcow2
。/source-host/base.vm.img
は使用されなくなりました。
手順14.3 ブロックプルを使用してバッキングチェーンを短縮する
- blockpull を実行する前にこのコマンドを実行すると役立つ場合があります。
# virsh snapshot-create-as $dom $name - disk-only
- チェーンが次のようになっている場合: base ← snap1 ← snap2 ← active 次を実行します。
# virsh blockpull $dom $disk snap1
このコマンドは、snap2 からデータをアクティブにプルすることで、snap1 のバッキングファイルをアクティブな状態にします。その結果、base ← snap1 ← active になります。 - blockpullが完了すると、チェーンに追加イメージを作成したスナップショットのlibvirt追跡は役に立ちなくなります。次のコマンドを使用して、古いスナップショットの追跡を削除します。
# virsh snapshot-delete $dom $name - metadata
- 単一のイメージをフラット化し、そのバッキングイメージチェーンからのデータを取り込むには: # virsh blockpull example-domain vda - wait
- バッキングイメージチェーンの一部をフラット化するには: # virsh blockpull example-domain vda - base /path/to/base.img - wait
- ディスクイメージをホスト上の新しいファイルシステムに移動するには: # virsh snapshot-create example-domaine - xmlfile /path/to/new.xml - disk-only に続いて # virsh blockpull example-domain vda - wait
- コピー後のストレージ移行でライブ移行を使用する
- destination 実行時:
# qemu-img create -f qcow2 -o backing_file=/source-host/vm.img /destination-host/vm.qcow2
- ソース実行時:
# virsh migrate example-domain
- destination 実行時:
# virsh blockpull example-domain vda - wait
14.5.17. blockresize を使用してドメインパスのサイズを変更する
- 次のコマンドを実行します: blockresize [domain] [path size]。ここで、
- Domain は、サイズを変更するドメインの一意のターゲット名またはソースファイルです
- Path size はスケーリングされた整数であり、接尾辞がない場合、デフォルトで KiB (1024 バイトのブロック) になります。バイトには B の接尾辞を使用する必要があります。
14.5.18. ライブブロックコピーを使用したディスクイメージ管理
- ゲストイメージをローカルストレージから中央の場所に移動する
- メンテナーンスが必要な場合、パフォーマンスを損なうことなく、ゲストを別の場所に移動できます
- 速度と効率のためにゲストイメージの管理を可能にします
- ゲストをシャットダウンせずにイメージ形式の変換を行うことができます
例14.1 ライブブロックコピーを使用した例
- 最初のバッキングファイルチェーンは次のようになります。base ← sn1 ← sn2コンポーネントは以下のとおりです。
- ベース - 元のディスクイメージ
- sn1 - ベースディスクイメージから取得された最初のスナップショット
- sn2 - 最新のスナップショット
- アクティブ - ディスクのコピー
- イメージのコピーが sn2 の上に新しいイメージとして作成されると、結果は次のようになります。base ← sn1 ← sn2 ← active
- この時点で、読み取り権限はすべて正しい順序であり、自動的に設定されます。書き込み権限が適切に設定されていることを確認するために、ミラーメカニズムはすべての書き込みを sn2 とアクティブの両方にリダイレクトし、sn2 とアクティブがいつでも同じように読み取るようにします (このミラーメカニズムは、ライブブロックコピーとイメージストリーミングの本質的な違いです)。
- すべてのディスククラスターをループするバックグラウンドタスクが実行されます。クラスターごとに、次のケースとアクションが考えられます。
- クラスターはすでにアクティブに割り当てられており、何もする必要はありません。
- bdrv_is_allocated() を使用して、バッキングファイルチェーンを追跡します。クラスターが (共有されている) ベースから読み取られる場合、何もする必要はありません。
- bdrv_is_allocated() バリアントが実行可能でない場合は、イメージをリベースし、読み取りデータをベースの書き込みデータと比較して、コピーが必要かどうかを判断します。
- 他のすべての場合は、クラスターを
active
にコピーします
- コピーが完了すると、アクティブのバッキングファイルがベースに切り替えられます (リベースと同様)
14.5.19. グラフィック表示への接続の URI の表示
--include-password
オプションを使用すると、SPICE チャネルのパスワードが URI に含まれます。
14.5.20. ドメイン取得コマンド
- virsh domhostname domain は、ハイパーバイザーが公開できる場合、指定されたドメインのホスト名を表示します。
- virsh dominfo domain は、指定されたドメインに関する基本情報を表示します。
- virsh domuid domain|ID は、指定されたドメイン名または ID を UUID に変換します。
- virsh domid domain|ID は、指定されたドメイン名または UUID を ID に変換します。
- virsh domjobabort domain は、指定されたドメインで現在実行中のジョブを中止します。
- virsh domjobinfo domain は、移行統計情報など、指定されたドメインで実行されているジョブに関する情報を表示します
- virsh domname domain ID|UUID は、指定されたドメイン ID または UUID をドメイン名に変換します。
- virsh domstate domain は、指定されたドメインの状態を表示します。
--reason
オプションを使用すると、表示された状態の理由も表示されます。 - virsh domcontrol domain は、ドメインの制御に使用された VMM へのインターフェイスの状態を表示します。OK でも Error でもない状態の場合は、制御インターフェイスが表示状態に入ってから経過した秒数も出力されます。
例14.2 統計的フィードバックの例
# virsh domjobinfo rhel6 Job type: Unbounded Time elapsed: 1603 ms Data processed: 47.004 MiB Data remaining: 658.633 MiB Data total: 1.125 GiB Memory processed: 47.004 MiB Memory remaining: 658.633 MiB Memory total: 1.125 GiB Constant pages: 114382 Normal pages: 12005 Normal data: 46.895 MiB Expected downtime: 0 ms Compression cache: 64.000 MiB Compressed data: 0.000 B Compressed pages: 0 Compression cache misses: 12005 Compression overflows: 0
14.5.21. QEMU 引数のドメイン XML への変換
$ cat demo.args LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
$ virsh domxml-from-native qemu-argv demo.args
<domain type='qemu'> <uuid>00000000-0000-0000-0000-000000000000</uuid> <memory>219136</memory> <currentMemory>219136</currentMemory> <vcpu>1</vcpu> <os> <type arch='i686' machine='pc'>hvm</type> <boot dev='hd'/> </os> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/bin/qemu</emulator> <disk type='block' device='disk'> <source dev='/dev/HostVG/QEMUGuest1'/> <target dev='hda' bus='ide'/> </disk> </devices> </domain>
14.5.22. ドメインのコアのダンプファイルの作成
--bypass-cache
--live |--crash |--reset
--verbose
--memory-only
を実行すると、ドメインコアが corefilepath で指定されたファイルにダンプされます。一部のハイパーバイザーが提供する場合があることに注意してください。このアクションに対する制限があり、corefilepath パラメーターで指定されたファイルとパスに対する適切なアクセス許可を手動で確認する必要がある場合があります。このコマンドは、SR-IOV デバイスやその他のパススルーデバイスでサポートされます。次のオプションがサポートされており、次の効果があります。
--bypass-cache
保存されたファイルには、ファイルシステムキャッシュは含まれません。このオプションを選択すると、ダンプ操作が遅くなる可能性があることに注意してください。--live
は、ドメインの実行を継続するときにファイルを保存し、ドメインを一時停止または停止しません。--crash
は、ダンプファイルの保存中にドメインを一時停止状態のままにするのではなく、クラッシュ状態にします。--reset
ダンプファイルが正常に保存されると、ドメインがリセットされます。--verbose
は、ダンププロセスの進捗を表示します。--memory-only
ダンプファイルに保存される情報は、ドメインのメモリーと CPU 共通レジスタファイルのみです。
14.5.23. 仮想マシンの XML ダンプの作成 (設定ファイル)
# virsh dumpxml {guest-id, guestname or uuid}
# virsh dumpxml GuestID > guest.xml
guest.xml
は、ゲスト仮想マシンを再作成できます (参照 「ゲスト仮想マシンの設定ファイルの編集」。この XML 設定ファイルを編集して、追加のデバイスを設定したり、追加のゲスト仮想マシンをデプロイしたりできます。
# virsh dumpxml guest1-rhel6-64 <domain type='kvm'> <name>guest1-rhel6-64</name> <uuid>b8d7388a-bbf2-db3a-e962-b97ca6e514bd</uuid> <memory>2097152</memory> <currentMemory>2097152</currentMemory> <vcpu>2</vcpu> <os> <type arch='x86_64' machine='rhel6.2.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> <pae/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='threads'/> <source file='/home/guest-images/guest1-rhel6-64.img'/> <target dev='vda' bus='virtio'/> <shareable/< <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/> </disk> <interface type='bridge'> <mac address='52:54:00:b9:35:a9'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <input type='tablet' bus='usb'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes'/> <sound model='ich6'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </sound> <video> <model type='cirrus' vram='9216' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </memballoon> </devices> </domain>
14.5.24. 設定ファイルからのゲスト仮想マシンの作成
# virsh create configuration_file.xml
14.6. ゲスト仮想マシンの設定ファイルの編集
rhel6
という名前のゲスト仮想マシンを編集するには、以下を実行します。
# virsh edit rhel6
14.6.1. KVM ゲスト仮想マシンへの複合 PCI デバイスの追加
- virsh edit [guestname] コマンドを実行して、ゲスト仮想マシンの XML 設定ファイルを編集します。
- アドレスタイプタグに、function='0x0' の multifunction='on' エントリーを追加します。これにより、ゲスト仮想マシンで多機能 PCI デバイスを使用できるようになります。
<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-1.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/ </disk>
2 つの機能を持つ PCI デバイスの場合は、XML 設定ファイルを修正して、最初のデバイスと同じスロット番号と、別の機能番号 (function='0x1' など) を持つ 2 番目のデバイスを追加します。以下に例を示します。<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-1.img'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/> </disk> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source file='/var/lib/libvirt/images/rhel62-2.img'/> <target dev='vdb' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/> </disk>
- KVM ゲスト仮想マシンからの lspci 出力は次のことを示しています。
$ lspci 00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device 00:05.1 SCSI storage controller: Red Hat, Inc Virtio block device
14.6.2. 実行中のドメインを停止して後で再起動する
--bypass-cache
--running | --paused | --verbose
は、実行中のドメインを保存および破棄 (停止) して、後で同じ状態から再起動できるようにします。virsh start コマンドと併用すると、この保存ポイントから自動的に開始されます。--bypass-cache
オプションとともに使用すると、保存によってファイルシステムのキャッシュが回避されます。このオプションを使用すると、保存プロセスの速度が低下する可能性があることに注意してください。
--verbose
は、ダンププロセスの進捗を表示します。
--running
オプションを使用して、実行状態のままにする必要があることを示したり、--paused
オプションを使用して、一時停止状態のままにすることを示したりして上書きできます。
14.6.3. 指定されたドメインの CPU 統計情報の表示
--total
start
count
コマンドは、指定されたドメインの CPU 統計情報を提供します。デフォルトでは、すべての CPU の統計および合計が表示されます。--total
オプションは、合計統計のみを表示します。
14.6.4. スクリーンショットの保存
--screen
を使用して画面 ID を指定すると、キャプチャする画面を指定できます。複数のグラフィックカードがあり、デバイスの前にヘッドが番号付けされている場合、画面 ID5 は 2 番目のカードの 2 番目のヘッドをアドレス指定します。
14.6.5. 指定されたドメインへのキーストロークの組み合わせの送信
--codeset
--holdtime
keycode を使用すると、シーケンスを keycode として特定のドメインに送信できます。
# virsh send-key rhel6 --holdtime 1000
0xf
--holdtime
を指定すると、各キーストロークは指定した時間 (ミリ秒単位) 保持されます。--codeset
ではコードセットを指定できます。デフォルトは Linux ですが、以下のオプションを使用できます。
linux
- このオプションを選択すると、シンボリック名が対応する Linux キー定数マクロ名に一致するようになります。数値は、Linux 汎用入力イベントサブシステムが提供するものになります。xt
- XT キーボードコントローラーで定義する値を送信します。シンボリック名は記載されていません。atset1
- 数値は、AT キーボードコントローラー、set1 (XT 互換セット) で定義されるものです。atset1 から拡張されたキーコードは、XT コードセットの拡張キーコードとは異なる場合があります。シンボリック名は記載されていません。atset2
- 数値は、AT キーボードコントローラー、set 2 で定義されるものです。シンボリック名は記載されていません。atset3
- 数値は、AT キーボードコントローラー、set 3 (PS/2 互換) で定義されるものです。シンボリック名は記載されていません。os_x
- 数値は、OS-X キーボード入力サブシステムで定義されるものです。シンボリック名は、対応する OS-X の鍵定数マクロ名と一致します。xt_kbd
- 数値は、Linux KBD デバイスーで定義されるものです。これは、元の XT コードセットのバリアントですが、拡張キーコードのエンコードが異なります。シンボリック名は記載されていません。win32
- 数値は、Win32 キーボード入力サブシステムで定義されるものです。シンボリック名は、対応する Win32 鍵定数マクロ名と一致します。usb
- 数値は、キーボード入力の USB HID で定義されるものです。シンボリック名は記載されていません。rfb
- 数値は、raw キーコードを送信するために RFB 拡張で定義されるものです。これは XT コードセットのバリアントですが、拡張キーコードでは、最初のバイトの上位ビットではなく、2 番目のビットセットの下位ビットが使用されます。シンボリック名は記載されていません。
14.6.6. プロセス信号名を仮想プロセスに送信する
# virsh send-process-signal rhel6 187 kill # virsh send-process-signal rhel6 187 9
14.6.7. VNC ディスプレイの IP アドレスとポート番号の表示
# virsh vncdisplay rhel6 127.0.0.1:0
14.7. NUMA ノード管理
14.7.1. ノード情報の表示
$ virsh nodeinfo
CPU model: x86_64
CPU(s): 4
CPU frequency: 1199 MHz
CPU socket(s): 1
Core(s) per socket: 2
Thread(s) per core: 2
NUMA cell(s): 1
Memory size: 3715908 KiB
14.7.2. NUMA パラメーターの設定
<numatune>
要素内にネストされています。オプションを使用しない場合は、現在の設定のみが表示されます。numatune domain コマンドには指定されたドメインが必要であり、次のオプションを選択できます。
--mode
- モードは、strict
、インターリーブ
、または推奨
のいずれかに設定できます。実行中のドメインは、ドメインがstrict
モードで開始されていない限り、ライブ中にモードを変更することはできません。--nodeset
には、ドメインを実行するためにホスト物理マシンによって使用される NUMA ノードのリストが含まれています。この一覧には、それぞれがコンマで区切られたノードが含まれ、ノード範囲に使用されるダッシュ-
と、ノードの除外に使用されるカレット^
も含まれています。- インスタンスごとに使用できるオプションは、次の 3 つのうち 1 つだけです。
--config
は、永続ゲスト仮想マシンの次回の起動時に有効になります。--live
は、実行中のゲスト仮想マシンのスケジューラー情報を設定します。--current
は、ゲスト仮想マシンの現在の状態に影響を及ぼします。
14.7.3. NUMA セルの空きメモリー量の表示
--all
オプションを使用すると、各セルの空きメモリーとマシンの合計空きメモリーが表示されます。数値引数を使用するか、セル番号とともに --cellno
オプションを使用すると、指定したセルの空きメモリーが表示されます。
14.7.4. CPU リストの表示
$ virsh nodecpumap
CPUs present: 4
CPUs online: 1
CPU map: y
14.7.5. CPU 統計の表示
$ virsh nodecpustats
user: 1056442260000000
system: 401675280000000
idle: 7549613380000000
iowait: 94593570000000
$ virsh nodecpustats 2 --percent
usage: 2.0%
user: 1.0%
system: 1.0%
idle: 98.0%
iowait: 0.0%
14.7.6. ホスト物理マシンの一時停止
--target
オプションは、次のいずれかに設定できます。mem
、disk
、またhybrid
。これらのオプションは、メモリー、ディスク、または 2 つの組み合わせを一時停止するように設定することを示します。--duration
を設定すると、設定した期間が終了した後に起動するようにホスト物理マシンに指示します。秒単位で設定されます。継続時間は 60 秒より長くすることをお勧めします。
$ virsh nodesuspend disk 60
14.7.7. ノードメモリーパラメーターの設定および表示
- shm-pages-to-scan - 共有メモリーサービスがスリープ状態になる前にスキャンするページ数を設定します。
- shm-sleep-milisecs - 次のスキャンの前に共有メモリーサービスがスリープするミリ秒数を設定します
- shm-merge-across-nodes - 別の NUMA ノードのページをマージできるかどうかを指定します。許可される値は
0
と1
です。0
に設定すると、マージ可能なページのみが、同じ NUMA ノードのメモリー領域に存在するページのみです。1
に設定すると、全 NUMA ノードのページをマージすることができます。デフォルト設定は次のとおりです1
。
14.7.8. ホストノードでのデバイスの作成
<デバイス>
の XML の説明が含まれている必要があります。
14.7.9. ノードデバイスの切り離し
<hostdev>
パススルーを介してゲストが安全に使用できるようにします。このアクションは nodedev-reattach コマンドで元に戻すことができますが、マネージドサービスでは自動的に実行されます。このコマンドは、nodedev-dettach も受け入れます。
--driver
オプションを使用すると、目的のバックエンドドライバーを指定できます。
14.7.10. デバイスの設定設定の取得
<デバイス>
の XML 設定ファイルをダンプします。XML 設定には、デバイス名、たとえばデバイスを所有するバス、ベンダー、製品 ID などの情報が含まれます。引数の device は、デバイス名にすることも、WWNN | WWPN 形式の WWN の組み合わせにすることもできます (HBA のみ)。
14.7.11. ノード上のデバイスの一覧表示
--tree
コマンドは、libvirt によって認識されているノードで使用可能なすべてのデバイスを一覧表示します。cap は、機能タイプでリストをフィルターリングするために使用されます。各タイプはコンマで区切られ、--tree
と一緒に使用することはできません。--tree
オプションを使用すると、次のように出力がツリー構造になります。
# virsh nodedev-list --tree computer | +- net_lo_00_00_00_00_00_00 +- net_macvtap0_52_54_00_12_fe_50 +- net_tun0 +- net_virbr0_nic_52_54_00_03_7d_cb +- pci_0000_00_00_0 +- pci_0000_00_02_0 +- pci_0000_00_16_0 +- pci_0000_00_19_0 | | | +- net_eth0_f0_de_f1_3a_35_4f (this is a partial screen)
14.7.12. ノードのリセットのトリガー
14.8. ゲスト仮想マシンの起動、一時停止、再開、保存、および復元
14.8.1. 定義済みドメインの開始
--console
--paused
--autodestroy
--bypass-cache
--force-boot
--pass-fds
コマンドは、定義済みで非アクティブのドメインを起動します。この仮想マシンのステータスは、最後の管理保存状態または起動直後から非アクティブになっています。このコマンドは、次のオプションを選択できます。
--console
- コンソールに接続しているドメインを起動します--console
- これがドライバーによってサポートされている場合、ドメインを起動してから一時停止状態にします--autodestroy
- virsh セッションが閉じるか、libvirt への接続が閉じるか、それ以外の場合は終了すると、ゲスト仮想マシンは自動的に破棄されます--bypass-cache
- ドメインが管理された保存状態にある場合に使用されます。これを使用すると、システムキャッシュを回避して、ゲスト仮想マシンが復元されます。これにより、復元プロセスが遅くなることに注意してください。--force-boot
- managedsave オプションをすべて破棄し、新規ブートが実行されます。--pass-fds
- は、ゲスト仮想マシンに渡される、コンマで区切られた追加オプションのリストです。
14.8.2. ゲスト仮想マシンの一時停止
# virsh suspend {domain-id, domain-name or domain-uuid}
14.8.3. 実行中のドメインの一時停止
--duration
--target
コマンドは、実行中のドメインを取得して一時停止し、3 つの可能な状態 (S3、S4、または 2 つのハイブリッド) のいずれかに配置できるようにします。
# virsh dompmsuspend rhel6 --duration 100
--target mem
--duration
- 状態変更の期間を秒単位で設定します--target
-mem (suspend to RAM (S3))
disk (suspend to disk (S4))
またはhybrid (hybrid suspend)
のいずれかを使用できます。
14.8.4. pmsuspend 状態からドメインをウェイクアップする
# dompmwakeup rhel6
14.8.5. ドメインの定義を解除する
# virsh undefine domain--managed-save
--snapshots-metadata
--storage
--remove-all-storage
--wipe-storage
--managed-save
- このオプションは、管理対象の保存イメージもクリーンアップされることを保証します。このオプションを使用しない場合、管理対象の保存イメージを使用してドメインの定義を解除しようとすると失敗します。--snapshots-metadata
- このオプションは、非アクティブなドメインの定義を解除するときに、スナップショット (snapshot-list で示される) もクリーンアップされることを保証します。設定ファイルにスナップショットメタデータが含まれている非アクティブなドメインの定義を解除しようとすると失敗することに注意してください。このオプションが使用され、ドメインがアクティブである場合、それは無視されます。--storage
- このオプションを使用する場合は、ボリュームターゲット名またはストレージボリュームのソースパスをコンマで区切って指定し、未定義のドメインと一緒に削除する必要があります。このアクションでは、ストレージボリュームを削除する前にそのストレージボリュームの定義が解除されます。これは、非アクティブなドメインでのみ実行できることに注意してください。これは、libvirt で管理されるストレージボリュームでのみ機能することに注意してください。--remove-all-storage
- ドメインの定義を解除することに加えて、関連するすべてのストレージボリュームが削除されます。--wipe-storage
- ストレージボリュームを削除する以外にも、コンテンツをワイプします。
14.8.6. ゲスト仮想マシンの再開
# virsh resume {domain-id, domain-name or domain-uuid}
14.8.7. ゲスト仮想マシンを保存する
# virsh save {domain-name|domain-id|domain-uuid} state-file --bypass-cache
--xml
--running
--paused
--verbose
--bypass-cache
- 復元を実行してファイルシステムキャッシュを回避しますが、このオプションを使用すると復元動作が遅くなる可能性があることに注意してください。--xml
- このオプションは、XML ファイル名とともに使用する必要があります。通常、このオプションは省略されますが、ドメイン XML のホスト固有の部分のみを変更し、復元したゲスト仮想マシンで使用するための代替 XML ファイルを提供するために使用できます。たとえば、ゲストの保存後に取得されたディスクスナップショットによる、基になるストレージのファイル名の違いを説明するために使用できます。--running
- は、保存イメージに記録された状態をオーバーライドして、ドメインを実行中として開始します。--paused
- 保存イメージに記録された状態をオーバーライドして、ドメインを一時停止として開始します。--verbose
- 保存の進捗を表示します。
14.8.8. ゲストの復元に使用されるドメイン XML ファイルの更新
--running
|--paused
コマンドは、指定されたファイルが後で virsh restore コマンドで使用されるときに使用されるドメイン XML ファイルを更新します。xml 引数は、ドメイン XML のホスト物理マシン固有の部分のみが変更された代替 XML を含む XML ファイル名である必要があります。たとえば、ゲストを保存した後に、基となるストレージのディスクスナップショットを作成することで生じるファイルの命名の相違点を説明するために使用できます。ドメインを実行状態または一時停止状態に復元する必要があるかどうかを、イメージの保存で記録します。オプション --running
または --paused
を使用すると、使用する状態が決まります。
14.8.9. ドメイン XML ファイルの抽出
--security-info
コマンドは、保存された状態ファイル (virsh save コマンドで使用) が参照されたときに有効だったドメイン XML ファイルを抽出します。--security-info
オプションを使用すると、ファイルにセキュリティー上の機密情報が含まれます。
14.8.10. ドメイン XML 設定ファイルの編集
--running
--paused
コマンドは、virsh save コマンドによって作成された保存済み ファイルに関連付けられている XML 設定ファイルを編集します。
--running
状態または --paused
状態のどちらに復元する必要があるかが記録されることに注意してください。これらのオプションを使用しない場合、状態はファイル自体によって決定されます。--running
または --paused
を選択すると、virsh restore が使用する必要のある状態を上書きできます。
14.8.11. ゲスト仮想マシンを復元する
# virsh restore state-file
--bypass-cache
- 復元を実行してファイルシステムキャッシュを回避しますが、このオプションを使用すると復元動作が遅くなる可能性があることに注意してください。--xml
- このオプションは、XML ファイル名とともに使用する必要があります。通常、このオプションは省略されますが、ドメイン XML のホスト固有の部分のみを変更し、復元したゲスト仮想マシンで使用するための代替 XML ファイルを提供するために使用できます。たとえば、ゲストの保存後に取得されたディスクスナップショットによる、基になるストレージのファイル名の違いを説明するために使用できます。--running
- は、保存イメージに記録された状態をオーバーライドして、ドメインを実行中として開始します。--paused
- 保存イメージに記録された状態をオーバーライドして、ドメインを一時停止として開始します。
14.9. ゲスト仮想マシンのシャットダウン、再起動、および強制シャットダウン
14.9.1. ゲスト仮想マシンのシャットダウン
# virsh shutdown{domain-id, domain-name or domain-uuid}
[--mode method]
14.9.2. Red Hat Enterprise Linux 7 ホストでの Red Hat Enterprise Linux 6 ゲストのシャットダウン
Minimal installation
を使用して Red Hat Enterprise Linux 6 ゲスト仮想マシンをインストールしても、acpid パッケージ はインストールされません。Red Hat Enterprise Linux 7 は、systemd
に引き継がれたため、このパッケージを必要としなくなりました。ただし、Red Hat Enterprise Linux 7 ホストで実行されている Red Hat Enterprise Linux 6 ゲスト仮想マシンには引き続き必要です。
手順14.4 Red Hat Enterprise Linux 6 ゲストの回避策
acpid パッケージのインストール
acpid サービスは、ACPI 要求をリッスンして処理します。ゲスト仮想マシンにログインし、ゲスト仮想マシンに acpid パッケージをインストールします。# yum install acpid
acpid サービスを有効にする
ゲスト仮想マシンの起動シーケンス中にacpid
サービスを開始するように設定し、サービスを開始します。# chkconfig acpid on # service acpid start
ゲストドメイン xml の準備
ドメインの XML ファイルを編集して、次の要素を追加します。virtio シリアルポートをorg.qemu.guest_agent.0
に置き換え、$guestname の代わりにゲストの名前を使用します。図14.2 ゲスト XML の置き換え
<channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/{$guestname}.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> </channel>
QEMU ゲストエージェントのインストール
QEMU ゲストエージェント (QEMU-GA) をインストールし、指示に従ってサービスを開始します。10章qemu-img および QEMU ゲストエージェント。Windows ゲストを実行している場合は、本章にもそのための手順があります。ゲストをシャットダウンします
- 以下のコマンドを実行します。
# virsh list --all - this command lists all of the known domains Id Name State ---------------------------------- rhel6 running
- ゲスト仮想マシンのシャットダウン
# virsh shutdown rhel6 Domain rhel6 is being shutdown
- ゲスト仮想マシンがシャットダウンするまで数秒待ちます。
# virsh list --all Id Name State ---------------------------------- . rhel6 shut off
- 編集した XML ファイルを使用して、rhel6 という名前のドメインを開始します。
# virsh start rhel6
- rhel6 ゲスト仮想マシンの acpi をシャットダウンします。
# virsh shutdown --mode acpi rhel6
- すべてのドメインを再度一覧表示し、rhel6 が一覧に含まれていることを確認し、シャットダウンしていることを示します。
# virsh list --all Id Name State ---------------------------------- rhel6 shut off
- 編集した XML ファイルを使用して、rhel6 という名前のドメインを開始します。
# virsh start rhel6
- rhel6 ゲスト仮想マシンゲストエージェントをシャットダウンします。
# virsh shutdown --mode agent rhel6
- ドメインを一覧表示します。rhel6 はまだリストに含まれており、シャットオフされていることを示しているはずです。
# virsh list --all Id Name State ---------------------------------- rhel6 shut off
libvirt-guests
サービスを停止することで、ゲストを自動的にシャットダウンできます。この方法に関する詳細は、「libvirt-guests 設定設定の操作」 を参照してください。
14.9.3. libvirt-guests 設定設定の操作
libvirt-guests
サービスには、ゲストが適切にシャットダウンするように設定できるパラメーターがあります。これは、libvirt インストールの一部で、デフォルトでインストールされるパッケージです。このサービスは、ホストのシャットダウン時にゲストをディスクに自動的に保存し、ホストの再起動時にゲストをシャットダウン前の状態に復元します。デフォルトでは、この設定はゲストを一時停止するように設定されています。ゲストをシャットオフする場合は、libvirt-guests
設定ファイルのパラメーターの 1 つを変更する必要があります。
手順14.5 ゲストの正常なシャットダウンを可能にするための libvirt-guests サービスパラメーターの変更
設定ファイルを開きます。
設定ファイルは/etc/sysconfig/libvirt-guests
にあります。ファイルを編集し、コメントマーク (#) を削除し、ON_SHUTDOWN=suspend
をON_SHUTDOWN=shutdown
に変更します。変更を保存することを忘れないでください。$ vi /etc/sysconfig/libvirt-guests # URIs to check for running guests # example: URIS='default xen:/// vbox+tcp://host/system lxc:///' #URIS=default # action taken on host boot # - start all guests which were running on shutdown are started on boot # regardless on their autostart settings # - ignore libvirt-guests init script won't start any guest on boot, however, # guests marked as autostart will still be automatically started by # libvirtd #ON_BOOT=start # Number of seconds to wait between each guest start. Set to 0 to allow # parallel startup. #START_DELAY=0 # action taken on host shutdown # - suspend all running guests are suspended using virsh managedsave # - shutdown all running guests are asked to shutdown. Please be careful with # this settings since there is no way to distinguish between a # guest which is stuck or ignores shutdown requests and a guest # which just needs a long time to shutdown. When setting # ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a # value suitable for your guests. ON_SHUTDOWN=shutdown # If set to non-zero, shutdown will suspend guests concurrently. Number of # guests on shutdown at any time will not exceed number set in this variable. #PARALLEL_SHUTDOWN=0 # Number of seconds we're willing to wait for a guest to shut down. If parallel # shutdown is enabled, this timeout applies as a timeout for shutting down all # guests on a single URI defined in the variable URIS. If this is 0, then there # is no time out (use with caution, as guests might not respond to a shutdown # request). The default value is 300 seconds (5 minutes). #SHUTDOWN_TIMEOUT=300 # If non-zero, try to bypass the file system cache when saving and # restoring guests, even though this may give slower operation for # some file systems. #BYPASS_CACHE=0
- ???
URIS
- checks the s