仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

HPサーバーのGen8以降用ディスクトレイのパチモンをeBayで買う

久しぶりにサーバーネタは、HDDトレイのパチモン(偽造品)を買って試すお話です。はじめに言うとトレイは一応使えましたが、言わずもがな使用は自己責任となります。

背景

長らく弊社の検証サーバー機材として活躍してきたHP ProLiant G6世代のサーバーが、iLO2のJava Appletリモートコンソールが使用不能になるなどしてOSやブラウザの進歩に追いつけなくなり、リプレースの対象になってきました。使う分にはスペック的に悪くないのでやや惜しいですね。現在は、代わりになるサーバーとして同じくHPEサーバーのGen8・Gen9世代や、Dell R620をオークションで調達しています。

Gen8世代以降のサーバーではハードディスクのトレイ形状が変更になったため、サーバーのリプレースに合わせてディスクトレイもそれなりにたくさん必要になります。オークションの中古サーバーは大抵はディスクがついておらず、ディスクトレイのためにまだ使えるディスクごと買い換えるのも惜しいので、eBayからディスクトレイを調達しました。

買い方

eBayで[hp gen8 2.5 caddy]などのように検索するとたくさんアイテムが出てきます。トレイではなくキャディーが正しい?ようです。日本への発送に対応している商品に絞込み、価格+送料が低い順でソートして、適当なものをセレクトします。

パチモンと判別する方法は比較的簡単で、外見的にはトレイのサイドにHPロゴがあるかないかで見分けられました。また、商品によってはGen8以降のトレイの特徴とも言えるLEDが省略された分安いものもあります。潔いですね。今回はLEDつきのトレイを10個ほど調達しました。

比較

左がパチモン、右が正規品です。上から見る分には大きく変わりません。

f:id:virtualtech:20170607211924j:plain:w450

簡単に見分けられるサイド。HPロゴがないことがわかります。

f:id:virtualtech:20170608170614j:plain:w450

真上から。金属加工がいまいちなのか、沿ってしまっていますが誤差ではあります。金属加工は取っ手の付近にあるバネバネしたところもふわふわと浮いていて、折が足りない印象ですね。

f:id:virtualtech:20170608145916j:plain:w450

正面。上がパチモンです。ランプの窓が少し違う気もします。取っ手は金属製でさわり心地もふつうです。

f:id:virtualtech:20170608145504j:plain:w450

LEDの端子。端子のパターンが丸と四角で異なっています。丸くても四角くても利用上わかりませんが。

f:id:virtualtech:20170608145756j:plain:w450

地味につらいのが付属のネジ。HPサーバーでは馴染み深いトルクスネジなのですが、T15でもT10でもなく、何故かT9です。しかもセンターに突起があるのでドライバーを選びそうです。できればネジは別途調達したいですね。

f:id:virtualtech:20170609092753j:plain:w450

動作チェック

さて、これをサーバーに差し込んで起動させてみましょう。Smart Arrayがスキャンした段階で、1709で始まるメッセージが出力されました。調べてをみると、偽造品であることが見事にバレていました。正規品かどうか判別するチップが中に入っているようです。

f:id:virtualtech:20170608170704j:plain:w450

1709-Slot # Drive Array - One or more attached drives could not be authenticated as a genuine HP drive. Smart Array will not control the LEDs to these drives. Please run HP Smart Storage Administrator (HP SSA) or ACU to learn which drives could not be validated as genuine.

