プロジェクト

全般

プロフィール

Linux KVM操作

コマンドライン操作

KVMストレージプールの定義

仮想ゲストのイメージを格納する領域を定義します。KVMホストインストール時点ではストレージプールの定義はありません。仮想ゲストを新規作成するときにデフォルトのプールが定義されます。そのため、そのKVMホスト上で仮想ゲストを作成せず、他の場所からイメージを移してくるときはストレージプールを手動で作成します。

ストレージ・プールの確認

ストレージプールのリストを閲覧します。

# virsh pool-list
名前               状態     自動起動
-----------------------------------------

表示されるものがなければ、プールがデフォルトを含めて存在していません。

# virsh pool-list
名前               状態     自動起動
-----------------------------------------
default              動作中  はい (yes)

デフォルトのプールがある場合の表示結果です。

ディレクトリ・ストレージプールの作成

KVMのイメージをファイル形式で保持する場合は、ディレクトリ・ストレージプールを使います。

# virsh pool-define-as default dir - - - - "/var/lib/libvirt/images" 
プール default が定義されました

# virsh pool-start default
プール default が起動されました

# virsh pool-autostart default
プール default が自動起動としてマークされました

#

/etc/libvirt/storage ディレクトリがなければ生成され、その中に設定ファイルが生成されます。

KVMゲストの破棄

# virsh undefine guest3
# virsh vol-delete /var/lib/libvirt/images/guest3.img
  • virsh vol-deleteは、KVMストレージプールが定義されていないと動作しません

KVMゲスト設定の変更

# virsh edit guest3

デフォルトエディタ(vim等)で設定ファイルが開くので、メモリ、CPU数、ネットワーク設定あたりで必要があれば修正します。

もし、直接/etc/libvirt/qemu/guest3.xml を編集したら、編集結果を保存後次のコマンドを実行します。

# virsh define /etc/libvirt/qemu/guest3.xml

KVMゲストの起動・終了

KVMゲストの稼動状況一覧

  • 稼働中のKVMゲストの一覧
    # virsh list
  • 全てのKVMゲストの稼働状況一覧
    # virsh list --all
  • 非稼動のKVMゲストの一覧
    # virsh list --inactive

KVMゲストの起動

  • KVMゲストの起動
    # virsh start <KVMゲスト名>
  • KVMゲストの起動とコンソールの接続
    # virsh start <KVMゲスト名> --console
    • コンソール接続には、ゲストOS側にシリアル接続設定が必要
  • 起動しているKVMゲストへのコンソール接続
    # virsh console <KVMゲスト名>
    • ゲストOS側からホストOS側にコンソールを切り替える(戻す)には、[Ctrl]+[]]キーを押します。
  • KVMゲストの自動起動設定(ホストマシン起動時に自動起動する)
    virsh autostart <KVMゲスト名>

KVMゲストの終了

  • KVMゲストの停止
    # virsh shutdown <KVMゲスト名>
    • ゲストOS側でacpidが動作している必要あり(Linuxの場合)、Windowsの場合は?
  • KVMゲストの強制停止
    # virsh destroy <KVMゲスト名>
  • KVMゲストの自動起動設定を解除
    virsh autostart --disable <KVMゲスト名>

ホストマシンのシャットダウン時にKVMゲストを自動でシャットダウンする

ホストOSに以下の設定を記述します。

  • /etc/sysconfig/libvirt-guests
    ON_SHUTDOWN = shutdown
    PARALLEL_SHUTDOWN = 4
    SHUTDOWN_TIMEOUT = 60
    

    並行数、タイムアウト数は環境に応じて調整します。

KVMゲストの作成(イメージのコピー)

複製元からコピー

# virt-clone --original centos65minimal --name bravo --file /var/lib/libvirt/images/bravo.img

MACアドレスを指定してクローンすることができます。

# virt-clone --original centos65minimal --name bravo --file /var/lib/libvirt/images/bravo.img \
 --mac 52:54:00:fd:a8:64

KVMゲストの起動とホスト名、ネットワーク設定

起動し、コンソール接続します(複製元のイメージでシリアル接続が設定されていること。CentOS 6でカーネルブートオプションの指定参照)。

# virsh start bravo
# virsh console bravo
  • /etc/udev/rules.d/70-persistent-net.rules の削除(OS再起動で再度生成される)
  • /etc/sysconfig/network の編集(HOSTNAMEにホスト名記述)
  • /etc/sysconfig/network-script/ifcfg-eth0 の編集(ネットワークデバイス名がeth0のとき)
  • acpidのインストール(KVMホストからのシャットダウン操作に必要)

