tagged VLAN を仮想マシンの NIC まで引き込む方法

tagged VLAN を仮想マシンNIC まで引き込む設定方法。

要は外から入ってきた tagged パケットを、そのまま仮想マシンNIC まで渡したいということ。
(tagged packet) -> Host:eth -> VM:eth -> (tagged packet)

結論から書くと、普通に bridge すると、すんなり VM まで tagged パケットが上がった。

環境

  • CentOS 6.2(64bit) + KVM + 標準Linux bridge。
  • ホストも仮想マシンCentOS 6.2(64bit)
  • ホストマシンの eth0 は管理アクセス用。eth1 は tagged VLAN なネットワークにぶら下がる用。
  • 仮想マシンNICの対応も同
  • eth0 系は設定済が前提

パケットの流れはこんな感じ。
(tagged packet) -> Host:eth1 -> Host:br1 -> VM:eth1 -> (tagged packet)

ホストマシン側の設定

tcpdump で tagged packet が eth1 に上がってきてるか確認

# tcpdump -i eth1 -e
09:49:29.733814 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 91: vlan 10, p 0, ethertype IPv4, foo.bar.jp.60597 > 224.0.0.252.hostmon: UDP, length 25
09:49:29.734303 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 71: vlan 20, p 0, ethertype IPv4, foo.bar.jp.60032 > 224.0.0.252.hostmon: UDP, length 25

eth1 側(VLAN側)の設定

# vi /etc/sysconfig/network-script/ifcfg-eth1
DEVICE="eth1"
HWADDR="A4:11:2B:A9:C7:15"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE="br1"

tagged のまま素通しする br1 の設定

# vi /etc/sysconfig/network-script/ifcfg-br1
DEVICE="br1"
BOOTPROTO="none"
HWADDR="A4:11:2B:A9:C7:15"
ONBOOT="yes"
TYPE="Bridge"

設定を有効にするため、 network restart

# /etc/init.d/network restart
インターフェース br0 を終了中:                             [  OK  ]
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
インターフェース eth1 を活性化中:                          [  OK  ]
インターフェース br0 を活性化中:
br0 のIP情報を検出中... 完了。
                                                           [  OK  ]
インターフェース br1 を活性化中:                           [  OK  ]

仮想マシン側の設定

仮想マシンのconfigでNICを追加。追加したNICの接続先は、先に設定したbr1。
仮想マシンを起動して、ホストマシン側でbridgeの状態を確認すると、次のようになっているはず。

# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.e4115ba9c514       no              eth0
                                                        vnet0
br1             8000.e4115ba9c515       no              eth1
                                                        vnet1

仮想マシンLinux にログインして、追加した eth1 の設定を入れる。

# vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE="eth1"
BOOTPROTO="none"
HWADDR="52:54:00:8F:32:AB"
ONBOOT="yes"
TYPE="Ethernet"

eth1 を有効にする。

# ifconfig eth1 up

tcpdump で tagged packet が上がってきてるか確認

# tcpdump -i eth1 -e
09:50:10.361190 XX:XX:XX:XX:XX:XX (oui Unknown) > XX:XX:XX:XX:XX:XX (oui Unknown), ethertype 802.1Q (0x8100), length 64: vlan 10, p 0, ethertype ARP, Request who-has 192.168.1.1 tell 192.168.1.1, length 46
10:53:15.293586 XX:XX:XX:XX:XX:XX (oui Unknown) > Broadcast, ethertype 802.1Q (0x8100), length 64: vlan 20, p 0, ethertype ARP, Request who-has 192.168.1.1 tell 192.168.1.1, length 46

ここまでできたら、LinuxでタグVLAN | なんとかなりたい にあるように
仮想マシン内で untag してやればVLAN扱い放題に。

後書きのようなもの