( http://h20565.www2.hpe.com/hpsc/doc/public/display?sp4ts.oid=7481826&docId=emr_na-c04597377&docLocale=en_US より)

メッセージ通りなら、LEDが制御されないとのことですが、起動後もアクセスランプがくるくる回るように点灯していました。他のステータス表示に支障があるのかもしれません。透け具合が正規品と違うので、写真写りもイマイチですね。

f:id:virtualtech:20170608170846j:plain:w450

iLOではDegradedという扱いにされてしまっていたため、使用中はサーバーのアラートランプが点滅を続けていました。別の部位がDegradedになったときには不便かもしれません。

f:id:virtualtech:20170608170314j:plain:w450

まとめ

見た目以上に、サーバーお墨付きのパチモンディスクトレイになってしまいましたが、一応使えることが確認できました。エラーを無視して使うことになりそうです。非純正ディスクはセンサーやベンダー独自のステータス取得等ができないなど、ベンダー的には使ってほしくないと言うのはなんとなくわかるのですが、検証が主な用途な弊社的には不自由でやや不便といった感じです。

容量ラベルを貼る部分にはペンギンさんシールを貼り付けて、識別しやすいようにしておきました。次にトレイが不足したらLED省略版を試してみたいです。

おまけ

ちなみに、パチモントレイは今回のものに限らず、旧世代のHPサーバーやDellサーバー向けのトレイもたくさん出回っています。下の写真はDellのトレイの場合ですが、レバーが正規品よりもガバって開いたり、レバーをおこすボタンの色が薄かったりします。

f:id:virtualtech:20170609093800j:plain:w450

Canonical Ubuntu MAAS 2.2.0がリリースされた

2017年5月末にMAAS 2.2がリリースされたので、早速試してみました。

Canonical Ubuntu MAAS 2.2は現在MAAS Stable PPAで公開されており、Ubuntu 16.04.x Serverで利用するには次のようにリポジトリーを有効化する必要があります。

$ sudo add-apt-repository ppa:maas/stable
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install maas  #All-in-Oneインストール

インストール方法についてはドキュメントが公開されています。

MAAS 2.2では様々な機能改修、機能追加が行われていますが、特に便利だったのがPodsと言う新機能でqemu-kvmをサポートしたことが挙げられると思います。

Pod typeとしてvirshを選択、Virsh Address qemu+sshなアドレスを設定して、「Save pod」をクリックで追加されます。このあとデプロイまでに必要な処理は自動的に行われます。すごい。

f:id:virtualtech:20170607102903p:plain

これまでもMAASでKVM仮想マシンを仮想ノードとして管理することは可能でしたが、物理マシンと同列に仮想マシンを管理するだけの機能しか有していませんでした。Podsでqemu-kvmと連携すると、登録した仮想化ホスト上の仮想マシンをMAASに追加するところからデプロイできる状態までの処理を自動で行ってくれるようになります。

f:id:virtualtech:20170607102950p:plain

また、MAAS DashboardやMAAS API経由で関連づけた仮想ホストに仮想マシンを作ってMAASに仮想ホストとして登録することもできるようになったとのことです。

f:id:virtualtech:20170607103016p:plain

標準でデプロイをサポートするOSはUbuntu 12.04LTS,14,04LTS,16.04LTSのほか、16.10,17.04,17.10(devel)のほか、引き続きCentOSの6と7のデプロイをサポートしています。自宅の仮想サーバーの管理とか、検証環境や本番環境のOSのセットアップに活用できそうですね。

なお、Ubuntu 16.04の標準リポジトリーのMAASパッケージも2.1系の最新版である2.1.5に更新されています。こちらはバグ修正が主のようです。

VMware ESXiやWorkstationとFusionに非常に深刻な脆弱性、アップデートパッチが公開される

以下のNEWSGAIA社のニュースサイト「Security NEXT」による報道について、調べてみました。

www.security-next.com

この問題はCVE-2017-4902, CVE-2017-4903, CVE-2017-4904, CVE-2017-4905で報告されている脆弱性で、修正プログラムは2017年03月28日にVMwareより提供されています。

オフィシャルのアドバイザリーはこちらで公開されています。

www.vmware.com

対象の修正プログラムは以下の通りです。

ESXi5.5以前の製品に対するパッチは提供されません。以前のバージョンを利用しているユーザーは直ちにメンテナンスされているバージョンへの更新を検討すべきです。

ESXiのパッチの詳細は次のURLから確認、ダウンロード可能です。

https://my.vmware.com/group/vmware/patch#search

本件や仮想化についてのお問い合わせはこちらまでお願いします。ご要望に合わせて見積もりさせていただきます。

Ubuntu Xenial (16.04) でOpen vSwitch+DPDKな環境を作る(後編)

tech.virtualtech.jp

Ubuntu XenialでOpen vSwitch+DPDKな環境を作る(前編) の環境ができたら、次にOpen vSwitch+DPDKをLinux KVM仮想マシンで使ってみます。

以降の手順は次のページで解説されています。今回はこれをベースに手順を記述します。

insights.ubuntu.com

Linux KVMのインストール

Linux KVM環境を構築し、VMを起動して通信できることを確認します。 UbuntuにはVMの作成とコンフィグレーション、OSのデプロイなどの処理を便利にしてくれるuvtoolというツールが用意されていますので、ここではこのコンポーネントを利用します。

uvtoolをインストールすると一緒にLinux KVM関連もインストールされますので、インストール後はvirshコマンドでKVMを叩けます。

kvmhost# apt -y install uvtool
kvmhost# virsh list --all
 Id    Name                           State
----------------------------------------------------

テンプレートイメージのダウンロード

Cloud images and uvtoolに使い方が書かれているのでそれを参考に、Ubuntu 16.04のイメージをダウンロードします。少々時間がかかりますが、インストールするよりずっと速いので待ちます。

kvmhost# uvt-simplestreams-libvirt sync \
    --source http://cloud-images.ubuntu.com/daily \
    release=xenial arch=amd64

VMコンフィグテンプレートのダウンロード

すぐDPDKを試したい人のためにVMコンフィグ用のテンプレートを用意してくれているのでこれを使います。 二つのファイルの違いはvhost-userが1か2かの違いだけです。

http://paste.ubuntu.com/16062769/plain/ の内容を guest-dpdk-vhost-user-singleq-1.xml に書き込み
http://paste.ubuntu.com/16062773/plain/ の内容を guest-dpdk-vhost-user-singleq-2.xml に書き込み

なお、上記のページを見るにはUbuntu Oneアカウントにログインする必要があります。

仮想マシンの起動

次のコマンドを実行して仮想マシンの作成、OSイメージの流し込みを行います。仮想マシンの設定には先の手順で作成したファイルを利用します。

kvmhost# uvt-kvm create --memory 2048 --template guest-dpdk-vhost-user-singleq-1.xml --password=ubuntu guest-dpdk-vhost-user-1 release=xenial arch=amd64 label=daily

kvmhost# uvt-kvm create --memory 2048 --template guest-dpdk-vhost-user-singleq-2.xml --password=ubuntu guest-dpdk-vhost-user-2 release=xenial arch=amd64 label=daily

作成したVMはuvt-kvmコマンドでVMを作成した時にパスワードを設定したので、ubuntu/ubuntuでログインできます。 指定しなかった場合は公開鍵認証を使いますので、必要な場合は事前にキーペアを作っておきます。

「unable to map backing store for hugepages: Cannot allocate memory」とかエラーが出た場合は、Hugepagesを増やしましょう。

ex.

# sysctl -w vm.nr_hugepages=8192

uvt-kvmコマンドを使った方法だと仮想マシンマネージャーでアクセスできるので、 仮想マシンマネージャーにリモートホストを登録して操作することができます。

f:id:virtualtech:20161209141151p:plain:w400

IPアドレスの設定

GUIによるアクセス環境が用意できれば仮想マシンマネージャーで仮想マシンにアクセスしてipコマンドなどでIPアドレスを設定してください。最初の状態ではNAT接続のNICしかIPアドレスが設定されていません。

GUI環境が用意できなければvirshコマンドを使ってそれぞれのVMにログインして設定します。

kvmhost# virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     guest-dpdk-vhost-user-1        running
 2     guest-dpdk-vhost-user-2        running

kvmhost# virsh console 1
Connected to domain guest-dpdk-vhost-user-1
Escape character is ^]   ←Enterを押す。うまく接続できない場合はlibvirt-binを再起動してから

