2016年9月30日金曜日

piscesとariesのIPを固定化しよう

とりあえず、piscesとariesが、aquariusやその他のマシンとフラットなネットワークに接続されるようになった。
aquariusや別途動かしているWindows機(コレ、将来作り変えてOSも変えるツモリだけど)は固定IPにして運用している。

piscesやariesは、今後の検証作業でサーバとしてかなりガッツリ稼働してもらうことになるので、固定IPにしておいた方が色々便利だ。
そのため、IPアドレスを固定にする。

それぞれ、以下のアドレスを割り当てる予定だ。
ホスト名IPアドレス
pisces192.168.55.133/24
aries192.168.55.134/24

2環境とも、OSはubuntu 14.04 LTSのため、その流儀に従うことになる。
OSがubuntu 16.04のaquariusとは若干異なる。

というわけで設定。
まずはpiscesから。

(pisces)$ sudo vi /etc/network/interfaces
末尾、primary network interfaceの宣言部を、以下のように更新しよう。
--ココから
# The primary network interface
auto eth0
iface eth0 inet dhcp

# The primary network interface
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
    address   192.168.55.133
    netmask   255.255.255.0
    network   192.168.55.0
    broadcast 192.168.55.255
    gateway   192.168.55.1

dns-nameservers 192.168.55.1
--ココまで

ファイルが作成し終わったら、piscesを再起動して確認だ。
(pisces)$ sudo shutdown -r now
(pisces)$ ip address show
(pisces)$ dig news.google.co.jp

上手く反映されていたら、同じ作業をariesにも実施だ。
設定ファイル(/etc/network/interfaces)のaddress宣言だけ、192.168.55.134にするだけで、後の作業は全く同じはずだ。

pisces、ariesともに固定IP化出来たら、今回はおしまい。

2016年9月28日水曜日

Open vSwitchのREADME

Open vSwitchを調べていた時、どうも情報量が少なく感じた。
それもあって、中々設定が出来なかった。

で、よくよく考えてみたら、UbuntuのベースであるDebian GNU/Linuxは、ドキュメント類もある程度揃っていることを思い出した。
なので、そのドキュメントをチェックしてみればヨカッタ。

ドキュメントは、以下のpathに存在している。(パッケージはopenvswitch-switch(2.5.0-0ubuntu1)のものを見ている。)
/usr/share/doc/openvswitch-switch/README.Debian.gz

で、コイツは英語で書かれているので、以下にメモとして記載するのと併せて、超意訳しておくことにする。
--ココから
README.Debian for openvswitch-switch
---------------------------------

The Linux kernel 3.3 or later has an integrated Open vSwitch kernel module.  Theis Linux kernel module lacks a few features that are in the third-party module.  For details, please see the FAQ, "What features are not available in the Open vSwitch kernel datapath that ships as part of the upstream Linux kernel?".  If you need the additional features, you will need to build and install a Linux kernel module by hand from the openvswitch source package.

Linuxカーネル3.3以降の便利なOpen vSwitchのカーネルモジュールがあります。これらのLinuxカーネルモジュールは、サードパーティのモジュールにあるいくつかの機能を欠いています。詳細については、「What features are not available in the Open vSwitch kernel datapath that ships as part of the upstream Linux kernel?」というFAQをご覧ください。これらの機能が必要な場合は、openvswitchソースパッケージからLinuxカーネルモジュールの構築とインストールする必要があります。

Debian network scripts integration
----------------------------------
This package lets a user to optionally configure Open vSwitch bridges and ports from /etc/network/interfaces. Please refer to the interfaces(5) manpage for more details regarding /etc/network/interfaces.

Open vSwitchのブリッジとポート設定を、どのように/etc/network/interfacesへ記載するのか、そのオプションについて記述しています。その他の/etc/network/interfacesの記載内容については、interfaces(5)のman pageを参照してください。

The stanzas that configure the OVS bridges should begin with "allow-ovs" followed by name of the bridge. Here is an example.
allow-ovs br0

OVSブリッジを設定をするには、"allow-ovs"で始まり、対象ブリッジの名前が続く記述が必要です。こちらは一例です。
allow-ovs br0