Vyatta を仮想マシンで動かして〜という話はよく聞くものの、tagged VLAN を扱った情報がほとんど見あたらない。
Vyatta 自体で tagged VLAN を扱えるので、ホスト側では VLAN はスルーにしてゲストの Vyatta 側で好きなVLANを操って、
という形にした方が(少なくともサーバ内では)設定を一箇所に集めることができて管理が楽になるはず。
しかしながら、ホスト側で br0.xxx br0.yyy の様なデバイスを作り、untag したものをゲスト側に渡して…という情報しか見つけられなかったわけで、tagged packet をホスト内素通しでゲストまで届けられるのか?が疑問だった。


試してみて…すんなりゲストまでスルーされちゃった。と。
bridge の機能上、当たり前すぎるから誰も書いてなかったのかなーと思う次第。


tagged packet ---> eth0 -> br0 -> tap0 ---> VM nic こんな環境で、ホストに eth0.xxx ってデバイス
作ると、ホスト側で untag packet が入ってくるようになったり、結構柔軟だなーとか思ったり。


ホストの NIC を全部 bonding して、ホスト外とのやりとりは tagged packet だけ、って形もできそう。

テプラPROラベル作成ソフトのSPC9がWindows7で起動しない問題の対処

テプラPROラベル作成ソフトのSPC9 Ver3.61 がWindows7(32bit)では、スプラッシュが出るだけで固まってしまい、起動しない問題の対処方法。

SPC9 がインストールされたフォルダを開き、その内にある「epcjkhei.ttf」「H2GTRB.ttf」を(コントロールパネルのフォントを開いて)フォントとしてインストールします。

これで起動するようになるはず。

情報源はこちら。
テプラ PRO用 ラベルソフト|Windows 7 アプリケーション動作報告リスト
気づいたこと共有: SPC9 テプララベルソフト3.61で固まる時の対応

2013/7/1 情報源がリンク切れしていたので、新たなソースを追記
(Win8 対応を謳う SPC9 Ver3.70が出ているので、更新するほうがいいかも(未検証) SPC9 Ver3.70/SDM9 Ver3.61/SPC3 Ver1.01 のダウンロード | 機種選択 | 「ファイル」と「テプラ」のキングジム )
2013/7/13 Ver3.70 でもダメなそうで fromコメント(ThxTEPRA職人さん)

GH-USB-8ADKのmicroUSBコネクタはデータ通信に非対応

GREEN HOUSE のUSBマルチ充電コネクタセットGH-USB-8ADK

GREEN HOUSE 携帯電話 USB充電ケーブル ブラック (7コネクタ+MiniB5タイプ) GH-USB-8ADK

GREEN HOUSE 携帯電話 USB充電ケーブル ブラック (7コネクタ+MiniB5タイプ) GH-USB-8ADK

これのminiB-microUSBコネクタは充電専用。
Xperia非対応のUSB ACアダプタでもXperiaが充電されるのでD+とD-が内部で短絡されてる模様。