Ubuntu 16.04.1 LTS guest-dpdk-vhost-user-1 ttyS0

guest-dpdk-vhost-user-1 login: ubuntu ←ubuntuユーザーでログイン
Password: (ubuntuと入力)

guest...-1$ sudo ip a add 192.168.1.101/24 dev ens4 && sudo ifconfig ens4 up
guest...-2$ sudo ip a add 192.168.1.102/24 dev ens4 && sudo ifconfig ens4 up

コンソール接続を終了するにはログイン画面で「 CTRL+] 」を押します。

guest...-1$ exit

Ubuntu 16.04.1 LTS guest-dpdk-vhost-user-1 ttyS0

guest-dpdk-vhost-user-1 login:  ←「 CTRL+] 」を押す。

以上で仮想マシンでDPDKデバイスを割り当ててOpen vSwitch+DPDKの仮想ネットワークと接続できるようになりました。

Hello Worldアプリケーションがビルドできない?

5. Hello World Sample Application — Data Plane Development Kit 16.04.0 documentation

に従ってビルドしようとすると、次のようなエラーが出力されます。

# export RTE_SDK=/usr/share/dpdk/
# cd /usr/share/dpdk/examples/helloworld
# make
/usr/share/dpdk//mk/internal/rte.extvars.mk:57: *** Cannot find .config in /usr/share/dpdk//x86_64-native-linuxapp-gcc.  Stop.