The stanzas that configure the OVS ports should begin with "allow-${bridge-name}" followed by name of the port. Here is an example.
allow-br0 eth0

OVSポートを設定するには、"allow-ブリッジ名"で始まり、ポートの名前が続く記述になります。こちらは一例です。
allow-br0 eth0

The following OVS specific "command" options are supported:
これらの定義には、以下に記載するコマンドオプションがあります。

    - ovs_type: This can either be OVSBridge, OVSPort, OVSIntPort, OVSBond, OVSPatchPort or OVSTunnel depending on whether you configure a bridge, port, an internal port, a bond, a patch port or a tunnel. This is a required option.
    - ovs_type: 設定する対象を指定します。設定したい内容に応じてOVSBridge、OVSPort、OVSIntPort、OVSBond、OVSPatchPortまたはOVSTunnelのいずれかを指定します。これは必須です。

    - ovs_ports: This option specifies all the ports that belong to a bridge.
    - ovs_ports: このオプションでは、ブリッジに属するすべてのポートを指定します。

    - ovs_bridge: This options specifies a bridge to which a port belongs. This is a required option for a port.
    - ovs_bridge: このオプションは、ポートが所属するブリッジを指定します。これは、ポートの必須オプションです。

    - ovs_bonds: This option specifies the list of physical interfaces to be bonded together.
    - ovs_bonds: このオプションは、複数の物理インターフェイスをbondする場合に使用します。複数の物理インターフェースを指定することで、結合された1つのインターフェースに出来ます。

    - ovs_patch_peer: For "OVSPatchPort" interfaces, this field specifies the patch's peer on the other bridge.
    - ovs_patch_peer: ovs_typeが"OVSPatchPort"の場合、このフィールドは、他のbridgeを指定することで、そのスイッチと結合出来ます。

    - ovs_tunnel_type: For "OVSTunnel" interfaces, the type of the tunnel. For example, "gre", "vxlan", etc.
- ovs_tunnel_type: ovs_typeが"OVSTunnel"の場合、"gre"、"vxlan"など、そのトンネルの種類を指定します。

    - ovs_tunnel_options: For "OVSTunnel" interfaces, this field should be used to specify the tunnel options like remote_ip, key, etc.
    - ovs_tunnel_options: "OVSTunnel"の場合、このフィールドはREMOTE_IP、キーなどのようなトンネルオプションを指定します。

    - ovs_options: This option lets you add extra arguments to a ovs-vsctl command. See examples.
    - ovs_options: このオプションは、ovs-vsctlコマンドに追加の引数を追加することができます。例を参照してください。

    - ovs_extra: This option lets you run additional ovs-vsctl commands, separated by "--" (double dash). Variables can be part of the "ovs_extra" option. You can provide all the standard environmental variables described in the interfaces(5) man page. You can also pass shell commands.
    - ovs_extra: このオプションにより、"--"(ハイフン2つ)で区切られた、追加のOVS-vsctlコマンドを実行することができます。変数は"ovs_extra"オプションの一部とすることができます。interfaces(5)のマニュアルページに記載されているすべての標準環境変数を提供することができます。また、シェルコマンドを渡すことができます。

More implementation specific details can be seen in the examples.
いくつかの例を挙げておきます。

Examples:
--------
ex 1: A standalone bridge.
(単純なブリッジの例。物理インターフェースへの接続が無いローカルブリッジになります。)

allow-ovs br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    ovs_type OVSBridge

ex 2: A bridge with one port.
(単純なブリッジの例。物理インターフェース:eth0が接続されています。)

allow-ovs br0
iface br0 inet dhcp
    ovs_type OVSBridge
    ovs_ports eth0

allow-br0 eth0
iface eth0 inet manual
    ovs_bridge br0
    ovs_type OVSPort

ex 3: A bridge with multiple physical ports.
(複数の物理インターフェースを接続したブリッジの例。bondingではありません。)

allow-ovs br0
iface br0 inet dhcp
    ovs_type OVSBridge
    ovs_ports eth0 eth1

allow-br0 eth0
iface eth0 inet manual
    ovs_bridge br0
    ovs_type OVSPort

