「ホワイトボックススイッチ」
ホワイトボックススイッチとONIE
本記事で言う
普段会社で使うスイッチのうちPCに近いところで使うスイッチは、
やれ10GbEだ、
そこで出てくる概念が
ソフトウエア側はNetwork OS
言い方を変えるとスイッチベンダーは、
これによりハードウェアとソフトウェアを独立して開発できるようになり、
ホワイトボックススイッチ用のNOSはいろいろなところが開発していますが、
実は過去に
ビルド環境の構築とONIEイメージの作成
まずはQEMU用のONIEをビルドすることにします。ONIEはもともとスイッチベンダーが作る想定であるため、
ビルドをするためには
まずはDockerのインストールです。今回はUbuntu 21.
$ sudo apt install docker.io git $ sudo adduser $USER docker
グループ設定を反映するために、
$ git clone https://github.com/opencomputeproject/onie.git $ cd onie/contrib/build-env/ $ docker build -t debian:build-env . (中略) Successfully built 85940c5a622e Successfully tagged debian:build-env
このあたりは普通のDockerの使い方ですね。次にONIE用のソースコードのビルドディレクトリを用意し、
今回はホームディレクトリの下に~/onie_
」
$ mkdir --mode=0777 ${HOME}/onie_src $ docker run -it -v ${HOME}/onie_src:/home/build/src --name onie debian:build-env build@ece6bf615181:~$ ls clone-onie src build@ece6bf615181:~$ ls src/ build@ece6bf615181:~$
clone-onie
スクリプトを使うと、src/
」src/
」${HOME}/onie_
」
build@ece6bf615181:~$ ./clone-onie build@ece6bf615181:~$ cd src/onie/build-config
build-config/
は機種共通のビルドスクリプト置き場です。よってまずはこのディレクトリに移動した上でmake
コマンドを実行します。
しかしながら、grub-install: error: /usr/
」
$ sed -i 's/^SECURE_BOOT_ENABLE = yes/SECURE_BOOT_ENABLE = no/' ../machine/kvm_x86_64/machine.make
機種依存な情報はmachine/
以下にmachine/ベンダー名/プラットフォーム名
として保存されます。特定のプラットフォームMACHINEROOT=../
」
今回作るQEMU向けのプラットフォームは、MACHINE
だけ指定すれば問題ありません。次の方法でビルドしてください。
build@ece6bf615181:~$ make -j8 MACHINE=kvm_x86_64 all (中略) Drive current: -outdev '/home/build/src/onie/build/images/onie-recovery-x86_64-kvm_x86_64-r0.iso' Media current: stdio file, overwriteable Media status : is blank Media summary: 0 sessions, 0 data blocks, 0 data, 408g free xorriso : UPDATE : 279 files added in 1 seconds Added to ISO image: directory '/'='/home/build/src/onie/build/kvm_x86_64-r0/recovery/iso-sysroot' Created: /home/build/src/onie/build/images/onie-updater-x86_64-kvm_x86_64-r0 === Finished making onie-x86_64-kvm_x86_64-r0 master-05021132 ===
初回ビルド時はコンパイラやカーネルをダウンロード・
「../
」
build@ece6bf615181:~/src/onie/build-config$ ls -l ../build/images/ total 55244 -rw-r--r-- 1 build build 7549712 May 2 11:57 kvm_x86_64-r0.initrd -rw-r--r-- 1 build build 3966912 May 2 11:56 kvm_x86_64-r0.vmlinuz -rw-r--r-- 1 build build 3965008 May 2 11:56 kvm_x86_64-r0.vmlinuz.unsigned -rw-r--r-- 1 build build 28704768 May 2 11:57 onie-recovery-x86_64-kvm_x86_64-r0.iso -rw-r--r-- 1 build build 12371831 May 2 11:57 onie-updater-x86_64-kvm_x86_64-r0
これらのファイルのうち今回使用するのは、onie-recovery-x86_
)onie-updater
」vmlinuz
やinitrd
はPXEブートなどが必要な場合に使用します。
ビルド環境はもう不要なので、exit
コマンドでDockerインスタンスから抜けておいてください。
仮想マシンへのONIEのインストール
QEMUを利用して仮想マシンを作成しましょう。amd64なCPUが載ったホワイトボックススイッチはおおよそUEFIに対応しているため、
まず必要なパッケージをインストールして、
$ sudo apt install qemu-system-x86 qemu-utils ovmf $ mkdir ~/onie_src/qemu/ && cd $_ $ qemu-img create -f qcow2 onie.img 20G $ cp /usr/share/OVMF/OVMF_VARS.fd .
別途作成したリカバリーイメージを指定して起動します。
$ sudo qemu-system-x86_64 --enable-kvm -m 2G \ -name "onie" \ -nographic \ -boot order=cd,once=d -cdrom ../onie/build/images/onie-recovery-x86_64-kvm_x86_64-r0.iso \ -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \ -drive if=pflash,format=raw,file=OVMF_VARS.fd \ -drive file=onie.img,media=disk,if=virtio,index=0 \ -serial telnet:localhost:9000,server QEMU 5.2.0 monitor - type 'help' for more information (qemu) qemu-system-x86_64: -serial telnet:localhost:9000,server: info: QEMU waiting for connection on: disconnected:telnet:127.0.0.1:9000,server
4行目で先ほど作成したリカバリーイメージの一を指定しています。6行目と7行目にUEFI変数領域と作成した空のディスクイメージを指定しています。最後の行はシリアルコンソールの出力先として、
$ telnet localhost 9000
起動すると次のようなGRUBのメニューが表示されます。