同封の巻き取りUSBケーブルは普通のストレート結線なので惜しいところ。
普段は充電用に使いつつ、PCと繋げば通信も…とか皮算用してただけに、ちょっと残念(´・ω・`)
充電・データ通信切り替えできるミヤビックスのminiB-microUSB変換アダプタ HAMIBMCBSW で補完か。

CentOS 6.2 に Open vSwitch をインストールする手順

CentOS 6.2 に Open vSwitch をインストールする手順について。
rpm 化したほうが入れたり消したりが便利なので、全て rpm でのインストールです。

要点

  • KVM + libvirtd での仮想化環境のホスト側仮想スイッチとして、デフォルトの Linux bridge の置き換えが目的
  • すでにbridge構成なネットワークになっている仮想化環境を想定
  • 全部 rpm でインストールする


ざっくりとこんな流れ

  1. 2.64 以降の autoconf をインストール
  2. Open vSwitch のビルドに必要なその他パッケージ(kernel-devel openssl-devel)をインストール
  3. Open vSwitch のrpmを作成、インストール
  4. Open vSwitch の設定

autoconf 2.68 を rpm でインストール

まず Open vSwitch のビルドに必要な autoconf の 2.64 以降、ここでは最新版の 2.68 を入れる。
checkinstallrpm を作ってからのインストールになります。
checkinstall のインストール手順は d:id:naga_sawa:20120410 の記事参照のこと)

まず autoconf の tar ball をダウンロードする。

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
--2012-04-03 12:02:05--  http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz
ftp.gnu.org をDNSに問いあわせています... 208.118.235.20, 2001:4830:134:3::b
ftp.gnu.org|208.118.235.20|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1860672 (1.8M) [application/x-gzip]
`autoconf-2.68.tar.gz' に保存中

100%[======================================>] 1,860,672    441K/s 時間 4.1s

2012-04-03 12:02:10 (441 KB/s) - `autoconf-2.68.tar.gz' へ保存完了 [1860672/1860672]


展開して configure & make

$ tar zxf autoconf-2.68.tar.gz
$ cd autoconf-2.68
$ ./configure --prefix=/usr --libdir=/usr/lib64
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
(略)
config.status: creating lib/autoscan/Makefile
config.status: creating lib/m4sugar/Makefile
config.status: creating lib/autoconf/Makefile
config.status: creating lib/autotest/Makefile
config.status: creating bin/Makefile
config.status: executing tests/atconfig commands

$ make
(略)
chmod +x ifnames.tmp
chmod a-w ifnames.tmp
mv -f ifnames.tmp ifnames
make[2]: Leaving directory `/home/foobar/autoconf-2.68/tests'
Making all in man
make[2]: Entering directory `/home/foobar/autoconf-2.68/man'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/home/foobar/autoconf-2.68/man'
make[1]: Leaving directory `/home/foobar/autoconf-2.68'


checkinstallRPM 作成。
既存パッケージと干渉する部分が出てくるので --inspect オプションを付けておく。

# checkinstall --inspect

お決まりの構築手順を進めると、 vi が起動してパッケージするファイルを変更できるので、binutils-2.20.51.0.2-5.28.el6.x86_64 と競合する以下2つを削除する。

  • /usr/share/info/dir
  • /usr/share/info/standards.info

何かしら問題出るかもしれないけど、手元の環境では今のところ問題なし。

バックアップパッケージを書き込み..OK

temp dirを削除..OK


**********************************************************************

 Done. The new package has been saved to

 /root/rpmbuild/RPMS/x86_64/autoconf-2.68-1.x86_64.rpm
 You can install it in your system anytime using:

      rpm -i autoconf-2.68-1.x86_64.rpm

**********************************************************************


できあがった autoconf をインストール。

#  rpm -Uvh /root/rpmbuild/RPMS/x86_64/autoconf-2.68-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:autoconf               ########################################### [100%]

Open vSwitch のビルドに必要な既存パッケージをインストール

# yum install kernel-devel openssl-devel

Open vSwitch の make とインストール

Open vSwitch をダウンロード&展開

$ wget http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
--2012-04-12 14:05:32--  http://openvswitch.org/releases/openvswitch-1.4.0.tar.gz
openvswitch.org をDNSに問いあわせています... 69.56.251.103
openvswitch.org|69.56.251.103|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1972471 (1.9M) [application/x-gzip]
`openvswitch-1.4.0.tar.gz' に保存中

100%[======================================>] 1,972,471    292K/s 時間 8.5s

2012-04-12 14:05:41 (226 KB/s) - `openvswitch-1.4.0.tar.gz' へ保存完了 [1972471/1972471]

$ tar zxf openvswitch-1.4.0.tar.gz


configure

$ cd openvswitch-1.4.0
$ ./boot.sh
$ ./configure --with-linux=/lib/modules/`uname -r`/build
(略)
config.status: creating datapath/linux/Makefile
config.status: creating datapath/linux/Makefile.main
config.status: creating tests/atlocal
config.status: creating config.h
config.status: executing tests/atconfig commands
config.status: executing depfiles commands
config.status: executing include/openflow/openflow.h.stamp commands
config.status: executing ovsdb/ovsdbmonitor/dummy commands
config.status: executing utilities/bugtool/dummy commands


make して Open vSwitch の rpm 作り。

$ make dist
(略)
make[1]: ディレクトリ `/home/foobar/openvswitch-1.4.0' に入ります
make[1]: ディレクトリ `/home/foobar/openvswitch-1.4.0' から出ます
test -n "" \
        || find "openvswitch-1.4.0" -type d ! -perm -755 \
                -exec chmod u+rwx,go+rx {} \; -o \
          ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
          ! -type d ! -perm -444 -exec /bin/sh /home/foobar/openvswitch-1.4.0/build-aux/install-sh -c -m a+r {} {} \; \
        || chmod -R a+r "openvswitch-1.4.0"
tardir=openvswitch-1.4.0 && /bin/sh /home/foobar/openvswitch-1.4.0/build-aux/missing --run tar chof - "$tardir" | GZIP=--best gzip -c >openvswitch-1.4.0.tar.gz
{ test ! -d "openvswitch-1.4.0" || { find "openvswitch-1.4.0" -type d ! -perm -200 -exec chmod u+w {} ';' && rm -fr "openvswitch-1.4.0"; }; }

$ mkdir -p ~/rpmbuild/SOURCES
$ mv ./openvswitch-1.4.0.tar.gz ~/rpmbuild/SOURCES/
$ rpmbuild -bb --target=x86_64 rhel/openvswitch-kmod-rhel6.spec
(略)
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/foobar/rpmbuild/BUILDROOT/openvswitch-kmod-1.4.0-1.el6.x86_64
警告: ホスト名を正式なものにできません: foobar.jp
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/kmod-openvswitch-1.4.0-1.el6.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.bkfPrF
+ umask 022
+ cd /home/foobar/rpmbuild/BUILD
+ cd openvswitch-1.4.0
+ rm -rf /home/foobar/rpmbuild/BUILDROOT/openvswitch-kmod-1.4.0-1.el6.x86_64
+ exit 0

$ rpmbuild -bb --target=x86_64 rhel/openvswitch.spec
(略)
Processing files: openvswitch-debuginfo-1.4.0-1.x86_64
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/foobar/rpmbuild/BUILDROOT/openvswitch-1.4.0-1.x86_64
警告: ホスト名を正式なものにできません: foobar.jp
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/openvswitch-1.4.0-1.x86_64.rpm
書き込み完了: /home/foobar/rpmbuild/RPMS/x86_64/openvswitch-debuginfo-1.4.0-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.tgkPfe
+ umask 022
+ cd /home/foobar/rpmbuild/BUILD
+ cd openvswitch-1.4.0
+ rm -rf /home/foobar/rpmbuild/BUILDROOT/openvswitch-1.4.0-1.x86_64
+ exit 0


~/rpmbuild/RPMS/x86_64/ に 3 本の rpm が出来ているのでインストール
kmod-openvswitch で時間がかかるけど我慢

$ cd ..
$ ll rpmbuild/RPMS/x86_64/
kmod-openvswitch-1.4.0-1.el6.x86_64.rpm
openvswitch-1.4.0-1.x86_64.rpm
openvswitch-debuginfo-1.4.0-1.x86_64.rpm
$ cp rpmbuild/RPMS/x86_64/*.rpm .

# rpm -ivh kmod-openvswitch-1.4.0-1.el6.x86_64.rpm openvswitch-1.4.0-1.x86_64.rpm openvswitch-debuginfo-1.4.0-1.x86_64.rpm
準備中...                ########################################### [100%]
   1:kmod-openvswitch       ########################################### [ 33%]
   2:openvswitch            ########################################### [ 67%]
   3:openvswitch-debuginfo  ########################################### [100%]


インストールされたのを確認

# ovs-vsctl -V
ovs-vsctl (Open vSwitch) 1.4.0
Compiled Apr 12 2012 14:17:32


CentOS6.2 のパッケージの libvirt 0.9.4 は OpenvSwitchにネイティブ対応していないので、/etc/sysconfig/openvswitch を修正して Linux bridge 互換機能を有効にする。
(brcompatdとbrcompat_modが有効になる…なってるんだと思う)

# vi /etc/sysconfig/openvswitch
+BRCOMPAT=yes  ←最後に追記/もしくはコメント外す


既存のbridge設定の変更(現環境で bridge を使ってない人はスルーで)

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="none"
HWADDR="XX:XX:XX:XX:XX:XX"
ONBOOT="yes"
TYPE="Ethernet"
-BRIDGE="br0"  ←これを消す ovs 側で設定するので


既存 Linux bridge を止める。
(既にbridge環境導入済みで br_x にアドレスが振ってある場合はネットワークが切れるのでリモート作業している場合は注意)

# rmmod bridge


再起動

# reboot


動作確認

$ lsmod | grep openvswitch
openvswitch_mod        83029  1
$ chkconfig --list | grep openvswitch
openvswitch     0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ /etc/init.d/openvswitch status
ovsdb-server is running with pid 1628
ovs-vswitchd is running with pid 1637

元の bridge 状態と同様になるよう Open vSwitch を設定

元は br0 に eth0 がぶら下がっている環境を想定してます。
Open vSwitch では add-br で bridge デバイスを登録して、add-port でそれに eth0 をぶら下げます。

# ovs-vsctl add-br br0
# ovs-vsctl add-port br0 eth0


設定状況の確認

# ovs-vsctl show
3be7f9ef-5e64-42a8-b27c-f94e04b5c78c
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "eth0"
            Interface "eth0"
    ovs_version: "1.4.0"


br0 が寝ていると困るので、network を restart しておく。

# /etc/init.d/network restart
インターフェース br0 を終了中:                             [  OK  ]
インターフェース eth0 を終了中:                            [  OK  ]
ループバックインターフェースを終了中                       [  OK  ]
ループバックインターフェイスを呼び込み中                   [  OK  ]
インターフェース eth0 を活性化中:                          [  OK  ]
インターフェース br0 を活性化中:                           [  OK  ]

# ifconfig
br0       Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.11.48  Bcast:192.168.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:3057 errors:0 dropped:0 overruns:0 frame:0
          TX packets:353 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:431595 (421.4 KiB)  TX bytes:44540 (43.4 KiB)

eth0      Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:1043 errors:0 dropped:0 overruns:0 frame:0
          TX packets:98 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:141364 (138.0 KiB)  TX bytes:15031 (14.6 KiB)
          Interrupt:16 Memory:c0000000-c0012800

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:480 (480.0 b)  TX bytes:480 (480.0 b)


疎通確認。

# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_seq=1 ttl=255 time=1.29 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=255 time=0.417 ms
^C
--- 192.168.11.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1434ms
rtt min/avg/max/mdev = 0.417/0.855/1.294/0.439 ms


これでリモートから入れるようになったはず。
仮想マシンを起動すると、仮想NICのtap(以下の例ではvnet0がそれ)がovsのbr0に追加されてることがわかるはず。

# ovs-vsctl show
3be7f9ef-5e64-42a8-b27c-f94e04b5c78c
    Bridge "virbr0"
        Port "virbr0"
            Interface "virbr0"
                type: internal
        Port "virbr0-nic"
            Interface "virbr0-nic"
    Bridge "br0"
        Port "br0"
            Interface "br0"
                type: internal
        Port "vnet0"
            Interface "vnet0"
        Port "eth0"
            Interface "eth0"
    ovs_version: "1.4.0"

参考

Open vSwitch をいじるにあたり、色々と先人の辿った道を参考にしました。