15.5.3.3. Attaching a virtio-mem device to virtual machines
実行中の仮想マシンに追加のメモリーをアタッチ (メモリーのホットプラグとも呼ばれます) し、その後ホットプラグされたメモリーのサイズを変更できるようにするには、virtio-mem デバイスを使用できます。具体的には、libvirt XML 設定ファイルと virsh コマンドを使用し、virtio-mem デバイスを定義して仮想マシン (VM) に割り当てることができます。
前提条件
- ホストが、Intel 64、AMD64、ARM 64、または IBM Z CPU アーキテクチャーを使用している。
ホストは、以下のいずれかのオペレーティングシステムバージョンを使用します。
- Intel 64 ホストおよび AMD64 ホスト - RHEL 9.4 以降
- ARM 64 ホストの場合: RHEL 9.6 以降
- IBM Z ホストの場合:RHEL 9.7 以降
ホスト上で実行されている仮想マシンが、次のいずれかのオペレーティングシステムバージョンを使用している。
Intel 64 ホストおよび AMD64 ホスト - RHEL 8.10、RHEL 9.4 以降、または RHEL 10.0 以降
重要RHEL 8.10 仮想マシンでは、実行中の仮想マシンからメモリーをアンプラグすることはデフォルトで無効になっています。
- ARM 64 ホストの場合: RHEL 9.6 以降または RHEL 10.0 以降
- IBM Z ホストの場合: RHEL 9.7 以降または RHEL 10.1 以降
- VM にメモリーオンライン化が設定されている。手順は、仮想マシンでのメモリーのオンライン化設定 を参照してください。
手順
ターゲット仮想マシンの XML 設定に
maxMemoryパラメーターが含まれるようにします。# virsh edit testguest1 <domain type='kvm'> <name>testguest1</name> ... <maxMemory unit='GiB'>128</maxMemory> ... </domain>この例では、
testguest1仮想マシンの XML 設定で、128 ギビバイト (GiB) のmaxMemoryパラメーターが定義されています。maxMemoryサイズは、仮想マシンが使用できる最大メモリーを指定します。これには、初期メモリーとホットプラグされたメモリーの両方が含まれます。XML ファイルを作成して開き、ホスト上の
virtio-memデバイスを定義します。次に例を示します。# vim virtio-mem-device.xmlvirtio-memデバイスの XML 定義をファイルに追加し、保存します。<memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </memory> <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>1</node> <block unit='MiB'>2</block> <requested unit='GiB'>0</requested> <current unit='GiB'>0</current> </target> <alias name='ua-virtiomem1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </memory>この例では、2 つの
virtio-memデバイスが以下のパラメーターで定義されます。-
size: これは、デバイスの最大サイズです。この例では 48 GiB です。sizeはblockサイズの倍数である必要があります。 -
node: これは、virtio-memデバイスに割り当てられた vNUMA ノードです。 -
block: これはデバイスのブロックサイズです。これは、少なくとも transparent huge page (THP) のサイズである必要があります。THP は、Intel 64 および AMD64 CPU アーキテクチャーでは 2 MiB です。ARM64 アーキテクチャーでは、THP のサイズはベースページサイズに応じて 2 MiB または 512 MiB になります。通常、Intel 64 または AMD64 アーキテクチャーでは、2 MiB ブロックサイズが適切なデフォルトの選択となります。virtio-memを Virtual Function I/O (VFIO) または 仲介デバイス (mdev) で使用する場合、すべてのvirtio-memデバイスにまたがるブロックの合計数は 32768 を超えることはできません。超えると、RAM のプラグインに失敗する可能性があります。 -
requested: これは、virtio-memデバイスを使用して仮想マシンに割り当てるメモリー量です。ただし、これは VM に対する単なるリクエストであり、VM が適切に設定されていない場合など、正常に解決されない可能性があります。requestedサイズはblockサイズの倍数である必要があり、定義された最大sizeを超えることはできません。 -
current: これは、virtio-memデバイスが仮想マシンに提供する現在のサイズを表します。たとえば、リクエストを完了できない場合や VM を再起動する場合など、currentサイズは、requestedサイズとは異なる場合があります。 alias: これは、libvirt コマンドでデバイスを編集する場合など、目的のvirtio-memデバイスを指定するために使用できるオプションのユーザー定義のエイリアスです。libvirt のすべてのユーザー定義のエイリアスは、"ua-" 接頭辞で始まる必要があります。これらの特定のパラメーターとは別に、
libvirtは、virtio-memデバイスを他の PCI デバイスと同様に処理します。
-
XML ファイルを使用して、定義された
virtio-memデバイスを仮想マシンにアタッチします。たとえば、virtio-mem-device.xmlで定義された 2 つのデバイスを実行中の仮想マシンtestguest1に永続的にアタッチするには、次のコマンドを実行します。# virsh attach-device testguest1 virtio-mem-device.xml --live --config--liveオプションは、実行中の仮想マシンにのみデバイスを接続します。再起動後に永続性は維持されません。--configオプションは、設定の変更を永続化します。--liveオプションを指定せずに、デバイスをシャットダウンした仮想マシンに接続することもできます。オプション: 実行中の仮想マシンに接続されている
virtio-memデバイスのrequestedサイズを動的に変更するには、virsh update-memory-deviceコマンドを使用します。# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiBこの例では、以下が適用されます。
-
testguest1は、更新する仮想マシンです。 -
--alias ua-virtiomem0は、以前に定義されたエイリアスで指定されたvirtio-memデバイスです。 --requested-size 4GiBは、virtio-memデバイスのrequestedサイズを 4 GiB に変更します。警告requestedサイズを減らして実行中の仮想マシンからメモリーをアンプラグすると、信頼性が低下する可能性があります。このプロセスが成功するかどうかは、使用中のメモリーオンライン化ポリシーなど、さまざまな要因によって決まります。場合によっては、その時点でホットプラグされたメモリーの量を変更できないため、ゲストオペレーティングシステムが要求を正常に完了できないことがあります。
さらに、RHEL 8.10 仮想マシンでは、実行中の仮想マシンからメモリーをアンプラグすることはデフォルトで無効になっています。
-
オプション: シャットダウンした仮想マシンから
virtio-memデバイスを取り外すには、virsh detach-deviceコマンドを使用します。# virsh detach-device testguest1 virtio-mem-device.xmlオプション: 実行中の仮想マシンから
virtio-memデバイスを取り外すには、以下を実行します。virtio-memデバイスのrequestedサイズを 0 に変更します。そうしないと、実行中の仮想マシンからvirtio-memデバイスを取り外す試行が失敗します。# virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0実行中の仮想マシンから
virtio-memデバイスを取り外します。# virsh detach-device testguest1 virtio-mem-device.xml --config
検証
仮想マシンで、利用可能な RAM を確認し、合計量にホットプラグされたメモリーが含まれているかを確認します。
# free -h total used free shared buff/cache available Mem: 31Gi 5.5Gi 14Gi 1.3Gi 11Gi 23Gi Swap: 8.0Gi 0B 8.0Gi# numactl -H available: 1 nodes (0) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 29564 MB node 0 free: 13351 MB node distances: node 0 0: 10実行中の仮想マシンの XML 設定を表示して、プラグイン RAM の現在の容量をホストで表示することもできます。
# virsh dumpxml testguest1 <domain type='kvm'> <name>testguest1</name> ... <currentMemory unit='GiB'>31</currentMemory> ... <memory model='virtio-mem'> <target> <size unit='GiB'>48</size> <node>0</node> <block unit='MiB'>2</block> <requested unit='GiB'>16</requested> <current unit='GiB'>16</current> </target> <alias name='ua-virtiomem0'/> <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/> ... </domain>この例では、以下が適用されます。
-
<currentMemory unit='GiB'>31</currentMemory>は、すべてのソースから VM で利用可能な合計 RAM を表します。 -
<current unit='GiB'>16</current>は、virtio-memデバイスが提供するプラグイン RAM の現在のサイズを表します。
-