Archive for the ‘oraclevm’ tag
Oracle VMをCisco UCS + Palo(M81KR)で検証しました
8/6のOracle VM Forumで発表させていただきましたが、Oracle VMとCisco UCSを組み合わせて検証しました。検証の焦点はCisco UCSに装着したCNA, 「Palo」ことM81KRを認識できるかということと、その性能です。
M81KRはmezzanine cardですが一枚のM81KRで最大128個の仮想NICを作成できるところがポイントです。さらにOS側には特段SR-IOV対応等は必要ありません。OSはM81KRで作成された仮想NICを普通のPCIデバイスとして認識します。
Cisco UCS M81KR 仮想インターフェイス カード
結論から言うとまず認識に関してはまったく問題ありませんでした。
Oracle VM Serverでlspciコマンドを実行し、認識しているPCIデバイスを確認するとM81KRで作成した仮想NICは下記のように表示されます。
[root@vmserver]# lspci 0c:00.0 Ethernet controller: Cisco Systems Inc 10G Ethernet NIC (rev a2) 0d:00.0 Ethernet controller: Cisco Systems Inc 10G Ethernet NIC (rev a2) 0e:00.0 Ethernet controller: Cisco Systems Inc 10G Ethernet NIC (rev a2) 0f:00.0 Ethernet controller: Cisco Systems Inc 10G Ethernet NIC (rev a2) 10:00.0 Ethernet controller: Cisco Systems Inc 10G Ethernet NIC (rev a2)
lspciの出力は、デバイスから得られるPCI IDと、/usr/share/hwdata/pci.idsに格納されているPCI IDを照合してデバイス名を表示しています。したがってlspciでデバイス名が得られたからといってドライバがこのデバイスを認識しているかどうか(つまりNICとして使用可能な状態かどうか)は別問題です。
M81KRが作成する仮想NICを利用するにはenicというドライバが必要になります。これはまだ多くのLinuxディストリビューションには含まれていないため、別途Ciscoさんのサイトからダウンロードしてインストールする必要があります。RHEL5.x, OEL5.xであればRPMが用意されています。しかし今回僕も初めて気がつきましたが、Oracle VM Server 2.2.1はこのenicドライバを標準でインストールしてあります。なのでM81KRで作成した仮想NICはOracle VM Serverからは別途ドライバをインストールせずともNICとして正しく認識され、ethX, xenbrXが自動的に作成されます。
一方、この仮想NICを有効活用するにはPCI Passthroughが効果的でしょう。その場合はこのデバイスに対するドライバが必要となるのはゲストOS(仮想マシン)の方です。Passthrough設定を行うとVM Server(つまりdom0)からはそのNICは見えなくなります(ただし依然としてlspciの出力には現れます)。したがってPassthroughした先のゲストOSでこのNICを利用するにはゲストOS側にenicドライバをインストールする必要があります。
RHEL5.x, OEL5.xではenicドライバはバンドルされていませんが、RHEL6.x, OEL6.xでは標準でバンドルされるようです。
2010年8月時点ではOracle VM ServerでのPCI Passthroughは公式サポートされていません。チャレンジャーな方は下記に手順を紹介しますのでトライしてみてください。
Oracle VM Serverで上記の仮想NICをPassthroughするにはまずUCSの該当ブレードでVT-d(I/O Virtualization)がEnabledとなっていることを確認します。
次にOracle VM Serverのgrub.confを編集してI/O Virtualizationを有効にしてOSを再起動します。
title Oracle VM Server-ovs (xen-64-3.4.0 2.6.18-128.2.1.4.25.el5ovs)
root (hd0,0)
kernel /xen-64bit.gz dom0_mem=547M iommu=pv
module /vmlinuz-2.6.18-128.2.1.4.25.el5xen ro root=UUID=f1b13de3-adb2-4b5a-a6e9-a8beda1b4f73
module /initrd-2.6.18-128.2.1.4.25.el5xen.img
OSが起動したら下記のコマンドでI/O Virtualizationが有効化されていることを確認します。
[root@vmserver]# xm dmesg | grep 'I/O virtualisation' (XEN) I/O virtualisation enabled (XEN) I/O virtualisation for PV guests enabled
次にmodprobe.confに下記の記述を追加し、再起動を行います。これはdom0からPCIデバイスを隠蔽するための設定です。(0000:0c:00.0はdom0用に残しておきます)
install enic /sbin/modprobe pciback ; /sbin/modprobe --first-time --ignore-install enic options pciback hide=(0000:0d:00.0)(0000:0e:00.0)(0000:0f:00.0)(0000:10:00.0)
ifconfig -a等でインターフェースを確認してみるとと、先ほどまでこれらの仮想NICにひもづいて作成されていたethXやxenbrXがなくなるはずです。
その代わりにPCIデバイスはPassthrough用にプールされています。xmコマンドで確認可能です。
[root@vmserver]# xm pci-list-assignable-device 0000:0d:00.0 0000:0e:00.0 0000:0f:00.0 0000:10:00.0
ここにリストされているPCIデバイスはゲストOSにPassthrough可能になっています。仮想マシンの設定ファイルを編集してPCIデバイスを割り当てます。ここではPVHVMを使用しています。
単なるHVMでももちろん可能ですが、PVMの場合はPVMのgrub.confにも少し設定が必要です。
ネットワークの内部構成は下図のようになります。
.png)
[root@vmserver]# vi /OVS/running_pool/oel55-phvm-01/vm.cfg
acpi = 1
apic = 1
builder = 'hvm'
device_model = '/usr/lib/xen/bin/qemu-dm'
disk = ['file:/OVS/running_pool/oel55-phvm-01/System.img,hda,w']
kernel = '/usr/lib/xen/boot/hvmloader'
keymap = 'en-us'
memory = 1000
name = 'oel55-phvm-01'
on_crash = 'restart'
on_reboot = 'restart'
pae = 1
serial = 'pty'
timer_mode = '2'
uuid = '313105b6-15ac-d7ea-de41-0ef0a90d302a'
vcpus = 4
vif = ['bridge=xenbr0,mac=00:16:3E:42:C7:A9,type=netfront'] #これはPVドライバを利用したインターフェース
vif_other_config = []
pci = ['0000:0d:00.0'] #PCI Passthroughの設定
vnc = 1
vncconsole = 1
vnclisten = '0.0.0.0'
vncpasswd = ''
vncunused = 1
これでゲストOSを起動します。まだゲストOSにenicドライバをインストールしていない場合はインストールします。
ドライバ:http://tools.cisco.com/support/downloads/go/ImageList.x?relVer=1.3%281e%29&mdfid=283004074&sftType=Unified+Computing+System+%28UCS%29+Tools+and+Drivers+Bundle&optPlat=Linux&nodecount=2&edesignator=null&modelName=Cisco+UCS+B200+M2+Blade+Server&treeMdfId=282558030&treeName=Unified+Computing&modifmdfid=&imname=&hybrid=Y&imst=N&lr=Y
*アカウントが必要です
[root@guest]# rpm -ivh kmod-enic-1.3.1c-rhel5u5.x86_64.rpm
そしてlspciコマンドで仮想NICをPCIデバイスとして認識できているか確認します。
[root@guest]# lspci | grep Cisco 00:03.0 Ethernet controller: Cisco Systems Inc VIC Ethernet NIC (rev a2)
ドライバをロードしてネットワークインターフェースが認識されることを確認します。
[root@guest]# ls /sys/class/net
eth0 lo sit0
[root@guest]# modprobe enic
[root@guest]# ls /sys/class/net
eth0 eth1 lo sit0
あとはいつも通りネットワークインターフェースを設定するだけです。
性能値についてはOracle社のポリシー上公開できないのですが、かなりの値が期待できると思っていただいて間違いないでしょう。また、スピードが速い、というだけでなくdom0へのCPUインパクトが激減(というかほぼゼロ)になるのが素晴らしいところです。
ubuntu-10.04をXenのPVMとして作成する方法
先日公開されたubuntu-10.04 LTSはkernel-2.6.32を採用しており、かつ、pvopsが有効となっています。pvopsが有効になっているLinuxカーネルは同一のカーネルでベアメタル上、HVMとして、またPVMとして稼動することができます。なので今回はまずHVMとしてubuntuを作成し、それをPVMとして起動し直すという手法で進めてみます。環境は下記の通り。
- Xen : Oracle VM Server 2.2.1 (Xen 3.4.0)
- domU : ubuntu-10.04 x86_64
最初にubuntuをHVMとして作成します。これはubuntuのインストレーションISOファイルを使ってOracle VM Managerから作成できます。下図のような感じ。新しい紫のテーマが美しい。
ここはごく一般的な手順なので割愛します。
インストールが終わって再起動が完了したらネットワークまわりをセットアップしてdom0と通信できるようにします。疎通できるようななったら、ubuntuのカーネルとramdiskをdom0に転送します。
[root@ubuntu1004]# scp /boot/vmlinuz-2.6.32-21-generic dom0:/OVS/running_pool/ubuntu1004/ [root@ubuntu1004]# scp /boot/initrd.img-2.6.32-21-generic dom0:/OVS/running_pool/ubuntu1004/
転送が完了したら一旦ubuntuをシャットダウンします。そしてdom0側で仮想マシン定義ファイルをいじります。
[root@vmservero]# vi /OVS/running_pool/ubuntu1004/vm.cfg
*修正後 kernel = 'vmlinuz-2.6.32-21-generic' ramdisk = 'initrd.img-2.6.32-21-generic' root = '/dev/xvda1 ro' disk = [ 'file:/var/ovs/mount/4ED5C364C05246FE8AEE8C0E26D79ACF/running_pool/ubuntu1004/System.img,xvda,w', ] keymap = 'en-us' memory = '1024' name = 'ubuntu1004' on_crash = 'restart' on_reboot = 'restart' uuid = '6fc94c0b-d902-476c-4c8b-0dfd3dadb315' vcpus = 4 vif = [ 'type=netfront, mac=00:16:3E:14:73:5A, bridge=xenbr0', 'type=netfront, mac=00:16:3E:16:E5:F2, bridge=xenbr1', ] vfb = [ 'type=vnc,vncunused=1,vnclisten=0.0.0.0,vncpasswd=' ]
*修正前 acpi = 1 apic = 1 builder = 'hvm' device_model = '/usr/lib/xen/bin/qemu-dm' disk = ['file:/var/ovs/mount/4ED5C364C05246FE8AEE8C0E26D79ACF/running_pool/ubuntu1004/System.img,hda,w', ] kernel = '/usr/lib/xen/boot/hvmloader' keymap = 'en-us' memory = '1024' name = 'ubuntu1004' on_crash = 'restart' on_reboot = 'restart' pae = 1 serial = 'pty' timer_mode = 0 uuid = '6fc94c0b-d902-476c-4c8b-0dfd3dadb315' vcpus = 4 vif = ['type=ioemu, mac=00:16:3E:14:73:5A, bridge=xenbr0', 'type=ioemu, mac=00:16:3E:16:E5:F2, bridge=xenbr1', ] vnc = 1 vncconsole = 1 vnclisten = '0.0.0.0' vncpasswd = '' vncunused = 1
そして仮想マシン(ubuntu)を起動します。起動後、lsmodコマンドでPVM特有のカーネルモジュールがロードされていることを確認します。
[root@ubuntu1004]# lsmod Module Size Used by binfmt_misc 7960 1 ppdev 6375 0 joydev 11072 0 fbcon 39270 71 tileblit 2487 1 fbcon font 8053 1 fbcon bitblit 5811 1 fbcon xen_kbdfront 4249 0 softcursor 1565 1 bitblit xen_fbfront 7225 2 fb_sys_fops 1611 1 xen_fbfront sysimgblt 2547 1 xen_fbfront sysfillrect 3949 1 xen_fbfront xen_netfront 17890 0 syscopyarea 3640 1 xen_fbfront lp 9336 0 parport 37160 2 ppdev,lp xen_blkfront 10697 3
逆に8139cpや8139tooといった物理NIC用のドライバはロードされていないことが確認できます。
例えば修正前の仮想マシン定義ファイルをhvm.cfg, 修正後をpvm.cfgとして保存しておけば起動するときにHVMとして起動するかPVMとして起動するか切り替えることが可能になります。仮想マシンそのものは同じもので。pvops、素敵ですね。
VT-dを使ってXenでPCI-Passthroughを設定する手順
システム環境
- CPU: Intel Core-i7 860
- チップセット: Intel P55 Express
- マザーボード: MSI P55M-SD40
- Xen: 3.4.0
- dom0: Oracle VM Server (Oracle Enterprise Linux 5.3ベース)
- Passthrough対象のdomU: OpenSolaris b134 PVHVM
Xenは既にインストールされているという前提で始めます。/etc/grub.confのkernel行に「iommu=pv」と追記してI/O Virtualizationを有効化します。*これはBIOSでの有効とは異なります。BIOSでI/O Virtualizationを有効にした上でこの設定を行います。参考までにgrub.conf全体を。
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle VM server (2.6.18-128.2.1.4.25.el5xen)
root (hd0,0)
kernel /xen-64bit.gz dom0_mem=564M iommu=pv
module /vmlinuz-2.6.18-128.2.1.4.25.el5xen ro root=UUID=d060bc44-d5d2-49ec-8312-222c761a3746
module /initrd-2.6.18-128.2.1.4.25.el5xen.img
*より一般的にはiommu=1と設定しますが、これではPVM(準仮想化マシン)に対してのPassthroughが有効にならないのでiommu=pvとしています。iommu=pvとすればHVM, PVM双方でPassthroughが有効になります。
ここで一度OSを再起動します。再起動後、xm dmesgコマンドを発行してI/O Virtualizationが有効になったことを確認します。
[root@vmserver]# xm dmesg | grep "I/O virtualisation" (XEN) I/O virtualisation enabled (XEN) I/O virtualisation for PV guests enabled
*ちなみにgrepする場合はvirtualizationではなく上記のようにvirtualisationで引っ掛けてください。
次にdomUにPassthroughしたいPCIデバイスをdom0から隠します。作業の流れとしては、まず対象となるPCIデバイスのBDFを求めます(BDFについて詳しくはこちら)。次にPCIデバイスをdom0から隠すためのカーネルモジュール「pciback」をロードします。そしてsysファイルシステムを使うか、modprobe.confに適当な記述を行うことでPCIデバイスをdom0から隠しdomUにPassthrough可能な状態にします。
BDFはlspciコマンドでPCIデバイスの一覧を表示させ、それっぽいモノを判別します。
[root@vmserver]# lspci
00:00.0 Host bridge: Intel Corporation Clarksfield/Lynnfield DMI (rev 11)
00:03.0 PCI bridge: Intel Corporation Clarksfield/Lynnfield PCI Express Root Port 1 (rev 11)
00:08.0 System peripheral: Intel Corporation Clarksfield/Lynnfield System Management Registers (rev 11)
00:08.1 System peripheral: Intel Corporation Clarksfield/Lynnfield Semaphore and Scratchpad Registers (rev 11)
00:08.2 System peripheral: Intel Corporation Clarksfield/Lynnfield System Control and Status Registers (rev 11)
00:08.3 System peripheral: Intel Corporation Clarksfield/Lynnfield Miscellaneous Registers (rev 11)
00:10.0 System peripheral: Intel Corporation QPI Link (rev 11)
00:10.1 System peripheral: Intel Corporation QPI Routing and Protocol Registers (rev 11)
00:1a.0 USB Controller: Intel Corporation Ibex Peak USB2 Enhanced Host Controller (rev 05)
00:1b.0 Audio device: Intel Corporation Ibex Peak High Definition Audio (rev 05)
00:1c.0 PCI bridge: Intel Corporation Ibex Peak PCI Express Root Port 1 (rev 05)
00:1c.4 PCI bridge: Intel Corporation Ibex Peak PCI Express Root Port 5 (rev 05)
00:1c.5 PCI bridge: Intel Corporation Ibex Peak PCI Express Root Port 6 (rev 05)
00:1d.0 USB Controller: Intel Corporation Ibex Peak USB2 Enhanced Host Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation Ibex Peak LPC Interface Controller (rev 05)
00:1f.2 IDE interface: Intel Corporation Ibex Peak 4 port SATA IDE Controller (rev 05)
00:1f.3 SMBus: Intel Corporation Ibex Peak SMBus Controller (rev 05)
00:1f.5 IDE interface: Intel Corporation Ibex Peak 2 port SATA IDE Controller (rev 05)
01:00.0 VGA compatible controller: nVidia Corporation Unknown device 0a65 (rev a2)
01:00.1 Audio device: nVidia Corporation Unknown device 0be3 (rev a1)
03:00.0 SATA controller: 1b4b:9123 (rev 11)
04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 03)
手元の環境では増設したSATAコントローラ(赤字)がPassthroughしたいPCIデバイスです。したがって対象のBDFは03:00.0です。が、実際にはこの番号の頭に0000:をくっつけて、『0000:03:00.0」が正式なBDFで、この後もこちらの正式なBDFを使用します。
*ちなみに00:1f.0, 00:1f.2, 00:1f.3, 00:1f.5のように下一桁だけが異なるものはマルチファンクションのPCIデバイスです。この例ではこのPCIデバイスはオンボードのSATAコントローラ・ブリッジで、6ポートのSATAポートを装備しています。そしてこの内4ポートが00:1f.2に属しており、2ポートが00:1f.5に属しています。一度00:1f.2にSSDを一枚差し、00:1f.5にSSDを一枚差して後者だけをdomUにPassthroughできるか試してみましたが、結果はNGでした。Xen 3.4.0とXen 4.0.0両方でトライしましたが、前者は一見うまくいったように見えるのですがその内I/Oエラーやファイルシステムのジャーナルエラーが報告され、domo, domUともフリーズしました。後者は割り当てた瞬間にフリーズが発生しました。DMAのマップがめちゃくちゃになってそうな雰囲気です。
次にpcibackのロードですが、Oracle VM Serverのdom0カーネルでは(恐らく多くの他の環境でも)、pcibackはカーネルに組み込まれてビルドされておらずモジュールとしてビルドされています。この状態ではpcibackはオンラインでmodprobeコマンドによってロードできますが、逆にブート時にカーネルパラメータを渡すことでロードすることはできません。自動的にロードさせたい場合はブートのもう少し後の段階でロードします。具体的にはrc.localかmodprobe.confを少々編集します。今回はrc.localに記載する手順で話を進めます。そしてロードに続けてPCIデバイスをdom0から隠しPassthrough可能にする設定を行います。これらをまとめてrc.localに下記のように記述します。
BDF=0000:03:00.0
# Load pciback
modprobe pciback
# Unbind a PCI function from its driver as necessary
[ ! -e /sys/bus/pci/devices/$BDF/driver/unbind ] || \
echo -n $BDF > /sys/bus/pci/devices/$BDF/driver/unbind
# Add a new slot to the PCI Backend's list
echo -n $BDF > /sys/bus/pci/drivers/pciback/new_slot
# Now that the backend is watching for the slot, bind to it
echo -n $BDF > /sys/bus/pci/drivers/pciback/bind
*pcibackはpvops採用のdom0カーネルではxen-pcibackと名前が変更されています。
*環境によってはPCIデバイスをunbindした瞬間にOSがクラッシュするかもしれません。僕はahciドライバで認識しているデバイスをunbindしたときにこのクラッシュに遭遇しました。これを回避するためにはrc.localではなくmodprobe.confを利用する設定方法が有効でした。ahci等のドライバがデバイスを認識する前にpcibackをロードして該当デバイスを隠蔽することによって回避することができました。詳しくはこちらの2.の手法を参照してください。skgeは手元の環境に合わせて変える必要があります。
設定がうまくいっていれば、xm pci-list-assignable-deviceで確認できます。
[root@vmserver]# xm pci-list-assignable-device 0000:03:00.0
この出力が確認できれば対象のPCIデバイスはPassthroughされる準備が整っています。あとはdomUの設定ファイルにてpci = [ '0000:03:00.0' ]の記述を入れてdomUを起動すればPassthroughが実現できます。参考までに手元のOpenSolaris b134のPVHVMの設定ファイルを掲載しておきます。
acpi = 1
apic = 1
builder = 'hvm'
device_model = '/usr/lib/xen/bin/qemu-dm'
disk = ['file:/var/ovs/mount/4ED5C364C05246FE8AEE8C0E26D79ACF/running_pool/nas/System.img,hda,w',
',hdc:cdrom,r',
]
kernel = '/usr/lib/xen/boot/hvmloader'
keymap = 'en-us'
memory = '1024'
name = 'nas'
on_crash = 'restart'
on_reboot = 'restart'
pae = 1
pci = ['0000:03:00.0']
serial = 'pty'
timer_mode = '0'
uuid = '42d9bfd3-dd90-4b54-a8a0-af90bcc53028'
vcpus = 4
vif = ['bridge=xenbr0,mac=00:16:3E:15:01:3E,type=netfront']
vif_other_config = []
vnc = 1
vncconsole = 1
vnclisten = '0.0.0.0'
vncpasswd = 'secret'
vncunused = 1
正直PCI-Passthroughの設定はなかなかクセがあり、苦労しました。動いたように見えて半日くらいしてからI/Oエラーがでたり、サーバ全体がクラッシュしたり、デバイスによっては隠蔽設定はうまくいくもののxm pci-list-assignable-deviceには表示されなかったり、Xenのバージョンによってかなり挙動が違ったり。下記にPCI-Passthroughにおける教訓を掲載しておきます 。
- マルチファンクションデバイスの一部だけPassthroughしようとしない。Passthroughするときは丸ごと。
- Linuxで確実に動作する鉄板のPCIデバイスを使う。
- Xenは出来る限り新しいバージョンを使う。
- 動いたと思っても油断しない。最低1日はヒートランすべき。
*今回検証した機材の他に、下記の組み合わせでも動作を確認しています。ご参考まで。
- CPU: Intel Core-i7 860
- チップセット: Intel H55 Express
- マザーボード: Intel DH55TC
- Xen: 4.0.0
- dom0: Fedora12 kernel 2.6.32
- Passthrough対象のdomU: OpenSolaris b134 PVHVM
OpenSolaris b133をOracle VM上でPVMとして作成する
OpenSolaris b133をPVM(準仮想マシン)64bitとしてOracle VM上にクリーンインストールする方法を紹介します。
リファレンス:Starting At The C
*最初にお断りしておきますがソコソコ面倒です。
まずはOpenSolaris b133のisoをダウンロードし、VM Serverの/OVS/iso_poolあたりに置いておきます。
[root@vmserver]# cd /OVS/iso_pool
[root@vmserver]# wget http://www.genunix.org/dist/indiana/osol-dev-133-x86.iso
まずVM ServerでこのVMを格納するためのディレクトリを任意の名前で作成しそのディレクトリに移動します。ここではosolとしています。
[root@vmserver]# mkdir /OVS/running_pool/osol [root@vmserver]# cd /OVS/running_pool/osol
次に仮想ハードディスクをファイルで作成します。Sparse形式で良いでしょう。ここでは推奨値の10GBにしています。(実際は9.8GBくらいになりちょっと足りないのでインストール時に警告がでる。が、無視。)
[root@vmserver]# dd if=/dev/zero of=system.img bs=1M count=1 seek=10000
VMの設定ファイルを作成します。この設定ファイルはインストール用で、インストール後には新しく作り直します。
[root@vmserver]# vi vm_install.cfg bootloader = '/usr/bin/pygrub' bootargs = '--kernel=/platform/i86xpv/kernel/amd64/unix --ramdisk=/platform/i86pc/amd64/boot_archive' name = 'osol' memory = 1024 on_reboot = destroy vif = [ 'type=netfront,bridge=xenbr0,mac=00:16:3e:00:00:52', ] disk = [ 'file:/OVS/iso_pool/osol-dev-133-x86.iso,xvdc:cdrom,r', 'file:/OVS/running_pool/osol/system.img,xvda,w', ]
VMを起動し、コンソールに接続します。
[root@vmserver]# xm create -c vm_install.cfg
言語とキーボード配列を選び、username:jack, password:jackでログインします。
DHCPサーバが動いている環境であればそのうちIPが割り当てられるのでしばらく待ってからifconfig等でIPを確認します。DHCPがない場合は自分で静的IPを割り当てます。IPが設定されたらコンソールを抜け、VNCのポート番号とパスワードを確認します。これは自動的に設定されているものです。
まずxm listコマンドでVMのdomain IDを確認し、次にxenstore-readコマンドでVNCの情報を取得します。
[root@vmserver]# xm list osol Name ID Mem VCPUs State Time(s) osol 15 1024 1 -b---- 32.3 [root@vmserver]# xenstore-read /local/domain/15/guest/vnc/port 5900 [root@vmserver]# xenstore-read /local/domain/15/guest/vnc/password bxukNvkb
ここまでで得たVMのIPアドレス、VNC Port番号、VNCパスワードをもって任意のVNCクライアントから接続します。すると通常OpenSolarisのインストールCDから起動したときと同じ画面にログインできます。画面左のショートカットから通常通りインストールウィザードを起動してインストールを進めてます。そして注意しなければいけないのは、インストールが「Finished」となってもすぐにRebootをしないことです。リブートの前にOpenSolaris上でターミナルを開いて以下の作業を行います。
[jack@osol]$ vi update-dom0.sh #/bin/bash dom0=$1 dompath=$2 unixfile=/platform/i86xpv/kernel/amd64/unix root=`pfexec beadm list -H | grep ';N*R;' | cut -d \; -f 1` mkdir /tmp/root pfexec beadm mount $root /tmp/root 2>/dev/null mount=`pfexec beadm list -H $root | cut -d \; -f 4` pfexec bootadm update-archive -R $mount scp $mount/$unixfile root@$dom0:$dompath/kernel.$root scp $mount/platform/i86pc/amd64/boot_archive root@$dom0:$dompath/ramdisk.$root pfexec beadm umount $root 2>/dev/null echo "Kernel and ramdisk for $root copied to $dom0:$dompath" echo "Kernel cmdline should be:" echo "$unixfile -B zfs-bootfs=rpool/ROOT/$root,bootpath=/xpvd/xdf@51712:a" [jack@osol]$ chmod 755 update-dom0.sh [jack@osol]$ ./update-dom0.sh vmserver1 /OVS/running_pool/osol (dom0のパスワードを訊かれるので入力する)
これが完了したらRebootボタンを押してリブートしてください。ただし実際にはリブートではなくシャットダウンされます。シャットダウンされたらvm.cfgを作成・編集します。
[root@vmserver]# vi vm.cfg name='osol' kernel='/OVS/running_pool/osol/kernel.opensolaris' ramdisk='/OVS/running_pool/osol/ramdisk.opensolaris' extra='/platform/i86xpv/kernel/amd64/unix -B zfs-bootfs="rpool/ROOT/opensolaris",bootpath="/xpvd/xdf@51712:a"' memory=1024 vif= [ 'type=netfront,bridge=xenbr0,mac=00:16:3e:00:00:52', ] disk= [ 'file:/OVS/running_pool/osol/system.img,xvda,w', ]
これでインストールは完了です。vm_install.cfgは削除してしまって構いません。新しく作成した設定ファイルで起動してみてください。
[root@vmserver]# xm create -c vm.cfg
GUIにログインしたい場合は以下のようにVM上でVNC Serverを起動してから任意のVNCクライアントで接続すればOKです。適切なIPアドレス設定を忘れずに。
[nkjm@osol]$ vncserver
XXXよりOracle VMが優れているところはどこですか?
XXXには各種仮想化ソフトウェアが入ると思って下さい。
お客様からOracle VMの説明の依頼をいただいたときに、ほぼ必ず訊かれるのがこの質問です。この質問にそのままご回答するのはあまり本意ではないのですが、今だと大体このようにお答えします。
- 最新のXenをEnjoyしたいのであれば、Oracle VMが最適では。Xen 3.4採用でインストールも1CDから10分で完了。Xenの何がいいの?といわれたら、性能と実績。Xenは仮想マシンの性能を劇的に改善したHypervisor型、準仮想化モードのパイオニア。これから主流になりそうな最新のCPU仮想化機構にももちろん対応。性能には定評があり、多くの主要クラウドサービスで採用されている仮想化エンジン。また、今年リリースが見込まれるXen 4.0ではソフトウェアでFT機構を提供するRemusやPage Sharingといった先進機能満載。最近いろいろ仮想化ソフトありますが、Xenってやっぱり最高だと思う。
- GUIが付属している。GUIがある、ないでは、マニュアルを読まなきゃ始められないか、読まなくてもある程度直感的に操作できるかという点で大きく異なる。Oracle VM Managerは最高のGUIだ!とは言いませんが(オイオイ)、便利な管理ツールであることは間違いない。Oracle VMは最新のXenを最も手軽に使い始めることができ、かつ、複数サーバを管理できるGUIがついている。
- H/A機能が付いている。VM Serverが意図せずダウンしたときにはそのVM Server上で稼働していたVMは他のVM Serverで自動的に復旧(OS起動)する。このVM H/A機能はVMになんら手を加えずに障害時自動復旧の機構を提供するので、どんなシステムにもすぐに適用することができる。しかも、タダで。VM H/A機能まで完全にタダで利用できるのはOracle VMだけでは。そしてもしサポートが要る、と思ったらサポートも購入できる。これもまた妙に安い。
- 最高の仮想化エンジンを使うことができて、マネージャーも付属。さらにはライブマイグレーションやH/Aというオプションまで標準で装備しており、、、ライセンスフリー。もし純粋な仮想化ソフトとして他の製品と比較したとしても、僕がエンドユーザだったらかなり気になる。もし僕が中嶋商会をスタートアップしたとして、タダでここまでやれちゃうソフトがあるのに、何百万も払って他の仮想化ソフトを購入するという選択肢はまずないと思われます。(あくまで中嶋商会だったら、の話しですよ)
と、ここまでが単に「仮想化ソフト」としてOracle VMを見た時に思うこと。しかし最初に本意ではない、と書いた通り、あまり仮想化ソフトだけで比較しても大切なことが見えてこないと思っています。最終的にはユーザーはシステムや、サービスを構築/運用するのであって、インテグレートされた姿が最も大切。VM, OS, Database, Application Server, そして監視、管理のシステムがいかにスムースに連携して、最終的に最もコストを抑えてハイパフォーマンスを発揮するかに注目したい。そこには単に「動くはず」といった理論ではなく、実際に検証を行って見い出されるベストプラクティスが不可欠で、その動作の実績というものが重要視されるはずです。例えばRACを仮想化環境上で動かすときにはいくつかの注意点があります。クラスタ間のタイマー同期の問題、ネッワークセグメントの構成方法、安全なvCPU割り当て、VBDの形式等です。Oracleではこれらのコンフィギュレーションについてベストプラクティスを提供しています。サーバ仮想化環境でRACを確実に動作させるために、というものです。Oracle VM, Oracle Enterprise Linux, Oracle Databaseそしてストレージにまたがる全システム構成について言及しています。単に各ソフトウェアレイヤについてオールスターを集めてくる、ということに捕らわれると、一番大事なチームとしてのパフォーマンスが後回しになってしまいます。最初にプレーヤーを個別に選定すると、後々「アレとアレの組み合わせがサポートされない」であるとか、「実績はあるのか?」という問題でもめることになりがちです。オールスターを集めることだけではなく、チームとしての完成度を意識することが重要だと思います。そしてOracleではこのようなベストプラクティス、ノウハウをホワイトペーパーやNoteといったドキュメントで提供しています。あるいはコンサルティングサービスという形で設計のレビューや実際の設計作業も請け負っています。そして、特筆すべきことはベストプラクティスをそのまま「VMテンプレート」という形で提供していることです。例えばOracle DatabaseのVMテンプレートは、Database用に最適化されたOracle Enterprise Linux JeOSにDatabaseがすでにインストールされた状態で提供されています。つまりVMテンプレートを使えばDatabaseのインストールという作業を省略できることはもちろん、同時にそれ以前に必要なDatabase用にOSを設定するという作業(カーネルパラメータ変更、必要なパッケージのインストール)も不要になります。これは作業工程が短縮されるということ以上に、Database用に最適化されたイメージをそのまま適用できることによる「確実なシステム構築」ということを意味しています。VMテンプレートとは最適化された「チーム」をまるごと手に入れて、すぐにゲームを開始できる、ということだと思います。もちろんVMテンプレートを使っても個別に設計が必要な部分は残ります。ストレージ周りの物理構成、論理構成等は入念な設計が必要な最たる例です。しかしVMテンプレートをうまく採用し、自社環境用にカスタマイズすることで得られるメリットは少なくないと思います。
仮想化はいまだにバブっている分野で、その中心を成すサーバ仮想化ソフトウェアには熱い視線が注がれています。しかしふと、着眼点として仮想化ソフトの選定というところから一歩引いて考えると、チームとしてどれが最高なのかという新たなパラダイムが見えてくるかもしれません。OracleはVirtualization+GRIDという連携で最高のチームを用意しています。これは本気で最高のシステムです。(僕はこのシステムを超高密度インフラストラクチャーと呼んでいます。たぶん僕しか呼んでいません。)*そのチームって具体的にどんな?という方はお近くの営業までお問い合わせください。
重要なのはソフトウェア? それとも、システム?
Oracle VMでVLANを設定する
サーバを仮想化すると必然的に一つの物理ネットワークポートを数多くのVMで共有することになりがちです。そんな環境では、セキュリティ的に(こういう表現好きじゃないんだけど)それぞれのVMのセグメントを分離したいという要件がでてきます。または、特にRAC等の検証環境で物理ネットワークポートは一個しかないんだけど、仮想マシンには最低2つのセグメントを与えたい、というような要件がでてきます。そんなときにはVLANですよね。
ということで、Oracle VM環境でVM Serverには物理的なネットワークポートは一つしかないけど、VLANで二つの仮想ネットワークポートを作成して仮想マシンに2つのネットワークセグメントへの接続を与えるという設定方法を紹介します。RACでは最低でもPublicとPrivateの二つのセグメントが必要になるのでそういう場合に便利です。
*ちなみにOracle VMはバージョンによって内部仮想ネットワークの構成がちょいちょい変わっていますが、この手順は2.1.xでも最新の2.2でもいけるはずです。
*タグVLAN(802.1q)を使用するので、VM Serverを結ぶネットワークスイッチも適切に設定する必要があります。
まずxend-config.sxpを編集してネットーワーク設定の初期化を行うnetwork-scriptを変更します。
[root@vmserver]# cd /etc/xen/xend-config.sxp (network-script network-bridge-ovs)
次に先程指定したnetwork-bridge-ovsを作成します。これは実際にはダミーです。つまりVLANを構成する場合は通常のネットワーク初期化機構を放棄するという設定を行っているわけです。
[root@vmserver]# vi /etc/xen/scripts/network-bridge-ovs #!/bin/sh /bin/true
そしてVLAN用に仮想スイッチの設定ファイルを作成します。各VLAN毎にxenbr(仮想スイッチ)を作成します。xenbrNNのNNの部分は任意ですが、VLAN IDと紐付けておくのが吉でしょう。ここではVLAN ID:11と、VLAN ID:12に対応するxenbrを作成しています。
[root@vmserver]# vi /etc/sysconfig/network-scripts/ifcfg-xenbr11 DEVICE=xenbr11 ONBOOT=yes TYPE=Bridge DELAY=0 STP=off BOOTPROTO=static IPADDR=10.0.11.1 NETMASK=255.255.255.0 [root@vmserver]# vi /etc/sysconfig/network-scripts/ifcfg-xenbr12 DEVICE=xenbr12 ONBOOT=yes TYPE=Bridge DELAY=0 STP=off BOOTPROTO=static IPADDR=10.0.12.1 NETMASK=255.255.255.0
次にVLANインターフェースを作成します。ここではeth0上にVLAN ID:11とVLAN ID:12となるインターフェースを作成しています。このときのeth0.NNのNNがVLAN IDの指定になります。単なる名前ではなくVLAN IDの設定になるので、ここの設定と物理スイッチでのVLAN設定は合わせる必要があります。そして各VLANインターフェースは先程作成した対応するxenbrにそれぞれ接続します。
[root@vmserver]# vi /etc/sysconfig/network-scripts/ifcfg-eth0.11 DEVICE=eth0.11 BOOTPROTO=none ONBOOT=yes BRIDGE=xenbr11 VLAN=yes [root@vmserver]# vi /etc/sysconfig/network-scripts/ifcfg-eth0.12 DEVICE=eth0.12 BOOTPROTO=none ONBOOT=yes BRIDGE=xenbr12 VLAN=yes
これで完了です。VM Serverを再起動すればxenbr11が作成され、そこにeth0.11が接続されます。また、xenbr12が作成され、eth0.12がそこに作成されます。
ゲストOSの仮想ネットワークインターフェースを作成するときは、xebr11を指定すればVLAN 11に、xenbr12を指定すればVLAN 12に接続されます。
Oracle VM Server 2.2をインストールした後に最低限行う作業(2/1更新)
少し独断と偏見が入っていますがつれづれなるままに。
- up2dateコマンドでULN (Unbreakable Linux Network) へ登録(サポートを購入してないと登録できません)
- *サポートを買ってない人はhttp://public-yum.oracle.com/repo/EnterpriseLinux/EL5/3/base/i386/からOEL5.3のパッケージをインストールできます。後述のvim-enhancedとか。
- ULNにログインし、登録したシステムのサブスクリプションに以下のチャネルを追加
- Enterprise Linux 5 update 3 installation media copy (i386)
- Enterprise Linux 5 update 3 patch (i386)
- vim-enhanced、screenをインストールし、.bashrcを編集してalias vi=’vim’とする
[root@vmserver]# up2date vim-enhanced screen
- up2date –configureで19番をクリアする
- up2date –updateでパッチをすべて適用
また思いついたら都度更新します。
Oracle VM上でOpenSolarisをPVMとしてJeOSから作成する方法
注)2010年1月現在、OpenSolarisはOracle VMのゲストOSとしてサポートされていません。
Oracle VM 2.2上でOpenSolaris 2009.06をPVM(準仮想マシン)としてインストールする方法を紹介します。まだプロトタイプという位置づけではあるものの、実はOpenSolaris 2009.06にもいわゆるVMテンプレートが存在します。今回はそのテンプレートを使ってOpenSolarisのPVMを作成します。まずはVMテンプレートをダウンロードします。
OpenSolaris 2009.06 JeOS Prototype VM Images
このページからXen用のPVMイメージをダウンロードします。直リンはこちら。(直リンって久しぶりだな。。)
Xen: Oracle VM, OpenSolaris xVM, etc. KVM: (In XEN HVM mode)
そしてこのイメージは7zipという少し耳慣れないツールで圧縮されています。以下のページからご自身のプラットフォームに応じたモジュールをゲットしてインストールしてください。
http://www.7-zip.org/download.html
僕はp7zip for POSIX/Linuxをダウンロードしてビルドしました。そして使い方で一点ハマリポイントがありました。深く考えずに/usr/local/bin/7za e osol-0906-jeos-proto-xvm-zen-para.7z などとしていたのですが、eだと現在のディレクトリ直下にすべてが解凍されてしまい、サブディレクト内に何にもねぇ!ってことになってしまいます。p7zip for POSIX/Linuxを使われる方はくれぐれも/usr/local/bin/7za x osol-0906-jeos-proto-xvm-zen-para.7z で解凍してください。他のプラットフォームはわかりません。また、Oracle VM Serverにはgcc等の開発キットは含まれていないのでmakeはできません。7zipは他のプラットフォームにインストールしてVMイメージは解凍してからVM Serverに格納するのが吉でしょう。
解凍してできたディレクトリをVM Serverの/OVS/running_pool/直下に保存します。
[root@vmserver]# pwd /OVS/running_pool [root@vmserver]# ls OSOL0906JeOSProto
次に設定ファイル生成スクリプトを編集します。というかこのスクリプトを編集して設定ファイルそのものにしたらいいんじゃないかという気もします。どっちでもいい話ですが、結果的に以下のファイルを作成します。(ファイル名はvm.cfgでなくても良いのですが、Oracle VMの慣例にならってvm.cfgとしておきます。
[root@vmserver]# cd OSOL0906JeOSProto/ [root@vmserver]# vi vm.cfg name = "OSOL0906JeOSProto" vcpus = 1 memory = "768" disk = [ 'file:/OVS/running_pool/OSOL0906JeOSProto/System.raw/vdisk.raw,xvda,w', 'file:/OVS/running_pool/OSOL0906JeOSProto/instance.raw/vdisk.raw,xvdb,w' ] vif = ['type=netfront,bridge=xenbr0,mac=00:16:3e:00:00:01'] on_shutdown = "destroy" on_reboot = "destroy" on_crash = "preserve"
あとはxmコマンドで以下のように起動すればOpenSolarisがPVMとして起動します。
[root@vmserver]# xm create vm.cfg -c
ただしこのOpenSolaris、Just Enoughと名乗るだけあってほんとに軽量版です。汎用的に利用するにはいろいろとパッケージを追加する必要があるでしょう。しかし手元の環境ではsshがうまく起動せず、疲れてきたので作業終了しました(オイオイ)。
どなたかこのJeOSでsshを普通に起動する方法をご存知でしたら教えてください。
1/26追記:/lib/svc/method/sshd -cしておくと起動できました。@satokazさん、有難うございます!
ここまで書いておきながらなんですが、僕は普通にvirshを使ってPVMをインストールしようと思います。その手順はまた後ほど。
Storage GRIDセミナー終了。有難うございました!
今日は遅い時間にも関わらずかなり多くの方々にお越しいただけ、感謝、感謝です、有難うございました!
今日の資料、というか投影していたスライドをUPしました。残念ながらココが味噌、の性能部分についてはご案内させていただいた通り、公開できないため間引きさせていただきました。ごめんなさい。
年明けにオラクル青山センターでOracle VMセミナーやります
年明けの1月21日にオラクル青山センターでOracle VMのセミナーを開催します。いわゆるEvening Seminarという形で、普段日中お忙しい方にも来ていただけるように18:00という少し遅い時間からの開始です。
2セッション構成で、前半のセッションではOracle VMの最新バージョン2.2をベースとしたOracle VMの基本的なコンポーネントのご説明、最新バージョンで追加された機能の解説に加え、性能についていくつかの検証結果の紹介を行います。後半のセションでは仮想化環境で特に重要な設計ポイントであるストレージに焦点を当て、仮想化環境で課題となるストレージ設計についてOracle的考え方、実装方法を検証結果を交えて解説します。
お申し込みはこちらから。
Catch up !! Oracle VM 最新バージョン2.2の実力検証& 仮想化アーキテクチャの要[Storage GRID]詳解 (2セッション 合計2時間)
.png)