仮想化通信

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

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な環境を作る(後編)

[2017/7/6 追記] 大幅に内容を書き換えました。

tech.virtualtech.jp

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

Linux KVMのインストール

Linux KVM環境を構築し、仮想マシンを起動して通信できることを確認します。 まずはLinux KVMをインストールします。

kvmhost# apt update
kvmhost# apt install qemu-kvm libvirt-bin

LibvirtでHugePagesを使う設定

こちらの投稿を参考に、/etc/default/qemu-kvmKVM_HUGEPAGESを1に設定変更します。設定変更後はqemu-kvmサービスを再起動します。

仮想マシンを作成

Virt-Managerなどで仮想マシンを作成します。作成した仮想マシンにOSをインストールします。 インストール、アップデートが終わったら、一旦シャットダウンします。

仮想マシンの設定に追記

DPDKに必要な設定を追記します。以下の共通設定は全ての仮想マシンに設定し、vhostuserインターフェイスは別々のポートを各仮想マシンに設定するようにしてください。

共通の設定

  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  
<memoryBacking>
    <hugepages/>
  </memoryBacking>
(memoryBackingセクションを追加)

  <cpu mode='host-passthrough'>
    <numa>
      <cell id='0' cpus='0' memory='1048576' unit='KiB' memAccess='shared'/>
    </numa>
 </cpu>
(cpu mode,numaセクションを追加。numaのmemoryサイズはcurrentMemory unitと同じサイズにする)

各VMにDPDKポートの追記

# virsh edit vm1

    <interface type='vhostuser'>
      <source type='unix' path='/var/run/openvswitch/vhost-user1' mode='client'/>
      <model type='virtio'/>
    </interface>

# virsh edit vm2

    <interface type='vhostuser'>
      <source type='unix' path='/var/run/openvswitch/vhost-user2' mode='client'/>
      <model type='virtio'/>
    </interface>

仮想マシンの起動

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

kvmhost# virsh start vm1
kvmhost# virsh start vm2

仮想マシンが起動すると、ovs-vswitch.logに次のような出力がされるはずです。

dpdk(vhost_thread1)|INFO|State of queue 0 ( tx_qid 0 ) of vhost device '/var/run/openvswitch/vhost-user1'changed to 'enabled'
dpdk(vhost_thread1)|INFO|vHost Device '/var/run/openvswitch/vhost-user1' has been added on numa node 0
dpdk(vhost_thread1)|INFO|State of queue 0 ( tx_qid 0 ) of vhost device '/var/run/openvswitch/vhost-user2'changed to 'enabled'
dpdk(vhost_thread1)|INFO|vHost Device '/var/run/openvswitch/vhost-user2' has been added on numa node 0

仮想マシンにはsshやvirt-manager,virt-viewerなどでアクセスします。あとは仮想マシンのゲストOSに入って、追加したvhostuserポート側にIPアドレスを割り当てます。

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

ex.

# sysctl -w vm.nr_hugepages=8192

以上でvhostuserを仮想マシンに割り当てて、仮想マシン間で通信できるようになります。

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

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を実行してください。

このエントリーの続編です。

tech.virtualtech.jp

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"

[2017/7/6 追記] Ubuntu 4.4.0-83.106-generic 4.4.70、Ubuntu 16.04.2 LTSで前後編を動作確認。

NICの確認

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

Numaノードの確認

DPDKポートとして使うNICがどちらのNumaノードに格納されているか確認します。 本例の場合は、Numaノード0側にNICが接続されていることがわかります。

~# hwloc-ls
Machine (63GB total)
  NUMANode L#0 (P#0 31GB)
  ..
..
 HostBridge L#0
      PCIBridge
        PCI 8086:10fb
          Net L#0 "eno1"
        PCI 8086:10fb
          Net L#1 "eno2"
      PCIBridge
        PCI 1000:0073
          Block(Disk) L#2 "sda"
      PCIBridge
        PCI 8086:1521
          Net L#3 "eno3"
        PCI 8086:1521
          Net L#4 "eno4"
..
NUMANode L#1 (P#1 31GB) + Package L#1 + L3 L#1 (20MB)  
...

numactlコマンドを実行して、CPUコアのNumaノードごとの割り振りを確認します。このサーバーには論理32プロセッサーが実装されていることが確認できます。またメモリーは合計64GB、32GB毎割り振られていることがわかります。

~# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30
node 0 size: 32128 MB
node 0 free: 31083 MB
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
node 1 size: 32251 MB
node 1 free: 31498 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

PPAの追加

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

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

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

Ocata以降のリポジトリーパッケージを使う場合は、以下をご覧ください。

tech.virtualtech.jp

インストール

次のようにコマンドを実行して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を設定します。 ページサイズはのちに動かすアプリケーションに合わせたサイズを指定する必要があります。grep pdpe1gb /proc/cpuinfo |uniq|grep pdpe1gbコマンドを実行してpdpe1gbフラグが出力された場合は1Gの方でページサイズを設定できます。出力されない古いプロセッサーを実装したサーバーでは2Mの方でページサイズを指定してください。1Gで指定した場合、アプリケーションによっては2Mのページも必要な場合があるようです。

