概要
Mininet-WiFi とは、ソフトウェアで仮想ネットワーク環境を定義して動かせるMininetにWi-Fiのノードを利用できるよう拡張したものです。
MacでMininet-WiFiを動かしたかったのですが、若干苦労したのでメモ。
最終的に可能だったのは以下の構成です。
MacOS Sequoia 15.7.3
VirtualBox 7.2.4
Ubuntu 24.04.3 (ARM64 Desktop版)
構成
VirtualBox上のUbuntu内で、Mininet-WiFiのgitリポジトリにあるDockerfileをDockerでビルドして動かします
手順
VirtualBoxをインストール
UbuntuのISOをダウンロード
VM新規作成
VirtualBoxで仮想マシンを新規作成します。
VM名: 適当にわかる名前
ISOイメージ: ダウンロードしたISOファイル
OS: Linux
OSディストリビューション: Ubuntu
OSバージョン: Ubuntu 24.04 LTS (Noble Numbat) (ARM64-bit)
無人インストール: なし (日本語キーボードを選択したいため)
仮想ハードウェア
メインメモリ: 6GBぐらい?
CPU: 4つぐらい (マシンの搭載CPUの1/3以下あたり良いかと思います)
ネットワーク設定
アダプター2でホストオンリーネットワークを選択して、存在する項目を選択。
最初はVirtualBox自体の設定の「ネットワーク」で新規作成する必要があります。設定項目はそのままで大丈夫。
Ubuntuセットアップ
VM起動後、普通にセットアップします。
若干トラブルがありました。しばらくしてインストールが動かなくなりましたが、画面右上からマシンのリスタートを選んだりしたらなぜか進みました。
止まったときのログの最後は以下のような感じでした。
curtin command in-target
インターネット接続をなくすと進むみたいな話も見かけましたが真偽不明です。
Macからsshでアクセスできるようにする
- Desktop UIから設定アプリのSystemでsshをONにする
- sshをインストール
sudo apt install openssh-server sudo systemctl restart ssh - sshプロセスがいるか確認
ps aux | grep ssh - Macのターミナルからログインしてみる
ssh hammmm@mininet-wifi2.local ssh ログイン名@マシン名.local - 入れない場合は以下を確認しましょう
- sshプロセスが動いているか
- avahiプロセスが動いているか
- なければ sudo apt install -y avahi-daemon
- ホストオンリーネットワークのIPが取得できているか?
- ip a してみましょう
- sudo dhclient -v enp0s9 などでIPがとれるかもです
- 再起動後もIPとれるようにするには?
- /etc/netplan/ のyamlファイルで、enp0s9のdhcp4もtrueにする
git, docker, (tmux) インストール
自分はtmuxも使うので入れます。tmuxの利点としては、ターミナルを画面分割できるだけでなく、MacBookをスリープしたりして、sshが切れてもVMが動いていれば履歴が残っていて、tmux attachすると前回そのままの状態で引き続き作業できる、というのがあります。
sudo apt install git tmux
- dockerインストール
snapとaptの方式がありますが、どうもsnapだと/var/run/docker.sock のパーミッション問題が出るのでaptのほうが良さそうでした。
sudo apt install docker.io
# dockerグループに自分を入れる
sudo usermod -a -G docker $USER
# グループ変更を反映するためVM再起動
sudo reboot
sudo snap install docker
mininet-wifi クローン、Dockerビルド
git clone https://github.com/intrig-unicamp/mininet-wifi.git
docker build -t mininet-wifi:v1 .
Dockerイメージを確認します。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mininet-wifi v1 957341e7b543 About a minute ago 2.32GB
Docker起動、mininet-wifi起動
Dockerは以下の感じで起動します。(https://github.com/intrig-unicamp/mininet-wifi/ 参照)
Ubuntu側のデバイスを利用するためのオプション設定が重要のようです。
docker run -it --rm --privileged --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" -v /tmp/.X11-unix:/tmp/.X11-unix:rw --net host -v /sys/:/sys -v /lib/modules:/lib/modules -v /sys/kernel/debug:/sys/kernel/debug -v /var/run/netns:/var/run/netns mininet-wifi:v1
Docker内のbashが起動します。
おもむろに
mn --wifi
とやってみましたが、以下のようなエラーが出ました。
ovs-vsctl exited with code 1
*** Error connecting to ovs-db with ovs-vsctl
Make sure that Open vSwitch is installed, that ovsdb-server is running, and that
"ovs-vsctl show" works correctly.
You may wish to try "service openvswitch-switch start".
そこで、openvswitchサービスを開始します。
service openvswitch-switch start
# mn --wifi
/usr/local/bin/mn:4: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
__import__('pkg_resources').run_script('mininet-wifi==2.7', 'mn')
*** Adding stations:
sta1 sta2
*** Adding access points:
ap1
*** Configuring nodes...
*** Creating network
*** Adding controller
*** Adding hosts:
*** Adding switches:
*** Adding links:
(sta1, ap1) (sta2, ap1)
*** Starting controller(s)
c0
*** Starting L2 nodes
ap1 ...
*** Starting CLI:
mininet-wifi>
やっとコマンドラインが出ました!
mininet-wifiは、何も指定しないとAP(WiFiアクセスポイント)1つにSTA(WiFiクライアント)2つというシンプルなネットワークを構成します。
mininet-wifi> nodes
available nodes are:
ap1 c0 sta1 sta2
mininet-wifi> links
ap1-wlan1<->wifi (use iw/iwconfig to check connectivity)
sta1-wlan0<->wifi (use iw/iwconfig to check connectivity)
sta2-wlan0<->wifi (use iw/iwconfig to check connectivity)
pingを打ってみます。
mininet-wifi> sta1 ping -c1 sta2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
92 bytes from 10.0.0.1: Destination Host Unreachable
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
pingが届きません!問題があります。
これは、Ubuntu上のNetworkManagerが設定を変えてしまうせいで、よくあることのようです。NetworkManagerを止めておきます。
Ubuntu側(Dockerホスト側)で以下のようにやります。
sudo systemctl stop NetworkManager
quitしてから mn --wifi で起動しなおして、pingを打ってみると、通るようになりました!
mininet-wifi> sta1 ping -c1 sta2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: icmp_seq=0 ttl=64 time=2059.985 ms
--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max/stddev = 2059.985/2059.985/2059.985/0.000 ms
Mininetでのコマンド実行について
このように、Mininetでは、まずノード名を書いて、その後にコマンドラインを続けると、そのノードの仮想ネットワーク環境で実行することができます。
また、コマンドラインの中に、ダブルクォーテーションで囲っていないノード名があると、IPアドレス (10.0.0.2) に変換されてから実行されるようです。
(/etc/hosts やDNSルックアップではなさそうです)
(ノード名) (コマンドライン...)
修正版Dockerの起動スクリプト
上記いくつかの問題を回避するため、以下のようなスクリプトで起動すれば良さそうです。
sudo systemctl stop NetworkManager
docker run -it --rm --privileged --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" -v /tmp/.X11-unix:/tmp/.X11-unix:rw --net host -v /sys/:/sys -v /lib/modules:/lib/modules -v /sys/kernel/debug:/sys/kernel/debug -v /var/run/netns:/var/run/netns mininet-wifi:v1 sh -c "service openvswitch-switch start && /bin/bash"
service openvswitch-switch start については、Dockerfileに記載して再ビルドする手もありそうです。ついでに必要なツールなども追加しておくと良さそうです。
xterm起動はノードによってはうまくいかない
DISPLAY=:0 mn --wifi
のようにするとディスプレイを指定できるので、mininetのコマンドラインで xterm (ノード名) などでGUIのxtermを起動できるはずらしいのですが、wifiクライアントのノード (sta1, sta2)については起動できませんでした。
