ラムをインストールする必要があります。-online"さらに、詳細やコマンド例を確認したい場合は、注釈に従って、以下のようにコマンドを入力してください。-full初回は以下のようにアップデートを要求されるため、yを入力してアップデートしてください。モジュールの最新のヘルプファイルをダウンロードして、コンピューターにインストールします。Interfaceの設定が全て消えました。Up後は再度作り直しが必要となります。作り直した後、コンパネ上の名前*2が「イーサネットxx」と表示されます。これを元々使っていた名前(例えば、vlan300)に変更しようとすると、以下のエラーが表示され、同じ名前に設定することができません。このため、「vlan0300」や「v300」など名前を工夫してください。*3加えて、IntelNICドライバのVersionは24.3以降の方が良さそうです。情報ソースは以下のURLとなります。Interfaceの有効化ができなくなりました。このため、IntelNICドライバをVer25.0.0.0へアップデートしたところ正常に動作することを確認しました。7.最後に以下のサイトを参考にさせて頂きました。Interface作成が可能だった時期があったと思います。InterfaceがGUI(NICの構成のプロパティ)で作成可能になりました。Interfaceが消えたりしていたため、一抹の不安を感じていたのですが、Intelのサイトやフォーラムを読んでいくと、いろいろと試行錯誤していた変遷がわかりました。NICの構成のプロパティでは、色々と制約があったようで、今回ご紹介したPowerShellによる設定となったようです。Utility)上で設定できるみたいなので、それを待ちたいと思います。今回はチーミングについて触れていませんが、上記のIntelサイトにはチーミングコマンドについても記載があるため、興味がある方はヘルプを参照しながら設定してみてください。Nameではなく、コンパネ上の表示名の方です。*3:VerUp前の名前はレジストリ上にゴミとして残っていますが、これを消すのリスクの方が大きいと思いますので。vSwitch)+DPDKのビルドとネットワーク設定方法について記載しました。前回記事にDPDKを実装しました。当初はOvSもDPDKもrpmビルドしたものをインストールするところまではOKだったのですが、いざ仮想マシンからトラフィックを流すと上手く流れず・・・だったので、ソースからビルドしました。edit2.事前準備2-1.qemu-kvm-evのインストールCentOS7のqemu-kvmですと、vHostUserClientに対応していないため、qemu-kvm-evを事前にインストールしておきます。-versionqemu-evリポジトリファイルのインストールqemu-evリポジトリの常時無効化*1qemu-kvm-evのインストールlibvirtd再起動qemu-kvmのVersion確認2-2.qemu-kvmの実行ユーザをrootへ変更qemu-kvmの実行ユーザをqemu→rootに変更します。#コメントを外すviで/etc/libvirt/qemu.confを開き、上記ユーザとグループの行をコメントアウト。/etc/modules-load.d/iommu.confvfio-pciの永続化設定vfio-pciのiommu利用の永続化2-6’.uio_pci_generic設定vfio-pciが利用できない場合は、uio_pci_genericを使用します。/etc/modules-load.d/uio_pci_generic.confuio_pci_genericの永続化設定ここまでの準備が整ったら一旦再起動してください。reboot3.DPDKソースビルド3-1.ビルド環境準備ビルド環境の準備をします。$DPDK_DIRディレクトリ移動ソースのダウンロードソースのtarファイルを解凍パスのエクスポートディレクトリ移動3-2.ビルドソースからビルドします。DESTDIR=installパスのエクスポートパスのエクスポートビルド&インストール多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。complete4.OvSソースビルド4-1.ビルド環境準備ビルド環境の準備をします。cloneにてソースのダウンロード4-2.ビルドソースからビルドします。上記のmakeでエラーとなる場合は以下で実施してみてください。install上記のうち、$DPDK_BUILDは以下のパスとなります。directoryが表示されるようであれば、上記の絶対パスを以下のように記載して実行ください。--with-dpdk=/usr/src/dpdk-18.11/x86_64-native-linuxapp-gcc多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。前回記事の構成図と比較してください。グレーアウト&斜体文字になっているのが前回設定した箇所です。今回は(1)~(6)の黒文字になっている箇所を設定していきます。~概要~DPDKにバインド:(1)(2)Bridge作成:(3)Bond作成:(4)vHostUserClientポート作成:(5)仮想マシンの設定:(6)5-3.コマンド投入前準備1コマンド投入前には以下のようにパスを通しておいてください。PATH5-4.コマンド投入前準備2OvSを起動後、DPDK周りの詳細設定を追加しておきます。上記のうち、dpdk-init=true以外はチューニングパラメータなので、設定しなくてもとりあえずは動きます。~コマンドのみ~以下のコマンドを投入していきます。やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。青=追記,緑=置換6.DPDKにバインドKernel上で動作しているX540をDPDK上で動作されるようにバインドします。driverに表示されます。今回利用するドライバはvfio-pciですが、uio_pci_genericでも利用可能です。利用したい場合は、以下のように変更すればOKです。DL360G8を使用している方はRMRR設定が必要になる場合があります。以下のサイトを参考にしてみてください。念のため、ovsの再起動をした後、Bridge作成を行ってください。datapath_type=netdev正常にBridgeが作成されると上記のような出力となります。flags:0といった出力より、X540の各ポート*4に対してメモリの割り当て行っているようです。8.Bond作成ovsbr0上にアップリンクポート*5を追加し、Bondを組みます。TrunkとLACPの設定も同時に追加します。~]#上記のように追加されていればOKです。FullTrunkにしたい場合は、以下の行を削除してください。\スイッチ側の仕様でLACPが組めない場合、以下のように修正してください。\9.vHostUserClientポート作成ovsbr0上にダウンリンクポート*6を追加します。先にSocketファイルとなるvhuc0を作成し、その後ovsbr0にポートを追加します。"2.10.90"上記のように追加されていればOKです。tag=300としましたが、tag=300のみでも自動的にaccessポートにしてくれます。trunks=11,300-304」を参考に置換してください。10.仮想マシンの設定virshで仮想マシンの設定を編集します。これにより、以下3点を実施します。mode」などで検索すればすぐに見つかると思います。あと、vhostuserですが、mode=serverとなっています。以前はmode=clientだったのですが、現在はmode=serverが推奨されています。仮想マシンを起動して疎通確認を行ってみてください。Denyなどのエラーが出力される場合があります。その場合、「2-2.qemu-kvmの実行ユーザをrootへ変更」を参照し、Qemuの実行ユーザが確実にrootとなっていることを確認してください。libvirtd.serviceを実行し、それでもダメなら、ホストOSを再起動してみてください。12.最後に以下のサイトを参考にさせて頂きました。DPDK)を構築しました。ovsの設定方法についても踏み込んで解説を入れたので、ある程度好きな構成を組めるところまでは網羅できているのではないかと思います。仮想マシン側のネットワーク設定については、過去記事を参考にして頂ければと思います。次はLXC/LXDコンテナでvHostUserClientモードで接続できないか、もう少し調べてみたいと考えています。*1:常時qemu-evリポジトリを参照しに行かれるのがイヤだったので設定を入れましたが、別に構わないという方は不要です。*2:IOMMUについては、DL360G8特有の設定(RMRRの設定)があるため、途中で補足を入れます。Softwareに記載されています。vSwitch)のネットワーク設定(Bridge、Bonding、VLAN)の方法について記載しました。KVMとLXC/LXDにおいてLinuxBridgeで実現可能だったことを、ovsでも同様に実現可能にした内容となっています。このため、LinuxBridgeからovsへの移行設計が可能になると考えています。*1過去記事では、nmcliコマンドによるLinuxBridgeについて記載しましたが、LinuxBridgeからovsへ変更した際、どこが変わったのか?のポイントも記載したいと考えています。2.10.1今回は物理スイッチとLACPで接続するために上記の筐体を使用しましたが、LACP以外のところはVMWareWorkstation12上でも動作しますので、本記事に記載した内容は特に環境依存的なことはないと考えています。構成図上に(1)~(13)までの番号を割り振りました。スイッチ側の設定は以下となります。~コマンドのみ~以下のコマンドを投入していきます。やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。eth12.Bridge作成まずはBridgeを作成します。"2.10.1"3.BondingBondを作成し、物理インターフェースをBondにアタッチします。"2.10.1"過去記事の図と比較してもらえればわかると思いますが、過去記事の(3)~(5)を行った状態となります。"ovsbr0"の中にBondが入っています。"bond0"のインターフェースとして、物理のens1f0やens1f1が定義されています。これは仮想スイッチovsbr0のアップリンクポート(物理サーバの外部へ抜けるトラフィックが通るポート)がBondとして定義されている状態と言えます。仮にESXiのvSwitchで例えるなら、こんな↓状態です。4.永続化設定コマンドを打っただけだと、ホストOSをRebootすると消えてしまうので永続化設定を行います。networkいくつか、ポイントを記載します。固定LAGのどちらかの設定を行ってください。ここではLACPとします。・ovsのDefaultでは、vlan_mode=trunkにてFullTrunk状態となっているため、明示的にTrunkするVLANを絞りたい場合に、trunks=11,300-302が必要となります。*2・NM_CONTROLLED=noにより、該当するインターフェースがNetworkManagerの管理下から外れるため必須設定と考えてください。・nmcliコマンドでBondを作成した際も、上記パス*3に似たようなファイルが生成されていますが、ovs特有のオプションを指定できる点が異なります。・networkサービスのリスタートを行っても正常に動作しない場合、少々ダサいですがホストOSごと再起動してみてください。仮想マシン側でNICを追加する際、ovsを選択できるようにするため、libvirt上でネットワークの定義を行います。その際、仮想マシンとovsをaccessポートで接続するのか?trunkポートで接続するのか?を設定できるようにするため、PortGroupの定義も併せて行います。ESXiのvSwitchで例えるなら、下図の左側にある「仮想マシンのポートグループ」の設定を行っていくイメージです。</vlan></portgroup></network>いくつか、ポイントを記載します。portとして接続させたい場合の設定となります。portとして接続させたい場合の設定となります。IDを付けずにトラフィックを流してくる仮想マシン用として使用できます。IDを付けてトラフィックを流してくる仮想マシン用として使用できます。ちなみに、B.においては、4.永続化設定で記載したように、DefaultでFullTrunk状態です。このため、許可するVLANを絞ることも可能なようですが、ここでは割愛します。*4上記ファイルの作成が完了したら、virshコマンドで定義していきます。以下が各コマンドの出力結果となります。yes上記の設定が完了すると、Virt-Manager上の画面からovsやPortGroupが選択できるようになります。portで接続Virt-Manager画面上で設定する場合は、以下の通り。Network’ovsnw’を選択Portgroup:vlan300を選択virshコマンドで設定する場合は、以下の通り。portで接続Virt-Manager画面上で設定する場合は、以下の通り。Network’ovsnw’を選択Portgroup:untagを選択virshコマンドで設定する場合は、以下の通り。</interface>8.Guest側Tagging例1と2Guest2起動後、Guest2のbash上でnmcliコマンドにより、VLANインターフェースを作成します。nmcliコマンドの詳細については、過去記事を参照ください。portの設定により、(5)のeth0とvnet1間はFullTrunkで接続されていると考えてください。これにより、例えば、SrcIP:192.168.31.162-DstIP:192.168.31.254でPingを打つと、以下のような流れで処理されます。ID301がTaggingされる。(5)はFullTrunk状態なので、VLANタグは剥がされずに、そのままスイッチング処理*5される。(2)では11,300-302がAllowedされているので、VLANタグは剥がされずに、そのままスイッチング処理される。InterfaceがPingに応答する。Interface)の作成と同時に永続化設定も実施します。bridgeのアタッチ)に進むと、必ず躓くポイントになります。302をBridgeとして認識させる必要があるためです。302)にコンテナlxc762のeth1をアタッチします。eth1アタッチ後、仮想マシンやLXCコンテナを起動すると、ovs上では以下のように構成されていることが確認できます。」まで打った後、Tabキーで補完してみてください。すると、物理インターフェースもしくはBridgeインターフェースしか表示されません。virbr0すると、lxcコンテナをovsにアタッチするためには、ovsbr0を選択するしかない状態となってしまいます。302がBridgeであるということを明示的に認識させる必要があるため、fake_bridge=trueオプションを指定しています。ちなみに、上記のlxcコマンドでovsbr0を選択した場合、(5)に接続した状態となります。IDを付与する必要があります。IDを付ける設定を実施することは、そもそも使い方が間違っている気がしました。*6このため、KVM:(4)の通り、PortGroupで所属するVLANを決定する。bridgeで所属するVLANを決定する。いう使い方が適しているのではないかと考えています。12.補足2:ovs上での見え方Guest1と2を起動すると、ovs上では以下のように見えます。"2.10.1"また、今回LCAPを使用しましたが、LCAPの状態を確認する場合は、以下のコマンドで可能です。13.最後に以下のサイトを参考にさせて頂きました。GitHubovsは、最初は取っ付き難かったのですが、触ってみると意外と楽しかったです。LinuxBridgeと異なる点として、Port(Interface)やBond、VLANの概念がBridgeの中に集約されている(ように見える)ので、よりスイッチっぽいかな?と。ovsはVxLANのVTEPを作ったり、OpenFlowが使えたりと色々遊べるのですが、まずはLinuxBridgeからの移行で最低限必要な機能は網羅できたかなと思います。次のステップとして、DPDKを実装したいと考えています。*1:手前味噌ですが、私はovsに一本化しようと思いました。*2:ネットワークエンジニアという職業柄、意図しないループが怖いため、TrunkするVLANはなるべく絞りたい派です。id='11,300-302'などと記載すれば、できそうな気がしていますが、libvirt側の話題になるため、また別の機会に確認したいと思います。*5:宛先MACアドレスとMACアドレステーブルを照合し、受信したEtherフレームを然るべきポートへ転送する動作のこと*6:もちろん、ケースバイケースで充分な議論をする余地はあるかと思います。vSwitch)のビルドとインストール方法について記載しました。0:2.0.0-7.el7がインストールされますが、今後DPDK版ovsを作りたいと考えているため、その練習も兼ねて、最新版2.10系のビルドから行います。owner/groupのエラーで弾かれてしまうため、ビルド用ユーザを作成します。Linuxやfirewalldの無効化は行っておいてください。ovsユーザ作成wheelグループに追加(sudoさせるため)パスワード設定スイッチユーザ2-2.追加のパッケージインストールユーザovsで操作しているものとします。numactl-devel3.rpmビルド3-1.ビルド環境準備ビルド環境の準備をします。ovs.specソース格納ディレクトリの作成ディレクトリ移動ソースのダウンロードソースのtarファイルを解凍specファイル生成3-2.ビルドソースからrpmファイルを生成します。check"依存パッケージのインストールovsのソース格納ディレクトリへ移動boot.sh実行configure実行rpmビルド*1多少時間は掛かりますが、最後の方は以下のような出力がでれば正常にビルドが完了しています。04.インストール生成されたrpmをインストールします。rpm/rpmbuild/RPMS/x86_64/openvswitch-2.10.1-1.el7.x86_64.rpm5.起動確認rpmインストール後はrootに戻ります。ovsbr0などでBridgeを作成していきます。ovsの設定方法は次回記載します。6.最後に先にも記載しましたが、ovs-dpdkをやることが目的なこともあり、rpmのビルドから実施しました。以下のサイトに詳しい説明が記載されていますが、software.intel.com今回インストールしたのは、下図の左上(ovsのみ)です。左下(dpdk)については、過去記事のpktgenやspdk+NVMe-oFで、既に実績があるため、DPDKはサクッと導入できるかな?と考えています。dpdkを追記すると、DPDKにも対応してくれるようです。事前にDPDKのビルドは必須ですが。*2:記載したパスには、debug版やovn版などのrpmも生成されていますので、興味があればインストールしてみてください。Interfaceの設定方法に加えて、SR-IOVを使用した場合について記載しました。SR-IOVの使用方法として、KVMとLXC/LXDのそれぞれについてもまとめました。SR-IOVを使用する場合の注意点についても記載しました。内部ネットワーク的な疎通可否についても記載しました。構成図上に(1)~(21)までの番号を割り振りました。(1)~(10)については過去記事を参照してください。metonymical.hatenablog.com(11)~(21)については主にVLANやIPの設定となります。各VLANとIPは以下の通りです。(11)(13)(16)(19)Untag:192.168.30.22x/24(12)(14)(18)(21)VLAN301:192.168.31.22x/24(15)Untag:192.168.31.222/24*1SR-IOVを使用する場合、仮想マシンやコンテナを起動する前にVFを予めアタッチした後*2、起動させます。アタッチ方法については、nmcliコマンドではできないため、適時解説します。各仮想マシンやコンテナは以下の通りです。c750~c753:KVM上の仮想マシンlxc754:LXC/LXD上のコンテナスイッチ側の設定は以下となります。~コマンドのみ~以下のコマンドを投入していきます。やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。show(1)~(10)の詳細は省略し、以下は(11)から解説します。全ての出力結果を表示させると不要な設定も記載することになるため、一部省略します。2.c750のEthernet&VLAN+IP物理とVLANインターフェースを作成しIPをアサインします。forever3.c751のEthernet&VLAN+IP物理とVLANインターフェースを作成しIPをアサインします。異なる点は、IPアドレスの第4オクテットが221となります。4.c752のEthernet+IP物理インターフェースを作成しIPをアサインします。異なる点は、IPアドレスの第4オクテットが222となります。5.c753のBonding&VLAN+IP仮想マシン起動前にVFをアタッチします。Hardwareを実施し以下の画面のようにアタッチしてください。上記画面の場合、VFのBus:Device(Slot).function番号が0000:04:10:0となっていますが、以下のようにPFとVFのBus:Device(Slot).function番号は対応しています。04:10:3または、ホストOS上のvirshでアタッチする場合は、以下のように設定してください。domain=の行がVFのBus:Device(Slot).function番号に対応しています。</hostdev>上記設定が完了した後、仮想マシンを起動して以下の設定を仮想マシン上で行ってください。BondingインターフェースとVLANインターフェースを作成します。~]#6.lxc754のBonding&VLAN+IPコンテナ起動前にVFを仮想マシンにアタッチします。ホストOS上で以下のように設定してください。lxc754上記設定が完了した後、コンテナを起動して以下の設定をコンテナ上で行ってください。NetworkManagerを実施しておいてください。BondingとVLANインターフェースを作成します。異なる点は、IPアドレスの第4オクテットが224となります。以下3つの注意点があります。先に結論だけ書きますと、以下の通りとしてください。VFのMACアドレスについて:固定設定は実施しないBlackListについて:ixgbevfはBlackListに含めないVFIO-PCIについて:固定設定は実施しない8-1.VFのMACアドレスについてVFのMACアドレスは固定設定とせずに、オール0(ゼロ)のままの状態にしておいてください。通常、VFのMACアドレスを明示的に固定設定とする場合、/etc/rc.localに以下のように記載しますが、全てコメントアウトしてください。0MACアドレスをKVMやLXC/LXD側で動的にアサインさせないと、Bondingが機能しなくなる*4ためです。8-2.BlackListについてBlackListを使用した場合、LXC/LXDでVFをコンテナにアタッチしようする際、エラーで弾かれます。このため、BlackListからixgbevfはコメントアウト、または削除してください。ixgbevf8-3.VFIO-PCIについてこれも理由は8-2.と同様です。KVMの場合、仮想マシン起動時に動的にVFIO-PCIを使用してくれるため、明示的に設定しなくても良いようです。options行を削除してください。ids=8086:10edvfio_pci行を削除してください。/etc/modules-load.d/vfio_pci.confvfio_pci上記8-1~8-2の設定が完了したら、ホストOSを一旦再起動してください。見ながら、以下のマトリックスを見てください。VLAN300:192.168.30.0/24VLAN301:192.168.31.0/24今回は(11)~(21)にIPアドレスをアサインしました。そこからPing疎通できた箇所にはRTTを記載しました。*6Ping疎通できなかった箇所はNGと記載しています。上記の表より、疎通NGだった箇所*7について記載したいと思います。9-1.VLAN300:192.168.30.0/24の表について以下2つのフローが疎通NGでした。Dst:(19)PF(ens1f0)⇔VF間におけるEtherフレームの受け渡しがうまくいっていないようでした。replayが見えず。replayを返送していました。replayが見えない点が怪しいものの解決に至らず。9-2.VLAN301:192.168.31.0/24の表について以下2つのフローが疎通NGでしたが、疎通不可な理由は9-1に記載した事象と同一です。Dst:(21)以下の通信が全滅でした。Dst:ALL原因は、戻りのEtherフレームにVLAN301のタグが付いていることにより、(3)から(9)へ転送されてしまうためです。実際、(9)や(15)でPcapしたところ、(14)宛てのVLANタグ付きフレームが受信できました。9-3.RTTから見えてくるもの宛先がSWになっているRTTを見てください。概ね1~2ms程度です。自分自身にPingを打った場合のRTTは、おおむね100μs(0.100ms)以下となっています。それ以外のRTTは概ね900~200μs(0.9~0.2ms)程度です。Bridgeを使用したインターフェースのRTTと比較して、SR-IOVを使用したインターフェースのRTTは全体的に短時間(500μs程度)となっています。加えて、SR-IOVを使用した者同士のRTTはさらに短時間(200~300μs程度)となっています。「6.lxc754のBonding&VLAN+IP」に記載したアタッチ方法の場合、VFを自動的にアサインしてくれますが、今回紹介したKVMでの方法は手動設定を行いました。理由は、KVMによるVF自動アサインを行った結果、(16)(17)を作成した際にens5がLinkUpしなかったためです。仮想マシン上でBondingしない場合は有用な設定方法だと思いますので、補足として記載しておきます。以下のようにxmlの定義ファイルを作成し、virshコマンドで定義ファイルを読み込ませます。以下の画面にて、Autostartにチェックを入れApplyをクリック。左下の再生ボタン*8をクリック。network」を選択することができるようになります。これにより、ens1f0から自動的にVFがアサインされるようになります。1つのPF上でVFを8個や16個など作成した場合には管理が煩雑となるため、どのVFを使用しているかを意識せずに設定することが可能となります。10.最後にLinuxBridge*9とSR-IOVを駆使したネットワーク構成としては、概ね網羅できたと思います。vSwitchによる分散仮想スイッチ*10の構成になると考えています。パフォーマンス面ではDPDKを使用する*11ことに加え、足回りを全てSR-IOVにすることにより、ようやく最下層における基礎/基盤の部分が構成できるようになります。その上で、あるホストから別のホストへトラフィック*12を転送する際に、MPLSやVxLANでトラフィックを識別し、対向スイッチ上では、MP-BGPやEVPNを使用することにより、Overlayネットワークが構成できるようになります。SDN/NFVという言葉だけがあちこちに溢れていますが、最下層の仕組みを理解せずに上物だけをやってしまうのは、とても怖い気がしています。*1:¥(9)にてVLAN301を付与しているためUntagとなります。*2:厳密には、KVMとLXC/LXDでVFのアタッチ方法が異なります。詳しくは補足に記載します。*3:補足で解説しますが、LXC/LXDの場合、PF=ens1f0やens1f1を指定するだけで、自動的に空いているVFをアタッチしてくれます。*4:見かけ上の設定では上手くいったように見えますが、IP疎通性が無くなる場合があります。BondingインターフェースのSlaveのうちの一つがLinkUpしてくれないといった状態になります。*5:つまり、ホストOS上でixgbevfがmodprobeされる状態にしておいてください。*6:送信元:スイッチに関しては、min/avg/maxRTTの表記となっています。仮想化LXC/LXDコンテナ上にEPC環境を構築しました。利用するEPCはNextEPCとなります。NextEPCに含まれるサービスは以下の通りです。mmehsssgwpgwpcrfwebuiまた、以下2つの内容が理解できていることを前提に記載しますので、LXC/LXD環境などは既に構築済みの状態からスタートします。InstallWinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。今回用意するlxcコンテナはUbuntu18.04となります。公式サイトを読む限りCentOS7のコンテナでもいけそうなのですが、ビルドが必要っぽいので。ロードマップには、いずれRPMも公開される旨、記載されていました。今回はimages:からではなく、ubuntu:からコンテナイメージを引っ張ってきます。|+-----------+---------+---------------------+------+------------+-----------+2-2.コンテナのネットワーク設定lxc8041のeth1をlxdbr30にアタッチします。|+---------+----------+---------+-------------+---------+2-3.ubuntuのネットワーク設定lxc8041のeth1に固定IPを設定します。IPアドレスは各自の環境に合わせてください。false設定反映後にIPアドレスが設定されているかを確認し一旦再起動します。nextepcホストOS上からコンテナのbashへ移動aptアップデートリポジトリ登録NextEPCのインストール注意事項リポジトリ登録時に以下のようにEnterキーを押すよう促してくるので、そのままEnterキーを押下してください。サービスが起動するまで3分程度待ってください。|+-----------+---------+----------------------+------+------------+-----------+再起動3分後のステータスpgwtunインターフェースが表示されていればOKです。|+-----------+---------+----------------------+------------------+------------+-----------+4.NextEPCのWebUIにアクセス4-1.ログインログインします。6.最後に以下のサイトを参考にさせて頂きました。LTS+NextEPC)メインは公式サイトですが、@m0ch1m0ch1さんの記事が大変良くまとめられています。ラズパイ上で動くならコンテナ上でも動くかな?と思ってやってみましたが、何とか動くところまでは確認できました。基地局側の環境を用意するのは、USRPなどが必要となってくるようで、少々敷居が高いのですが、タイミングをみて検証したいなと思っています。あとはキャリアのSGWと接続テストとかやってみて上手くいきそうであれば、IoT用途に特化したPGWとしては有効活用できそうな気がしています。Interface)などにも興味が湧いてきたので、折をみて検証したいなと考えています。前々回の続きとなります。Deflectionまた、前回の内容が理解できていることを前提として記載します。DeflectionLXC/LXDコンテナは「LightweightなKVM」というイメージで使用しています。このため、コンテナのトラフィックをBridgeで外部ネットワークに流して使用する場合の設定方法を記載したいと思います。InstallWinおよびVMWare環境は以下の画像で確認してもらった方が良いかもしれません。前々回の記事に加えてNICを追加していますが、実際に使用するのはトータル3つです。具体的には以下の通りです。Interface設定方法は過去記事を参照ください。metonymical.hatenablog.comなお、ベアメタル環境でも同様に設定可能です。init時にDefaultで作成されています。Profileの設定よりコンテナ作成時にlxdbr0が使用されるように構成されています。lxdbr0はNATして外部ネットワークに接続されています。私の用途としては、コンテナ上でyumなどを行いたい場合のInternet接続用マネジメントインターフェースとして使用しています。KVMライクにLXC/LXDコンテナを使用したいので、今回行う設定は(1)~(2)となります。lxdbr30を作成し、コンテナlxc751を収容します。networkコマンドを使用して設定を行っていきます。前々回の続きという想定なので、lxc751というコンテナは既に作成済みという認識で進めます。流れというよりも、それぞれ別々の設定となります。~コマンドのみ~以下のコマンドを投入していきます。やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。物理インターフェースとBridgeインターフェースを1対1でアサインします。nonelxdbr30が作成され、物理インターフェースens34にもアタッチされました。コンテナに対してDHCPでIPアドレス割り当てを行うため、lxdbr30自身にもIPアドレスを設定しています。|+---------+---------+----------------------+----------------------------------------------+------------+-----------+lxdbr30にコンテナlxc751のeth1をアタッチし、コンテナのIP設定を行っています。その後コンテナを起動し、lxc751のeth1上でdhclientコマンドを実行しています。「コンテナのIP設定」と記載しましたが厳密には異なります。上記コマンドの場合、恒久設定ではないためコンテナ上で設定ファイルを作成します。/etc/sysconfig/network-scripts/ifcfg-eth1DEVICE=eth0BOOTPROTO=dhcpONBOOT=yesHOSTNAME=LXC_NAMENM_CONTROLLED=noTYPE=EthernetMTU=DHCP_HOSTNAME=`hostname`#コンテナのviが起動されるため、sed(:s/eth0/eth1/g)して保存(:wq)します。lxc751」によりコンテナ上でコマンドを実行できます。コピーして、DEVICE=eth1に書き換え、コンテナを再起動しています。listによりeth1のアドレスが取得できていればOKです。3.手動によるIP固定設定の場合やっていることは前項と同様です。何が異なるか?と言いますと、lxdbr30にIPアドレスを設定したくない場合を想定しています。具体的には、以下のような構成の場合です。コンテナlxc751からLBまで、LBからコンテナlxc752までをそれぞれ同一VLANとしたい場合、Bridgeインターフェース上でIPアドレスを設定してしまうと、ホストOS上のRoutingテーブルにlxdbr30とlxdbr31がconnectedで載ってきてしまうため、LBまで到達せずに内部で折り返してしまいます。net.ipv4.ip_forwardを無効にしてしまうと、今度はlxdbr0で稼働しているNAT+Routingが動作しなくなるため、lxdbr30にIPアドレスを設定せずに構成する方法を記載します。nonelxdbr30が作成され、物理インターフェースens34にもアタッチされました。lxdbr30自身にはIPアドレスが設定されていません。|+---------+---------+---------------------+----------------------------------------------+------------+-----------+lxdbr30にコンテナlxc751のeth1をアタッチしましたが、コンテナのIPは設定されていません。/etc/sysconfig/network-scripts/ifcfg-eth1DEVICE=eth0BOOTPROTO=dhcpONBOOT=yesHOSTNAME=LXC_NAMENM_CONTROLLED=noTYPE=EthernetMTU=DHCP_HOSTNAME=`hostname`#コンテナのviが起動されるため、sedで置換してIPとPrefixを追記して保存します。コピーして、DEVICE=eth1に書き換え、コンテナを再起動しています。listによりeth1のアドレスが表示されていればOKです。4.補足1:nmcliコマンドでBridgeを作成した場合nmcliコマンドでBridgeインターフェースを作成しても、lxc上で利用可能です。nmcliコマンドで作成した場合、lxdの管理下から外れるため、以下のようにMANAGED=NOとなります。|+---------+----------+---------+-------------+---------+nmcliでBridgeを作成した場合、LXDクラスタを組んだときなどに困りそうな予感はしていますが、もう少し検証してみようと思います。LXC/LXDのネットワーク周りの設定は以下の公式サイトに詳細が記載されています。https://lxd-ja.readthedocs.io/ja/latest/networks/5.補足2:PortForwarding設定コンテナ内のサービスを外部に公開したい場合、今回解説したBridgeの他に、Defaultで作成されるlxdbr0上でPortForwardingを行う方法があります。connect=tcp:localhost:80lxc751:コンテナ名httpd:任意の名前listen=tcp:0.0.0.0:80:ホスト側の待受けポート*2connect=tcp:localhost:80:コンテナ側(lxc751)の待受けポート以上です。6.最後に以下のサイトを参考にさせて頂きました。技術評論社LXC/LXDはコンテナ起動後、ちょいちょいいじりたい時に便利だなと思っています。「LightweightなKVM」とか「KVMライク」といった使い方が、私にはマッチしています。ちなみに、SR-IOVやCloud-initにも対応しているため、そちらの検証もやってみたいなと思います。*1:lxcコマンドでは、アサインではなく、アタッチという言葉を使っているため統一します。*2:IPはホストOSの物理インターフェースのIPアドレスにアクセスしてください。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。