WSL2でMininet-WiFiを使ってみた
1 WSL2でUbuntu環境を用意
1.1 Windows Powershellを起動し、以下のコマンドを実行
wsl --install
1.2 インストール完了後、Windowsを再起動
インストールが終わるとこのような表示が出る
インストール中:Linux用Windowsサブシステム
Linux用Windowsサブシステムはインストールされました
インストール中:Ubuntu
Ubuntuはインストールされました
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
Windowsを再起動したらターミナルが開いて、以下のような表示が現れる
Ubuntuは既にインストールされています
Ubuntuを起動しています
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
1.3 ユーザー名とパスワードを作成
うまくいくとこんな表示が出る
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>"
See "man sudo_root" for details.
1.4 Ubuntuをタスクバーにピン留めしておく
今後よく使うことになるので、下の画像のようにUbuntuを検索してピン留めしておこう!
2 Mininet-WiFiで必要なカーネルモジュールを追加
2.1 以下のコマンドを一行ずつUbuntuで実行
# MicrosoftのWSLカーネルソースをダウンロード
git clone https://github.com/microsoft/WSL2-Linux-Kernel
# 再構築するカーネルのコンフィグファイルを上書き
cd WSL2-Linux-Kernel
cp Microsoft/config-wsl .config
# 再構築に必要なツールをインストール
sudo apt update
sudo apt install cmake libncurses-dev flex bison libboost-all-dev openssl libspdlog-dev build-essential libssl-dev libelf-dev dwarves
2.2 設定コンフィグを変更する
Ubuntuで続けて以下コマンドを実行
make menuconfig
青色のウィンドウの設定コンフィグが表示されるので以下を作業を順に行う
(1)カーネルリソース名を変更する
自分の場合はこのようにした。
(2)bridgeモジュールを追加する
(3)QoSの設定を変更する
(4)OpenVSwitchモジュールを追加する
(5)mac80211モジュールを追加する
このモジュールだけ設定コンフィグ内で見つからないので、Ubuntuのターミナルで以下コマンドを実行する
scripts/config --module CONFIG_MAC80211
scripts/config --module CONFIG_MAC80211_HWSIM
(6)設定コンフィグをセーブする
2.3 カーネルモジュールをコンパイルしてインストール
Ubuntuで以下コマンドを実行する(makeに時間がかかるのでCPUコアを全部使って時短している)
jobs=$(($(cat /proc/cpuinfo | grep processor | wc -l)+1))
time make -j $jobs
make modules_install
正常にできていたら、以下コマンドを実行するとカーネルリソース名が設定したものになっているはず
find /lib/modules
2.4 vmlinuxをWindowsファイルシステムにコピーしておく
Ubuntuで以下コマンドを実行
# C:\Users\ユーザ名\.wslconfigファイルを作成して、上記vmlinuxを使うように設定
winuser=$(cmd.exe /c "echo %USERNAME%" 2> /dev/null | tr -d '\012\015')
echo $winuser
mkdir /mnt/c/Users/$winuser/wsl2/
cp vmlinux /mnt/c/Users/$winuser/wsl2/
echo -e '[wsl2]\nkernel = C:\\\\Users\\\\'$winuser'\\\\wsl2\\\\vmlinux' | tee /mnt/c/Users/$winuser/.wslconfig
2.5 カーネルを再起動する
まず、Ubuntuで現在使用中のカーネルリソース名を確認する
uname -rv
管理者権限でPowershellを開いてWSL2をシャットダウン
wsl --shutdown
Ubuntuを開いてカーネルリソース名を確認する。もしカーネルリソース名が変更されていたらおk
uname -rv
3 WSL2スタートアップスクリプトの設定
3.1 Ubuntuで以下コマンドを実行
# /sbin/mount -a 実行時にrcファイルシステムをマウントするように設定
echo 'none none rc defaults 0 0' | sudo tee -a /etc/fstab
# /sbin/mount.rcファイルを実行可能スクリプトとして作成
echo '#!/bin/bash' | sudo tee /sbin/mount.rc
sudo chmod +x /sbin/mount.rc
# /sbin/mount.rcに実行権限が付与されているか確認
ll /sbin/mount.rc
# 起動時に実行させたいスクリプトを/sbin/mount.rcに追記
echo 'modprobe -a openvswitch sch_htb sch_netem sch_hfsc sch_tbf sch_red mac80211_hwsim' | sudo tee -a /sbin/mount.rc
echo '/etc/init.d/openvswitch-switch start' | sudo tee -a /sbin/mount.rc
# スタートアップスクリプトを確認
sudo cat /sbin/mount.rc
3.2 管理者権限でPowershellを開いてWSL2を再起動
wsl --shutdown
wsl
これでWSLを再起動するために実行しなければいけない面倒なコマンドを自動化できた
4 Mininet-WiFiをインストール
4.1 必要なパッケージをインストール
Ubuntuで以下コマンドを実行
# パッケージリストを更新
sudo apt-get update
sudo apt-get upgrade -y
# 必要な依存パッケージをインストール
sudo apt-get install -y git build-essential python3-dev python3-pip flex bison libssl-dev libnl-genl-3-dev libnl-route-3-dev libnl-nf-3-dev libnl-idiag-3-dev cmake autoconf libtool pkg-config libsqlite3-dev net-tools wireshark tcpdump ethtool
4.2 Mininet-WiFiをインストール
Ubuntuで以下コマンドを実行
# GitHubレポジトリをローカルにクローン
git clone https://github.com/intrig-unicamp/mininet-wifi.git
# インストールスクリプトを実行
cd mininet-wifi
sudo util/install.sh -Wlnfv
ちなみに、このスクリプトでは以下のオプションが用意されている
-w Wiresharkをインストール
-l 最新版をインストール
-n Mininetのインストールをスキップ
-f OpenFlowをインストール
-v 詳細な出力を有効にする
5 動作確認
5.1 Mininet-WiFiをつかってみる
Ubuntuで以下のコマンドを入力し、ネットワークの疎通テストを行う
sudo mn --wifi --test pingall
うまくいくとこんな感じ
参考文献
WSL2にOpenVSwitchをインストール(カーネル再構築)
How to Install Mininet in WSL2 - HackMD
WSL2でスタートアップスクリプトを実行するには