allow-br0 eth1
iface eth1 inet manual
    ovs_bridge br0
    ovs_type OVSPort

ex 4: A bridge with an OVS internal port.
(VLANタグを持ったスイッチの例。)

allow-ovs br1
iface br1 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    ovs_type OVSBridge
    ovs_ports vlan100

allow-br1 vlan100
iface vlan100 inet manual
    ovs_bridge br1
    ovs_type OVSIntPort
    ovs_options tag=100
    ovs_extra set interface ${IFACE} external-ids:iface-id=$(hostname -s)

ex 5: Bonding.
(bonding例。eth2とeth3でbondingを組んだ形になります。)

allow-ovs br2
iface br2 inet static
    address 192.170.1.1
    netmask 255.255.255.0
    ovs_type OVSBridge
    ovs_ports bond0

allow-br2 bond0
iface bond0 inet manual
    ovs_bridge br2
    ovs_type OVSBond
    ovs_bonds eth2 eth3
    ovs_options bond_mode=balance-tcp lacp=active

ex 6: Patch ports.
(Patch portを使用した例。br0のpatch0ポートと、br1のpatch1ポートが接続されています。)

allow-ovs br0
iface br0 inet manual
    ovs_type OVSBridge
    ovs_ports patch0

allow-br0 patch0
iface patch0 inet manual
    ovs_bridge br0
    ovs_type OVSPatchPort
    ovs_patch_peer patch1

allow-ovs br1
iface br1 inet manual
    ovs_type OVSBridge
    ovs_ports patch1

allow-br1 patch1
iface patch1 inet manual
    ovs_bridge br1
    ovs_type OVSPatchPort
    ovs_patch_peer patch0

ex 7: Tunnel.
(トンネルモードの例)

allow-ovs br1
iface br1 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    ovs_type OVSBridge
    ovs_ports gre1

allow-br1 gre1
iface gre1 inet manual
    ovs_bridge br1
    ovs_type OVSTunnel
    ovs_tunnel_type gre
    ovs_tunnel_options options:remote_ip=182.168.1.2 options:key=1

ex 8: Create and destroy bridges.
(ブリッジを作成・削除するコマンド例。)

ifup --allow=ovs $list_of_bridges
ifdown --allow=ovs $list_of_bridges

 -- Ben Pfaff <pfaffben@debian.org>, Tue, 19 Aug 2014 08:29:32 -0700

Notes on dependencies:
---------------------

openvswitch-switch depends on $network, $named $remote_fs and $syslog to start. This creates some startup dependency issues.

openvswitchスイッチは$network、$named、$remote_fs、$syslogに依存します。これらは、起動時に問題が発生する要因となりえます。

* Since openvswitch utilities are placed in /usr and /usr can be mounted through NFS, openvswitch has to start after it.  But if a user uses openvswitch for all his networking needs and hence to mount NFS, there will be a deadlock. So, if /usr is mounted through NFS and openvswitch is used for all networking, the administrator should figure out a way to mount NFS before starting OVS. One way to do this is in initramfs.

* Open vSwitchコマンド類は、/usr 以下に配置されます。そのため、/usr がNFSマウントの場合にデッドロック等の問題を引き起こします。それらの問題を回避するには、/usr がNFSマウントされてから Open vSwitchを起動する方法を検討する必要があります。initramfs等を使用することで回避が可能になります。

* Since openvswitch starts after $network, $remote_fs and $syslog, any startup script that depends on openvswitch but starts before it, needs to be changed to depend on openvswitch-switch too.

* openvswitchは$network、$remote_fs、$syslog、openvswitch及び各種スタートアップスクリプトに依存します。Open vSwitchは任意の起動スクリプトの後に起動するようにすべきかもしれません。

* Ideally, an admin should not add openvswitch bridges in the 'auto' section of the 'interfaces' file.  This is because, when ifupdown starts working on bridges listed in 'auto', openvswitch has not yet started.

* 基本的に、管理者は、"interfaces"ファイルのautoセクションにopenvswitchブリッジを追加してはいけません。 Open vSwitchがまだ起動していないタイミングで、ifupdownが開始されてしまいます。

