KVMストレージ構成

libvirtは、KVMで使用するために構成できる様々なストレージ・メカニズムを処理します。そうしたメカニズムは、異なるプールまたはユニットに編成されています。デフォルトでは、libvirtは新しいディスクの作成にディレクトリベースのストレージ・プールを使用しますが、物理ディスク、NFS、iSCSIなどの様々なストレージ・タイプに対してプールを構成できます。

構成されているストレージ・プールのタイプに応じて、KVMで様々なストレージ・ボリュームをブロック・デバイスとして使用できるようになります。iSCSIプールを使用する場合など、ボリュームを定義する必要がないこともあります。これは、KVMにiSCSIターゲットのLUNが自動的に提示されるためです。

KVMでlibvirtを使用するために、異なるストレージ・プールとボリュームを定義する必要がないことに注意してください。これらのツールは、必要に応じてKVMによるストレージの使用方法と消費方法を管理するのに役立ちます。デフォルトのディレクトリベースのストレージを使用して、デフォルトの場所に手動でマウントしたストレージを使用できます。

KVM環境の複雑なストレージ要件の管理と構成が簡単になるように、Oracle Linux Virtualization Managerの使用をお薦めします。または、Cockpitを使用してKVMストレージを管理することもできます。詳細は、『Oracle Linux: Cockpit Webコンソールの使用』ストレージ管理タスクを参照してください。

コマンドラインを使用してKVMで使用するストレージ構成を管理する方法の詳細は、次のトピックを参照してください:

ストレージ・プール: 作成および管理

ストレージ・プールによってストレージ・タイプの論理的なグループ化が可能になります。ストレージ・タイプは、ボリュームをホストするために使用でき、そのボリュームをVMのセットが仮想ディスクとして使用できます。多様なストレージ・タイプが用意されています。ローカル・ストレージは、ディレクトリベースのストレージ・プール、ファイル・システム・ストレージおよびディスクベースのストレージの形式で使用できます。その他のストレージ・タイプ(NFS、iSCSIなど)では、標準ネットワーク・ベースのストレージが提供され、RBDタイプでは分散ストレージが提供されます。詳細は、https://libvirt.org/storage.htmlを参照してください。

ストレージ・プールは、基盤となるストレージ・リソースをVM構成から抽象化するために役立ちます。この抽象化は、仮想ディスクなどのリソースが、物理的な場所やメディア・タイプを変更する可能性がある場合に役立ちます。ターゲット・パス、DNSまたはIPアドレス指定は時間とともに変化する可能性があるため、ネットワーク・ベースのストレージを使用するときに抽象化がより重要になります。この構成情報を抽象化することで、複数のKVMインスタンスを更新する必要なく、統合された方法でリソースを管理できるようになります。

ホストがリブートするまで使用可能な一時ストレージプールを作成することも、リブート後に復元される永続ストレージ・プールを定義することもできます。

一時ストレージ・プールは、作成直後に自動的に起動され、その中のボリュームは即座にVMで使用できるようになりますが、一時ストレージ・プールに関する構成情報は、プールの停止後、ホストのリブート後またはlibvirtdサービスが再起動された場合に失われます。ストレージ自体に影響はありませんが、一時ストレージ・プール内のリソースを使用するように構成されたVMは、そうしたリソースにアクセスできなくなります。一時ストレージ・プールは、virsh pool-createコマンドを使用して作成します。

ほとんどの場合に、永続ストレージ・プールの作成を検討する必要があります。永続ストレージ・プールは、構成エントリとして定義され、/etc/libvirt内に格納されます。永続ストレージ・プールは停止および起動が可能で、ホスト・システムのブート時に起動するように構成できます。libvirtは、永続ストレージの構成時に、ネットワーク・ベースのリソースを自動的にマウントしてアクセスできるようにします。永続ストレージ・プールの作成にはvirsh pool-defineコマンドを使用するため、通常、そのプールを使用するには作成後に起動する必要があります。

