yoshida_eth0の日記 このページをアンテナに追加 RSSフィード

2012-01-08

KVMで仮想マシンに物理ハードディスクを直接接続させる

virsh editで<devices>に定義を追加する。

source devは/dev/sdXで指定するとホストマシンの構成が変わった時に変わる可能性があるから、/dev/disk/by-XXXで指定した方がいい。

target devは、ユニークになるように指定。

 

仮想マシンで直接マウント出来るから管理も楽だし速度も速い(多分)。

virtio経由の方が速いのかは不明。

とりあえず、XenServerでは出来なかった事だからKVMで出来てよかった。

 

Sample

    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-id/scsi-SATA_Hitachi_HDS7230_MK0331YHGVRPSA'/>
      <target dev='vdb' bus='virtio'/>
    </disk>

 

KVMホストから見た状態

[root@kvm ~]# parted /dev/sdc print
モデル: ATA Hitachi HDS72303 (scsi)
ディスク /dev/sdc: 3001GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt 

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    1049kB  3001GB  3001GB  ext4              primary

 

KVM仮想マシンから見た状態

[root@nas ~]# parted /dev/vdb print
モデル: Virtio Block Device (virtblk)
ディスク /dev/vdb: 3001GB
セクタサイズ (論理/物理): 512B/512B
パーティションテーブル: gpt 

番号  開始    終了    サイズ  ファイルシステム  名前     フラグ
 1    1049kB  3001GB  3001GB  ext4              primary

 

参考URL

第8章 ストレージの管理

http://opensuse-man-ja.berlios.de/opensuse-html/sec.libvirt.stornet.storage.html

2011-12-18

CentOSにKVMをインストールしてゲストOSをLVMで管理する

HP ProLiant N40L MicroServerに入れる。

 

ホストOSは、CentOS 6.1。

筐体内部にあるUSBポートにUSBメモリを挿して、そこにインストールした。

 

ゲストOSは、LVMで管理する。

 

bridge-utilsインストール

[root@kvm ~]# yum install bridge-utils

 

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
BOOTPROTO="static"
MACADDR="D6:2E:6F:8C:71:C4"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethenet"
BRIDGE=br0

 

/etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
BOOTPROTO="static"
IPADDR=192.168.135.10
NETMASK=255.255.255.0
GATEWAY=192.168.135.1
MACADDR="C2:E2:D5:DC:69:1E"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Bridge"

 

KVMインストール

[root@kvm ~]# yum install qemu-kvm libvirt virt-install

 

ゲストOSイメージ格納用のLVMを作成

[root@kvm ~]# fdisk /dev/sda 
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x436f87cb で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

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

コマンド (m でヘルプ): c
DOS互換フラグは設定されていません

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

ディスク /dev/sda: 250.1 GB, 250059350016 バイト
ヘッド 255, セクタ 63, シリンダ 30401
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x436f87cb

デバイス ブート      始点        終点     ブロック   Id  システム

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

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

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

ディスク /dev/sda: 250.1 GB, 250059350016 バイト
ヘッド 255, セクタ 63, シリンダ 30401
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x436f87cb

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1               1       30401   244195008+  8e  Linux LVM

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

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
[root@kvm ~]# 
[root@kvm ~]# 
[root@kvm ~]# pvcreate /dev/sda1
  Physical volume "/dev/sda1" successfully created
[root@kvm ~]# 
[root@kvm ~]# 
[root@kvm ~]# vgcreate vg_kvm_guest /dev/sda1
  Volume group "vg_kvm_guest" successfully created

 

KVMの設定をブートディスクから切り離す

設定用パーティション作成
[root@kvm ~]# lvcreate -L 1G -n lv_config vg_kvm_guest
  Logical volume "lv_config" created
[root@kvm ~]# 
[root@kvm ~]# 
[root@kvm ~]# mkfs.ext4 /dev/vg_kvm_guest/lv_config
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Writing inode tables: done                            
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

 

設定移動
[root@kvm ~]# mount /dev/vg_kvm_guest/lv_config /mnt/
[root@kvm ~]# cp -rp /etc/libvirt/* /mnt/
[root@kvm ~]# rm -rf /etc/libvirt/*
[root@kvm ~]# umount /mnt/
[root@kvm ~]# mount /dev/vg_kvm_guest/lv_config /etc/libvirt/
[root@kvm ~]# echo '/dev/vg_kvm_guest/lv_config /etc/libvirt            ext4    defaults        1 2' >> /etc/fstab

 

外部からのVNC接続を許可

[root@kvm ~]# echo 'vnc_listen = "0.0.0.0"' >> /etc/libvirt/qemu.conf

 

KVM起動

[root@kvm ~]# service libvirtd start
libvirtd デーモンを起動中:                                 [  OK  ]

 