But, if the admin wants to go down this route and adds openvswitch bridges in the 'auto' section, openvswitch-switch will forcefully be started when ifupdown kicks in. In a case like this, the admin needs to make sure that /usr has already been mounted and that a remote $syslog (if used) is ready to receive openvswitch logs.

Open vSwitchをautoセクションに入れた場合、ifupdownが起動するときにOpen vSwitchが強制的に起動されます。このようにしたい場合は、/usr が先にマウントされるように構成する必要があります。また、syslogサーバを使用している場合、そのサーバがsyslogメッセージを受け入れるように構成する必要があります。
--ココまで

Open vSwitch試してみよう

とりあえず、Open vSwtichを試してみる。

Open vSwitchは、どうやらNetworkManagerでは管理出来ないっぽい。
まだNetworkManagerが対応していないようなのだ。
IPを付与している物理NICも、Network Managerではなく、旧来の管理方法(/etc/network/interfaces)を用いる必要があるようだ。
せっかく、IPアドレスの固定化でNetworkManagerを使用したのに、元に戻すことになってしまう。

大きな流れは以下の通りだ。
  1. Open vSwitchをインストールする。
  2. NetworkManagerから旧来の/etc/network/interfacesに切り替える。
  3. Open vSwitchのブリッジを作成する。
  4. /etc/network/interfacesの設定を書き換え、物理NICのIPアドレスを削除(ブリッジに接続)し、ブリッジにIPアドレスを付与する設定にする。
  5. KVMに新しいネットワークを作成する。(Open vSwitchで作成したブリッジを認識させる。既存のdefaultをOpen vSwitchに切り替えるやり方もアリ。)
  6. 既存の仮想マシンの接続先を、新しいネットワークに変更する。
1番と2番は順序は関係無い。2番を先に実施してもいいぞ。
この間、何度かOS再起動をしながら確認することになるため、コンソールから作業することになる。