KVMゲストの作成(virt-install)

virt-installコマンドのオプション

virt-installはコマンドラインオプションが豊富でかなり複雑です。

オプション 内容 備考
--connect デフォルト以外のハイパーバイザーへ接続(KVMの場合要指定) --connect qemu:///system
--name 仮想ゲスト実体名を指定 --name foxtrot
--vcpus 仮想CPU数を指定 --vcpus 2
--cpu CPUモデルと機能を指定 --cpu host CPUモデル一覧は、virsh cpu-models x86_64コマンドを実行
--memory メモリ割り当てMB数を指定 --memory 1024
--os-type 仮想化ゲストのOS種類を指定 --os-type linux windows,unix,linux,otherのいずれか
--os-variant OS細部種類を指定 --os-variant rhel6
--hvm 完全仮想化を指定 --hvm
--virt-type 仮想化技術の選択 --virt-type kvm
--network ゲストからホストへのネットワーク接続を指定 --network bridge=br0,model=virtio bridgeかnetworkかuser、およびmodel、macの指定も可能
--graphics ディスプレイ使用時の手段を指定 --graphics vnc,listen=0.0.0.0,port=5902,keymap=ja 省略時はvnc
--keymap VNCコンソールのキーボードレイアウトを指定 --keymap jp106 [*1]
--location ゲストOSインストールイメージ(URL)を指定 --location /var/tmp/CentOS-7-x86_64-DVD-1503-01.iso URLを指定すればネットワークインストール
--disk ゲストのディスクイメージファイルを指定 --disk /var/lib/libvirt/images/foxtrot.img,size=8 指定したサイズのイメージファイルを生成、形式を指定するformatオプションあり(デフォルトはraw)
--noautoconsole ゲスト起動時ホストからゲストにコンソール接続するのを抑制 --noautoconsole
  • connect
    • qemu:///system
      "If running on a bare metal kernel as root" ローカルのKVM
  • disk
    • busは、ide/scsi/usb/virtioから選択
    • cacheは、none/writethrough/writebackから選択
    • ioは、native/threads
  • network
    • 昔はmodelを指定しないとrtl8139が指定されてしまったりするけれど、今はvirtioが指定されるようです。
    • 複数NICを設定するときは、--networkオプションを2つ記述すればよいです。
  • vnc
    • --vnc、--vncport、--vnclistenは非推奨(deprecated)、--graphicsで指定すべき
    • ポート番号を指定しない場合は、仮想マシンの起動順に5900、5901、5902、と割り当てられる
    • [*1] --keymapで指定したキーボードレイアウトがVNC接続で変な場合、--graphicsのオプションでkeymapを指定しておく
  • file
    • --file、--file-size、--nonsparseは非推奨(deprecated)、--diskで指定すべき
  • accelerate
    QEMUゲストインストール時にKVMまたはKQEMUを使用するオプションだが、すでにデフォルトの振る舞いとなってるため非推奨

ネットワークインストール

以下はvirt-installコマンドでCentOS 6のKVMゲストをネットワークインストールしたときの例です。

~$ sudo virt-install --connect qemu:///system --name=centos6tmpl --ram=1024 --vcpus=1 \
 --os-type=linux --os-variant=rhel6 --hvm --virt-type=kvm --network bridge=br0\
 --graphics vnc,port=5902,listen=0.0.0.0,keymap=ja \
 --location='http://ftp.riken.jp/Linux/centos/6/os/x86_64/' \
 --disk /var/lib/libvirt/images/centos6tmpl.img,size=4 --noautoconsole

インストールの開始中...
ファイル vmlinuz を読出中...                     | 8.1 MB     00:00 !!! TA
ファイル initrd.img を読出中...                  |  69 MB     00:05 !!! ETA
割り当て中 'centos6tmpl.img'                        | 4.0 GB     00:00
ドメインを作成中...                              |    0 B     00:00
仮想マシンのインストールが進行中です。インストールが完了するまでコンソールの再接続を待っています。
~$

ここで、別なPCからVNCで接続します。すると、CentOSのインストール画面が表示されます。

Windows Server 2012 R2のインストール

以下はvirt-installコマンドでWindows Server 2012 R2のKVMゲストをインストールしたときの例です。

準備するもの

  • Windows Server 2012 R2のISOイメージファイル(DVDではインストールできませんでした)
    → KVMホストの/tmp/WindowsServer2012R2_Standard_Ja.iso に配置
  • virtioドライバー(なくても動きますが、あると性能が向上します)
    RedHat Enterprise LinuxならRHNよりインストール可能です。CentOS他は、次からISOイメージファイルをダウンロード可能です。
    https://fedoraproject.org/wiki/Windows_Virtio_Drivers
    → KVMホストの/tmp/virtio-win-0.1.102.iso に配置
    • NetKVM: ネットワークドライバ
    • viostor: ブロックドライバ
    • vioscsi: SCSIドライバ
    • viorng: RNGドライバ
    • vioser: シリアルドライバ
    • Balloon: メモリ・バルーン・ドライバ
$ sudo virt-install --connect=qemu:///system --name=winsrv12r2 --ram=2048 --vcpus=2 \
--hvm --os-type=windows --os-variant=win2k8 --hvm \
--disk pool=default,format=raw,sparse=false,bus=virtio,size=32,cache=none,io=native \
--disk path=/tmp/virtio-win-0.1.102.iso,device=cdrom,bus=ide \
--disk path=/tmp/WindowsServer2012R2_Standard_Ja.iso,device=cdrom,bus=ide \
--graphics vnc,port=5902,listen=0.0.0.0,keymap=ja \
--network=bridge:br0 \
--noautoconsole

インストールの開始中...
割り当て中 'tridente.img'                           |  32 GB     00:00
ドメインを作成中...                              |    0 B     00:00
仮想マシンのインストールが進行中です。インストールが完了するまで  待機します。
  • virtioドライバはWindows OSのインストールメディアには含まれていないので、別途isoをCDROMマウントします。
    • --cdromオプションは2つ指定できないので、--diskオプションでdevice=cdromを付けてisoを複数マウントします。
  • イメージファイルは事前に作成して--disk path=で指定する方法もありますが、今回はpool他を指定しインストール時に作成します。
    • formatを指定しないと、qcow2形式になりました
  • グラフィックスインストールが必須なので、VNCを設定しています。上述コマンドを実行後、VNCクライアントを起動します。
    別なマシンからVNC接続するときは、ファイアウォール設定を行います。次は一時的な設定です。
    $ sudo firewall-cmd --add-service=vnc-server
  • ネットワークはデフォルトに任せたところ、RTL8139となってしまいました。
    • 一度Windows Serverゲストを停止し、virsh editでinterfaceのmodelをrtl8139からvirtioに修正し再起動、マウントしているvirtio-winの中にあるNetKVM\2k12R2\amd64\netkvm.infを右クリックしインストール(Red Hat VirtIO Ethernet Adapter)します。インストール直後、ネットワークが使えるようになりました。

Windows Server 2012 R2のインストールについて

  • [今すぐインストール]をクリック
  • プロダクトキーを入力して[次へ]
  • インストールするオペレーティングシステムに[Windows Server 2012 R2 Standard(GUI使用サーバー)]を選択して[次へ]
  • ライセンス条項に[同意します]にチェックを付けて[次へ]
  • [カスタム:Windowsのみをインストールする(詳細設定)]を選択
  • この時点では、virtioバスのイメージ(仮想ハードディスク)は見えないので、[ドライバーの読み込み]をクリック、[参照]をクリックし、CDドライブ virtio-win-0.1.1をドリルダウンして、[viostor] > [2k12R2] > [amd64]を選択状態にして[OK]
    → Red Hat VirtIO SCSI controller(E:\viostor\2k12R2\amd64\viostor.inf) を選択状態にして[次へ]
  • virtioバスのイメージ(仮想ハードディスク)が見える([ドライブ0の割り当てられていない領域])ので、これを選択状態にして[次へ]
  • ユーザーAdministratoのパスワードを入力します(英大文字、英小文字、数字がそれぞれ1つ以上で8文字以上)
  • 「もう少しで完了します」が延々と続いた後に・・・、ログイン画面が表示されます。サインインのCtrl + Alt + Del は、VNCのツールバー左端のアイコンで送信できます。

KVMネットワーク設定

ブリッジ設定

  • 2つのNICを持ち、それぞれブリッジデバイスbr0、br1を設定、4つのゲストを起動しているときのブリッジ設定
    $ brctl show
    bridge name     bridge id               STP enabled     interfaces
    br0             8000.6805ca185cdf       no              eth0
                                                            vnet0
                                                            vnet1
                                                            vnet2
                                                            vnet3
    br1             8000.08606ef13196       no              eth1
    virbr0          8000.52540052171a       yes             virbr0-nic
    $
    

ブリッジ転送設定

libvirtがIPv4転送設定を有効にしています。

$ cat /etc/sysctl.conf | grep ipv4.ip_forward
net.ipv4.ip_forward = 1

$ cat /etc/sysctl.conf|grep net.bridge
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
$ sudo iptables -L FORWARD
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             192.168.122.0/24    state RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere            reject-with icmp-port-unreachable

virbr0を削除

KVMはデフォルトでネットワーク設定virbr0を作成し稼動させます。

~$ sudo virsh net-list --all
名前               状態     自動起動  永続
--------------------------------------------------
default              動作中  はい (yes)  はい (yes)

このネットワーク"default"の設定は、/etc/libvirt/qemu/networks/default.xml に記述されています。
<network>
  <name>default</name>
  <uuid>3aaa67f8-63e2-4c87-ac6d-446869d77550</uuid>
  <bridge name="virbr0" />
  <mac address='52:54:00:52:17:1A'/>
  <forward/>
  <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>

virbr0は、KVMゲストをNATで動かすときに使用されます。ゲストをbridgeで外部に接続するなら不要です。
次に削除する手順を示します。

~$ sudo virsh net-destroy default
~$ sudo virsh net-autostart default --disable

イメージファイルの操作

イメージファイルのサイズ拡大

仮想イメージファイルのサイズを大きくし、仮想ゲストのディスク容量を増加させます。

仮想ゲストをシャットダウンしてから次を実行します。以下は8GBのイメージファイルを56GB増加させ64GBにする例です。

~$ sudo qemu-img resize /var/lib/libvirt/images/arvigo.img +56G
Image resized.

仮想ゲストを起動してディスクパーティションを調べます。

~$ sudo fdisk -l

ディスク /dev/vda: 68.7 GB, 68719476736 バイト
ヘッド 16, セクタ 63, シリンダ 133152
Units = シリンダ数 of 1008 * 512 = 516096 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000c9a28

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *           3         612      307200   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2             612        2693     1048576   82  Linux スワップ / Solaris
パーティション 2 は、シリンダ境界で終わっていません。
/dev/vda3            2693       16645     7031808   83  Linux
パーティション 3 は、シリンダ境界で終わっていません。

/dev/vdaがディスクとなります。シリンダ数は133152ありますが、パーティション3のシリンダは16645で終わっています。これは拡張前の値です。そこで、パーティション3の終点を最大シリンダに変更します。

~$ sudo fdisk /dev/vda
警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): u
セクタ数 の表示/項目ユニットを変更します

コマンド (m でヘルプ): p

ディスク /dev/vda: 68.7 GB, 68719476736 バイト
ヘッド 16, セクタ 63, シリンダ 133152, 合計 134217728 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000c9a28

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048      616447      307200   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2          616448     2713599     1048576   82  Linux スワップ / Solaris
パーティション 2 は、シリンダ境界で終わっていません。
/dev/vda3         2713600    16777215     7031808   83  Linux
パーティション 3 は、シリンダ境界で終わっていません。

コマンド (m でヘルプ): d
パーティション番号 (1-4): 3

コマンド (m でヘルプ): p

ディスク /dev/vda: 68.7 GB, 68719476736 バイト
ヘッド 16, セクタ 63, シリンダ 133152, 合計 134217728 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000c9a28

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048      616447      307200   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2          616448     2713599     1048576   82  Linux スワップ / Solaris
パーティション 2 は、シリンダ境界で終わっていません。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 3
最初 セクタ (63-134217727, 初期値 63): 2713600
Last セクタ, +セクタ数 or +size{K,M,G} (2713600-134217727, 初期値 134217727):
初期値 134217727 を使います

コマンド (m でヘルプ): p

ディスク /dev/vda: 68.7 GB, 68719476736 バイト
ヘッド 16, セクタ 63, シリンダ 133152, 合計 134217728 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x000c9a28

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/vda1   *        2048      616447      307200   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/vda2          616448     2713599     1048576   82  Linux スワップ / Solaris
パーティション 2 は、シリンダ境界で終わっていません。
/dev/vda3         2713600   134217727    65752064   83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

警告: パーティションテーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。新しいテーブルは
次回リブート時か、partprobe(8)またはkpartx(8)を実行した後に
使えるようになるでしょう
ディスクを同期しています。

~$ sudo resize2fs /dev/vda3
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vda3 is mounted on /; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 4
Performing an on-line resize of /dev/vda3 to 16438016 (4k) blocks.
The filesystem on /dev/vda3 is now 16438016 blocks long.

~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3        62G  779M   58G   2% /
tmpfs           499M     0  499M   0% /dev/shm
/dev/vda1       283M   45M  223M  17% /boot

クリップボードから画像を追加 (サイズの上限: 1 GB)