コマンドラインを使用してKVMのストレージ・プールを作成および管理する方法の詳細は、次のトピックを参照してください:

ストレージ・プールの作成

永続ストレージ・プールを作成するには、virshツールを使用します。
  1. プールを定義します。
    virsh pool-define-as pool_name type
    説明:
    • pool_name – プールに割り当てる名前。
    • type – プールで使用されるストレージ・タイプ。
    指定できるストレージ・タイプの詳細は、libvirtのドキュメントを参照してください:

    次の表に、定義可能な様々なプール・タイプの例を示します:

    コマンド 構成の詳細
    virsh pool-define-as pool_name dir \
    --target /share/storage_pool
    ホスト・システムの/share/storage_poolにあるディレクトリにpool_nameという名前のプールを作成します。
    virsh pool-define-as pool_name fs \
    --source-dev /dev/sdc1 \
    --target /share/storage_mount
    フォーマットされたブロック・デバイス/dev/sdc1をマウント・ポイント/share/storage_mountにマウントする、ファイル・システム・ベースのストレージを作成します。
    virsh pool-define-as pool_name netfs \
    --source-path /ISO \
    --source-host nfs.example.com \
    --target /share/storage_nfs
    NFS共有をストレージ・プールとして作成します。
  2. プールが定義されたことを確認します。
    virsh pool-info pool_name
    システム上のすべてのプールのリストを表示することもできます。
    virsh pool-list --all
  3. ターゲット・パスが存在しない場合は、ディレクトリを作成します。
    virsh pool-build pool_name
  4. プールを起動します。
    virsh pool-start pool_name
  5. システムのブート時に自動的に起動するようにプールを構成します。
    virsh pool-autostart pool_name

プールを作成したら、プール内にストレージ・ボリュームを作成できます。詳細は、「ストレージ・ボリュームの作成」を参照してください。

virt-installを使用してVMを作成するときに、使用するプールを指定することもできます。--disk引数と、poolおよびsizeサブ・オプションを含めます。次に例を示します:

virt-install 
...
--disk pool=pool_name, size=80

XMLからのストレージ・プールの作成

XMLファイルからストレージ・プール構成をロードしてプールを作成するには、virshツールを使用します。
  1. ストレージ・プールの定義を含むXMLファイルを作成します。

    ストレージ・プール定義のXML形式の詳細は、ストレージ・プールおよびボリュームのXML形式を参照してください。

    たとえば、iSCSIボリュームにストレージ・プールを作成するには、pool_definition.xmlという名前のXMLファイルを次の内容で作成します:

    <pool type='iscsi'>
      <name>pool_name</name>
      <source>
        <host name='192.0.2.1'/>
        <device path='iqn.2024-12.com.mycompany:my-iscsi-host'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>

    前述の例では、iSCSIサーバーがすでに構成されていて、IPアドレス192.0.2.1のホストで実行されており、iSCSI修飾名(IQN)がiqn.2024-12.com.mycompany:my-iscsi-hostであることを想定しています。

  2. virsh pool-defineを実行して、XMLファイルからlibvirtに構成情報をロードします。
    たとえば、前のステップのpool_definition.xmlファイルをロードするには、次のコマンドを実行します:
    virsh pool-define pool_definition.xml
  3. プールが定義されたことを確認します。
    virsh pool-info pool_name
    システム上のすべてのプールのリストを表示することもできます。
    virsh pool-list --all
  4. ターゲット・パスが存在しない場合は、ディレクトリを作成します。
    virsh pool-build pool_name
  5. プールを起動します。
    virsh pool-start pool_name
  6. システムのブート時に自動的に起動するようにプールを構成します。
    virsh pool-autostart pool_name

ストレージ・プールの削除

永続ストレージ・プールを停止および削除するには、virshツールを使用します。
  1. ストレージ・プールを停止します。
    virsh pool-destroy pool_name
  2. ストレージ・プールのディレクトリを削除します。

    ノート:

    このコマンドでディレクトリを削除するには、ディレクトリが空である必要があります。
    virsh pool-delete pool_name
  3. システムからストレージ・プール定義を削除します。
    virsh pool-undefine pool_name
  4. ストレージ・プールの削除を確認します。
    virsh pool-list --all