以下、上記流れに沿って実施してみる。
  1. Open vSwitchをインストールする。
    (aquarius)$ sudo apt-get update
    (aquarius)$ sudo apt-get --simulate install openvswitch-switch
    (aquarius)$ sudo apt-get install openvswitch-switch
     
  2. NetworkManagerから旧来の/etc/network/interfacesに切り替える。
    今回は、interfacesに直接記載するのではなく、/etc/network/interfaces.dの下にNICの名前のファイルを作って、そちらに定義してみることにする。
    (aquarius)$ sudo vi /etc/network/interfaces.d/enp0s25
    ----以下の内容で作成----
    auto enp0s25
    iface enp0s25 inet static
        address   192.168.55.131
        netmask   255.255.255.0
        network   192.168.55.0
        broadcast 192.168.55.255
        gateway   192.168.55.1

        dns-nameservers 192.168.55.1
        #dns-nameservers 8.8.8.8
    ----ココまで----
    あくまで、192.168.55.131/24のIPアドレスを付与する時の設定で、ルータのアドレスが192.168.55.1であることを想定して書いている。
    各自、自分のネットワーク環境に合わせて欲しい。

    また、最後の行は意味が無い行だ。ネームサーバを複数指定可能な環境の人向けのサンプルと思ってくれぃ。

    これを設定したら、一度OSを再起動して、正しく反映されるか確認しておこう。
    (aquarius)$ sudo shutdown -r now
    (aquarius)$ ip address show
    (aquarius)$ nmtui
    nmtuiで「接続をアクティベートする」を選び、enp0s25にマーク(*)が付いていなければ、NetworkManager管理下に無い(interfaces管理下)ので成功だ。

    ネームサーバの設定も行われているか確認しておこう。
    (aquarius)$ dig www.yahoo.co.jp
     
  3. Open vSwitchのブリッジを作成する。
    (ここでは、br-external という名前にしている)
    (aquarius)$ sudo ovs-vsctl show
    5070b377-4ad8-4ede-9ab5-d69ccfa820cb
        ovs_version: "2.5.0"
    (aquarius)$ sudo ovs-vsctl list-br
    (aquarius)$ sudo ovs-vsctl add-br br-external
    (aquarius)$ sudo ovs-vsctl show
    5070b377-4ad8-4ede-9ab5-d69ccfa820cb
        Bridge br-external
            Port br-external
                Interface br-external
                    type: internal
        ovs_version: "2.5.0"
    (aquarius)$ sudo ovs-vsctl list-br
    br-external
    (aquarius)$ sudo ovs-vsctl list-ports br-external
    (aquarius)$ sudo ovs-vsctl list-ifaces br-external
    (aquarius)$ sudo ovs-vsctl get-controller br-external
    (aquarius)$ sudo ovs-vsctl get-aa-mapping br-external
    (aquarius)$ sudo ovs-vsctl get-manager

    こんなんでいいのかな…?
     
  4. /etc/network/interfacesの設定を書き換え、物理NICのIPアドレスを削除(ブリッジに接続)し、ブリッジにIPアドレスを付与する設定にする。

    今度は、物理NIC(enp0s25)のIPアドレスを削除して、ブリッジI/Fを作成、IPアドレスをそちらに付与する。
    よく分かっていないのだが、ブリッジ側にIPを付与しないと、ホストマシン(aquarius)のネットワークが使えなくなるのだ。
    まずは、先に作成した設定ファイルを別の場所に移動しておく。(そのためのディレクトリも作っておく。)
    (aquarius)$ sudo mkdir /etc/network/interfaces.d.old
    (aquarius)$ ls -al /etc/network/interfaces.d.old
    (aquarius)$ sudo mv /etc/network/interfaces.d/enp0s25 /etc/network/interfaces.d.old/
    (aquarius)$ ls -al /etc/network/interfaces.d.old

    続いて、物理NICのIPを削除。(IP未設定とする)
    物理NIC設定と、ブリッジ設定で順番があるかもしれないので、ファイル名に数字を付与しておく。
    (aquarius)$ sudo vi /etc/network/interfaces.d/0110.enp0s25
    --ココから--
    auto enp0s25
    allow-br-external
    iface enp0s25 inet manual
        ovs_bridge br-external
        ovs_type   OVSPort
    --ココまで--

    ブリッジへのIP付与だ
    (aquarius)$ sudo vi /etc/network/interfaces.d/0010.br-external
    --ココから--
    auto br-external
    allow-ovs br-external
    iface br-external inet static
        address   192.168.55.131
        network   192.168.55.0
        netmask   255.255.255.0
        broadcast 192.168.55.255
        gateway   192.168.55.1
        ovs_type  OVSBridge
        ovs_ports enp0s25

        dns-nameservers 192.168.55.1
    --ココまで--

    ここまで出来たら、一度OSを再起動し、設定が反映されるか確認しよう。
    (aquarius)$ sudo shutdown -r now
    (aquarius)$ ip address show
    (aquarius)$ dig www.blogger.com
    (aquarius)$ sudo ovs-vsctl show

    ip address showを実行したら、今までIPが付与されていたenp0s25には直接IPは付与されておらず、master ovs-sysytemとなっていることが確認できる。
    (IPv6アドレスは特に変更していないため、リンクローカルアドレスは付与されているが…)

    そして、br-externalにIPが付与されているはずだ。
     
  5. KVMに新しいネットワークを作成する。(Open vSwitchで作成したブリッジを認識させる。既存のdefaultをOpen vSwitchに切り替えるやり方もアリ。)

    新しいネットワーク定義を作成するので、既存の定義を確認しておく。
    (aquarius)$ virsh net-list --all

    新しいネットワーク定義用のxmlファイルを作成する。
    (aquarius)$ vi ovsbridge.xml
    --ここから
    <network>
      <name>ovsbridge</name>
      <forward mode='bridge'/>
      <bridge name='br-external'/>
      <virtualport type='openvswitch'/>
    </network>
    --ここまで

    作成した定義ファイルを取り込もう。
    (aquarius)$ virsh net-define ovsbridge.xml
    (aquarius)$ virsh net-list --all

    定義が取り込めたら、自動起動に設定する。
    (aquarius)$ virsh net-autostart ovsbridge
    (aquarius)$ virsh net-list --all

    併せて、ネットワーク定義を起動しておこう。
    (aquarius)$ virsh net-start ovsbridge
    (aquarius)$ virsh net-list --all
     
  6. 既存の仮想マシンの接続先を、新しいネットワークに変更する。
    piscesもariesも同じ作業なので、同じ手順で設定できる。

    まずは、今の状態を出力しておく。
    (aquarius)$ virsh dumpxml pisces

    内容を確認したら、仮想マシンのネットワーク接続先をdefaultからovsbridgeに書き換える。
    (aquarius)$ virsh edit pisces
    <interface type='network'>という定義を探して、その中にある<source network='default'/>を<source network='ovsbridge'/>に書き換えよう。

    終わったら、設定が反映されているか確認だ。
    (aquarius)$ virsh dumpxml pisces
