第13章 ストレージプール

本章では、さまざまなタイプのストレージプールを作成する方法について説明します。ストレージプール とは、管理者 (ストレージ担当管理者の場合が多い) によって確保される一定量のストレージで、ゲスト仮想マシンなどに使用されます。ストレージプールは、ストレージ管理者またはシステム管理者のいずれかによってストレージボリュームに分割され、ボリュームはブロックデバイスとしてゲスト仮想マシンに割り当てられます。
たとえば、NFS サーバー担当のストレージ管理者が、ゲスト仮想マシンのデータすべてを格納するための共有ディスクを作成するとします。システム管理者は共有ディスクの詳細情報を使用して、仮想化ホストにストレージプールを定義します。この例では、管理者は nfs.example.com:/path/to/share/vm_data にマウントします。ストレージプールが起動すると、libvirt は指定ディレクトリーに共有をマウントします。これは、システム管理者がログインし、mount nfs.example.com:/path/to/share /vmdata を実行したかのような動作になります。ストレージプールが自動起動するように設定されている場合、libvirtlibvirt の起動時に指定されたディレクトリーに NFS 共有ディスクをマウントします。
ストレージプールが起動すると、NFS 共有ディスク内のファイルはストレージボリュームとして報告され、ストレージボリュームのパスは libvirt API を使って問い合わせることができます。次に、ストレージボリュームのパスを、ゲスト仮想マシンの XML 定義内のゲスト仮想マシンのブロックデバイス用のソースストレージについて記述しているセクションにコピーできます。NFS の場合、libvirt API を使用するアプリケーションは、プールの制限サイズ (共有のストレージ最大容量) までストレージプール内にストレージボリューム (NFS 共有内のファイル) を作成したり、そのボリュームを削除したりすることができます。ボリュームの作成および削除は、ストレージプールのすべてのタイプで対応している訳ではありません。ストレージプールを停止 (pool-destroy) すると起動の操作が無効になるような場合は、NFS 共有をアンマウントしてください。破棄の操作では共有にあるデータは変更されませんが、その名前は変更されます。詳細は、man virsh を参照してください。
2 番目の例として、iSCSI ストレージプールについて見てみましょう。ストレージ管理者は iSCSI ターゲットをプロビジョニングして一連の LUN を VM を実行するホストに提示します。その iSCSI ターゲットをストレージプールとして管理できるように libvirt を設定する場合、libvirt は、ホストが iSCSI ターゲットにログインし、libvirt が利用可能な LUN をストレージボリュームとして報告できるようにします。NFS の例と同様に、ストレージボリュームのパスは問い合わせが可能で、VM の XML 定義で使用されます。この場合、LUN は iSCSI サーバー上で定義され、libvirt はボリュームを作成したり、削除したりすることができません。
ゲスト仮想マシンの正常な操作のためにストレージプールとボリュームが必要な訳ではありません。ストレージプールとボリュームは、libvirt によりストレージの特定部分をゲスト仮想マシンで使用できるようにする方法を提供します。ストレージプールを使用しないシステムでは、システム管理者は、各自が選択するツールを使ってゲスト仮想マシンのストレージの可用性を確保する必要があります。たとえば、NFS 共有をホスト物理マシンの fstab に追加して、その共有が起動時にマウントされるようにします。
libvirt を使用してストレージプールおよびボリュームを管理する利点の 1 つに、libvirt のリモートプロトコルがあります。これにより、ゲスト仮想マシンによって必要とされるリソースの設定と共に、ゲスト仮想マシンのライフサイクルのあらゆる側面を管理することができます。これらの操作は完全に libvirt API 内で、リモートホストで実行できます。つまり、libvirt を使用した管理アプリケーションにより、ユーザーがホスト物理マシンでゲスト仮想マシンを設定するために必要なすべてのタスクを実行できることになります。これらのタスクには、シェルアクセスやその他のコントロールチャネルなしで実行できるリソースの割り当て、ゲスト仮想マシンの実行、ゲスト仮想マシンのシャットダウン、およびリソースの割り当て解除が含まれます。
ストレージプールは仮想コンテナーであるものの、qemu-kvm によって許可される最大サイズとホストマシン上のディスクサイズの 2 つの要素によって制限されます。ストレージプールはホストマシンのディスクサイズを超えることはできません。最大サイズは以下のようになります。
  • virtio-blk = 2^63 バイトまたは 8 エクサバイト (raw ファイルまたはディスクを使用)
  • Ext4 = ~ 16 TB (4 KB ブロックサイズを使用)
  • XFS = ~8 エクサバイト
  • qcow2 とホストファイルシステムはそれぞれ独自のメタデータを維持し、非常に大きなイメージサイズを使用する場合はスケーラビリティーの評価または調整を行う必要があります。raw ディスクを使用すると、スケーラビリティーや最大サイズに影響を与える可能性のある層の数が少なくなります。