それはどうもUbuntuのCloud Airchiveパッケージのバグの可能性があるようです。バグ報告されていない場合はしないといけませんね。どうしても動かしたい場合はDPDKだけビルドした方がいいのかもしれません。

以下の手順で対応可能でした。.configファイルは/usr/share/dpdk/にconfigファイルとして存在していました。また、公式ガイドではexport RTE_TARGET=x86_64-native-linuxapp-gccとなっていますが、Ubuntuパッケージ版はここがx86_64-default-linuxapp-gccになっています。 読み替えて次のように実行します。なお先の手順でDPDKをOpenvSwitchで使っている場合は動作させることができずエラーになりますので、一旦service openvswitch-switch stopが必要です。

# vi /etc/apt/sources.list.d/cloudarchive-newton.list
…
deb-src http://ubuntu-cloud.archive.canonical.com/ubuntu xenial-updates/newton main

# apt install dpdk-doc
# apt update && apt-get build-dep dpdk
# source /usr/share/dpdk/dpdk-sdk-env.sh
# cd ${RTE_SDK}/examples/helloworld
# make
  CC main.o
  LD helloworld
  INSTALL-APP helloworld
  INSTALL-MAP helloworld.map

実行する前にopenvswitch-switchサービスを停止します。

# service openvswitch-switch stop

念のため、こうして置いたほうがいいかもしれません。元に戻すには前編を参考にadd-portしてください。

# ovs-vsctl del-port ovsbr0 dpdk0
# service openvswitch-switch stop

実行してみます。

# ./build/helloworld -c f -n 4
EAL: Detected 16 lcore(s)
EAL: Probing VFIO support...
PMD: bnxt_rte_pmd_init() called for (null)
EAL: PCI device 0000:07:00.0 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:07:00.1 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:08:00.0 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
EAL: PCI device 0000:08:00.1 on NUMA socket -1
EAL:   probe driver: 8086:10d6 rte_igb_pmd
hello from core 1
hello from core 2
hello from core 3
hello from core 0

実行したサンプルプログラムはすぐ終了してしまうので端末を複数開き、一方でtopコマンドを実行し、一方でhelloworldを実行してください。

Ubuntu Xenial (16.04) でOpen vSwitch+DPDKな環境を作る(前編)

Open vSwitch+DPDKが今、熱いようです。

早速、Ubuntu XenialでOpen vSwitch+DPDKな環境を作ってみることにしました。

次のバージョンのUbuntuを使って動作確認しました。

$ cat /proc/version_signature
Ubuntu 4.4.0-53.74-generic 4.4.30
$ cat /etc/lsb-release |grep DISTRIB_DESCRIPTION
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

NICの確認

まずは動かそうとしているサーバーに対応するNICが実装されていることを確認します。 なお、NICによってサポートしている機能に差があるため、使おうとしている機能がそのNICで使えることを確認してください。

PPAの追加

Ubuntu XenialのOVSはバージョン2.5がサポートされます。より新しいバージョンのOVSをUbuntuで使うには、OpenStackのリポジトリー「CloudArchive」にあるパッケージを使うと便利です。次のコマンドを実行します。

