ゲスト側の仮想マシンをインストールする前に、まずは VM ホストサーバ 内に必要なリソースを用意して環境を整える必要があります。具体的には下記の設定を行う必要があります:
ネットワーク: ホストが提供するネットワークと接続するための機能に関する設定を行います。
ストレージプール: ホストが提供するストレージをゲスト側からアクセスできるようにして、ディスクイメージ等を保存できるようにします。
VM ゲスト に対してネットワーク機能を提供するには、下記の 2 種類の方法があります:
ネットワークブリッジ: ゲスト側にネットワーク接続を提供する設定の既定値で、推奨される方式です。
仮想ネットワーク: 転送機能を利用してネットワーク接続を提供する方式です。
ネットワークブリッジは、 VM ゲスト に対してレイヤ 2 スイッチの機能を提供します。レイヤ 2 スイッチは、ポート間のパケット転送の際にレイヤ 2 イーサネットパケットを利用し、 MAC アドレスをベースにして宛先を判断します。これにより、 VM ホストサーバ から VM ゲスト に対して、レイヤ 2 アクセスのネットワークを提供することになります。これは、 VM ゲスト の仮想的なイーサネットケーブルがイーサネットハブに接続され、そこからホスト自身やホスト内で動作する他の VM ゲスト に接続できる形態と同じになります。この設定は、 共有物理デバイス と称することもあります。
ネットワークブリッジは、 openSUSE Leap を KVM または Xen のハイパーバイザとして設定した際の既定の設定になっています。これは VM ゲスト と VM ホストサーバ の LAN を単純に接続できるため、お勧めの方法でもあります。
ネットワークブリッジを作成する際に使用すべきツールは、 VM ホストサーバ 側でのネットワーク接続を管理する際に使用しているサービスによって異なります:
ネットワーク接続を wicked
で管理している場合は、 YaST またはコマンドラインツールを利用してネットワークブリッジを作成します。サーバ用途として構築した場合は、 wicked
が既定で使用されます。
ネットワーク接続を NetworkManager で管理している場合は、コマンドラインツール nmcli
でネットワークブリッジを作成します。デスクトップ環境やラップトップ環境の場合は、 NetworkManager が既定で使用されます。
本章では、 YaST を利用してネットワークブリッジを追加または削除する方法を説明しています。
VM ホストサーバ にネットワークブリッジを追加するには、下記の手順を行います:
› › を起動します。
タブに移動して を押します。
では を選択し、 の項目にはブリッジデバイスのインターフェイス名を入力します。あとは を押します。
のタブでは、 DHCP 経由でアドレスを取得するか、もしくは固定で IP アドレスを設定するかを選択し、必要であれば IP アドレスやサブネットマスク、ホスト名などをそれぞれ入力します。
は、ブリッジが DHCP サーバに接続されているような場合のみ有用です。
物理的なイーサネットデバイスへの接続を持たない仮想ブリッジを作成する場合は、 192.168.0.0/16
, 172.16.0.0/12
, 10.0.0.0/8
などの中から選択します。
ホストシステムとは接続しないゲスト間のみのネットワーク接続を作成する場合は、 IP アドレスを 0.0.0.0
、サブネットマスクを 255.255.255.255
に設定します。これにより、 IP アドレスを設定しない特殊なネットワークを構成することができます。
のタブでは、ネットワークブリッジに含めたいネットワークデバイスを選択します。
を押すと タブに戻りますので、設定内容を確認して を押します。これで VM ホストサーバ 内にネットワークブリッジが作成され、有効化されます。
既存のネットワークブリッジを削除するには、下記の手順を行います:
› › を起動します。
タブで削除したいブリッジデバイスを選択します。
を押してブリッジを削除し、 を押します。
本章では、コマンドラインを利用してネットワークブリッジを追加もしくは削除する方法を説明しています。
VM ホストサーバ 内にネットワークブリッジを追加するには、下記の手順を行います:
ネットワークブリッジを作成したい VM ホストサーバ にログインし、 root
になります。
まずは新しいブリッジの名前を選択します。下記の例では、 virbr_test という名前で作成するものとします。
#
ip link add name virbr_test type bridge
VM ホストサーバ でブリッジが作成されたことを確認します:
#
bridge vlan
[...]
virbr_test 1 PVID Egress Untagged
virbr_test
という名前が現れていますが、この時点ではどの物理ネットワークインターフェイスにも結びつけられていません。
ネットワークブリッジを起動して、ブリッジにネットワークインターフェイスを追加します:
#
ip link set virbr_test up#
ip link set eth1 master virbr_test
ここで指定できるネットワークインターフェイスは、他のネットワークブリッジで使用されているものであってはなりません。
なお、必要であれば STP (スパニングツリープロトコル) を有効化することもできます:
#
bridge link set dev virbr_test cost 4
コマンドラインを利用して VM ホストサーバ のネットワークブリッジを削除するには、下記の手順を行います:
ネットワークブリッジを削除したい VM ホストサーバ にログインし、 root
になります。
まずは既存のネットワークブリッジの一覧を表示させて、名前を確認します:
#
bridge vlan
[...]
virbr_test 1 PVID Egress Untagged
ブリッジを削除します:
#
ip link delete dev virbr_test
nmcli
を利用したネットワークブリッジの作成 #Edit source本章では、 NetworkManager が提供するコマンドラインツール nmcli
を利用して、ネットワークブリッジを追加する方法を説明しています。
まずは既存のネットワーク接続を確認します:
>
sudo
nmcli connection show --active NAME UUID TYPE DEVICE Ethernet connection 1 84ba4c22-0cfe-46b6-87bb-909be6cb1214 ethernet eth0
br0
という名前の新しいブリッジデバイスを作成し、確認します:
>
sudo
nmcli connection add type bridge ifname br0 Connection 'bridge-br0' (36e11b95-8d5d-4a8f-9ca3-ff4180eb89f7) \ successfully added.>
sudo
nmcli connection show --active NAME UUID TYPE DEVICE bridge-br0 36e11b95-8d5d-4a8f-9ca3-ff4180eb89f7 bridge br0 Ethernet connection 1 84ba4c22-0cfe-46b6-87bb-909be6cb1214 ethernet eth0
必要であれば、ブリッジの設定を表示させてもよいでしょう:
>
sudo
nmcli -f bridge connection show bridge-br0 bridge.mac-address: -- bridge.stp: yes bridge.priority: 32768 bridge.forward-delay: 15 bridge.hello-time: 2 bridge.max-age: 20 bridge.ageing-time: 300 bridge.group-forward-mask: 0 bridge.multicast-snooping: yes bridge.vlan-filtering: no bridge.vlan-default-pvid: 1 bridge.vlans: --
物理イーサネットデバイス eth0
をブリッジデバイスに繋げます:
>
sudo
nmcli connection add type bridge-slave ifname eth0 master br0
あとは eth0
インターフェイスを無効化し、新しいブリッジを有効化します:
>
sudo
nmcli connection down "Ethernet connection 1">
sudo
nmcli connection up bridge-br0 Connection successfully activated (master waiting for slaves) \ (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/9)
状況によっては、 2 台の VM ホストサーバ 間や VM ゲスト 間で、プライベートな接続が必要となる場合があります。たとえば VM ゲスト を異なるネットワークセグメント内にあるホストに移行させる必要がある場合や、特定の VM ゲスト のみが接続できるプライベートブリッジが必要となる場合 (異なる VM ホストサーバ 内にあってもかまいません) などがそれにあたります。このような状況下では、 VLAN ネットワークを作成するのが最も簡単です。
VLAN インターフェイスは一般に VM ホストサーバ 内で設定を行います。この VLAN インターフェイスは異なる VM ホストサーバ システム間の相互接続として使用できるほか、 VM ゲスト のみが接続されたブリッジへの物理インターフェイスとしても設定することができます。このほか、 VM ホストサーバ では IP アドレスを設定せずに VLAN を物理インターフェイスに接続することもできてしまいます。これにより、 VM ゲスト から VM ホストサーバ に接続できないように設定できることになります。
まずは YaST を起動して
› を選択します。あとは下記の手順で VLAN インターフェイスを設定します:を押して新しいネットワークインターフェイスを作成します。
内の では、 を選択します。
1
は通常、管理用に使用します。
を押します。
では、 VLAN デバイスの接続先となるインターフェイスを選択します。一覧に必要なインターフェイスが表示されていない場合は、いったんキャンセルしてから、表示させたいインターフェイスを設定してください (このとき、 IP アドレスは指定しなくてかまいません) 。
さらに VLAN デバイスへの IP アドレス設定方法を選択します。
を押して設定を完了してください。
VLAN インターフェイスをブリッジの物理インターフェイスとして使用することもできます。これにより、特定の VM ホストサーバ と VM ゲスト のみを接続することができるようになりますので、そのネットワークを介して VM ゲスト を移行できるようになります。
場合によっては、 YaST で IP アドレスの設定を無くすことができない場合があります。たとえば VM ゲスト のみを接続するようなネットワークがそれにあたります。このような場合は、 IP アドレスに 0.0.0.0
を、サブネットマスクに 255.255.255.255
をそれぞれ指定してください。これにより IP アドレス無しでの設定ができるようになります。
libvirt
が管理する仮想ネットワークはブリッジ型のネットワークと似ていますが、一般的には VM ホストサーバ とのレイヤ 2 接続は行いません。 VM ホストサーバ の物理ネットワークへの接続は、レイヤ 3 転送を利用して実現します。これは VM ホストサーバ 側でパケット転送の機能を提供するもので、レイヤ 2 ブリッジ型ネットワークとは異なる方式になります。この種類の仮想ネットワークでは VM ゲスト に対して DHCP や DNS のサービスを提供することもできます。 libvirt
の仮想ネットワーク機能に関する詳細は、 https://libvirt.org/formatnetwork.html にある Network XML format の章をお読みください。
openSUSE Leap で標準的な方法で libvirt
のインストールを行うと、 default
という名前の仮想ネットワークが作成され、 DHCP と DNS の機能がそれぞれ提供されるようになります。また、この仮想ネットワークにはアドレス変換 (NAT) 機能が提供され、 VM ホストサーバ の物理ネットワークに接続できるようになります。これはあらかじめ設定済みの形で提供されますが、管理者側で有効化する必要があります。 libvirt
でサポートされている転送モードの詳細について、詳しくは https://libvirt.org/formatnetwork.html#elementsConnect にある Network XML format ドキュメンテーションをお読みください。
libvirt
が管理する仮想ネットワークは幅広い用途に対応していて、必要な機能のほとんどに対応していますが、ラップトップなどの無線接続や動的な (間欠的な) 接続の場合には不十分です。また仮想ネットワークは、仮想ネットワークと VM ホストサーバ のネットワークとの間でパケット転送を行うことから、 VM ホストサーバ の接続しているネットワーク内で IP アドレス数が不足しているような環境に有用でもあります。しかしながら、サーバ用途の場合は、 VM ゲスト を VM ホストサーバ の LAN に接続するネットワークブリッジ型の構成のほうが便利ではあります。
libvirt
の仮想ネットワークに対して転送モードを有効化するには、まず /proc/sys/net/ipv4/ip_forward
と /proc/sys/net/ipv6/conf/all/forwarding
をそれぞれ 1 に設定する必要があります。これにより、 VM ホストサーバ をルータとして動作させることができるようになります。なお、 VM ホストサーバ のネットワークを再起動してしまうと、これらの値はリセットされ転送機能が無効化されてしまいます。再起動後も転送モードを有効化したい場合は、 VM ホストサーバ 内の /etc/sysctl.conf
ファイルを編集して、下記の内容を追記してください:
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
仮想マシンマネージャ を利用することで、仮想ネットワークの作成や設定、操作などを行うことができます。
まずは 仮想マシンマネージャ を起動します。利用可能な接続が表示されますので、設定したい仮想ネットワークの名前を選択して
を押します。ウインドウで タブを選択します。ここには現在の接続で利用可能な全ての仮想ネットワークが表示されるほか、右側には選択した仮想ネットワークの詳細が表示されます。
新しい仮想ネットワークを追加するには、
を押します。まずは新しい仮想ネットワークの名前を指定します。
次にネットワークモードを指定します。
および の場合は、ネットワーク通信の転送先デバイスを指定することができます。 (Network Address Translation; ネットワークアドレス変換) は仮想的なネットワークアドレス領域を特定の IP アドレスに割り当てるための方式で、 1 つの IP アドレスを複数のゲストで共有することができるようになります。 は仮想ネットワーク側からのパケットを、そのまま VM ホストサーバ の物理ネットワークに転送する方式です。IPv4 ネットワークを使用する場合は
を選択して利用したい IPv4 ネットワークアドレスを入力します。 DHCP サーバが必要な場合は、 を選択して、割り当てるべきアドレス範囲を指定します。IPv6 ネットワークを使用する場合は
を選択して利用したい IPv6 ネットワークアドレスを入力します。 DHCP サーバが必要な場合は、 を選択して、割り当てるべきアドレス範囲を指定します。仮想ネットワークとは異なるドメイン名を設定したい場合は、
で を選択し、ドメイン名を入力します。virbrX
が作成され、これが新しい仮想ネットワークになります。これは bridge link
コマンドで確認することができます。 libvirt
では自動的に iptables のルールを追加して、新しく作成した virbrX でのゲスト間の通信可否を設定します。
停止済みの仮想ネットワークを起動するには、下記の手順で行います:
まずは 仮想マシンマネージャ を起動します。利用可能な接続が表示されますので、設定したい仮想ネットワークの名前を選択して
を押します。ウインドウ内では タブを選択します。ここには現在の接続で利用可能な、全ての仮想ネットワークが一覧表示されます。
仮想ネットワークを起動するには、
を押します。起動済みの仮想ネットワークを停止するには、下記の手順で行います:
まずは 仮想マシンマネージャ を起動します。利用可能な接続が表示されますので、設定したい仮想ネットワークの名前を選択して
を押します。ウインドウ内では タブを選択します。ここには現在の接続で利用可能な、全ての仮想ネットワークが一覧表示されます。
停止させたい仮想ネットワークを選択して、
を押します。VM ホストサーバ から仮想ネットワークを削除するには、下記の手順で行います:
まずは 仮想マシンマネージャ を起動します。利用可能な接続が表示されますので、設定したい仮想ネットワークの名前を選択して
を押します。ウインドウ内では タブを選択します。ここには現在の接続で利用可能な、全ての仮想ネットワークが一覧表示されます。
削除したい仮想ネットワークを選択して
を押します。nsswitch
を利用した IP アドレスの取得 (KVM) #Edit sourceVM ホストサーバ 側に libvirt-nss をインストールします。これは libvirt 向けに NSS サポートを提供するものです:
>
sudo
zypper in libvirt-nss
/etc/nsswitch.conf
に libvirt
を追記します:
... hosts: files libvirt mdns_minimal [NOTFOUND=return] dns ...
NSCD を起動している場合は、再起動します:
>
sudo
systemctl restart nscd
これでホスト側からゲストを名前で接続できるようになります。
なお、 NSS モジュールの機能は完全ではありません。 dnsmasq
が提供する /var/lib/libvirt/dnsmasq/*.status
ファイルを読み込んで、 JSON レコード形式で記述されているホスト名と IP アドレスを検出します。ホスト名の変換は、 dnsmasq
の動作している libvirt 管理下のブリッジ型ネットワークの VM ホストサーバ でのみ動作します。
virsh
を利用した仮想ネットワークの管理 #Edit sourcelibvirt
が提供する仮想ネットワークは、 virsh
コマンドラインツールで管理することができます。 virsh
で利用可能なネットワーク関連のコマンドを一覧表示するには、下記のように入力して実行します:
>
sudo
virsh help network Networking (help keyword 'network'): net-autostart ネットワークの自動起動 net-create XML ファイルによるネットワークの作成 net-define define (but don't start) a network from an XML file net-destroy ネットワークの強制停止 net-dumpxml XML 形式のネットワーク情報 net-edit ネットワークの XML 設定の編集 net-event Network Events net-info ネットワーク情報 net-list ネットワークの一覧表示 net-name ネットワーク UUID からネットワーク名への変換 net-start 停止状態の(定義済み)ネットワークの起動 net-undefine undefine an inactive network net-update 既存のネットワーク設定の一部分の更新 net-uuid ネットワーク名からネットワーク UUID への変換 net-port-list list network ports net-port-create create a network port from an XML file net-port-dumpxml network port information in XML net-port-delete delete the specified network port
virsh
の特定のコマンドに対するヘルプを表示したい場合は、 virsh help コマンド
のように入力して実行してください。
>
sudo
virsh help net-create 名前 net-create - XML ファイルによるネットワークの作成 形式 net-create <file> 詳細 ネットワークを作成します。 オプション [--file] <string> ネットワーク の XML 記述を含むファイル
新しい 動作中 の仮想ネットワークを作成するには、下記のように入力して実行します:
>
sudo
virsh net-create 定義ファイル名.xml
ここで、 定義ファイル名.xml には、 libvirt
が受け入れ可能な XML 形式で記述された、仮想ネットワークの設定ファイルを指定します。
有効化せずに新しい仮想ネットワークを追加したい場合は、下記のように入力して実行します:
>
sudo
virsh net-define 定義ファイル名.xml
下記には、様々な種類の仮想ネットワークの設定例を示しています。
下記の設定は VM ゲスト から外部に発信する通信を許可するネットワーク設定です。ただし、 VM ホストサーバ 側で外部に接続することのできる環境が必要です。 VM ホストサーバ 側にそのようなネットワークが用意されていない場合、相互に通信できるだけのネットワークになります。
<network> <name>vnet_nated</name>1 <bridge name="virbr1"/>2 <forward mode="nat"/>3 <ip address="192.168.122.1" netmask="255.255.255.0">4 <dhcp> <range start="192.168.122.2" end="192.168.122.254"/>5 <host mac="52:54:00:c7:92:da" name="host1.testing.com" \ ip="192.168.1.101"/>6 <host mac="52:54:00:c7:92:db" name="host2.testing.com" \ ip="192.168.1.102"/> <host mac="52:54:00:c7:92:dc" name="host3.testing.com" \ ip="192.168.1.103"/> </dhcp> </ip> </network>
新しい仮想ネットワークの名前です。 | |
仮想ネットワークを構築する際のブリッジデバイス名を指定します。 <forward> (転送) モードが | |
<forward> 要素を含めることで、仮想ネットワークを物理 LAN に接続することができるようになります。 | |
ネットワークブリッジに設定する IP アドレスとネットマスクです。 | |
仮想ネットワークに対して DHCP サーバ機能を有効化し、 | |
指定は任意ですが、 <host> 要素を設定することで、内蔵の DHCP サーバに対して割り当てるべき IP アドレスを設定することもできます。この <host> 要素では、 IPv4 の場合は割当先のホストの MAC アドレスと DHCP サーバが割り当てるべき IP アドレス、そしてホスト名をそれぞれ設定します。 IPv6 の場合は IPv4 と少し異なり、 IPv6 では使用しない |
下記の設定は、仮想ネットワーク内のトラフィックを LAN にそのまま (NAT を適用せずに) 転送する場合の例を示しています。 IP アドレスの範囲は、 VM ホストサーバ 側のネットワークルータであらかじめ設定されていなければなりません。
<network>
<name>vnet_routed</name>
<bridge name="virbr1"/>
<forward mode="route" dev="eth1"/>1
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254"/>
</dhcp>
</ip>
</network>
この例では、ゲスト側のトラフィックは VM ホストサーバ 内の |
この設定は、プライベートネットワークとして完全に孤立させる設定例となります。ゲスト同士や VM ホストサーバ との間では通信ができるものの、 LAN 内のマシンからは全く接続できなくなります。これは XML の設定内に <forward> 要素が存在していないためです。
<network> <name>vnet_isolated</name> <bridge name="virbr3"/> <ip address="192.168.152.1" netmask="255.255.255.0"> <dhcp> <range start="192.168.152.2" end="192.168.152.254"/> </dhcp> </ip> </network>
この設定は、 VM ホストサーバ 内にある既存のネットワークブリッジ br0
を使用する場合の例です。 VM ゲスト は物理ネットワークに直接接続される形になります。 VM ゲスト の IP アドレスは物理ネットワークと同じサブネットでなければなりませんが、その代わり、接続に関する制限は送受信ともになくなります。
<network> <name>host-bridge</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
libvirt
で利用可能な仮想ネットワークの一覧を表示するには、下記のように入力して実行します:
>
sudo
virsh net-list --all 名前 状態 自動起動 永続 ---------------------------------------------------------- crowbar 動作中 はい (yes) はい (yes) vnet_nated 動作中 はい (yes) はい (yes) vnet_routed 動作中 はい (yes) はい (yes) vnet_isolated 停止状態 はい (yes) はい (yes)
利用可能なドメインの一覧を表示するには、下記のように入力して実行します:
>
sudo
virsh list Id 名前 状態 ---------------------------------------------------- 1 nated_sles12sp3 動作中 ...
動作中のドメインのインターフェイス一覧を表示したい場合は、 domifaddr ドメイン
のように入力して実行します。このとき、インターフェイス名を直接指定して実行することもできます。既定では IP アドレスと MAC アドレスがそれぞれ出力されます:
>
sudo
virsh domifaddr nated_sles12sp3 --interface vnet0 --source lease 名前 MAC アドレス Protocol Address ------------------------------------------------------------------------------- vnet0 52:54:00:9e:0d:2b ipv6 fd00:dead:beef:55::140/64 - - ipv4 192.168.100.168/24
指定したドメインに関連づけられた全ての仮想インターフェイスの概要情報を表示するには、下記のように入力して実行します:
>
sudo
virsh domiflist nated_sles12sp3 Interface Type Source Model MAC --------------------------------------------------------- vnet0 network vnet_nated virtio 52:54:00:9e:0d:2b
ネットワークに関する詳細情報を取得するには、下記のように入力して実行します:
>
sudo
virsh net-info vnet_routed 名前: vnet_routed UUID: 756b48ff-d0c6-4c0a-804c-86c4c832a498 起動中: はい (yes) 永続: はい (yes) 自動起動: はい (yes) ブリッジ: virbr5
設定済みではあるものの、現在起動していないネットワークを起動したい場合は、まず対象の名前 (もしくは識別子や UUID) を判断します。具体的には、下記のように入力して実行します:
>
sudo
virsh net-list --inactive 名前 状態 自動起動 永続 ---------------------------------------------------------- vnet_isolated 停止状態 はい (yes) はい (yes)
あとは下記のように入力して実行します:
>
sudo
virsh net-start vnet_isolated ネットワーク vnet_isolated を起動しました
動作中のネットワークを停止するには、まず対象の名前 (もしくは識別子や UUID) を判断します。具体的には、下記のように入力して実行します:
>
sudo
virsh net-list --inactive 名前 状態 自動起動 永続 ---------------------------------------------------------- vnet_isolated 動作中 はい (yes) はい (yes)
あとは下記のように入力して実行します:
>
sudo
virsh net-destroy vnet_isolated ネットワーク vnet_isolated は強制停止されました
停止したネットワークの設定を VM ホストサーバ から完全に停止したい場合は、下記のように入力して実行します:
>
sudo
virsh net-undefine vnet_isolated ネットワーク vnet_isolated の定義が削除されました
VM ホストサーバ 自身から VM ゲスト を管理する場合であれば、 VM ホストサーバ のファイルシステム内で任意の箇所にアクセスして仮想ハードディスクを割り当てたり作成したりすることができますし、既存のイメージを VM ゲスト に割り当てたりすることができます。しかしながら、このような機能は VM ゲスト をリモートから管理しようとしている場合には実現できません。このような理由から、 libvirt
では 「ストレージプール」 と呼ばれる機能を提供して、リモートからアクセスできるようにしています。
リモートのクライアントから VM ホストサーバ 内の CD/DVD イメージにアクセスできるようにするには、まずそれらのイメージをストレージプール内に配置します。
libvirt
では 2 種類のストレージを管理しています。それらはボリュームとプールと呼ばれます。
ストレージボリュームは、ゲストに対して割り当てることのできるストレージデバイスを意味します。たとえば仮想ディスクや CD/DVD イメージのほか、フロッピィディスクイメージなども該当します。また、ストレージボリュームを物理デバイス (パーティションや論理ボリュームなど) に設定することもできますし、 VM ホストサーバ 内のファイルとして存在させることもできます。
ストレージプールは VM ホストサーバ 内のストレージリソースを意味するもので、その中にストレージボリュームが存在する形になります。デスクトップマシンにおけるネットワークストレージのような存在です。物理的には下記のいずれかの形態を取ることができます:
イメージファイルを含むディレクトリの形態です。イメージファイルにはディスク形式 (raw, qcow2) のほか、 ISO イメージであってもかまいません。
物理ディスク全体をストレージプールとして使用する形態です。その中にパーティションを作成してストレージボリュームを設定し、プールへの追加を行います。
ファイルシステムのディレクトリをストレージプールとして使用する場合と同様に、特定のパーティションをストレージプールとして使用する形態です。ただし、この方式の場合は、 libvirt
側でデバイスのマウント処理を行います。
iSCSI ターゲット内にストレージプールを作成する形態です。この場合は、 libvirt
で使用するより前に、あらかじめボリュームにログインしておく必要があります。 YaST の モジュールを利用してターゲットを検出し、ログインしておいてください。 iSCSI ストレージプール内でのボリューム作成はサポートされていませんが、既存の論理ユニット番号 (LUN) そのものがボリュームそのものになります。それぞれのボリューム (LUN) を使用するには、あらかじめパーティションテーブルを作成しておくか、ディスクラベルを設定しておく必要があります。いずれも存在していない場合は、 fdisk
で設定してください:
>
sudo
fdisk -cu /dev/disk/by-path/ip-192.168.2.100:3260-iscsi-iqn.2010-10.com.example:[...]-lun-2 デバイスには認識可能なパーティション情報が含まれていません。 新しい DOS ディスクラベルを作成しました。識別子は 0xdeadbeef です。 コマンド (m でヘルプ): w パーティション情報が変更されました。 ディスクを同期しています。
LVM のボリュームグループをプールとして使用する形態です。設定済みのボリュームグループの中から選択するか、もしくは使用したいデバイスを指定してグループを作成することができます。ストレージボリュームは、その中のパーティションとして作成されます。
LVM ベースのプールをストレージマネージャで削除した場合、ボリュームグループについても削除が行われます。そのため、プール内にあるデータは完全に削除され、復元できなくなることに注意してください!
現時点では、マルチパスデバイスへのサポートは限定的で、ゲストに対して既存のデバイスを割り当てることだけができます。 libvirt
内からマルチパスデバイスのボリュームを作成する機能は提供されていません。
ファイルシステムのディレクトリプール (イメージファイルをディレクトリ内に配置する) と同様に、ネットワークディレクトリを指定して、そのディレクトリ内に配置する方法です。ただし、こちらの場合は libvirt
側でマウント処理を行います。こちらは NFS に対応しています。
iSCSI ターゲットと同様に SCSI ホストアダプタを使用する方法です。この場合、デバイス名に /dev/sdX
ではなく、 /dev/disk/by-*
を使用することをお勧めします。これは、 /dev/sdX
を使用してしまうと、ハードディスクの取り付けや取り外しなどで名前が変化してしまうことがあり得るためです。 iSCSI プール内のボリューム作成には対応していませんが、既存の LUN (論理ユニット番号; Logical Unit Number) がそのままボリュームを表します。
データの損失や破壊を防ぐため、 LVM ボリュームグループや iSCSI ターゲットなど、 VM ホストサーバ のストレージプールを構成するリソースを別目的で使用してはなりません。これらに対する必要な処理は libvirt
が行いますので、 VM ホストサーバ から直接接続する必要はありませんし、 VM ホストサーバ からマウントする必要もありません。
また VM ホストサーバ では、ラベルによるマウントも行わないようにしてください。ラベルによるマウントを行ってしまうと、本来は VM ゲスト 側で使用すべきパーティションを VM ホストサーバ 側が検知して、マウントしてしまう危険性があるためです。
virsh
を利用したストレージの管理 #Edit sourceコマンドラインからのストレージの管理についても、 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 ゲスト 側で使用されている全てのプール内のボリュームを表示することができます。
まずは下記のような内容で 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 プール名
既に VM ゲスト に割り当てられているプール内のボリュームについては、そのプールの状態 (
もしくは ) に関わらず、常にアクセスできる状態になります。プールの状態は、リモートから VM ゲスト のボリュームを管理する場合にのみ有効となります。>
virsh pool-delete プール名
警告: ストレージプールの削除 をお読みください
>
virsh pool-start プール名
>
virsh pool-autostart プール名
自動起動が有効化されたプールは、 VM ホストサーバ の起動時に自動的に起動が行われるようになります。
>
virsh pool-autostart プール名 --disable
virsh
ではストレージプールにボリュームを追加するにあたって、 2 種類の方法を提供しています。 vol-create
および vol-create-from
を利用して、 XML 設定ファイルから追加する方法と、 vol-create-as
のコマンドラインにパラメータを設定して追加する方法です。前者は現時点で SUSE 側でサポート対象となっていませんので、本章では vol-create-as
を説明します。
既存のプールにボリュームを追加するには、下記のようなコマンドを入力して実行します:
>
virsh vol-create-as プール名1名前2 12G --format3raw|qcow24 --allocation 4G5
ボリュームを追加したいプールの名前を指定します | |
ボリュームの名前を指定します | |
イメージのサイズを指定します。この例では 12 ギガバイトを指定していますが、 k (キロバイト), M (メガバイト), G (ギガバイト), T (テラバイト) の各接尾辞を指定することができます。 | |
ボリュームの形式を指定します。 SUSE では | |
任意指定のパラメータです。既定では、 このパラメータを指定しない場合、事前の割り当ての無いスパースファイルを作成することになります。あらかじめ全てのサイズを割り当てておきたい (非スパースファイルを作成したい) 場合は、イメージのサイズと同じ値 (この例では |
プールにボリュームを追加するもう 1 つの方法として、既存のボリュームの複製という手段があります。新しいボリュームは元のボリュームと同じプール内に作成されます。
>
virsh vol-clone 既存のボリューム名1新しいボリューム名2 --pool プール3
プールからボリュームを恒久的に削除したい場合は、 vol-delete
サブコマンドを使用します:
>
virsh vol-delete ボリューム名 --pool プール名
--pool
は任意指定で、通常は libvirt
がボリュームのプールを自動的に判断しますが、それがうまくいかない場合には、このパラメータを指定してください。
ボリュームは VM ゲスト 側が使用しているかどうかにかかわらず、どのような状況下であっても削除ができてしまいます。また、削除したボリュームを復元する方法はありません。
ボリュームが VM ゲスト 側で使用されているかどうかを判断したい場合は、 手順8.2「VM ホストサーバ で使用されている全てのストレージボリュームの一覧表示」 の手順を行ってください。
8.2.1.3項 「ストレージプールへのボリュームの追加」 で説明している手順でボリュームを作成したら、あとは仮想マシンへの割り当てを行ってハードディスクとして使用できるようにします:
>
virsh attach-disk ドメイン イメージファイル 接続先ディスクデバイス
たとえば下記のようになります:
>
virsh attach-disk sles12sp3 /virt/images/example_disk.qcow2 sda2
ディスクが接続できたかどうかを確認するには、 virsh dumpxml
コマンドの出力を確認します:
#
virsh dumpxml sles12sp3
[...]
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/virt/images/example_disk.qcow2'/>
<backingStore/>
<target dev='sda2' bus='scsi'/>
<alias name='scsi0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
[...]
ディスクの接続は、対象のドメインが動作中であっても停止済みであっても実施することができます。また、 --live
と --config
のオプションを使用することで、それぞれ下記のような動作を行うことができます:
--live
動作中のドメインに対してディスクをホットプラグします。接続の情報はドメインの設定ファイル内には保存されません。また、ドメインが動作中ではない場合、 --live
オプションを指定するとエラーになります。
--config
ドメインの設定ファイルを恒久的に変更します。接続されたディスクは次回のドメイン起動以降に利用できるようになります。
--live
--config
ディスクをホットプラグで接続すると共に、ドメインの設定ファイルを恒久的に変更します。
virsh attach-device
virsh attach-device
コマンドは virsh attach-disk
コマンドのより一般的な形式です。このコマンドは、ドメインに対して様々な種類のデバイスを接続することができます。
ドメインに対してディスクへの接続を解除したい場合は、 virsh detach-disk
コマンドを使用します:
#
virsh detach-disk ドメイン 接続先のディスクデバイス
たとえば下記のようになります:
#
virsh detach-disk sles12sp3 sda2
8.2.1.5項 「VM ゲスト へのボリュームの割り当て」 で説明しているのと同様に、こちらでも --live
オプションや --config
オプションで接続方式を制御することができます。
仮想マシンマネージャ はグラフィカルインターフェイスを提供するソフトウエアで、この中のストレージマネージャの機能を使用することで、ボリュームやプールを管理することができます。ストレージマネージャにアクセスするには、接続を選択してマウスの右ボタンを押し、表示されたメニューから
を選択するか、接続を選択して › を選択します。その後 タブを選択してください。ストレージプールを追加するには、下記の手順を行います:
左下の
ボタンを押します。 というダイアログが表示されるはずです。まずはプールに対する _
, -
, .
の各記号を使用することができます) 。あとは を選択します。
あとはプールの種類に従って詳細を指定します。それぞれ下記のようになります:
ZFS プールには対応していません。
: 既存のディレクトリを選択します。
parted
-l
を実行して形式を判別し、指定してください。
/dev/sdX
のようなパスではなく、 /dev/disk/by-*
のパスで指定することをお勧めします。これは、 /dev/sdX
を使用してしまうと、ハードディスクの取り付けや取り外しなどで名前が変化してしまうことがあり得るためです。また、パーティションではなくディスク全体を表すパスを指定してください。
: VM ホストサーバ 内のファイルシステムでのマウントポイントを指定します。
auto
で問題なく動作するはずです。
/dev/sdX
のようなパスではなく、 /dev/disk/by-*
のパスで指定することをお勧めします。これは、 /dev/sdX
を使用してしまうと、ハードディスクの取り付けや取り外しなどで名前が変化してしまうことがあり得るためです。
VM ホストサーバ 側で下記のコマンドを入力して実行し、必要なデータを収集してください:
>
sudo
iscsiadm --mode node
上記のように入力して実行すると、下記のような形式で iSCSI ボリュームの一覧が出力されます。下記のうち、太字の部分が必要な情報になります:
IP_アドレス:PORT,TPGT ターゲット名_(IQN)
/dev/disk/by-path
(既定値) もしくは /dev/disk/by-id
のいずれかを指定してください。
: iSCSI サーバのホスト名または IP アドレスを指定します。
: iSCSI のターゲット名 (iSCSI Qualified Name (IQN)) を指定します。
: iSCSI のイニシエータ名を指定します。
: 既存のボリュームグループのデバイスパスを指定します。
: マルチパス機能への対応は現在、全てのマルチパスデバイスを利用可能にする場合のみとなっています。そのため、ここで指定した任意の文字列は無視されますが、何らかの値を入力しないと XML パーサーの処理が失敗してしまいます。
: VM ホストサーバ 内のファイルシステムでのマウントポイントを指定します。
: ネットワークファイルシステムを提供するサーバの IP アドレスまたはホスト名を指定します。
: 公開されているサーバ内のディレクトリを指定します。
: RADOS ブロックデバイスを提供するサーバの IP アドレスまたはホスト名を指定します。
: サーバ側での RADOS ブロックデバイスの名前を指定します。
/dev/disk/by-path
(既定値) もしくは /dev/disk/by-id
のいずれかを指定してください。
: SCSI アダプタの名前を指定します。
ボタンによるファイル参照機能は、リモートから接続している場合には使用できません。
を押すとストレージプールを追加することができます。
仮想マシンマネージャ のストレージマネージャは、プール内にボリュームを作成したり削除したりすることができます。このほか、既存のストレージプールを一時的に無効化したり恒久的に削除したりすることもできます。なお、プールの基本的な設定の変更については、 SUSE でのサポート対象外となっています。
ストレージプールは、 VM ゲスト をリモートから管理する際に、 VM ホストサーバ 内に存在するブロックデバイスを VM ゲスト に追加したり削除したりする機能を提供するものです。リモートからアクセスできないように一時的に停止したい場合は、ストレージマネージャ内の左下にある
ボタンを押してください。停止されたプールは となり、左側の一覧ではグレーアウト表示されます。既定では新しく作成したプールは自動的に VM ホストサーバ 側で が設定され、自動的に起動するようになります。停止されているプールを起動して、リモートからアクセスできるようにしたい場合は、ストレージマネージャ内の左下にある
を押します。既に VM ゲスト に割り当てられているプール内のボリュームについては、そのプールの状態 (
もしくは ) に関わらず、常にアクセスできる状態になります。プールの状態は、リモートから VM ゲスト のボリュームを管理する場合にのみ有効となります。プールに対して恒久的にアクセスを停止したい場合は、ストレージマネージャ内の左下にある
ボタンを押します。ただし、削除は停止されたプールにのみ実施することができます。なお、プールを削除しても、 VM ホストサーバ 内の内容が物理的に削除されることはなく、プールの設定のみが削除されます。ただし、 LVM ボリュームグループの場合は例外で、この場合は物理的にも削除されることに注意してください。まだ VM ゲスト に割り当てられているボリュームが存在するプールの場合、 ローカルの ファイルシステムディレクトリやパーティション/ディスクをベースにしたストレージプールを削除しても、ボリュームには影響しません。
iSCSI, SCSI, LVM ボリュームグループ, ネットワーク公開ディレクトリの場合は、プールを削除すると VM ゲスト からもアクセスができなくなります。ボリュームそれ自身は削除されませんが、 VM ホストサーバ からリソースへのアクセスはできなくなります。
iSCSI/SCSI ターゲットやネットワーク公開ディレクトリの場合、新しいプールを作成し直して同じ設定を作成するか、もしくはホストシステム側から対象のリソースを直接マウントすることで、再度アクセスできるようになります。
LVM ボリュームグループベースのストレージプールの場合、 LVM のボリュームグループ設定が削除されることになりますので、ホストシステム内でも LVM ボリュームグループがアクセスできなくなります。この場合は設定の復元は不可能で、プール内のボリュームも恒久的に失われることになります。
仮想マシンマネージャ ではプールの種類がマルチパス, iSCSI, SCSI である場合を除いて、全てのストレージプール内にボリュームを作成することができます。これらのプール内のボリュームは LUN と等価な存在であり、 libvirt
側では変更ができません。
新しいボリュームはストレージマネージャを利用して作成することができるほか、 VM ゲスト に新しいストレージデバイスを追加する際に作成することもできます。いずれの場合であっても、左側のパネルでストレージプールを選択して
を押します。欄にイメージの名前を入力して、イメージの形式を選択します。
SUSE では現在、 raw
および qcow2
のイメージのみをサポート対象としています。また、後者は LVM ボリュームグループベースのプールの場合は選択できません。
次に qcow2
形式を選択していない場合は、 の容量も設定することができます。 で指定した容量は初期の割り当てサイズとなり、 と異なる値を設定すると、スパース形式のファイルが作成され、必要に応じてサイズが拡張されるようになります。
qcow2
形式の場合は、 (「バッキングファイル」 と呼ぶ場合もあります) を使用することもできます。これはイメージのベースとなるファイルを指定するためのもので、新しく作成した qcow2
イメージには、ベースからの変更点のみが記録されるようになります。
ボリュームの作成を開始するには
を押します。ボリュームの削除はストレージマネージャからのみ実施することができます。削除したいボリュームを選択して、
を押します。確認メッセージが表示されたら を押してください。ボリュームは動作中の VM ゲスト から使用されている状況下でも削除することができます。削除したボリュームを復元する手段はありません。
対象のボリュームが VM ゲスト から使用されているかどうかを確認したい場合は、ストレージマネージャ内の
列を確認してください。