libvirt では、ディレクトリーベースのストレージプール /var/lib/libvirt/images/ ディレクトリーをデフォルトのストレージプールとして使用します。このデフォルトストレージプールは別のストレージプールに変更することができます。
  • ローカルのストレージプール - ローカルのストレージプールは直接ホスト物理マシンサーバーに割り当てられます。ローカルのストレージプールには、ローカルのディレクトリー、直接割り当てられているディスク、物理パーティション、および LVM ボリュームグループなどが含まれます。これらのストレージボリュームはゲスト仮想マシンのイメージを格納するか、または追加ストレージとしてゲスト仮想マシンに割り当てられます。ローカルのストレージプールは直接ホスト物理マシンサーバーに割り当てられるため、ゲスト仮想マシンの移行や大量のゲスト仮想マシンを必要としない小規模な導入、テスト、および開発などに便利です。ローカルのストレージプールはライブマイグレーションには対応していないため、多くの実稼働環境には適していません。
  • ネットワーク接続の (共有) ストレージプール - ネットワーク接続のストレージプールには、標準プロトコルを使ってネットワーク経由で共有されるストレージデバイスが含まれます。ネットワーク接続のストレージは、ホスト物理マシン間での仮想マシンの移行に virt-manager を使用する場合は必須になりますが、virsh を使用する場合はオプションになります。ネットワーク接続のストレージプールは libvirt で管理します。ネットワーク接続のストレージプールに対応するプロトコルには、以下が含まれます。
    • ファイバーチャネルベースの LUN
    • iSCSI
    • NFS
    • GFS2
    • SCSI RDMA プロトコル (SCSI RCP) - InfiniBand アダプターと 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル

注記

マルチパスのストレージプールは、完全にサポートされていないため、作成したり、使用したりすることはできません。

例13.1 NFS ストレージプール

NFS サーバー担当のストレージ管理者が、ゲスト仮想マシンのデータを格納するための共有を作成するとしましょう。システム管理者は、ホスト物理マシン上のプールをこの共有の詳細を使って定義します (nfs.example.com:/path/to/share/vm_data にマウントされる)。プールが起動すると、libvirt は指定ディレクトリーに共有をマウントします。これは、システム管理者がログインし、mount nfs.example.com:/path/to/share /vmdata を実行したかのような動作になります。プールが自動起動するように設定されている場合、libvirt は、libvirt の起動時に指定されるディレクトリー上に NFS 共有をマウントします。
プールが起動すると、NFS で共有しているファイルがボリュームとして報告され、ストレージボリュームのパスの問い合わせが libvirt API を使って実行されます。このボリュームのパスは、ゲスト仮想マシンの XML 定義ファイル内のゲスト仮想マシンのブロックデバイス用のソースストレージについて記述しているセクションにコピーされます。NFS では、libvirt API を使用するアプリケーションで、プールの制限サイズ (共有のストレージ最大容量) までプール内にボリューム (NFS 共有内のファイル) を作成したり、そのボリュームを削除したりすることができます。ボリュームの作成および削除はすべてのプールタイプで対応している訳ではありません。プールを停止すると起動の操作が無効になるような場合は、NFS 共有をアンマウントしてください。破棄の操作により共有上にあるデータは変更されませんが、その名前は変更されます。詳細は man virsh をご覧ください。

注記

ゲスト仮想マシンが正常に機能するためにストレージプールとボリュームが必要な訳ではありません。プールとボリュームは、libvirt がストレージの一部をゲスト仮想マシンに使用できるようにする 1 つの手段です。ただし、独自にストレージを管理し、プールやボリュームを定義せずにゲスト仮想マシンを適切に動作させる方法を取る管理者もいます。プールを使用しないシステムでは、システム管理者は、各自が選択するツールを使ってゲスト仮想マシンのストレージの可用性を確保する必要があります。たとえば、NFS 共有をホスト物理マシンの fstab に追加して、その共有が起動時にマウントされるようにします。

警告

ゲストでストレージプールを作成する際には、『Red Hat Enterprise Linux 7 仮想化セキュリティーガイド』に書かれた関連するセキュリティー上の考慮事項に従うようにしてください。