Newtonより新しいバージョンのOpenStackが提供された場合はより新しいバージョンを指定してください。

# add-apt-repository cloud-archive:newton
# apt-get update

インストール

次のようにコマンドを実行してDPDKとDPDK EnableなOVSをインストールします。 パッケージの依存関係で普通のOVSもインストールされるので、二個目のコマンドで切り替えています。

# apt-get install openvswitch-switch-dpdk dpdk
# update-alternatives --set ovs-vswitchd /usr/lib/openvswitch-switch-dpdk/ovs-vswitchd-dpdk

NICのバインド

NIC用のドライバーをバインドするため、modprobeコマンドで読み込みます。

ex.

# modprobe uio_pci_generic 
or
# modprobe vfio-pci 

uio_pci_generic でも良い(パフォーマンスはでない)が、使える環境ならvfio-pciの方が良いようです。

また、e1000のように対応しているNICの場合はuio_pci_genericの代わりに、よりパフォーマンスの良いigb_uioを使うこともできます。Ubuntu Xenialではdpdk-igb-uio-dkmsパッケージの導入により、利用可能になります。

前の手順で読み込んだモジュールを再起動後も読み込むように/etc/modulesに書き込んでください。

# echo "uio_pci_generic" >> /etc/modules

モジュールについてはmodinfoコマンドで概要を確認できます。カーネルを更新すると新しいモジュールが利用できますので最新のものを使うことをおすすめします。Linuxカーネルの更新後は必ずシステムの再起動が必要です。

$ modinfo uio_pci_generic
filename:       /lib/modules/4.4.0-53-generic/kernel/drivers/uio/uio_pci_generic.ko
description:    Generic UIO driver for PCI 2.3 devices
author:         Michael S. Tsirkin <mst@redhat.com>
license:        GPL v2
version:        0.01.0
srcversion:     41BEEDE6B2A7E267E6CCD84
depends:        uio
intree:         Y
vermagic:       4.4.0-53-generic SMP mod_unload modversions

以降の手順は汎用的に利用可能なuio_pci_genericを使う例とします。

ネットワーク設定

管理用NIC以外はコメントアウトします。DPDKがネットワークを管轄するためです。 リモートアクセス用のNICとDPDK用のデバイスは別のものを用意するといいと思います。

# vi /etc/network/interfaces
auto eno1
iface eno1 inet static
address 172.16.214.100
netmask 255.255.0.0
gateway 172.16.0.1
dns-nameservers 8.8.8.8 8.8.4.4

#auto ens1f0
…
#auto ens1f1
…

OVS-DPDK関連の設定変更

まず、次のコマンドを実行してHugePagesを設定します。 ページサイズはのちに動かすアプリケーションに合わせたサイズを指定する必要があります。

# vi /etc/dpdk/dpdk.conf
#NR_2M_PAGES=64
↓
NR_2M_PAGES=6144
...

Linuxカーネルパラメーターへの記述

次のように実行して、カーネル起動後もIOMMUを有効にするためを入れておきます。 なお、uio_pci_genericを使う場合はこの設定は不要です。

# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="iommu=pt intel_iommu=on"

vfio-pciを使う場合にはVT-dが必要なため、iommu=pt intel_iommu=on の記述が必要です。反映させるために次のように実行して、再起動します。

# update-grub && reboot

なお、HPEのサーバーでIOMMUを使うには、次の情報を確認して対応してください。 この対処を施した場合、IOMMUが利用可能になりますが、サーバー前面のステータスランプが警告表示(常時、赤ランプ点滅)になります。ちなみにDellのサーバーでは特に何をする必要もありませんでした。

デバイスの確認とバインド

まず、DPDKのバインド状況を確認します。

# dpdk-devbind --status

