昨年6月以来の「かじってみた」シリーズ、今回はホワイトボックススイッチのNOS(Network OS)であるSONiCをVirtualBoxにデプロイしてみた。
そして、商用のホワイトボックススイッチのNOSとして多くのデータセンタにて導入が進んでいるCumulus Linuxの仮想アプライアンス版Cumulus VXもVirtualBoxにデプロイし、SONiCとCumulus VXとの間でBGPピアを張らせてみた。2022/12/31:記事の一部を修正
ホワイトボックススイッチとは?
自分を含めネットワークの設計・構築・運用に携わっている者の多くがお世話になっているであろうCiscoのCatalystやNexusやJuniperのEXシリーズスイッチ等はソフトウェアとハードウェアが統合された製品であり、我々ユーザ側が勝手にNOSをインストールする事や機能を追加する事は出来なかった。
ホワイトボックススイッチは、通信機器ベンダだけでなくユーザ側がOSや機能ソフトウェアを開発およびインストールする事が可能なスイッチであるが、SONiCやCumulus Linux等のようなホワイトボックススイッチ用のNOSが既にインストールされているスイッチの購入や、NOSが未インストールなスイッチの筐体にSONiCや他のホワイトボックススイッチのNOSをインストールし利用する事が出来る。
SONiCとは?
SONiC(Software for Open Networking in the Cloud)とは、マイクロソフト社が開発を始め2016年にオープンソースで公開し、現在はLinux Foundationで管理されているホワイトボックススイッチ用のNOSである。
他のホワイトボックススイッチ用NOSと同様に、OSはLinuxをベースとしている。
2000年代後半辺りからオープンソースのホワイトボッックス用NOSが幾つも開発されてきたが、その殆どが活動が停滞したり他のプロジェクトに吸収される等淘汰が進み、今はSONiCの1強の状態となりつつある状態に見える。
マイクロソフトだけでなく、Arista NetworksやJuniper Networks等のネットワーク機器ベンダだけでなくBroadcomやebayやdocker等も開発に協力しており、OSSのホワイトボックススイッチ用NOSの中で最も開発が活発である。
SONiCの中で動作しているスイッチングやルーティング等の主要なサービスは、SONiC内で各サービス毎に実装されているdockerコンテナの中で動作する。
SONiCのEthernet ASIC周りは、標準化されたAPIを定義するSAI(Switch Abstraction Interface)に基づいて構築されており、ネットワーク機器ベンダは一貫性を持った開発環境を利用しハードウェアプラットフォームを開発する事が出来る。SAIはBroadcomやMarvellやMellanox等Ethernet ASICベンダが実装している。
Googleで検索する際、SONiCだけで検索すると結果はセガの某キャラクターで埋め尽くされるが、SONiC NOSやSONiC Microsoft、SONiC BGP等で検索すると当記事で扱うSONiCが沢山出てくるようになる。
今回は、Cumulus Linuxだけでなく他のOSSなホワイトボックススイッチ用のNOSにも触れてみようという事で、QiitaのAdvent Calendarの記事やSpeaker Deakに掲載されている資料をチラチラ見ながらSONiCに触れてみた。
当方の環境
ホストOS:Windows10 64bit版 / RAM: 8GB / CPU: Intel Core i5 M460 2.53GHz
Oracle Virtualbox:6.1.18
ゲストOS 1:Cumulus VX 4.2.1
ゲストOS 2:SONiC.master.629-10436783
構成
SONiCはデプロイ完了の時点でIPアドレスやBGP等の設定が既に入っている状態である為、複数台のSONiCをデプロイしMACアドレスやIPアドレス等を変更するだけで、SONiCを使った簡単なBGP構成を試す事が出来る。
しかし、それだけではすぐに終わってしまいつまらない。
CiscoやJuniperの仮想アプライアンスのように初期状態からがっつりと設定投入しようという事で、既存の設定内容を大幅に修正したら外部だけでなく他のゲストOSとの通信も出来なくなった為、結局はSONiC側は変更箇所は最低限に済ませた。
よって、今回はCumulus VX側はSONiCの設定に合わせるような内容でIPアドレスをアサインした。
SONiCの導入および設定
2023/4/13編集
1.SONiCのデプロイ
まずはSONiCの仮想アプライアンス版をダウンロード。
https://sonic-net.github.io/SONiC/sonic_latest_images.html
VirtualBoxでは.imgファイルのデプロイは出来ない為、NHCというツールでimg形式からvdiもしくはvmdk形式に変換する必要がある。
https://euee.web.fc2.com/tool/nhc.html#nhc
その後、VirtualBoxからUUIDが無いよと怒られてデプロイ出来なかった為、DOS窓にて以下のコマンドを打ち、生成した.vdiファイルにUUIDを付与。
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands sethduuid "C:\Users\User\VirtualBox VMs\sonic-vm\sonic-vs.vdi"
.vdiファイルの準備が出来、これでようやくVirtualBoxにデプロイが可能となった。
VirtualBoxの設定
Hard Diskの設定にて、Use an existing virtual hard disk fileを選択し上記にて生成した.vdiファイルを選択。
VirtualBoxやEVE-NG環境で動かすのであれば、仮想RAMは2GB有れば充分だろう。しかしメモリをよく食べるRedis DBを中で動作させている為、商用環境で動かすとなると2GBでは少し心配かも。
[General]
Operating System:Debian (64-bit)
[System]
Base Memory:2048MB(可能であれば4GB以上)
Processors:1
Boot Order:Hard Disk
Acceleration:VT-x/AMD-V, Nested Paging, PAE/NX, KVM Paravirtualization
[Display]
Video Memory:16MB
Graphics Controller:VMSVGA
Remote Desktop Server:Disabled
Recording:Disabled
[Storage]
Controller:IDE
IDE Primary Master:sonic-vm.vdi
[Audio]
Disabled
[Network]
Adapter 1:Paravirtualized Network (Bridged Adapter, Broadcom 4313 802.1b/g/n)
Adapter 2:Paravirtualized Network (Internal Network, 'intnet01')
Adapter 3:Paravirtualized Network (Internal Network, 'intnet02')
Adapter 4:Paravirtualized Network (Internal Network, 'intnet03')
デプロイ開始
VirtualBoxにて起動ボタン(英語版ではStartボタン)をクリックし、SONiCのデプロイ開始。
起動中、以下のようなログが出力されるが今回は無視してそのまま進める。
systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:18: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:19: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:20: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:21: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:22: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:23: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:24: Invalid GROUP operation systemd-udevd[88]: /usr/lib/udev/rules.d/50-udev-default.rules:25: Invalid GROUP operation
デプロイ(起動)が完了したら、ログインIDとパスワードを入力しSONiCにログイン。出力内容から解るように、SONiCはDebian GNU/Linuxがベースとなっている。
ログインIDはadmin、パスワードはYourPaSsWoRd
パスワードの変更やユーザの追加は、DebianやUbuntuと同じくbashのコマンドで実行可能。
Debian GNU/Linux 10 sonic tty1 sonic login:
sshログインが出来るよう、以下のコマンドを投入し設定内容を保存。
sudo config interface ip add eth0 192.168.3.254/24 192.168.3.1 sudo config save
BGPの設定
Cumulus VXに倣いBGP unnumberedでBGPのピアを張りたかったのだが、下記リンク先のロードマップによると、BGP unnumberedは今年の6月末にリリースされるバージョン(SONiC.202106)にて実装されるようだ。
よって、今回はeBGPの基本的な設定を投入した。
https://github.com/Azure/SONiC/wiki/Sonic-Roadmap-Planning
https://debslink.hatenadiary.jp/entry/20201206/1607231451
インタフェースのIPアドレスは、SONiCにて既存の設定に合わせる形で/31のサブネットで設定。
SONiC側の設定は以下のとおり。/etc/sonic/config_db.jsonファイルを直接編集する方法と、sudo config xxxxのコマンドで設定する方法と、vtyshモードでCisco IOSのコマンドとほぼ同じコマンドを打って設定する方法の3つが有る。
sudo configのコマンドで設定した内容をsaveすると、保存された設定内容は/etc/sonic/config_db.jsonファイルに反映される。
今回は、BGPのネイバのアドレス、AS番号、自側のアドレス、name欄(Ciscoで言うdescription)を/etc/sonic/config_db.jsonファイルの内容を編集するやり方で修正した。
設定内容の保存後、show runningconfig allコマンドを叩くと以下のように出力される。
show runningconfigコマンドは、出力する内容は/etc/sonic/config_db.jsonファイルから拾っているようだ。
{ "BGP_NEIGHBOR": { "10.0.0.1": { "admin_status": "up", "asn": "65099", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.0", "name": "CUMULUS-VX-PATH1", "nhopself": "0", "rrclient": "0" }, "10.0.0.3": { "admin_status": "up", "asn": "65099", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.2", "name": "CUMULUS-VX-PATH2", "nhopself": "0", "rrclient": "0" }, "10.0.0.5": { "admin_status": "up", "asn": "65099", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.4", "name": "CUMULUS-VX-PATH3", "nhopself": "0", "rrclient": "0" }, "10.0.0.7": { "admin_status": "up", "asn": "65099", "holdtime": "180", "keepalive": "60", "local_addr": "10.0.0.6", "name": "CUMULUS-VX-PATH4", "nhopself": "0", "rrclient": "0" }, "10.1.1.99": { "admin_status": "up", "asn": "65099", "holdtime": "180", "keepalive": "60", "local_addr": "10.1.1.98", "name": "CUMULUS-VX-LO", "nhopself": "0", "rrclient": "0" } }, : : }, "DEVICE_METADATA": { "localhost": { "bgp_asn": "65098", "buffer_model": "traditional", "default_bgp_status": "up", "default_pfcwd_status": "disable", "hostname": "jpmtkvmsw98", "hwsku": "Force10-S6000", "mac": "52:54:00:12:34:56", "platform": "x86_64-kvm_x86_64-r0", "type": "LeafRouter" } "FEATURE": { "bgp": { "auto_restart": "enabled", "has_global_scope": "False", "has_per_asic_scope": "True", "has_timer": "False", "high_mem_alert": "disabled", "state": "enabled" }, :
vtyshモードにてshow running-configコマンドを叩くと以下のように出力される。
ルータIDとネイバのIPアドレスとdescriptionを変更し、ネイバの数を減らしている。ルートマップの設定は残してある。
router bgp 65098 bgp router-id 10.1.1.98 bgp log-neighbor-changes no bgp ebgp-requires-policy no bgp default ipv4-unicast bgp graceful-restart restart-time 240 bgp graceful-restart bgp graceful-restart preserve-fw-state bgp bestpath as-path multipath-relax neighbor PEER_V4 peer-group neighbor PEER_V6 peer-group neighbor 10.0.0.1 remote-as 65099 neighbor 10.0.0.1 peer-group PEER_V4 neighbor 10.0.0.1 description CUMULUS-VX-PATH1 neighbor 10.0.0.3 remote-as 65099 neighbor 10.0.0.3 peer-group PEER_V4 neighbor 10.0.0.3 description CUMULUS-VX-PATH2 neighbor 10.0.0.5 remote-as 65099 neighbor 10.0.0.5 peer-group PEER_V4 neighbor 10.0.0.5 description CUMULUS-VX-PATH3 neighbor 10.0.0.7 remote-as 65099 neighbor 10.0.0.7 peer-group PEER_V4 neighbor 10.0.0.7 description CUMULUS-VX-PATH4 neighbor 10.1.1.99 remote-as 65099 neighbor 10.1.1.99 peer-group PEER_V4 neighbor 10.1.1.99 description CUMULUS-VX-LO ! address-family ipv4 unicast network 10.1.1.98/32 neighbor PEER_V4 soft-reconfiguration inbound neighbor PEER_V4 route-map FROM_BGP_PEER_V4 in neighbor PEER_V4 route-map TO_BGP_PEER_V4 out neighbor 10.0.0.1 activate neighbor 10.0.0.3 activate neighbor 10.0.0.5 activate neighbor 10.0.0.7 activate neighbor 10.1.1.99 activate maximum-paths 64 exit-address-family !
Cumulus VX側の設定は以下のとおり。
Cumulus VX側もSONiCに倣い、インタフェースのIPアドレスは/31のサブネットマスクで設定。
router bgp 65099 bgp router-id 10.1.1.99 bgp bestpath as-path multipath-relax timers bgp 60 180 neighbor 10.0.0.0 remote-as 65098 neighbor 10.0.0.2 remote-as 65098 neighbor 10.0.0.4 remote-as 65098 neighbor 10.0.0.6 remote-as 65098 neighbor 10.1.1.98 remote-as 65098 address-family ipv4 unicast network 10.1.1.99/32 network 192.168.99.0/24
BGPの確認
設定を終えたところで、BGPのステータスの確認。
SONiC側は以下のとおり。
show ip bgp summaryコマンドを叩いてBGPテーブルの確認だが、通常のモードでもvtyshモードでもどちらでも実行可能。
設定直後はBGPピアを張れなかったが、VirtualBoxのNetwork設定欄内の 'intnet'の文字列を適当な文字列に変更した後、'intnet'に戻したらBGPピアを張る事が出来た。
BGPピアは張ったもののネットワークアドレスがアドバタイズされていない。SONiC同士やCumulus VX同士だとアドバタイズされるのだが、どうした事か。
jpmtkvmsw98# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0 BGP table version 1 RIB entries 3, using 576 bytes of memory Peers 5, using 128 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 10.0.0.1 4 65099 0 3 0 0 0 never Active 0 10.0.0.3 4 65099 0 7 0 0 0 never Active 0 10.0.0.5 4 65099 53 52 0 0 0 00:19:38 (Policy) (Policy) 10.0.0.7 4 65099 33 35 0 0 0 00:19:43 (Policy) (Policy) 10.1.1.99 4 65099 0 0 0 0 0 never Active 0 Total number of neighbors 5 jpmtkvmsw98#
show bgp summaryコマンド上ではBGPピアは張れているが、念の為プロセスレベルで確認してみる。
vtyshモードから抜けて、show serviceコマンドを叩いてBGPサービスが動作している事を確認。
BGPコンテナとその中のプロセスが出力され、BGPは動作している事が分かる。
jpmtkvmsw98# exit admin@jpmtkvmsw98:~$ admin@jpmtkvmsw98:~$ show services : : bgp docker --------------------------- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.9 32268 20308 pts/0 Ss+ 11:42 0:01 /usr/bin/python3 /usr/local/bin/supervisord root 19 0.0 0.7 27632 15608 pts/0 S 11:42 0:00 python3 /usr/bin/supervisor-proc-exit-listener --container-name bgp root 22 0.0 0.0 225856 2016 pts/0 Sl 11:42 0:00 /usr/sbin/rsyslogd -n -iNONE frr 26 0.0 0.5 677812 11476 pts/0 Sl 11:42 0:00 /usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm -M snmp frr 27 0.0 0.2 43884 4468 pts/0 S 11:42 0:00 /usr/lib/frr/staticd -A 127.0.0.1 frr 28 0.0 0.6 297708 14004 pts/0 Sl 11:42 0:01 /usr/lib/frr/bgpd 127.0.0.1 -M snmp root 37 0.0 0.9 39876 18772 pts/0 S 11:42 0:00 /usr/bin/python3 /usr/local/bin/bgpcfgd root 38 0.0 0.6 21912 12576 pts/0 S 11:42 0:00 /usr/bin/python3 /usr/local/bin/bgpmon root 39 0.0 0.1 82128 2916 pts/0 Sl 11:42 0:00 fpmsyncd : admin@jpmtkvmsw98:~$
また、systemctl status bgp.serviceコマンドを叩いたところ、bgp.serviceはLoadedでactive(running)である事から、正常に動作しているっぽい。
admin@jpmtkvmsw98:~$ systemctl status bgp.service ● bgp.service - BGP container Loaded: loaded (/lib/systemd/system/bgp.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-01-31 2:42:39 UTC; 27min ago Process: 1144 ExecStartPre=/usr/local/bin/bgp.sh start (code=exited, status=0/SUCCESS) Main PID: 1591 (bgp.sh) Tasks: 3 (limit: 2357) Memory: 17.9M CGroup: /system.slice/bgp.service tq1591 /bin/bash /usr/local/bin/bgp.sh wait tq1592 /bin/bash /usr/bin/bgp.sh wait mq1593 python3 /usr/local/bin/container wait bgp admin@jpmtkvmsw98:~$
BGP のプロセス自体は正常に動作している事は分かったが、ネイバからネットワークアドレスがアドバタイズされない点は気になる。以下のコマンドを打ちBGPのプロセスを再起動させてみた。
admin@jpmtkvmsw98:~$ sudo config bgp shutdown all Shutting down BGP session with neighbor 10.0.0.1... Shutting down BGP session with neighbor 10.0.0.3.... Shutting down BGP session with neighbor 10.0.0.5... Shutting down BGP session with neighbor 10.0.0.7... admin@jpmtkvmsw98:~$ admin@jpmtkvmsw98:~$ admin@jpmtkvmsw98:~$ admin@jpmtkvmsw98:~$ sudo config bgp startup all Starting up BGP session with neighbor 10.0.0.1... Starting up BGP session with neighbor 10.0.0.3.... Starting up BGP session with neighbor 10.0.0.5... Starting up BGP session with neighbor 10.0.0.7... admin@jpmtkvmsw98:~$
show ip bgp summaryのステータスに変化が無かった為、SONiCを再起動。
再起動後のBGPのステータスは状態は以下のとおり。
今度はBGPピアよりネットワークアドレスを受信出来た。
jpmtkvmsw98# show ip bgp summary IPv4 Unicast Summary: BGP router identifier 10.1.1.98, local AS number 65098 vrf-id 0 BGP table version 3 RIB entries 5, using 960 bytes of memory Peers 5, using 107 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt 10.0.0.1 4 65099 0 2 0 0 0 never Active 0 10.0.0.3 4 65099 0 0 0 0 0 never Active 0 10.0.0.5 4 65099 8 8 0 0 0 00:03:01 2 2 10.0.0.7 4 65099 8 8 0 0 0 00:03:01 2 2 10.1.1.99 4 65099 0 0 0 0 0 never Active 0 Total number of neighbors 5 jpmtkvmsw98#
Cumulus VX側は以下のとおり。
こちらもBGPピアは張れているものの、ネイバからネットワークアドレスがアドバタイズされていなかった。
しかし、SONiCの再起動後はBGPネイバよりネットワークアドレスがアドバタイズされた。
cumulus@jpmtkvmsw99:mgmt:~$ net show bgp summary show bgp ipv4 unicast summary ============================= BGP router identifier 10.1.1.99, local AS number 65099 vrf-id 0 BGP table version 5 RIB entries 5, using 960 bytes of memory Peers 5, using 128 KiB of memory Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.0.0.0 4 65098 0 0 0 0 0 never Active jpmtkvmsw98(10.0.0.2) 4 65098 41 39 0 0 0 00:03:08 1 jpmtkvmsw98(10.0.0.4) 4 65098 41 39 0 0 0 00:03:08 1 10.0.0.6 4 65098 0 0 0 0 0 never Active 10.1.1.98 4 65098 0 0 0 0 0 never Connect Total number of neighbors 5 show bgp ipv6 unicast summary ============================= % No BGP neighbors found show bgp l2vpn evpn summary =========================== % No BGP neighbors found cumulus@jpmtkvmsw99:mgmt:~$
今回はここまで。
vtyshモードではCisco IOS のコマンドとほぼ同じなので大きな間違いは無いと思うのだが、github内のドキュメントや海外の導入事例等をもう少し深く読んで、今回投入した設定が本当に正しいか再度確認したい。
問題点など
SONiCにおけるvtyshモードでの設定保存について。
writeコマンドの実行時、/etc/frrディレクトリ内のファイルに保存された旨のログが出力されるが、実際は/etc/sonic/frrディレクトリ内のファイルに保存される。/etc/frrディレクトリは存在しないので注意。
自分の環境下だけだろうか...
・毎回ではないが、再起動後、sshログインの設定が入っているにも関わらずsshログインが出来ない事が有る。その場合は再度sshログインの設定を投入するとsshログインが可能になる。
・今回は載せていないが、前日に同じ構成にてテストした結果、SONiC側から見たBGPネイバおよびCumulus VX側から見たBGPネイバのステータスはActiveになっているにも関わらず、Up時間がカウントし続ける事が有った。
・PingのReplyが返ってこない、BGPのピアが張れない...等の現象は、大抵はSONiCの再起動で改善された。
・上記の構成にて、SONiCとCumulus VXの起動完了後BGPのピアを張るまでに要する時間がまちまち。起動完了後30秒以内だったり5分前後だったり...
Rocket Turtle(Cumulus Linuxのマスコットキャラクター)「SONiCをのぞく時、SONiCもまたこちらをのぞいているのだ」
参照先など (2024/4/2 修正)
開発者および先達の皆さまに感謝。
https://sonicfoundation.dev/ SONiC
https://sonic-build.azurewebsites.net/ui/sonic/pipelines/142/builds/526483/artifacts/669686?branchName=master&artifactName=sonic-buildimage.vs ダウンロード(リンク先にてsonic-vsで検索。1500行目あたりにある)
https://github.com/Azure/SONiC/wiki/Configuration SONiC Configuration
https://github.com/Azure/SONiC/wiki/Architecture SONiCのアーキテクチャ
https://qiita.com/advent-calendar/2019/sonic SONiC Advent Calendar 2019
https://qiita.com/advent-calendar/2020/sonic SONiC Advent Calendar 2020
https://speakerdeck.com/imasaruoki Speaker Deckに掲載れているSONiCの資料
https://sonic.software/ ダウンロードサイト(非公式)
https://github.com/microsonic/usonic μSONiC (軽量版SONiC)
商用版SONiC
https://www.dell.com/support/home/ja-jp/product-support/product/enterprise-sonic-distribution/drivers Enterprise SONiC Distribution (DELL版SONiC)
https://github.com/Broadcom/sonic-VirtualSwitch/releases Enterprose SONiC By Broadcom (Broadcom版SONiC)
https://support.edge-core.com/hc/en-us/categories/360002134713-Enterprise-SONiC-Distribution-by-Edgecore Edgecore SONiC (Edgecore版SONiC)
https://cloudswit.ch/product/sonic-enterprise-distribution/ AsterNOS (Asterfusion版SONiC)
https://plvision.eu/offerings/sonic-product-development PLVISION版SONiC
SONiC関連の記事
https://debslink.hatenadiary.jp/entry/20210214/1613279732 SONiCのWarm Bootの動作確認
https://debslink.hatenadiary.jp/entry/20210822/1629600666 SONiCとCumulus LinuxでBGP unnumbered
https://debslink.hatenadiary.jp/entry/20210902/1630584311 SONiCとCumulus LinuxでBGP/EVPN/VXLAN
https://debslink.hatenadiary.jp/entry/20210912/1631418907 SONiCとCumulus Linuxで4byte ASなBGP+IP Clos構成
https://debslink.hatenadiary.jp/entry/20220122/1642852049 SONiCでL2 MC-LAGを組んでみた
https://debslink.hatenadiary.jp/entry/20210627/1624789102 SONiCの解説動画
https://debslink.hatenadiary.jp/entry/20240421/1713678733 DELL版のSONiCをVMware Fusionで動かす - 導入編