目次
VM ホストサーバ 自身で VM ゲスト を管理する場合、 VM ゲスト の仮想ハードディスクを
追加したり既存のイメージを割り当てたりする際、 VM ホストサーバ のファイルシステム
全体に対してアクセスして管理することができます。しかしながら、 VM ゲスト を
リモートから管理する場合、これを行なうことはできません。このような理由から
libvirt では、リモートからアクセスできる 「ストレージプール」
と呼ばれる仕組みが用意されています。
![]() | CD/DVD ISO イメージ |
|---|---|
リモートから VM ホストサーバ 上にある CD/DVD の iso イメージにアクセスできるように するには、これらをストレージプール上に配置する必要があります。 | |
libvirt ではそれぞれ、ストレージボリュームとストレージプールに対応しています:
ストレージボリュームとは、ゲストに割り当てることのできるストレージデバイス で、仮想ディスクや CD/DVD/フロッピィディスクなどのイメージです。物理的な (VM ホストサーバ 上での) ブロックデバイス (パーティション、論理ボリュームなど) を 割り当てることもできます。
基本的にはストレージプールとは、ボリュームを保存する際に使用することのできる、 VM ホストサーバ 上のストレージ資源を意味する用語です。デスクトップ機ではネットワーク ストレージの仕組みに似たもので、物理的には下記のような種類があります:
イメージファイルを提供するディレクトリを指定する方法です。ファイルは 対応するディスク形式 (raw, qcow2, qed) のいずれか、もしくは ISO イメージ を利用することができます。
物理ディスクをストレージとして使用する方法です。パーティションは、プール に追加した各ボリュームに対して作成します。
ファイルシステムのディレクトリ (イメージファイルを提供するディレクトリ)
と同じ方法でパーティションを指定する方法です。唯一の違いは、 libvirt
がデバイスのマウントを制御する、という点です。
iSCSI のターゲット上にプールを作成する方法です。 libvirt で利用できる
ようにするには、事前に対象のボリュームにログインしておく必要があります
。 iSCSI のプールに対してパーティションを作成
する機能には対応していませんが、既存の論理ユニット番号 (LUN) がボリュームを
表わします。それらを使用する際、それぞれのボリューム (LUN) には、有効な
(何も書かれていない) パーティションテーブルまたはディスクラベルが書かれて
いる必要があります。何も書かれていない場合は、 fdisk
を利用して追加します:
~ # fdisk -cu /dev/disk/by-path/ip-192.168.2.100:3260-iscsi-iqn.2010-10.com.example:[...]-lun-2 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xc15cdc4e. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
LVM のボリュームグループをプールとして使用する方法です。事前に設定された ボリュームグループを使用するか、もしくは使用するデバイスを指定して グループを作成します。ストレージボリュームは、ボリューム上のパーティション として作成されます。
![]() | LVM ベースのプールに対する削除について |
|---|---|
ストレージマネージャで LVM ベースのプールを削除すると、ボリュームグループ も削除されます。この削除は復元不可能な処理であるため、プール 上に保存された全てのデータが失われることになります! | |
現時点ではマルチパスへの対応は、ゲストに対して既存のデバイスを割り当てる
ことしかできません。 libvirt からマルチパスデバイスを作成したり、
設定したりすることには対応していません。
ファイルシステムのディレクトリ (イメージファイルを提供するディレクトリを
指定する方法) と同じ方法で、ネットワーク上のディレクトリを指定します。
ファイルシステムのディレクトリとの違いは、 libvirt がデバイスのマウントを
制御するという点です。プロトコルは NFS と glusterfs に対応しています。
iSCSI ターゲットの場合と同様に、 SCSI ホストアダプタを使用する方法です。
なお、この方法を利用する場合は、
/dev/sd のような
シンプルなデバイス名の形式ではなく、 X/dev/disk/by-*
のような形式のデバイス名を使用するのがお勧めです。これは前者の方式の場合、
デバイスの接続状況によって名前が変わってしまう可能性 (たとえばデバイスを
追加したり削除したりした場合に、名前が変わってしまう可能性) があるためです。
なお、 iSCSI プール上にボリュームを作成する機能はサポートされていません。
その代わり、既存の論理ユニット番号 (LUN) がボリュームを表わします。
![]() | セキュリティの考慮事項 |
|---|---|
データの損失や破壊を防ぐため、ストレージプールを構築する際に使用する
LVM ボリュームグループや iSCSI ターゲットなどを VM ホストサーバ 上で使用 (マウント)
しないでください。 VM ホストサーバ 上からこれらの資源に接続したりマウントしたりする
必要はありません。 また、 VM ホストサーバ 上のパーティションをラベルでマウントすることは避けてください。 このような設定を行なっている場合、 VM ゲスト 内でも同じラベル名が使用される 可能性があるため、 VM ホストサーバ 側でのマウント時にトラブルを招く可能性があります。 | |
Virtual Machine Manager では、ストレージボリュームとプールを管理するのに、グラフィカルな インターフェイスであるストレージマネージャを提供しています。これを利用するには、 接続を選んでからマウスの右ボタンを押して を選択する か、もしくは接続をハイライト表示させてから + を選択します。 表示されたウインドウで タブを選択してください。
![]() |
ストレージプールを追加するには、下記の手順で行ないます:
左下の隅にあるプラス型のシンボルを押し、 を開きます。
まずは 欄で名前を指定します (半角英数字のほか、 "_-." の各記号を利用できます) 。続いて を選び、 を押します。
![]() |
続いて表示されるウインドウでは、必要な詳細情報を指定します。入力すべきデータは、 作成しようとしているプールの種類によって異なります。
![]() |
: 既存のディレクトリを選択します。
: デバイスを提供するディレクトリを指定します。
ほとんどの場合、既定値である /dev が適切な
値になります。
: デバイスのパーティションテーブルの形式を指定します。
ほとんどの場合は (自動) で問題なく動作するはずです。
それ以外の場合は、 parted -l を実行する
ことで表示される一覧から形式を指定してください。
デバイスを指定します。たとえば
ここでは /dev/sd
のような形式ではなく、 X/dev/disk/by-* の形式で
指定しておくことをお勧めします。これは前者の方式の場合、デバイスの
接続状況によって名前が変わってしまう可能性 (たとえばデバイスを追加
したり削除したりした場合に、名前が変わってしまう可能性) があるためです。
また、ここではディスク上のパーティションではなく、ディスク全体を
表わすパスを指定します。
このオプションを選択すると、デバイスの フォーマット作業を行ないます。なお、このオプションを選択すると、対象の デバイスに存在する全てのデータが失われます!
VM ホストサーバ のファイルシステム内で、 マウントする位置 (マウントポイント) を指定します。
デバイスのファイルシステム形式を指定します。
既定値 auto (自動) で問題なく動作するはずです。
デバイスファイルのパスを指定します。
/dev/sd のような
形式ではなく、 X/dev/disk/by-* のような形式で
指定してください。これは前者のように指定してしまうと、デバイスの
接続状況によって名前が変わってしまう可能性 (たとえばデバイスを追加
したり削除したりした場合に、名前が変わってしまう可能性) があるためです。
VM ホストサーバ 上で下記のコマンドを入力すると、必要なデータを得ることができます:
iscsiadm --mode node
上記を実行すると、下記のような書式で iSCSI ボリュームの一覧が出力されます。 太字で表記している箇所が必要な情報です:
IP_アドレス:PORT,TPGT ターゲット名_(IQN)
デバイスファイルが含まれている
ディレクトリを指定します。 /dev/disk/by-path
(既定値) または /dev/disk/by-id のいずれかを
指定します。
iSCSI サーバのホスト名または IP アドレスを 指定します。
iSCSI のターゲット名 (IQN) を指定します。
既存のボリュームグルーブを使用する場合、
ここに既存のデバイスパスを入力します。新しい LVM ボリュームグループを作成
する場合は、 /dev ディレクトリ内のデバイスファイルの
うち、その時点で存在していないデバイス名を入力します。
既存のボリュームグループを使用する場合は 何も入力しません。新しいボリュームグループを作成する場合は、ここにデバイスを 指定します。
新しいボリュームグループを作成する場合のみ チェックを入れます。
マルチパスへの対応は、利用可能な全ての マルチパスデバイスを利用して作成する場合に限られています。そのため、 ここでは任意の文字列を指定します (何も指定しないと、 XML パーサーが エラーを返します) 。後で使用するようなことはありません。
VM ホストサーバ のファイルシステム上での マウントポイントを指定します。
ネットワークファイルシステムのプロトコルを 指定します。
ネットワークファイルシステムを提供する サーバの IP アドレスまたはホスト名を入力します。
サーバ上で公開しているディレクトリを 指定します。
デバイスファイルを含むディレクトリを
指定します。 /dev/disk/by-path (既定値) または
/dev/disk/by-id のいずれかを指定します。
SCSI アダプタの名称を入力します。
![]() | ファイル参照 |
|---|---|
リモートから操作している場合、 ボタンを押す ことによるファイルブラウザは利用できません。 | |
最後に を押すと、ストレージプールへの追加が 行なわれます。
Virtual Machine Manager のストレージマネージャでは、プール内にボリュームを作成することができる ほか、プール内のボリュームを削除することができます。そのほか、一時的に既存の ストレージプールを無効化したり、恒久的に削除したりすることもできます。なお、 プールの基本設定を変更する作業は、 SUSE ではサポートしていません。
ストレージプールの機能は、リモートから管理している場合に VM ホストサーバ 上に配置 されているブロックデバイスを追加できるようにするため、用意されている機能です。 特定のプールをリモートから一時的にアクセスできないようにするには、ストレージ マネージャの左下隅にある停止マークを押して (停止) させてください。停止されたプールは (状態: 無効) として印が付けられ、一覧表示では灰色で表示されます。既定では 新しく作成したプールは、 VM ホストサーバ の起動時に自動で開始するように () なっています。
無効になっているプールを開始 () し、リモートから 再度アクセスできるようにするには、ストレージマネージャの左下隅にある再生ボタン を押してください。
![]() | プールの状態と接続されたボリュームの影響関係 |
|---|---|
プールから VM ゲスト に割り当てられたボリュームは、そのプールの状態 ( (有効) または (無効)) に関わらず、常に利用可能な状態になります。プールの状態は、リモートからの 管理で、 VM ゲスト にボリュームを割り当てられるかどうかだけに影響します。 | |
プールに対して恒久的にアクセスできないようにするには、ストレージマネージャの 左下隅にあるシュレッダー型のボタンを押すことで (削除) を行なうことができます。削除は無効化されたプールに対してのみ実施できます。 削除の作業では VM ホストサーバ 上で物理的に削除されたり消去されたりすることはなく、 プールの設定だけが削除されます。ですが、特に LVM ボリュームグループベースの ツールを削除するような場合には注意して作業を行なってください:
![]() | ストレージプールの削除 |
|---|---|
ローカルの ファイルシステムディレクトリや ローカルパーティション、ローカルディスクをベースにしたプールの 削除は、その時点で VM ゲスト に割り当てられているボリュームに 対しては効果がありません (以前と変わらず利用できます) 。 一方、 iSCSI や SCSI 、 LVM グループやネットワークで公開されているディレクトリ の場合は、プールが削除されるとアクセス不可能になります。ボリュームそれ自身が 削除されなくても、 VM ホストサーバ ではそれらの資源に対してアクセスする権利がなくなる ためです。 iSCSI/SCSI ターゲット上やネットワークで公開されているディレクトリでは、 新しいプールを同じ設定で作成したり、ホスト側のシステムからマウントしたり アクセスしたりすることで、再度アクセスできるようになります。 LVM グループをベースにしたプールの場合は、 LVM グループの設定が消去されるため、 ホストシステム上では存在が消去されてしまいます。設定は復元することはできず、 プール上に存在していた全てのボリュームは失われてしまいます。 | |
Virtual Machine Manager では、マルチパスや iSCSI 、 SCSI のプールを除く全てのストレージプールに
対して、ボリュームを作成することができます。これらのプール上のボリュームは
LUN と等価なもので、 libvirt から変更することはできません。
新しいボリュームは、ストレージマネージャを利用して作成することができるほか、 VM ゲスト に対して新しいデバイスを追加する際にも作成することができます。 いずれの場合でも、 を選択して を選択します。
まずはイメージの (名前) を指定し、イメージの形式を
選択します (なお、 SUSE では raw, qcow2,
qed イメージ形式をサポートしています) 。イメージの形式は、
LVM グループベースのプールの場合には設定不要です。
さらに (最大容量) を指定し、初期状態で
割り当てる領域サイズを指定します。これらの値に対して異なる値を設定すると、
それは スパース イメージファイルと呼ばれる形式になり、
必要に応じてサイズを拡張するタイプのボリュームを作成します。
あとは を押すと、ボリュームの作成が始まります。
ボリュームの削除は、ストレージマネージャでのみ実施することができます。 削除したいボリュームを選んで を選んで ください。あとは を押して確認を行なうと、実際の 削除が行なわれます。なお、この機能を利用する際には特に注意を払ってください!
![]() | ボリューム削除の際の確認について |
|---|---|
ボリュームの削除は、有効な VM ゲスト や無効な VM ゲスト で使用されているか どうかに関わらず行なうことができます。削除されたボリュームを復元する手段は ありません。 VM ゲスト でボリュームが使用されているかどうかは、 ストレージマネージャ内の 列で判断することができます。 | |
virsh を利用することで、コマンドラインからもストレージを 管理することができます。なお、 SUSE ではストレージプールの作成機能はサポート していません。そのため、本章ではプールの開始や停止、削除のほか、ボリューム 管理の機能に限定して説明しています。
プールやボリュームの管理に使用する virsh の全サブコマンドは、 それぞれ virsh help pool または virsh help volume のコマンドを実行することで表示することができます。
現在利用可能な全てのプールを表示するには、下記のコマンドを実行します。
無効化されているプールも表示したい場合は、 --all オプションを
追加してください:
virsh pool-list --details
特定のプールに関する詳細を表示するには、 pool-info
サブコマンドを利用します:
virsh pool-info プール既定では、プールごとにボリュームを一覧表示できます。あるプールから提供されて いる全てのボリュームを表示するには、下記のコマンドを実行します:
virsh vol-list --details プール現時点の virsh コマンドでは、特定のボリュームがゲストで 使用されているかどうかを判断することはできません。下記の手順を利用すること で、 VM ゲスト で使用されている全てのプールと、そこから提供されている ボリュームを表示することができます。
手順7.1 VM ホストサーバ で使用されている全ストレージボリュームの一覧表示¶
まずは XSLT スタイルシートを下記の内容で作成します。たとえば ~/libvirt/guest_storage_list.xsl などのファイル名で保存します:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="text()"/>
<xsl:strip-space elements="*"/>
<xsl:template match="disk">
<xsl:text> </xsl:text>
<xsl:value-of select="(source/@file|source/@dev|source/@dir)[1]"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
下記のコマンドをシェル内で実行します。なお以下の例は、全てのゲストの
XML 定義が既定の場所 (/etc/libvirt/qemu) に存在
している場合の例です。また、 xsltproc プログラムは
libxslt パッケージ内に
あります。
SSHEET="$HOME/libvirt/guest_storage_list.xsl" cd /etc/libvirt/qemu for FILE in *.xml; do basename $FILE .xml xsltproc $SSHEET $FILE done
virsh のサブコマンドを利用することで、プールの開始や
停止、削除などを行なうことができます。下記の例では、それぞれ
POOL の部分をプール名または UUID に置き換えて
実行してください:
virsh pool-destroy POOL![]() | プールの状態と接続されたボリュームの影響関係 |
|---|---|
プールから VM ゲスト に割り当てられたボリュームは、そのプールの状態 ( (有効) または (無効)) に関わらず、常に利用可能な状態になります。プールの状態は、リモートからの 管理で、 VM ゲスト にボリュームを割り当てられるかどうかだけに影響します。 | |
virsh pool-delete POOL![]() | ストレージプールの削除 |
|---|---|
ローカルの ファイルシステムディレクトリや ローカルパーティション、ローカルディスクをベースにしたプールの 削除は、その時点で VM ゲスト に割り当てられているボリュームに 対しては効果がありません (以前と変わらず利用できます) 。 一方、 iSCSI や SCSI 、 LVM グループやネットワークで公開されている ディレクトリの場合は、プールが削除されるとアクセス不可能になります。 ボリュームそれ自身が削除されなくても、 VM ホストサーバ ではそれらの資源に 対してアクセスする権利がなくなるためです。 iSCSI/SCSI ターゲット上やネットワークで公開されているディレクトリでは、 新しいプールを同じ設定で作成したり、ホスト側のシステムからマウントしたり アクセスしたりすることで、再度アクセスできるようになります。 LVM グループをベースにしたプールの場合は、 LVM グループの設定が消去されるため、 ホストシステム上では存在が消去されてしまいます。設定は復元することはできず、 プール上に存在していた全てのボリュームは失われてしまいます。 | |
virsh pool-start POOLvirsh pool-autostart POOLVM ホストサーバ を再起動した際、自動的に開始するようにマークしたプールだけ を自動的に開始します。
virsh pool-autostart POOL --disable
virsh では 2 種類の方法でストレージプールを作成する
ことができます。 1 つは XML の定義から作成する方法で、
vol-create と vol-create-from を
利用して行ないます。もう 1 つは vol-create-as を
利用してコマンドラインパラメータから作成する方法です。前者の方法は
SUSE でサポートしていませんので、ここでは vol-create-as
のサブコマンドについて説明します。
既存のプールにボリュームを追加するには、下記のコマンドを実行します:
virsh vol-create-asPOOLNAME12G --format
raw|qcow2|qed--allocation 4G
ボリュームを追加すべき先のプール名を指定します。 | |
ボリューム名を指定します。 | |
イメージのサイズを指定します。この例では 12 ギガバイトを指定して います。それぞれ k,M,G,T の接尾辞を付けることで、キロバイト、メガバイト、 ギガバイト、テラバイトの意味になります。 | |
ボリュームの形式を指定します。 SUSE では現在、
| |
残りは任意指定のパラメータです。 virsh の既定では、 必要に応じてサイズの大きくなるスパースイメージファイルを作成します。 このパラメータでは、割り当てるべき領域を指定しています (この例では 4 ギガバイトを指定しています) 。それぞれ k,M,G,T の接尾辞を付けること で、キロバイト、メガバイト、ギガバイト、テラバイトの意味になります。
このパラメータを指定しないと、初期状態では領域を割り当てないスパース
イメージファイルを作成することになります。また、非スパース型の
ボリュームを作成したい場合は、このパラメータをボリュームのサイズと
一致 (この例では |
プールにボリュームを追加する際のもう 1 つの方法として、既存のボリューム を複製する、という方法があります。複製したボリュームは、元のボリュームと 同じプール内に作成されます。
vol-clone既存のボリュームの名前新しいボリュームの名前--pool
POOL
プールからボリュームを恒久的に削除するには、
vol-delete のサブコマンドを利用します:
virsh vol-deleteNAME--poolPOOL
--pool は任意指定です。 libvirt ではプールを自動的に
判断しますが、これがうまく行かない場合は、このパラメータを指定してください。
![]() | No Checks Upon Volume Deletion |
|---|---|
ボリュームの削除は、有効な VM ゲスト や無効な VM ゲスト で使用されているか どうかに関わらず行なうことができます。削除されたボリュームを復元する手段は ありません。 VM ゲスト でボリュームが使用されているかどうかを判断するには、 手順7.1「VM ホストサーバ で使用されている全ストレージボリュームの一覧表示」 をご覧ください。 | |
virtlockd を利用したディスクファイルとブロックデバイスの施錠¶ブロックデバイスやディスクファイルに対する施錠 (ロック) を設定することで、 複数の VM ゲストからブロックデバイスやディスクファイルに書き込まれるような 事態を避けることができます。それ以外にも、同じ VM ゲスト を 2 度起動して しまうような事態や、別々の仮想マシンに対して同じディスクを追加してしまう ような事態を避けることもできます。この仕組みにより、誤った設定によって 仮想マシンのディスクイメージを破壊するリスクを減らすことができます。
施錠処理は virtlockd と呼ばれる
デーモンが制御します。このデーモンは libvirtd デーモンとは別に動作する
ため、 libvirtd がクラッシュした場合や、 libvirtd を再起動したような
場合であっても、施錠を維持することができます。また、 virtlockd 自身を更新したような場合にも、自分
自身を再実行することができますので、この場合にも施錠を維持することができます。
このような仕組みが備わっていますので、 virtlockd の更新を適用した場合であっても、
VM ゲスト を再起動する必要は ありません 。
仮想ディスクの施錠は、 openSUSE の既定では有効化されていません。 有効化して、再起動時にも自動的に開始するように設定するには、下記の手順を 実施します:
/etc/libvirt/qemu.conf ファイルを編集し、下記の
ように値を設定します:
lock_manager = "lockd"
下記のコマンドを実行し、 virtlockd
デーモンを起動します:
rcvirtlockd start
下記のコマンドを実行して、 libvirtd を再起動します:
rclibvirtd restart
システムの起動時に自動的に virtlockd
を開始するように設定します:
insserv virtlockd
既定では、 virtlockd はお使いの
VM ゲスト に設定されたすべてのディスクを、自動的に施錠するように設定されて
います。また、既定の設定では "直接的な" 施錠領域を使用するように設定されて
います。これは、 VM ゲストの <disk> デバイスに設定された、
実際のファイルパスに対して施錠を行なう、という意味です。たとえば、
VM ゲスト の <disk> デバイス内に下記のような設定が書かれている場合、
/var/lib/libvirt/images/my-server/disk0.raw
ファイルに対して flock(2) が直接呼び出されます:
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/my-server/disk0.raw'/> <target dev='vda' bus='virtio'/> </disk>
virtlockd の設定は、
/etc/libvirt/qemu-lockd.conf ファイルを編集する
ことで変更することができます。このファイルには、コメント欄に
詳しい説明が書いてありますので、こちらをお読みください。
なお、変更した設定を反映するには、下記のようにして virtlockd を再読み込みさせる必要が
あります:
rcvirtlockd reload
![]() | ディスク施錠の設定範囲について |
|---|---|
SUSE Linux Enterprise 11 SP3 では、施錠は全体 (全ての仮想ディスク) に対して設定されます。 個別のディスクに対して施錠の可否を設定する機能は、将来リリースされる 予定です。 | |
virtlockd の既定の設定では、
「直接」 施錠領域を使用するようになっています。これは仮想
マシンの <disk> デバイス内に設定された、実際のファイルパスに対して
施錠を行なう、という設定です。実際のファイルパスが、必ずしもすべての
ホストからアクセスできるような構成でないような場合は、 virtlockd を 「間接」 施錠領域
を使用するように設定することもできます。この設定では、間接施錠領域用の
ディレクトリ内に、ディスクファイルのパスから作られたハッシュファイルを
作成して施錠を確立します。そのため、実際のディスクファイルのパス
ではなく、ハッシュファイルに対して施錠を設定することになります。間接
施錠領域は、ディスクファイルを含むファイルシステムが、
fcntl() による施錠に対応していないような場合にも
有用な仕組みです。間接施錠領域は、 file_lockspace_dir という設定で
指定することができます:
file_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"LVM や iSCSI ボリューム上に配置されていて、複数のホストで共有されている 仮想ディスクに対して施錠を実施したい場合は、パス (既定値) ではなく UUID で施錠を実施する必要があります。また、施錠領域のディレクトリは、 ボリュームを共有する全てのホストからアクセス可能な、共有ファイルシステム 上に配置する必要があります。 LVM や iSCSI をお使いの場合は、下記の オプションを指定してください:
lvm_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY" iscsi_lockspace_dir = "/MY_LOCKSPACE_DIRECTORY"