初期状態ではコマンドを実行すると次のような出力がされます。「Network devices using DPDK-compatible driver」がnoneと表示されるはずです。この状態ではDPDKがNICに対して有効化されていない状態です。

Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:01:00.0 'NetXtreme II BCM5709 Gigabit Ethernet' if=eno1 drv=bnx2 unused=uio_pci_generic *Active*
0000:01:00.1 'NetXtreme II BCM5709 Gigabit Ethernet' if=eno2 drv=bnx2 unused=uio_pci_generic
0000:02:00.0 'NetXtreme II BCM5709 Gigabit Ethernet' if=eno3 drv=bnx2 unused=uio_pci_generic
0000:02:00.1 'NetXtreme II BCM5709 Gigabit Ethernet' if=eno4 drv=bnx2 unused=uio_pci_generic
0000:07:00.0 '82575GB Gigabit Network Connection' if=enp7s0f0 drv=igb unused=uio_pci_generic
0000:07:00.1 '82575GB Gigabit Network Connection' if=enp7s0f1 drv=igb unused=uio_pci_generic
0000:08:00.0 '82575GB Gigabit Network Connection' if=enp8s0f0 drv=igb unused=uio_pci_generic
0000:08:00.1 '82575GB Gigabit Network Connection' if=enp8s0f1 drv=igb unused=uio_pci_generic

Other network devices
=====================
<none>

Active」とステータスが出ているNICは別の処理で使用中のNICです。NetworkサービスでStaticなIPアドレスを割り当ててUPしているNICであるためです。Linux側で利用しているデバイスはDPDKドライバーを読み込むことはできません。

例えばuio_pci_genericとして、デバイス番号「0000:07:00.0」のNICをバインドするには次のように実行します。アンバインドするには-bオプションを-uに変えて実行してください。

# dpdk-devbind -b uio_pci_generic  0000:07:00.0

もう一度ステータスを確認すると次のように出力されるはずです。これで指定したデバイスでDPDK-compatible driverが読み込まれます。

# dpdk-devbind --status
...
Network devices using DPDK-compatible driver
============================================
0000:07:00.0 '82575GB Gigabit Network Connection' drv=uio_pci_generic unused=igb
...

DPDKバインドしたデバイスをLinux Kernel側に戻すには、同じくdpdk-devbind -bコマンドでドライバーの割り当てを上書きします。例えば先にバインドしたデバイスを元に戻すには現在利用していない(unused)ドライバーを指定すれば良いので、次のように設定することができます。

# dpdk-devbind -b igb 0000:07:00.0

DPDKモジュールの自動読み込みに関する設定

先の手順で手動でバインドしましたが、これは/etc/dpdk/interfacesに記述することで自動的にバインドさせることができます。次のように実行して、指定したデバイス番号のNICでDPDK対応ドライバーを利用するための設定を行っておきます。

# vi /etc/dpdk/interfaces
pci 0000:07:00.0 uio_pci_generic ←追記  

UEFIモードで起動しているシステムにUbuntuをインストールした場合、この方法で自動読み込みを設定するとうまく動かない可能性があります。BIOSアーキテクチャでは再起動後も正常に動作するようです。

DPDKとOVSのセットアップ

ここまでできたら、次にOVSの設定を行います。通常のようにOVSを使うのと異なり、いくつかオプションを指定します。以下のページの情報を参考にしましたが、次に実行するコマンドを列挙します。

Documentation/vhost-user-ovs-dpdk - QEMU

# mkdir -p /var/run/openvswitch
# mount -t hugetlbfs -o pagesize=2048k none /dev/hugepages

# modprobe openvswitch

# killall ovsdb-server ovs-vswitchd
# rm -f /var/run/openvswitch/vhost-user*
# rm -f /etc/openvswitch/conf.db

# export DB_SOCK=/var/run/openvswitch/db.sock
# ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
# ovsdb-server --remote=punix:$DB_SOCK --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach

# ovs-vsctl --no-wait init
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0xf
# ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x2
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem=1024
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
# ovs-vswitchd unix:$DB_SOCK --pidfile --detach --log-file=/var/log/openvswitch/ovs-vswitchd.log
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra="--vhost-owner libvirt-qemu:kvm --vhost-perm 0664"
# service openvswitch-switch restart

# ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev
# ovs-vsctl add-port ovsbr0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
# ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
# ovs-vsctl show
cd83e731-6786-4985-9102-25c874b87255
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "vhost-user2"
            Interface "vhost-user2"
                type: dpdkvhostuser
        Port "vhost-user1"
            Interface "vhost-user1"
                type: dpdkvhostuser

