# 網路模擬與分析 (2/22):Ubuntu 與 Mininet 安裝
###### tags: `Mininet`、`HTTP Server`、`Python`
## 環境架設與安裝
### ubuntu 16.04 安裝 (for mac)
1. ubuntu 16.04 iso(desktop):https://mirror.umd.edu/ubuntu-iso/16.04/
2. 下載完之後到 VMWare 進行創建虛擬機

3. 選擇安裝的方式,點選**繼續**
4. 匯入 iso 檔

5. 創建虛擬機名稱,例如:ubuntu 16.04
完成後,你的 ubuntu 系統就完成安裝了

### Mininet 安裝
變更 root 權限密碼
```
sudo passwd root
```
用 git clone 下載
```
git clone https://github.com/mininet/mininet.git
```
* 若你尚未安裝 git,可使用`apt-get install git`
```
root@ubuntu:/home/user# apt-get install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
git-man liberror-perl
Suggested packages:
git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk
gitweb git-arch git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 159 not upgraded.
Need to get 3,932 kB of archives.
After this operation, 25.6 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://us.archive.ubuntu.com/ubuntu xenial/main amd64 liberror-perl all 0.17-1.2 [19.6 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 git-man all 1:2.7.4-0ubuntu1.9 [736 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu xenial-updates/main amd64 git amd64 1:2.7.4-0ubuntu1.9 [3,176 kB]
Fetched 3,932 kB in 3s (1,085 kB/s)
Selecting previously unselected package liberror-perl.
(Reading database ... 177262 files and directories currently installed.)
Preparing to unpack .../liberror-perl_0.17-1.2_all.deb ...
Unpacking liberror-perl (0.17-1.2) ...
Selecting previously unselected package git-man.
Preparing to unpack .../git-man_1%3a2.7.4-0ubuntu1.9_all.deb ...
Unpacking git-man (1:2.7.4-0ubuntu1.9) ...
Selecting previously unselected package git.
Preparing to unpack .../git_1%3a2.7.4-0ubuntu1.9_amd64.deb ...
Unpacking git (1:2.7.4-0ubuntu1.9) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up liberror-perl (0.17-1.2) ...
Setting up git-man (1:2.7.4-0ubuntu1.9) ...
Setting up git (1:2.7.4-0ubuntu1.9) ...
root@ubuntu:/home/user# git clone https://github.com/mininet/mininet.git
Cloning into 'mininet'...
remote: Enumerating objects: 10154, done.
remote: Total 10154 (delta 0), reused 0 (delta 0), pack-reused 10154
Receiving objects: 100% (10154/10154), 3.15 MiB | 1.96 MiB/s, done.
Resolving deltas: 100% (6782/6782), done.
Checking connectivity... done.
```
進入`mininet`資料夾後,使用`util/install.sh -a`進行安裝
> 可先使用`-h`查看有哪些指令
結果出現這樣的畫面就代表已經成功安裝好 mininet
```
----------------------------------------------------------------------
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/user/oflops/example_modules/snmp_cpu'
make[2]: Leaving directory '/home/user/oflops/example_modules/snmp_cpu'
make[2]: Entering directory '/home/user/oflops/example_modules'
make[3]: Entering directory '/home/user/oflops/example_modules'
make[3]: Nothing to be done for 'install-exec-am'.
make[3]: Nothing to be done for 'install-data-am'.
make[3]: Leaving directory '/home/user/oflops/example_modules'
make[2]: Leaving directory '/home/user/oflops/example_modules'
make[1]: Leaving directory '/home/user/oflops/example_modules'
Making install in cbench
make[1]: Entering directory '/home/user/oflops/cbench'
make[2]: Entering directory '/home/user/oflops/cbench'
/bin/mkdir -p '/usr/local/bin'
/bin/bash ../libtool --mode=install /usr/bin/install -c cbench '/usr/local/bin'
libtool: install: /usr/bin/install -c cbench /usr/local/bin/cbench
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/home/user/oflops/cbench'
make[1]: Leaving directory '/home/user/oflops/cbench'
Making install in doc
make[1]: Entering directory '/home/user/oflops/doc'
make[1]: Nothing to be done for 'install'.
make[1]: Leaving directory '/home/user/oflops/doc'
Enjoy Mininet!
```
---
我們可以使用一些簡單的指令,例如:`mn`來建立拓樸
```
root@ubuntu:/home/user/mininet# mn
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller
c0
*** Starting 1 switches
s1 ...
*** Starting CLI:
mininet>
```
* Topology:一台交換機相連兩台 host,其中控制器去控制交換機的行為

使用 mininet 呼叫 h1、h2,其中我們把 h1 當客戶端,h2 當服務端
```
xterm h1 h2
```
1. h2
建立網頁伺服器
```
echo "hi" > hi.htm
```
建立服務連線
```
python -m SimpleHTTPServer 80
```

2. h1
使用`curl`進行尋找網頁伺服器
```
curl 10.0.0.2/hi.htm
```

* 若有出現 **Curl: (7) Failed to connect to port 443: Connection refused** 的訊息,可以透過以下幾種方式進行除錯
1. 查看埠號資訊:`netstat -tunlp | grep 80`
2. curl 本地端:`curl 127.0.0.1`
3. 檢查 apache2 是否安裝以及啟動:
`apt-get install apache2 -y`
`systemctl start apache2`
`systemctl enable apache2`
`systemctl status apache2`
## Reference
1. Mininet 相關課程:https://www.bilibili.com/video/BV1y4411t71s?from=search&seid=1247895496549182471
2. Mininet github:https://github.com/mininet/mininet
3. ubuntu 16.04 iso:https://mirror.umd.edu/ubuntu-iso/16.04/
4. ubuntu 16.04 desktop iso on google drive : https://drive.google.com/drive/folders/1o_IuGVW37Ux4fzHlAO9r15SNdO0XRPpH?usp=sharing
5. 上課教學影片:https://drive.google.com/drive/folders/1hcu-E649f1py88s95eIZrl1iX_fnOBBK?usp=sharing
6. Mininet 安裝教學:https://sites.google.com/site/sdnruantidingyiwanglu/vmware-xia-zai-yu-an-zhuang/mininet