「ONIE: Rescue」
「ONIE: Embed ONIE」
今回は空のストレージにONIEをインストールしたいので、
ONIE: Embedding ONIE ... Platform : x86_64-kvm_x86_64-r0 Version : master-05021132 Build Date: 2021-05-02T11:32+00:00 Info: Mounting kernel filesystems... done. Info: BIOS mode: UEFI (中略) ONIE: Success: Firmware update URL: file:///lib/onie/onie-updater ONIE: Success: Firmware update version: master-05021132 ONIE: Rebooting... (中略) reboot: Restarting system
無事にインストールが完了したら再起動します。次のようなGRUBメニューが表示されます。

「ONIE: Install OS」
特に何も指定しなければ、
ONIE:/ # onie-discovery-stop NOTICE: The 'onie-discovery-stop' command is deprecated and will be removed in 2019.02. NOTICE: Use 'onie-stop' instead. discover: installer mode detected. Stopping: discover... done. ONIE:/ # halt
「Ctrl-]」
Open Network Linuxのインストール
Open Network Linux
ビルド済みのバイナリは公式サイトの
とにもかくにも最新のリリースをダウンロードしましょう。ONLもONIEと同じくDebian 9以下でないとビルドできません。
$ wget http://opennetlinux.org/binaries/latest/ONL-master-ONL-OS9-2019-07-23.0153-01d1564-AMD64-INSTALLED-INSTALLER
このイメージをONIEからインストールするわけですが、
- カーネルのコマンドラインパラメーターに
「 install_
」url=<イメージのURL> を指定して起動する - USBスティックなどのストレージにイメージをコピーして自動認識させる
- DHCPのレスポンスにURLを記述する
- ONIEが動いているマシンが接続されているネットワーク上のTFTPサーバーにイメージを置いておく
- ONIEが起動したあと、
手作業でインストールコマンドを入力する
複数台のインストールを自動化するなら、
ちなみにONIEはIPv4ブロードキャストアドレスやIPv6のリンクローカルなマルチキャストアドレスにpingを打ち、
今回は準備の手間を省くため、
まずはファイルの名前を変えておきます。今回は手作業でインストールするため、
$ mv ONL-master-ONL-OS9-2019-07-23.0153-01d1564-AMD64-INSTALLED-INSTALLER onl-installer.bin
Pythonのhttp.
$ python3 -m http.server Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
ポート番号が
$ wget --spider http://localhost:8000/onl-installer.bin スパイダーモードが有効です。リモートファイルが存在してるか確認します。 --2021-05-03 11:43:04-- http://localhost:8000/onl-installer.bin localhost (localhost) をDNSに問いあわせています... 127.0.0.1 localhost (localhost)|127.0.0.1|:8000 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 256304934 (244M) [application/octet-stream] リモートファイルが存在します。
ONIEが動く仮想マシンを起動します。今回はリカバリーイメージの指定は不要です。
$ sudo qemu-system-x86_64 --enable-kvm -m 2G \ -name "onie" \ -nographic \ -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \ -drive if=pflash,format=raw,file=OVMF_VARS.fd \ -drive file=onie.img,media=disk,if=virtio,index=0 \ -serial telnet:localhost:9000,server QEMU 5.2.0 monitor - type 'help' for more information (qemu) qemu-system-x86_64: -serial telnet:localhost:9000,server: info: QEMU waiting for connection on: disconnected:telnet:127.0.0.1:9000,server
別端末からtelnetログインしてシリアルコンソールを表示します。
$ telnet localhost 9000
「ONIE: Install OS」onie-stop
」
Please press Enter to activate this console. (中略) NOTICE: ONIE started in NOS install mode. Install mode persists NOTICE: until a NOS installer runs successfully. ** Installer Mode Enabled ** ONIE:/ # onie-stop discover: installer mode detected. Stopping: discover... done. ONIE:/ #
手動でのNOSのインストールにはonie-nos-install
コマンドを利用します。今回はQEMU環境なので、
ONIE:/ # ip route show default default via 10.0.2.2 dev eth0 10.0.2.0/24 dev eth0 src 10.0.2.15
上記の設定だとhttp://
」
ONIE:/ # onie-nos-install http://10.0.2.2:8000/onl-installer.bin discover: installer mode detected. Stopping: discover... done. Info: Attempting http://10.0.2.2:8000/onl-installer.bin ... Connecting to 10.0.2.2:8000 (10.0.2.2:8000) installer 100% |*******************************| 244M 0:00:00 ETA ONIE: Executing installer: http://10.0.2.2:8000/onl-installer.bin (中略) Installing for x86_64-efi platform. Installation finished. No error reported. (中略) Requesting system reboot reboot: Restarting system
インストール処理は完全に自動化されています。またインストールが完了すると自動的に再起動します。