ストレージ・ボリューム: 作成および管理

ストレージ・ボリュームはストレージ・プール内に作成され、1つ以上のVM内のブロック・デバイスとしてロードできる仮想ディスクに相当します。一部のストレージ・プール・タイプでは、ストレージ・ボリュームを個別に作成する必要はありません。ストレージ・メカニズムによって、すでにVMにブロック・デバイスとして設定されている場合があるためです。たとえば、iSCSIストレージ・プールは、iSCSIターゲットの個々の論理ユニット番号(LUN)を個別のブロック・デバイスとして指定します。

ディレクトリ・ベースまたはファイル・システム・ベースのストレージ・プールを使用する場合などは、仮想ディスクとして使用するためにストレージ・ボリュームを個別に作成します。その場合、いくつかのディスク・イメージ形式がサポートされていますが、一部の形式(qcow2など)の作成には追加のツール(qemu-imgなど)が必要になることがあります。

ディスク・ベースのプールの場合、標準パーティション・タイプのラベルは個々のボリュームを表すために使用されます。論理ボリュームマネージャに基づくプールの場合、ボリューム自体がプール内で個別に提供されます。

ストレージ・ボリュームは、ボリュームの初期サイズの割当て値をボリュームの容量より低い値に設定することで、作成時にスパース割当てできます。割当てはボリュームの初期または現在の物理サイズを示し、容量はKVMに提供される仮想ディスクのサイズを示します。スパース割当ては、KVMが最初に使用可能なディスク領域よりも最終的に多くのディスク領域を必要とする可能性がある場合に、物理ディスク領域をオーバーサブスクライブするために使用されます。スパース割当てされていないボリュームの場合、割当てはボリュームの容量と同じかそれ以上になります。ディスクの容量を超えると、メタデータ用の領域が必要に応じて提供されます。

同じシステムの別のプールに同じ名前のボリュームがある場合、--poolオプションを使用して、virshボリューム操作に使用するプールを指定する必要があります。この処理は後続の例で繰り返されます。

コマンドラインを使用してKVMで使用するストレージ・ボリュームを作成および管理する方法の詳細は、次のトピックを参照してください:

記憶域ボリュームの作成

ストレージ・プールのタイプに応じて、virsh vol-create-asコマンドを使用してストレージ・ボリュームを作成できます。
  1. virsh vol-create-asを実行し、必要な引数としてプール、ボリューム名および容量を含めます。
    次に例を示します:
    virsh vol-create-as \
    --pool pool_name \
    --name volume_name \
    --capacity 10G

    割当てや形式などの使用可能なオプションの多くにはデフォルト値が設定されるため、通常はボリュームを作成するストレージ・プールの名前、ボリュームの名前および必要な容量のみを指定できます。

  2. ストレージ・ボリュームの作成を確認します。
    virsh vol-info --pool pool_name volume_name

    次のような出力が表示されます。

    Name:           volume_name
    Type:           file
    Capacity:       9.31 GiB
    Allocation:     8.00 GiB

XMLからのストレージ・ボリュームの作成

ストレージ・プールのタイプに応じて、virsh vol-createコマンドを使用してXMLファイルからストレージ・ボリュームを作成できます。このコマンドは、ボリューム・パラメータのXMLファイル表現が指定されることを想定しています。

  1. ストレージ・ボリュームを定義するXMLファイルを作成します。

    ボリューム用のXMLは、プール・タイプと作成されるボリュームによって異なりますが、qcow2形式でスパース割当てされた10GBイメージの場合、XMLは次のようになります。

    <volume>
    	<name>volume1</name>
    	<allocation>0</allocation>
    	<capacity unit="G">10</capacity>
    	<target>
    		<path>/home/testuser/.local/share/libvirt/images/volume1.qcow2</path>
    		<permissions>
    			<owner>107</owner>
    			<group>107</group>
                		<mode>0744</mode>
                		<label>virt_image_t</label>
              	</permissions>
            </target>
    </volume>

    詳細は、libvirtのドキュメントのストレージ・プールおよびボリュームのXML形式を参照してください。

  2. virsh vol-createを実行し、必要な引数としてプールおよびソースXMLファイルを含めます。
    たとえば、volume1.xmlという名前のXMLファイルを使用して、pooldirという名前のストレージ・プールにボリュームを作成するには、次のコマンドを実行します:
    virsh vol-create pooldir volume1.xml