# vi /etc/dpdk/dpdk.conf
...
NR_2M_PAGES=8192 (2Mx8192=約16GB分)
...
NR_1G_PAGES=16

# systemctl restart dpdk    #設定を反映
# systemctl enable dpdk    #サービスの永続化

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

次のようにLinuxカーネルパラメーターでHugePagesを使うための設定を行うこともできます。指定したメモリーサイズは確保されるため、Linux Kernel側から見ると使用中になるので注意してください。改行せずに1行で入力してください。

# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=8192"

vfio-pciを使う場合にはVT-dが必要なため、iommu=pt intel_iommu=on の記述が必要です。その場合は次のように実行して、カーネル起動後もIOMMUを有効にするためを入れておきます。 なお、uio_pci_genericを使う場合はこの設定は不要です。

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

GRUBの変更を反映させるために次のように実行して、再起動します。

# 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 ←追記  

# systemctl restart dpdk    #設定を反映
# systemctl enable dpdk    #サービスの永続化

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,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 root:root --vhost-perm 0666"
# 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"が追加されたことを確認します。この段階でtopコマンドを実行すると、ovs-vswitchdプロセスのCPU使用率が上がっているのを確認できます。上がっていない場合は/var/log/openvswitch/ovs-vswitchd.logを確認して原因を探ります。例えば、lcoreやpmdの割り当てが足りないとか、dpdk-socket-memの指定の問題などです。

# 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ドライバーの切り替え

-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環境は更新してしまいました。

VMWare FusionのRetina対応とWindows 10 Anniversary updateと

VMware Fusionは結構前のバージョンからRetinaに対応しています。 先日、仕事用環境を一新してもらい、MacをRetina対応のMacBook Pro 13inchに、モニターを4K対応にしてもらったのを機にVMware FusionのVMもRetinaモードで使い始めました。新しいMacでもWindows 10は特に問題なく動いていました。

f:id:virtualtech:20160818103215p:plain

しかし、Windows 10にAnniversary updateを適用して以降、仮想マシンの中のWindows 10でマウスの矢印にズレが発生してリンク、アイコン、ウィンドウのクリックがしづらくなる問題が発生するようになりました。クリックするときにちょっと左上でクリックしないといけなくなってしまいました。

このため、画面上に見えている矢印の位置と実際のカーソルの位置が異なるため、マウスのクリックどころかウィンドウのドラッグアンドドロップも満足にできない状況です。

f:id:virtualtech:20160818103016p:plain

一番困るのがウィンドウが画面の上部に来てしまった時です。タイトルバーをクリックできないので、マウス操作ではウィンドウを移動することができなくなります。もちろん、キーボードショットカットを使ってウィンドウの移動は可能です。とはいえ、Anniversary update適用前は正常に動いていたものが動かなくなるとストレスが溜まります。

Anniversary update適用以前はこのような問題が発生していなかったことから、Anniversary updateとVMware Toolsの対応不足のような気がしています。

この環境は仕事用の環境なので、vSphere Clientを使った仮想マシンの管理をすることがあるのですが、その描画もおかしくなりました。ちなみにこの事象もAnniversary update適用以前は起きていませんでした(黒い部分は本来、描画されるべきところ)。

f:id:virtualtech:20160818103848p:plain

最初にWindows 10 Anniversary updateを動かしたのはVMware Fusion 6.0.6で、さすがに古いだろうと8.1.1に更新しましたが、状況は一緒でした。

ちなみにRetina非対応のモニターではこのような問題は起きませんでした。このことからVMware FusionのRetinaの実装の不足とWindows 10 Anniversary updateの何かの複合技で問題が発生している可能性が高いです。

とはいえ、もう疲れたのでParallels Desktop 11に乗り換えます(次の図はVMware FusionのVMをParallels Desktop 11にインポートしているところ)。

f:id:virtualtech:20160818112108p:plain

その後、VMware Fusion 6/8で動いていたWindows 10はParallels Desktop 11で無事動きました(ただし、インポート後にParallels Toolsのインストールと、VMをシャットダウンして仮想NICを追加する処理が必要でした)。VMware Fusion 6/8で動いていた時のようなカーソルのズレは全くなくなり、快適に動くようになりました。

ただし、移行後のWindows 10はライセンス認証を再度行う必要があるようです。

OpenStack 構築手順書 Mitaka 版(Think IT Books)のご紹介

はじめまして

技術ブログでははじめまして。平(Twitter:@mana_cat)です。 サーバーエンジニア、クラウドエンジニア、フリーランスを経験して今年4月に入社しました。二人の子どもを保育園に預けて時短勤務で働いています。 趣味はカメラと自宅IoTです。今後ブログも更新していきますのでよろしくお願いします。

続きを読む