NOSがインストールされるとNOSがインストールされたパーティションのGRUBが最初に起動します。たとえばNOSをアンインストールしたい場合は、
特に何も選ばないと自動的にOpen Network Linuxが起動します。
Stopping watchdog keepalive daemon.... Starting watchdog daemon.... Open Network Linux OS ONL-master, 2019-07-23.01:53-01d1564 localhost login: root Password: Linux localhost 4.14.109-OpenNetworkLinux #1 SMP Tue Jul 23 04:41:51 UTC 2019 x86_64 root@localhost:~#
ログインプロンプトが表示されるため、
root@localhost:~# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" root@localhost:~# onlpdump System Information: = { Product Name: ONLSIM Part Number: ONL MAC: 00:00:00:00:00:00 } SFPs: There are no SFP capable ports.
Debian 9ベースとなっていることがわかりますし、
SONiCのインストール
ONLに対して比較的活発に開発されているNOSが、
ONLをインストールしたディレクトリで、
$ wget https://sonic-jenkins.westus2.cloudapp.azure.com/job/vs/job/buildimage-vs-201911/lastSuccessfulBuild/artifact/target/sonic-vs.bin
ストレージに十分な空きがあればNOSを追加インストール可能です。ただ複数のNOSを同時に使うことはないため、
root@localhost:~# grub-reboot ONIE root@localhost:~# onl-onie-boot-mode uninstall [ 1342.495457] EXT4-fs (vda2): mounted filesystem with ordered data mode. Opts: (null) [ 1342.519414] EXT4-fs (vda3): re-mounted. Opts: (null) [ 1342.539015] EXT4-fs (vda3): re-mounted. Opts: (null) The system will boot into ONIE uninstall mode at the next restart. root@localhost:~# reboot
あとは放置しておけばONLがアンインストールされたのちに、onie-nos-install
コマンドでSONiC側を選択してみましょう。
ONIE:/ # onie-stop discover: installer mode detected. Stopping: discover... done. ONIE:/ # onie-nos-install http://10.0.2.2:8000/sonic-vs.bin
あとはONLと同様に放置しておけば、
Debian GNU/Linux 9 sonic ttyS0 sonic login: admin Password: Linux sonic 4.9.0-14-2-amd64 #1 SMP Debian 4.9.246-2 (2020-12-17) x86_64 You are on ____ ___ _ _ _ ____ / ___| / _ \| \ | (_)/ ___| \___ \| | | | \| | | | ___) | |_| | |\ | | |___ |____/ \___/|_| \_|_|\____| -- Software for Open Networking in the Cloud -- Unauthorized access and/or use are prohibited. All access and/or use are subject to monitoring. Help: http://azure.github.io/SONiC/ admin@sonic:~$
SONiCもDebian 9ベースです。SONiCはLinuxのコマンドツリーの中にスイッチ管理用のコマンドも取り込まれています。
admin@sonic:~$ show interfaces status Interface Lanes Speed MTU FEC Alias Vlan Oper Admin Type Asym PFC ----------- --------------- ------- ----- ----- -------------- ------ ------ ------- ------ ---------- Ethernet0 25,26,27,28 40G 9100 N/A fortyGigE0/0 routed down up N/A N/A Ethernet4 29,30,31,32 40G 9100 N/A fortyGigE0/4 routed down up N/A N/A Ethernet8 33,34,35,36 40G 9100 N/A fortyGigE0/8 routed down up N/A N/A Ethernet12 37,38,39,40 40G 9100 N/A fortyGigE0/12 routed down up N/A N/A (後略)
ONLと同じく仮想マシン上でできることは限られてはいるものの、