ストレージ・ボリュームのクローニング

ストレージ・ボリュームをクローニングするには、virsh vol-cloneコマンドを使用します。

  1. virsh vol-cloneコマンドを実行し、必要な引数として元のボリュームの名前とクローニングされたボリュームの名前を含めます。
    次に例を示します:
    virsh vol-clone --pool pool_name volume1 volume1-clone

    クローンは、同じパラメータを持つ同じストレージ・プールに作成されます。

  2. クローニングされたボリュームの作成を確認します。
    virsh vol-list --pool pool_name --details

ストレージ・ボリュームのサイズ変更

VMによって使用されていないストレージ・ボリュームの場合、virsh vol-resizeコマンドを使用してサイズを変更できます。
  1. virsh vol-resizeコマンドを実行し、必要な引数としてボリュームおよび容量を指定します。
    次に例を示します:
    virsh vol-resize --pool pool_name volume1 15G

    注意:

    既存のボリュームのサイズを減らすと、データが破損するリスクがあります。それでも、ボリュームのサイズを縮小するように変更する場合は、--shrinkオプションで新しいサイズ値を指定する必要があります。

ストレージ・ボリュームの削除

ストレージ・ボリュームを削除するには、virsh vol-deleteコマンドを実行します。

  1. virsh vol-deleteを実行し、必要な引数としてボリューム名を指定します。

    たとえば、pool_nameというストレージ・プール内のvolume1というボリュームを削除するには、次のコマンドを実行します:

    virsh vol-delete volume1 --pool pool_name

仮想ディスク: 作成および管理

通常、仮想ディスクは特定のパスに格納されているディスク・イメージに基づいて、ブロック・デバイスとしてVMにアタッチされます。仮想ディスクは、作成時にVMに対して定義することも、既存のVMに追加することもできます。

ノート:

仮想ディスクを管理するためのコマンドライン・ツールでは、ストレージ・ボリュームとストレージ・プールの処理に関して完全な一貫性があるわけではありません。
KVMで使用する仮想ディスクを作成および管理する方法の詳細は、次のトピックを参照してください:

既存のVMへの仮想ディスクのアタッチ

既存のVMにディスク・イメージをアタッチするには、virsh attach-diskコマンドを使用します。

既存のVMにボリュームをアタッチするコマンドライン・ツールは制限されており、cockpitなどのGUIツールはこの操作により適しています。ボリュームに関する作業が頻繁になると予想される場合は、Oracle Linux Virtualization Managerの使用を検討してください。

  1. ディスク・イメージがボリュームの場合は、virsh vol-listコマンドを実行して、そのパスを取得します。
    virsh vol-list storage_pool_1

    次のような出力が表示されます。

     Name            Path                                    
    --------------------------------------------------------------------
     volume1         /share/disk-images/volume1.qcow2
  2. 既存のVM構成内にディスク・イメージをアタッチし、そのイメージが永続的になるようにして、その後のVMの再起動のたびにアタッチされるようにするには、次のコマンドを実行します。
    virsh attach-disk --config \
    --domain guest_name \
    --source /share/disk-images/volume1.qcow2 \
    --target sdb1

    このコマンドでVMにディスク・イメージをアタッチするときに、そのイメージへのパスを指定する必要があります。

    次のオプションを使用できます。

    • --live – 実行中のVMにディスク・イメージを一時的にアタッチします。
    • --persistent – 実行中のVMにディスク・イメージをアタッチし、その構成を更新して、以降の再起動のたびにディスクがアタッチされるようにします。

