14.5. ストレージデバイスのゲストへの追加

このセクションでは、ゲストにストレージデバイスを追加する方法を説明しています。必要に応じてストレージのみを追加することができます。このセクションでは、以下のタイプのストレージについて説明します。

14.5.1. ファイルベースのストレージのゲストへの追加

ファイルベースのストレージは、ホスト物理マシンのファイルシステム上に格納されるファイルの集合であり、ゲストに対して仮想化されたハードドライブとして動作します。ファイルベースのストレージを追加するには、次の手順を実行します。

手順14.1 ファイルベースのストレージの追加

  1. ストレージファイルを作成するか、または既存のファイルを使用します (IMG ファイルなど)。以下のコマンドでは、どちらもゲスト用の追加ストレージとして使用できる 4GB のファイルを作成します。
    • ファイルベースのストレージイメージには、事前割り当てファイルを使用することをお勧めします。以下の dd コマンドを使って事前割り当てファイルを作成します。
      dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1G count=4
    • または、事前割り当てファイルの代わりにスパースファイルを作成することもできます。スパースファイルの方が短い時間で作成できるため、テストの目的で使用することに適しています。ただし、データ整合性またはパフォーマンス関連の問題があるため、実稼働環境に使用することはお勧めしません。
      dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1G seek=4096 count=4
  2. 新しいファイル内に <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>
    デバイス名は、IDE や SCSI ディスクを指定する「hd」や「sd」で始まる名前にすることができます。設定ファイルには <address> サブ要素も組み込むことができ、バス上に新しいデバイスの位置を指定することができます。virtio ブロックデバイスの場合、これは PCI アドレスになるはずです。<address> サブ要素を省略すると、livbirt により次に使用できる PCI スロットの検索および割り当てが行われます。
  3. 以下のようにして 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 >
  4. NewStorage.xml 内で定義されているデバイスをゲスト (Guest1) に追加します。
    virsh attach-device --config Guest1 ~/NewStorage.xml

    注記

    この変更は、ゲストが破棄され、再起動された後にのみ適用されます。また、永続デバイスが追加できるのは永続ドメインに対してのみになります。永続ドメインとは、ドメインの設定を virsh define コマンドを使って保存したドメインを指します。
    ゲストが実行中の場合で、そのゲストが破棄されるまでの間に新しいデバイスを一時的に追加する場合は --config オプションを省略します。
    virsh attach-device Guest1 ~/NewStorage.xml

    注記

    virsh コマンドでは attach-disk コマンドを使用することができます。このコマンドでは、より簡単な構文で限られた数のパラメーターを設定でき、XML ファイルを作成する必要がありません。以下に示すように、attach-disk コマンドは前述の attach-device コマンドと同じように使用できます。
    virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img vdb --cache none
    virsh attach-disk コマンドでも --config オプションを使用できる点に注意してください。
  5. ゲストマシンを起動します (まだ稼働していない場合):
    virsh start Guest1

    注記

    以下は Linux ゲストに固有のステップになります。他のオペレーティングシステムは、複数の異なる方法で新規のストレージデバイスを処理します。他のシステムについては、該当するオペレーティングシステムのドキュメントを参照してください。
  6. ディスクドライブのパーティション設定

    これでゲストは /dev/vdb というハードディスクデバイスを持っていることになります。必要であれば、このディスクドライブにパーティションを設定し、フォーマットします。追加したデバイスが表示されない場合は、ゲストのオペレーティングシステムにディスクのホットプラグに関する問題が発生していることを示します。
    1. 新規デバイスに対して fdisk を開始します。
      fdisk /dev/vdb
      Command (m for help):
    2. 新規パーティションを作成するために n を入力します。
    3. 次のように出力されます。
      Command action
      e   extended
      p   primary partition (1-4)
      プライマリーパーティションを作成するために p を入力します。
    4. 使用できるパーティション番号を選択します。この例では、1 が入力され1番目のパーティションが選択されています。
      Partition number (1-4): 1
    5. Enter を押して、デフォルトとなる 1 番目のシリンダーを入力します。
      First cylinder (1-400, default 1):
    6. パーティションのサイズを選択します。この例では、Enter が押されてディスク全体が割り当てられています。
      Last cylinder or +size or +sizeM or +sizeK (2-400, default 400):
    7. t を入力して、パーティションタイプを設定します。
      Command (m for help): t
    8. 直前のステップで作成したパーティションを選択します。この例ではパーティション番号が 1 のパーティションを選択しています。この例で作成されたパーティションは 1 つだけであるため、fdisk によってパーティション 1 が自動的に選択されています。
      Partition number (1-4): 1
    9. Linux パーティションを作成するために 83 を入力します。
      Hex code (type L to list codes): 83
    10. w を入力して、変更を書き込み、終了します。
      Command (m for help): w
    11. ext3 ファイルシステムで新しいパーティションをフォーマットします。
      mke2fs -j /dev/vdb1
  7. マウントディレクトリーを作成して、ゲスト上にディスクをマウントします。この例では、ディレクトリーは myfiles に置かれています。
    mkdir /myfilesmount /dev/vdb1 /myfiles
    これで、ゲストは仮想化されたファイルベースの追加ストレージデバイスを持つことになります。ただし、このストレージはゲストの /etc/fstab ファイル内で定義しない限り、再起動後も永続的にマウントされることはない点に注意してください。
    /dev/vdb1    /myfiles    ext3     defaults    0 0