13.1. ディスクベースのストレージプール

このセクションでは、ゲスト仮想マシン用にディスクベースのストレージデバイスを作成する方法について説明します。

警告

ゲストには、ブロックデバイスまたはディスク全体 (例: /dev/sdb) への書き込みアクセスは付与しないようにし、パーティション (例: /dev/sdb1) や LVM ボリュームなどを使用するようにします。
ゲストにブロックデバイス全体を渡した場合、ゲストはそれにパーティションを設定するか、またはその上に独自の LVM グループを作成する可能性があります。これは、ホスト物理マシンがこれらのパーティションや LVM グループを検出し、エラーを出す原因になります。

13.1.1. virsh を使用したディスクベースのストレージプールの作成

以下の手順では、virsh コマンドを使用して、ディスクデバイスを使って新しいストレージプールを作成します。

警告

ディスクをストレージプール専用にすると、再フォーマットが行われ、ディスクデバイス上に現在格納されているすべてのデータが消去されます。以下の手順を開始する前に、ストレージデバイスのデータをバックアップすることを強く推奨します。
  1. ディスクに GPT ディスクラベルを作成します。

    ディスクのラベルは、GPT (GUID Partition Table) ディスクラベルを使って付け直す必要があります。GPT ディスクラベルを使用すると、各デバイス上に最大 128 個もの数多くのパーティションを作成できます。MS-DOS パーティションテーブルに比べ、GPT パーティションテーブルの方がはるかに多くのパーティションのパーティションデータを格納することができます。
    # 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.
    #
  2. ストレージプールの設定ファイルを作成します。

    新規デバイスに必要となるストレージプール情報が含まれた一時 XML テキストファイルを作成します。
    このファイルは以下のような形式にし、以下のフィールドを含む必要があります。
    <name>guest_images_disk</name>
    name パラメーターはストレージプールの名前を指定します。この例では、guest_images_disk という名前を使用しています。
    <device path='/dev/sdb'/>
    path 属性を持つ device パラメーターはストレージデバイスのデバイスパスを指定します。この例では、デバイス /dev/sdb を使用しています。
    <target> <path>/dev</path></target>
    path サブパラメーターを持つファイルシステム target パラメーターは、ホスト物理マシンのファイルシステム上の位置を指定して、このストレージプールで作成されたボリュームを割り当てます。
    例: sdb1、sdb2、sdb3。この例のように /dev/ を使用すると、このストレージプールから作成したボリュームは /dev/sdb1、/dev/sdb2、/dev/sdb3 となり、これらにアクセスできるようになります。
    <format type='gpt'/>
    format パラメーターは、パーティションテーブルのタイプを指定します。この例では、前述のステップで作成した GPT ディスクラベルのタイプと一致するよう gpt を使用しています。
    テキストエディターを使って、ストレージプールデバイス用の XML ファイルを作成します。

    例13.2 ディスクベースストレージデバイスのストレージプール

    <pool type='disk'>
      <name>guest_images_disk</name>
      <source>
        <device path='/dev/sdb'/>
        <format type='gpt'/>
      </source>
      <target>
        <path>/dev</path>
      </target>
    </pool>
  3. ストレージプールを起動します。

    virsh pool-start コマンドを使用してストレージプールを起動します。virsh pool-list --all コマンドを使用して、プールが起動していることを確認できます。
    # virsh pool-start iscsirhel7guest
    Pool iscsirhel7guest started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    active     no
  4. デバイスを割り当てます。

    前述のステップで作成した XML 設定ファイルと共に virsh pool-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
  5. autostart をオンにします。

    ストレージプールの 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
  6. ストレージプールの設定を確認します。

    ストレージプールが正しく作成されたこと、およびサイズが正確に報告されていること、さらに状態が 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
    -----------------------------------------
  7. オプション: 一時設定ファイルを削除します。

    不要な場合は、一時的なストレージプール XML 設定ファイルを削除します。
    # rm ~/guest_images_disk.xml
これでディスクベースのストレージプールが利用できるようになります。

13.1.2. virsh を使用したストレージプールの削除

以下の手順は、virsh を使用してストレージプールを削除する方法を説明しています。
  1. 同じプールを使用する他のゲスト仮想マシンに関連した問題を避けるには、ストレージプールを停止し、そのストレージプールで使用中のリソースすべてを解放するのが最良の方法です。
    # virsh pool-destroy guest_images_disk
  2. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk