Linux KVM操作¶
- 目次
- 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
- qemu:///system
- 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