14.5.2. ハードドライブと他のブロックデバイスのゲストへの追加

システム管理者は、ゲスト用にストレージ領域を拡張したり、システムデータをユーザーデータから分離したりするために追加のハードドライブを使用するオプションを選択できます。

手順14.2 物理ブロックデバイスのゲストへの追加

  1. この手順は、ホスト物理マシン上のハードドライブをゲストに追加する方法を説明しています。これは、CD-ROM、DVD、およびフロッピーデバイスを含むすべての物理ブロックデバイスに適用されます。
    ホスト物理マシンにハードディスクデバイスを物理的に割り当てます。ドライブにデフォルトでアクセスできない場合に、ホスト物理マシンを設定します。
  2. 次のいずれかを行います。
    1. 新しいファイル内に 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>
    2. 直前のセクションの指示に従って、デバイスをゲスト仮想マシンに割り当てます。または、以下のように 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 を使用することもできます。
  3. これでゲスト仮想マシンは、Linux の場合は /dev/vdc という名前 (ゲスト仮想マシン OS の選択によって異なるがこれに類する名前) の新しいハードディスクデバイスを持つことになり、ゲスト仮想マシンのオペレーティングシステムに適した標準的な手順に従ってゲスト仮想マシンからディスクを初期化できるようになります。具体例については、手順14.1「ファイルベースのストレージの追加」を参照してください。

警告

ブロックデバイスをゲストに追加する際には、『Red Hat Enterprise Linux 7 仮想化セキュリティーガイド』に書かれた関連するセキュリティー上の考慮事項に従うようにしてください。

14.5.3. SCSI LUN ベースのストレージのゲストへの追加

ホストの SCSI LUN デバイスは、ホストの設定に応じて 3 つのメカニズムを使用してゲストに完全に公開できます。このように SCSI LUN デバイスを公開することで、SCSI コマンドをゲスト上で LUN に対して直接実行できるようになります。これは、ファイバーチャネルストレージをホスト間で共有できると共に、LUN をゲスト間で共有するための役に立つ方法になります。

重要