OVSにDPDKデバイスをバインドします。次のように実行します。

# ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk
(物理デバイスを指定するのではなく、dpdk番号を指定する)

Interface "dpdk0"が追加されたことを確認します。

# ovs-vsctl show
cd83e731-6786-4985-9102-25c874b87255
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "vhost-user2"
            Interface "vhost-user2"
                type: dpdkvhostuser
        Port "vhost-user1"
            Interface "vhost-user1"
                type: dpdkvhostuser
        Port "dpdk0"
            Interface "dpdk0"   ←追加された
                type: dpdk

以上でUbuntu Server XenialにOpen vSwitch+DPDKをインストールできます。

再起動後の復旧

DPDKホストを再起動してしまうとDPDKとの関連づけが消えてしまうことがあります。この場合は次のコマンドを実行して復旧できます。これはおそらくUbuntu自体やUbuntuのパッケージングの問題ではないと思われます。

# dpdk-devbind -b uio_pci_generic 0000:07:00.0
# dpdk-devbind --status
# ovs-vsctl del-port ovsbr0 dpdk0
# service openvswitch-switch restart
# ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk

DPDKドライバーの切り替え

-uオプションは稀に失敗するので、unbindせずに新しいドライバーをバインドすると上書きできるようです。

# ovs-vsctl del-port ovsbr0 dpdk0
# dpdk-devbind -b igb_uio 0000:07:00.0
# dpdk-devbind --status
Network devices using DPDK-compatible driver
============================================
0000:07:00.0 '82575GB Gigabit Network Connection' drv=igb_uio unused=igb,uio_pci_generic
...
# service openvswitch-switch restart
# ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk

OVSパラメーターの追加

other_configでパラメータを追加してOVSを再起動すると良いようです。

# ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x2
# service openvswitch-switch restart

後編に続きます。

tech.virtualtech.jp

UbuntuでOpen vSwitchをLinux KVMのブリッジとして使う

UbuntuにOpen vSwitchをインストールする

UbuntuでOpenvSwitchを利用するには次のようにパッケージを入れます。 Ubuntu 16.04.xではLTS版のOpen vSwitch 2.5系がインストールできます。

$ sudo apt update
$ sudo apt install openvswitch-switch openvswitch-common

ネットワーク設定

そのあとはコマンドでブリッジを作る前に、事前にNICの設定を行っておきます。 本例では物理NICをenp30s0、仮想ブリッジをbr-exとして構成する例を示します。

$ sudo vi /etc/network/interfaces
…
# The primary network interface
auto enp30s0
iface enp30s0 inet manual
address 0.0.0.0

auto br-ex
iface br-ex inet static
address 172.17.14.4
netmask 255.255.255.0
gateway 172.17.14.1
dns-nameservers 8.8.8.8
ovs_type OVSBridge
ovs_port enp30s0

OVSブリッジの作成

あとはブリッジを作るだけです。簡単です。

$ sudo ovs-vsctl add-br br-ex
$ sudo ovs-vsctl add-port br-ex enp30s0

作成したあと、外部にpingを送っても正常に通信できることを確認します。 それでは本題のOpen vSwitchをLinux KVMのブリッジとして使うにはどうするかというと...

Open vSwitchをLinux KVMのブリッジとして構成する

まずはLinux KVMを使えるようにパッケージをインストールします。

$ sudo apt install kvm libvirt-bin 

インストールの進捗を見るとわかりますが、kvm libvirt-binのあたりのインストール時にbridge-utilsもインストールされます。つまり、openvswitchとbridgeモジュールが共存される状況になります。

この状況は良くありませんから対処する必要があります。まずはbridgeモジュールを使っているネットワークを削除します。

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

片付けが終わったのでbridgeモジュールも片付けようとbridge-utilsをアンインストールしようとすると、Ubuntuは「libvirt-binも削除するで?」と言ってきます。これでは困るのでblacklistに設定してbridgeモジュールを読み込みしないように設定します。

$ sudo vi /etc/modprobe.d/modprobe.conf
blacklist bridge  ←追記