VM作成時の仮想ディスクのアタッチ

VMの作成時に、ストレージ・ボリュームを仮想ディスクとしてVMにアタッチできます。virt-installコマンドを使用すると、ボリュームまたはストレージ・プールを直接指定できます。その場合は、--diskオプションを使用します。

  1. virt-installを使用してVMを作成し、必要な--disk引数を含めます。

    VMの作成時に既存のボリュームを使用するには、volオプションを含めます。次に例を示します:

    virt-install \
    --name guest \
    --disk vol=storage_pool/volume1.qcow2
    ...

    インストール時に既存のストレージ・プール内に仮想ディスクをボリュームとして自動的に作成するには、poolオプションを含めます。この場合、sizeオプションも必要です。次に例を示します:

    virt-install \
    --name guest \
    --disk pool=storage_pool size=10
    ...

仮想ディスクのデタッチ

VMから仮想ディスクを削除する場合は、virsh detach-diskコマンドを使用できます。

注意:

実行中のVMからディスクをデタッチする前に、ゲストOS内で適切なアクションを実行して、最初にディスクを正しくオフラインにしてください。そうしないと、ファイル・システムが破損する可能性があります。たとえば、ディスクをデタッチする前に、残っている同期操作が実行されるように、ゲストOSのディスクをアンマウントします。
  1. ゲストに接続されているブロック・デバイスのリストを表示して、ディスク・ターゲットを識別します。
    virsh domblklist guest_name
  2. 仮想ディスクをデタッチします。
    virsh detach-disk --config guest_name target_name

    次のオプションを使用できます。

    • --live – 実行中のKVMからディスク・イメージを一時的にデタッチします。
    • --persistent – 実行中のKVMからディスク・イメージをデタッチし、その構成を更新して、以降の再起動時にそのディスクがKVMから完全にデタッチされるようにします。

    VMから仮想ディスクをデタッチしても、ディスク・イメージ・ファイルやボリュームがホスト・システムから削除されることはありません。仮想ディスクの削除が必要な場合は、ソース・イメージ・ファイルを手動で削除するか、ホストからボリュームを削除します。

    たとえば、guest1というKVMの構成からターゲットsdb1のディスクを削除するには、次のコマンドを実行します:

    virsh detach-disk --config guest1 sdb1

仮想ディスクのサイズ変更

VMの実行中に、virsh blockresizeコマンドを使用して仮想ディスク・イメージのサイズを変更できます。

  1. VMにアタッチされているすべてのブロック・デバイスの現在のサイズを確認します。
    virsh domblkinfo guest_name --all --human
  2. ディスク・イメージへのパスを見つけて、その場所をメモします。
    virsh domblklist guest_name --details
  3. virsh blockresizeを実行し、必要な引数としてゲスト名、ディスクへのパス、および目的のサイズを含めます。
    たとえば、guest1という実行中のVMのソースの場所/share/disk-images/volume1.qcow2にあるディスク・イメージのサイズを20GBに増やすには、次のコマンドを実行します。
    virsh blockresize guest_name /share/disk-images/volume1.qcow2 20GB

    サイズに指定する値はスケーリングした整数です。接尾辞を省略すると、デフォルトでKiBに設定されます。

    virsh blockresizeコマンドを使用すると、稼働中のVM上のディスクをスケール・アップできますが、追加のディスク・リソースが使用可能になったことをVMがすぐに識別できる保証はありません。一部のゲスト・オペレーティング・システムでは、使用可能になった追加のリソースをゲストが識別するには、VMの再起動が必要になることがあります。

    ブロック・デバイスにある個別のパーティションおよびファイル・システムは、このコマンドでスケーリングできません。これらの操作は、必要に応じてゲスト内から手動で実行する必要があります。

  4. VMのブロック・デバイス情報を再度確認して、サイズ変更が予期したとおりに機能したことを確認します。
    virsh domblkinfo guest_name --all --human