オプションの sgio 属性は、特権のない SCSI Generical I/O (SG_IO) コマンドが device='lun' ディスクについてフィルターされるかどうかを制御します。sgio 属性は 'filtered' または 'unfiltered' として指定できますが、SG_IO ioctl コマンドを永続性保存の状態でゲスト上で渡せるようにするには 'unfiltered' に設定する必要があります。
sgio='unfiltered' の設定のほかにも、ゲスト間で LUN を共有するために <shareable> 要素を設定する必要があります。sgio 属性は、指定がない場合はデフォルトで 'filtered' に設定されます。
<disk> XML 属性 device='lun' は、以下のゲストディスク設定について有効です。
  • type='block'<source dev='/dev/disk/by-{path|id|uuid|label}'/> に対して指定します。
       <disk type='block' device='lun' sgio='unfiltered'>
          ​ <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'/>
          <shareable />
       ​</disk>

    注記

    <source> デバイス名のコロンの前にはバックスラッシュが必要なことに注意してください。
  • type='network'<source protocol='iscsi'... /> に対して指定します。
        <disk type='network' device='disk' sgio='unfiltered'>
          <driver name='qemu' type='raw'/>
          <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-net-pool/1'>
            <host name='example.com' port='3260'/>
          </source>
          <auth username='myuser'>
            <secret type='iscsi' usage='libvirtiscsi'/>
          </auth>
          <target dev='sda' bus='scsi'/>
          <shareable />
        </disk>
  • type='volume' を、iSCSI または NPIV/vHBA ソースプールを SCSI ソースプールとして使用する場合に指定します。
    以下のサンプル XML は、ゲストで iSCSI ソースプール (iscsi-net-pool という名前) を SCSI ソースプールとして使用していることを示しています。
        <disk type='volume' device='lun' sgio='unfiltered'>
          <driver name='qemu' type='raw'/>
          <source pool='iscsi-net-pool' volume='unit:0:0:1' mode='host'/>
          <target dev='sda' bus='scsi'/>
          <shareable />
        </disk>

    注記

    <source> タグ内で mode= オプションは任意ですが、使用する場合には 'direct' ではなく 'host' に設定する必要があります。'host' に設定される場合、libvirt はローカルホスト上のデバイスへのパスを検索します。'direct' に設定される場合、libvirt はソースプールのソースホストデータを使用してデバイスへのパスを生成します。
    上記のサンプルの iSCSI プール (iscsi-net-pool) には、以下のような設定があります。
    # virsh pool-dumpxml iscsi-net-pool
    <pool type='iscsi'>
      <name>iscsi-net-pool</name>
      <capacity unit='bytes'>11274289152</capacity>
      <allocation unit='bytes'>11274289152</allocation>
      <available unit='bytes'>0</available>
      <source>
        <host name='192.168.122.1' port='3260'/>
        <device path='iqn.2013-12.com.example:iscsi-chap-netpool'/>
        <auth type='chap' username='redhat'>
          <secret usage='libvirtiscsi'/>
        </auth>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0755</mode>
        </permissions>
      </target>
    </pool>
    iSCSI ソースプールで利用可能な LUN の詳細を確認するには、以下のコマンドを入力します。
    # virsh vol-list iscsi-net-pool
     Name                 Path
    ------------------------------------------------------------------------------
     unit:0:0:1           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-1
     unit:0:0:2           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-2
  • type='volume' を、NPIV/vHBA ソースプールを SCSI ソースプールとして使用する場合に指定します。
    以下のサンプル XML は、ゲストで NPIV/vHBA ソースプール (vhbapool_host3 という名前) を SCSI ソースプールとして使用していることを示しています。
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable />
    </disk>    
    上記のサンプルの NPIV/vHBA プール (vhbapool_host3) には、以下のような設定があります。
    # virsh pool-dumpxml vhbapool_host3
    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <capacity unit='bytes'>0</capacity>
      <allocation unit='bytes'>0</allocation>
      <available unit='bytes'>0</available>
      <source>
        <adapter type='fc_host' parent='scsi_host3' managed='yes' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee045d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0700</mode>
          <owner>0</owner>
          <group>0</group>
        </permissions>
      </target>
    </pool>
    vHBA で利用可能な LUN の詳細を確認するには、以下のコマンドを入力します。
    # virsh vol-list vhbapool_host3
     Name                 Path
    ------------------------------------------------------------------------------
     unit:0:0:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
     unit:0:1:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
    SCSI デバイスで NPIV vHBA を使用する方法についての詳細は、「仮想マシンが vHBA LUN を使用するよう設定する」を参照してください。
以下の手順は、SCSI LUN ベースのストレージデバイスをゲストに追加する例を示しています。上記の <disk device='lun'> ゲストのディスク設定のいずれもこの方法で割り当てることができます。ご使用の環境に応じて設定を置き換えてください。

手順14.3 SCSI LUN ベースのストレージのゲストへの割り当て

  1. 新しいファイルに <disk> 要素を書き込むことによってデバイスファイルを作成し、このファイルを XML 拡張子を付けて保存します (例: sda.xml)。
    # cat sda.xml
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable />
    </disk>
  2. sda.xml で作成したデバイスをゲスト仮想マシン (例: Guest1) に関連付けます。
    # virsh attach-device --config Guest1 ~/sda.xml

    注記

    virsh attach-device コマンドを --config オプションを指定して実行するには、デバイスをゲストに永続的に追加するためにゲストを再起動する必要があります。または、--persistent オプションを --config の代わりに使用することができます。これを、デバイスをゲストにホットプラグするために使用することもできます。
別の方法として、SCSI LUN ベースのストレージを virt-manager を使用してゲスト上で割り当てるか、または設定することができます。virt-manager を使用してこれを設定するには、ハードウェアを追加 ボタンをクリックして、必要なパラメーターと共に仮想ディスクを追加するか、またはこのウィンドウから既存の SCSI LUN デバイスの設定を変更します。Red Hat Enterprise Linux 7.2 以降では、SGIO の値も virt-manager で設定できます。
virt-manager を使用した SCSI LUN ストレージの設定