上記設定が終わったら再起動します。

$ sudo reboot

再起動後、次のように実行してbridgeモジュールが読み込まれていないことを確認します。

$ sudo lsmod|grep openvswitch
openvswitch           221184  4
nf_nat_ipv6            16384  1 openvswitch
nf_nat_ipv4            16384  1 openvswitch
nf_defrag_ipv6         36864  2 openvswitch,nf_conntrack_ipv6
nf_nat                 24576  3 openvswitch,nf_nat_ipv4,nf_nat_ipv6
nf_conntrack          106496  6 openvswitch,nf_nat,nf_nat_ipv4,nf_nat_ipv6,nf_conntrack_ipv4,nf_conntrack_ipv6
gre                    16384  1 openvswitch
libcrc32c              16384  3 xfs,raid456,openvswitch
$ sudo lsmod|grep bridge
$

さあ準備が整いました...と言いたいところですが、Linux KVMでOVS Bridgeを使う場合、次のバグに注意する必要があります。

Bug #1279176 “virt-manager does not support ovs bridge” : Bugs : virt-manager package : Ubuntu

次のように仮想マシンマネージャーでOVSブリッジに完全に対応はしていないので、

f:id:virtualtech:20161125104822p:plain

とりあえず「ホストデバイスbr-ex:macvtap」などを使ってOSのインストールをしてシャットダウンしたあと、virsh editコマンドで該当の仮想マシンのNICの設定に「virtualport type=openvswitch」の記述を追加してください。例えば次のように設定します。

$ virsh edit vmname
...
    <interface type='bridge'>   ←bridgeにする
      <mac address='xx:xx:xx:xx:xx:xx'/>  ←そのまま
      <source bridge='br-ex'/>  ←ブリッジのNIC名を指定
      <virtualport type='openvswitch'>  ←追記
      </virtualport>  ←追記(virtualportタグを閉じる)
...

設定を変えたら設定を保存して閉じます。viで開いた場合は:wqです。設定に誤りがあればエラーが表示されます。問題なければ変更は保存されます。

「ホストデバイスbr-ex:macvtap」のままでもVMと外部間の通信は問題なく行え、一説によるとmacvtapを使った通信はパフォーマンスが良いとのことですが、KVMホストとVM間の通信ができないというデメリットがあります。今回のように対処するとLinux KVM+Linux Brige構成のような使い勝手をLinux KVM+Open vSwitch Bridgeで実現することができるようです。

MAAS 2.1.0がリリースされた

2016年11月9日にMAAS 2.1がリリースされたため、インストール済みだったMAAS 2.0からアップグレードしてみました。 次のように実行して再起動しました。無事MAAS 2.1にはなりましたが、MAASイメージの再インポートが必要でした。

$ sudo add-apt-repository ppa:maas/stable
$ sudo apt-get update
$ sudo apt-get upgrade

MAAS 2.1ではMAASの利用に必要ないくつかの設定を事前に設定できる、初期設定ウィザードが実装されていました。 また、オートディスカバリー機能が実装され、定期的に現在、ネットワーク上で使われているIPアドレスとハードウェアを視覚化できるようになりました。

f:id:virtualtech:20161111151637p:plain

MAASイメージの設定画面も改良されており、Ubuntuの各リリースのほか、CentOS 7とCentOS 6のイメージも個別に選択してインポートできるようになりました。

f:id:virtualtech:20161111152308p:plain

そのほかにも設定画面は色々と改良が行われていますが、私が一番嬉しかったのはここです。 ストレージのQuick Erase機能が実装されたことです。これでリリース後のEraseにものすごい時間がかかったり、時間がかかるからといって設定をオフにしないで済みます。 また、セキュアなEraseについてもこのバージョンで実装されています。

f:id:virtualtech:20161111152417p:plain

MAAS 2.1.0のChangelogはまだ更新されていませんが、修正されたバグの一覧はこちらで確認できます。

特にMAAS 2.0にあった、「IPアドレスが使われなくても確保し続けてしまうバグ」LP:#1615686 が修正されているのがこのリリースのポイントです。早速、弊社内の私のMAAS環境は更新してしまいました。