Pool作成

[root@kvm ~]# virsh pool-define-as default logical - - /dev/sda vg_kvm_guest /dev/vg_kvm_guest
プール default が定義されました

[root@kvm ~]# virsh pool-start default
プール default が起動されました

[root@kvm ~]# virsh pool-autostart default
プール default が自動起動としてマークされました

 

CentOS6インストール

virt-install \
--location http://ftp.riken.jp/Linux/centos/6/os/i386/ \
--extra-args console=ttyS0,115200n8 \
--accelerate \
--name centos6 \
--ram 512 \
--vcpus 1 \
--os-variant rhel6 \
--network bridge:br0 \
--disk pool=default,bus=virtio,size=8,cache=writethrough \
--noreboot \
--keymap=ja

 

DebianSqueezeインストール

virt-install \
--location http://ftp.jp.debian.org/debian/dists/squeeze/main/installer-i386/ \
--extra-args console=ttyS0,115200n8 \
--accelerate \
--name debian_squeeze \
--ram 512 \
--vcpus 1 \
--os-variant debianlenny \
--network bridge:br0 \
--disk pool=default,bus=virtio,size=8,cache=writethrough \
--noreboot \
--keymap=ja

 

XenServerインストール(VNC)

このコマンドでCDからブートは出来る。

でもMicroServerの場合、NICを認識しないからインストール出来ない。

PCIeとかでXenServerが認識出来るNICを追加すれば進めるらしい。

virt-install \
--cdrom /dev/cdrom \
--accelerate \
--name xenserver \
--ram 1024 \
--vcpus 1 \
--os-variant rhel6 \
--network bridge:br0 \
--disk pool=default,bus=virtio,size=8,cache=writethrough \
--noreboot \
--keymap=ja \
--vnc \
--vncport=5901 \
--noautoconsole

 

Citrix Forums : HP ProLiant N36L MicroServer ...

http://forums.citrix.com/thread.jspa?threadID=278765

 

WindowsXPインストール(VNC)

MacからF8を押す場合は、opt + cmd + F8。

virt-install \
--cdrom /dev/cdrom \
--accelerate \
--name WindowsXP \
--ram 512 \
--vcpus 1 \
--os-variant winxp \
--network bridge:br0 \
--disk pool=default,size=10,cache=writethrough \
--noreboot \
--keymap=ja \
--vnc \
--vncport=5901 \
--noautoconsole

 

仮想マシンをインポート

OSインストール済みのディスクをテンプレートとして、ddとかで新しいディスク作ってそれを起動ディスクにする。

virt-install \
--import \
--name Vpn \
--ram 512 \
--vcpus 1 \
--os-variant rhel6 \
--network bridge:br0 \
--disk path=/dev/vg_kvm_guest/Vpn.img,bus=virtio \
--noreboot \
--keymap=ja

 

CentOS6.2にアップデート

CentOSを6.2にアップデートすると、libvirtはlibvirt-0.9.4-23.el6_2.1.x86_64になる。

バージョンが上がって依存が増える。

 

libvirtがハイパーバイザーに接続出来ない
[root@kvm ~]# virsh list
エラー: Failed to reconnect to the hypervisor
エラー: 有効な接続ではありません
エラー: Failed to connect socket to '/var/run/libvirt/libvirt-sock': そのようなファイルやディレクトリはありません
[root@kvm ~]# virsh connect qemu:///system
エラー: ハイパーバイザーへの接続に失敗しました
エラー: Failed to connect socket to '/var/run/libvirt/libvirt-sock': そのようなファイルやディレクトリはありません

 

avahi-daemonを起動させれば接続出来る。

# messagebus起動(avahi-daemonが依存している)
service messagebus start
chkconfig messagebus on

# avahi-daemon起動
yum -y install avahi-daemon
service avahi-daemon start
chkconfig avahi-daemon on

# libvirt起動
service libvirtd start

 

VMの起動に失敗する
[root@kvm ~]# virsh start NAS
エラー: ドメイン NAS の起動に失敗しました
エラー: 内部エラー unable to reserve PCI address 0:0:2.0

 

virsh editで、<devices>内にある全ての<addess>タグを消す。

 

KVM guests failed to start after 6.2 upgrade - Linux Archive

http://www.linux-archive.org/centos/612609-kvm-guests-failed-start-after-6-2-upgrade.html

 

virsh shutdown出来ない / VMを停止させてもvirsh listで起動中のままになる

VMにacpidが入っていない

VMにインストールする。

入れれば起動はしなくていいっぽい。

yum install acpid

 

VM定義でacpiが有効になっていない

virsh edit VMNameをして

<features>

の中に

<acpi/>

を追加。