これで設定は完了だ。
piscesやariesを起動、Remote Viewerからログインして、IPアドレスを確認してみて欲しい。
今までは、DHCPで192.168.122.xのIPアドレスが付与されていたと思うが、今はDHCPで192.168.55.xのアドレスが付与されているはずだ。
そのアドレスに向かって、aquarisや他の(192.168.55.xネットワーク上の)マシンからsshログインが出来ることも併せて確認して欲しい。

以後、仮想マシン作成時に、接続するネットワークをovsbridgeにすれば、ホストOS側と同じネットワークにフラットに接続できる。

本来、Open vSwitchは、SDN(Software Defined Network)に使うような高機能仮想スイッチだが、今回は単純スイッチとして使っている。(勿体無いが)
いずれ、SDNスイッチとして色々実験していくことになると思うが、当面やりたいことは実現出来た。

今回は以上。

2016年9月10日土曜日

Open vSwitch使いたい…

更新がぜんぜん出来てねぇ…。
忙しかったこともあるけど、N/W構成をイジるのに理解が進まなくて。

2つのゲストOS(piscesとaries)は今、bridge仮想スイッチ(virbr0)を通して外部と通信している。
virt-managerをインストールした時に自動で作成された仮想スイッチのようで、これとNATの機能が働いていて、いわゆるNAT通信が出来ている状態だ。
これだと、外部(KVMホストとは別のマシン)からこのゲストにアクセスすることが出来ない。
ゲストをサーバとして使いたいので、これでは不便だ。


そのため、これを外部I/Fと直接接続する形に変えて、KVMホストとは別のマシンから直接アクセス出来るようにしたい。


で、色々調べてて(調べ終わったわけじゃないけど)時間がかかっている、というのが現状だ。
また、メインマシンはNICが1系統(無線LANも搭載しているけど使ってない)しか無く、遠隔から作業を行う限り、このNICを使って接続しているわけだが、N/W周りの変更は、設定ミスで外から繋げられなくなる。
そのため、出来る限りコンソールから作業をしたいので、どうしても家にいて時間に余裕がある時で無いと試せない、という理由も合って、時間がかかっている。
(iSCSIもNFSもsshも、全て同じNICを通している。N/Wの設定ミスったら、iSCSIも使えなくなるのだ。)

調べていく過程で、今の構成のままでも、直接接続する形に変更することは可能だということは分かった。
virt-managerから、対象のゲストOSのNICの設定を選び、ネットワークリソースとソースモードを変更すれば可能だ。
ただ、これだと今度はホスト(aquarius)とゲスト(piscesやaries)が通信できなくなる。(仕様上しょうがないらしい…いや、頑張れば出来るのだろうが、あまり頑張りたくない。)



これだと、ホストを踏み台にしてゲストにログインすることが出来ないため、自分のニーズが満たせない。

で、更に調べて行ったら、仮想スイッチとしてOpen vSwitchというのを使用すればいいようだ。

というわけで、Open vSwitchを導入、設定していくことにする。

実は他に仮想スイッチのツールはあるらしい。
その中で、なんでOpen vSwitchを選んだか?まぁ、Openという名前が付いているのは、今後のメインストリームになっていく気がしているから、というだけだ。(Open Office Orgという例もあるが…)

少しずつ調べて行くことにする。