第13章 ストレージプール

本章では、さまざまなタイプのストレージプールを作成する方法について説明しています。ストレージプール とは、管理者 (ストレージ担当管理者の場合が多い) によって確保される一定量のストレージで、仮想マシンなどに使用されます。ストレージプールは、ストレージ管理者またはシステム管理者のいずれかによってストレージボリュームに分割されることが多く、ボリュームはブロックデバイスとしてゲスト仮想マシンに割り当てられます。

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

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. デバイスを割り当てる

    前述のステップで作成した 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
  4. ストレージプールを起動する

    virsh pool-start コマンドを使用してストレージプールを起動します。virsh pool-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
  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