図14.1 virt-manager を使用した SCSI LUN ストレージの設定

ハードウェア故障後に公開されている LUN に再接続

ハードウェア (ホストのバスアダプター等) の故障により公開されているファイバーチャネル (FC) LUN への接続が失われた場合、ハードウェアの故障が修復された後でも、ゲストの公開されている LUN は故障したままのように見えることがあります。これを防ぐためには、dev_loss_tmo および fast_io_fail_tmo カーネルオプションを編集します。
  • dev_loss_tmo は、SCSI デバイスが故障してから SCSI レイヤーが故障と識別するまでの時間をコントロールします。タイムアウトを防ぐには、オプションを最大値の 2147483647 に設定することをお勧めします。
  • fast_io_fail_tmo は、SCSI デバイスが故障してから SCSI レイヤーが I/O にフェイルバックするまでの時間をコントロールします。dev_loss_tmo がカーネルによって無視されないようにするには、このオプションの値を dev_loss_tmo の値より小さい数値に設定します。
dev_loss_tmo および fast_io_fail の値を変更するには、以下に示すどちらかの操作を行います。
  • /etc/multipath.conf ファイルを編集し、defaults セクションの値を設定する。
    defaults {
    ...
    fast_io_fail_tmo     20
    dev_loss_tmo    infinity
    }
  • FC ホストまたはリモートポートのレベルで dev_loss_tmo および fast_io_fail を設定する。例を以下に示します。
    # echo 20 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/fast_io_fail_tmo
    # echo 2147483647 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
新しい dev_loss_tmo および fast_io_fail の値が有効であることを確認するには、以下のコマンドを使います。
# find /sys -name dev_loss_tmo -print -exec cat {} \;
パラメーターが正しく設定されていれば、出力は次のようになります (ただし、pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0 には実際のデバイスが表示されます)。
# find /sys -name dev_loss_tmo -print -exec cat {} \;
...
/sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
2147483647
...

14.5.4. ゲスト仮想マシンのストレージコントローラーの管理

virtio ディスクとは異なり、SCSI デバイスでは、コントローラーがゲスト仮想マシンに存在する必要があります。このセクションでは、仮想 SCSI コントローラー (「ホストバスアダプター」または HBA とも知られる) を作成し、SCSI ストレージをゲスト仮想マシンに追加するための必要なステップを詳しく説明します。

手順14.4 仮想 SCSI コントローラーの作成

  1. ゲスト仮想マシン (Guest1) の設定を表示して、すでに存在している SCSI コントローラーを探します。
    virsh dumpxml Guest1 | grep controller.*scsi
    デバイスコントローラーが存在する場合は、このコマンドは以下のように 1 つ以上の行を出力します。
    <controller type='scsi' model='virtio-scsi' index='0'/>
  2. 直前のステップでデバイスコントローラーが表示されない場合、新しいファイルでその 1 つを記述し、以下のステップを実行してそれを仮想マシンに追加します。
    1. 新しいファイルに <controller> 要素を書き込むことによってデバイスコントローラーを作成し、このファイルを XML 拡張子を付けて保存します。たとえば、NewHBA.xml のようになります。
      <controller type='scsi' model='virtio-scsi'/>
    2. virtio-scsi-controller.xml で作成したばかりのデバイスコントローラーを使用中のゲスト仮想マシン (例: Guest1) に関連付けます。
      virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
      この例では、--config オプションはディスク接続の場合と同様の動作をします。詳細は、手順14.2「物理ブロックデバイスのゲストへの追加」を参照してください。
  3. 新規 SCSI ディスクまたは CD-ROM を追加します。新規ディスクは、「ファイルベースのストレージのゲストへの追加」および「ハードドライブと他のブロックデバイスのゲストへの追加」セクションにある方法を使用して追加することができます。SCSI ディスクを作成するには、sd で始まるターゲットデバイス名を指定します。各コントローラーでは 1024 までの virtio-scsi ディスクがサポートされますが、より少ない数のディスクで (ファイル記述子などの) ホスト内で利用可能な他のすべてのリソースが消費される可能性もあります。
    詳細については、次の Red Hat Enterprise Linux 6 ホワイトペーパーを参照してください: The next-generation storage interface for the Red Hat Enterprise Linux Kernel Virtual Machine: virtio-scsi
    virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
    ゲスト仮想マシン内のドライバーのバージョンによっては、実行中のゲスト仮想マシンを実行しても、新しいディスクをすぐには検出できない場合があります。Red Hat Enterprise Linux 7 ストレージ管理ガイドのステップに従ってください。