顯示具有 Ubuntu 標籤的文章。 顯示所有文章
顯示具有 Ubuntu 標籤的文章。 顯示所有文章

2020年6月13日 星期六

[教學] DPDK在實體機/虛擬機上執行l3fwd

大家好啊~~

當初讓l3fwd這個範例程式可以正常轉送兩台電腦之間的封包
花了幾天的時間才成功
因為官網寫的文件太精簡了

起初一直無法兩端互相ping到對方
後來經過一番研究
發現使用l3fwd範例
除了routing table要在程式上預先設定之外
還必須需要指定static ARP
主要是因為l3fwd的範例程式
沒有針對TCP/UDP之外的封包做處理
所以從Source發出的ARP封包無法傳遞給Destination

拓譜架構:





電腦A(Windows 10,IP: 198.18.0.1,00-E0-4C-68-DD-6C,與Port0接)
電腦B(Windows 10,IP: 198.18.1.1,00-E0-4C-68-FD-E0,與Port1接)
電腦S(Ubuntu 20.04,Port0: 24-6e-96-58-69-68,Port1: 24-6e-96-58-69-69)

1. 在Windows上設定Static ARP MAC Address
參考這裡的說明
Ubuntu的設定
參考這裡的說明

以我這邊的環境Windows
電腦A要下Port0的MAC Address
netsh -c i i add neighbors 14 "198.18.1.1" "24-6e-96-58-69-68"
(雙引號可不加,純粹方便閱讀)
同理,電腦B要下Port1的MAC Address
這裡就不加贅述了

2. 在執行l3fwd範例的時候
要在命令列指定MAC address
最重要的就是要在命令列加入--eth-dest的參數
將電腦S上的port所對應的電腦A/B使用的網卡MAC Address

sudo ./l3fwd -c 0x3 -n 2 -- -p 0x3 --config="(0,0,0),(1,0,1)" --eth-dest=0,00:E0:4C:68:DD:6C --eth-dest=1,00:E0:4C:68:FD:E0

l3fwd啟動之後
ping的部分就會正常運作了






這邊在電腦A上使用iperf3來打流量過去到電腦B

執行結果
PS D:\iperf-3.1.3-win64> .\iperf3.exe -c 198.18.1.1
Connecting to host 198.18.1.1, port 5201
[  4] local 198.18.0.1 port 51374 connected to 198.18.1.1 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  99.0 MBytes   830 Mbits/sec
[  4]   1.00-2.00   sec   110 MBytes   919 Mbits/sec
[  4]   2.00-3.00   sec   110 MBytes   919 Mbits/sec
[  4]   3.00-4.00   sec   109 MBytes   916 Mbits/sec
[  4]   4.00-5.00   sec   110 MBytes   924 Mbits/sec
[  4]   5.00-6.00   sec   105 MBytes   881 Mbits/sec
[  4]   6.00-7.00   sec   110 MBytes   924 Mbits/sec
[  4]   7.00-8.00   sec   108 MBytes   904 Mbits/sec
[  4]   8.00-9.00   sec   110 MBytes   920 Mbits/sec
[  4]   9.00-10.00  sec  63.5 MBytes   533 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  1.01 GBytes   867 Mbits/sec                  sender
[  4]   0.00-10.00  sec  1.01 GBytes   867 Mbits/sec                  receiver

iperf Done.
PS D:\iperf-3.1.3-win64>


遇過的問題
port 1 is not present on the board
多半可能是因為網卡沒有綁定到DPDK上

延伸閱讀
https://www.twblogs.net/a/5b99e1c22b71773ebacd9d9e
https://www.cnblogs.com/ZCplayground/p/9381961.html

---------------------------------------------------------------------------------------------------------------------

下面另外亂入附上
在虛擬機上執行l3fwd的結果
因為沒有實際的網卡所以沒辦法產生封包互打
推測可能要在虛擬機之間設定LAN Segment之類的東西
((有誰試試可以告訴我結果XD

如果要在虛擬機上執行
需要多加一個--parse-ptype的參數

john@ubuntu:~/dpdk-stable-18.11.6/myinstall/share/dpdk/examples/l3fwd/build/app$ sudo ./l3fwd -c 1 -n 2 -- -p 0x3 -P --config="(0,0,0),(1,0,0)" --parse-ptype
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:02:01.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
soft parse-ptype is enabled
LPM or EM none selected, default LPM on
Initializing port 0 ... Creating queues: nb_rxq=1 nb_txq=1... Port 0 modified RSS hash function based on hardware support,requested:0xa38c configured:0
portid = 0, nb_rx_queue = 1
 Address:00:0C:29:DC:F9:16, Destination:02:00:00:00:00:00, Allocated mbuf pool on socket 0
LPM: Adding route 0x01010100 / 24 (0)
LPM: Adding route 0x02010100 / 24 (1)
LPM: Adding route IPV6 / 48 (0)
LPM: Adding route IPV6 / 48 (1)
txq=0,0,0
Initializing port 1 ... Creating queues: nb_rxq=1 nb_txq=1... Port 1 modified RSS hash function based on hardware support,requested:0xa38c configured:0
portid = 1, nb_rx_queue = 1
 Address:00:0C:29:DC:F9:20, Destination:02:00:00:00:00:01, txq=0,0,0

Initializing rx queues on lcore 0 ... rxq=0,0,0 rxq=1,0,0

Port 0: softly parse packet type info
Port 1: softly parse packet type info

Checking link statusdone
Port0 Link Up. Speed 1000 Mbps -full-duplex
Port1 Link Up. Speed 1000 Mbps -full-duplex
L3FWD: entering main loop on lcore 0
L3FWD:  -- lcoreid=0 portid=0 rxqueueid=0
L3FWD:  -- lcoreid=0 portid=1 rxqueueid=0


2020年5月25日 星期一

[教學] DPDK在Ubuntu虛擬機上編譯方式

大家好啊~~
最近在研究DPDK的套件
想了解這些範例程式跑起來的樣子是什麼
但手邊沒有支援DPDK的實體網卡
後來看到網路上說
可以使用虛擬機模擬出支援的網卡!!!
於是手刀部建虛擬機&編譯環境了

以下是整理過的筆記
以DPDK-18.11.6版本+Ubuntu 16.04.3 with 4.4.0-87-generic+VMware Workstation 15當作範例

撰寫日期:2020.05.20

1. 首先建立好虛擬機並安裝好作業系統

2. 把虛擬機關機,再去設定檔這邊添加2張網卡(mode設NAT即可)

3. 修改.vmx,把你要設定網卡的"virtualDev"的值,設定為"e1000"
(否則網卡會無法給DPDK使用)

4. 開機後去官網下載dpdk的原始碼,並解壓縮出來後,進入該資料夾

5. 使用指令
sudo apt-get install make gcc python libpcap-dev libnuma-dev pkg-config -y
安裝這幾個dpdk編譯會用到的套件
./usertools/dpdk-devbind.py --status
去看網卡類型是否變為
drv=e1000
有的話就成功模擬出支援的網卡囉

6. 環境變數DESTDIR指定程式build出來的位置(名字位置任意,本範例會在dpdk目錄底下的myinstall資料夾內,建立所有範例的binary)
還有DPDK編譯相關的環境變數
export DESTDIR=myinstall
export RTE_SDK=/home/john/dpdk-stable-18.11.6/ export RTE_TARGET=x86_64-native-linuxapp-gcc

7. 執行官方設置腳本,包含載入igb_uio模組以及綁定網卡給DPDK使用
./usertools/dpdk-setup.sh
依序選擇
[15] x86_64-native-linuxapp-gcc(根據作業系統、使用的編譯器決定)
[18] Insert IGB UIO module
[24] Bind Ethernet/Crypto device to IGB UIO module(綁定指定網卡給DPDK)
[21/22] Setup hugepage mappings for (non-)NUMA systems(設定Hugeopage給DPDK使用)

8. 手動編譯範例make test,發現ImportError: No module named pexpect
補上解法
sudo apt-get install python-setuptools
sudo easy_install pip
sudo -E pip install pexpect
9. 因為在虛擬機上面執行程式,虛擬出來的網卡會有一些問題
如圖所示

要去修改library的程式碼解決問題
vim kernel/linux/igb_uio/igb_uio.c : 259
修改完畢後要重新編譯DPDK,並且重新載入igb_uio模組

10. 再去執行範例程式,以Helloworld來說存在於myinstall/share/dpdk/examples/helloworld/build/app底下

我的虛擬機有4顆Core,3張網卡(後兩張有綁給DPDK)
使用sudo ./helloworld執行範例
執行結果如下
-------------------------------------------------------------------------
john@ubuntu:~/dpdk-stable-18.11.6/myinstall/share/dpdk/examples/helloworld/build/app$ sudo ./helloworld
EAL: Detected 4 lcore(s)
EAL: Detected 1 NUMA nodes
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:02:01.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket -1
EAL:   Invalid NUMA socket, default to 0
EAL:   probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0
john@ubuntu:~/dpdk-stable-18.11.6/myinstall/share/dpdk/examples/helloworld/build/app$
-------------------------------------------------------------------------

以上!
有問題歡迎留言討論
後續再來寫命令列參數的使用

2020年4月21日 星期二

大家好啊~~
來寫一篇非常基礎的Ubuntu安裝教學

安裝前置作業
請準備好一支16GB以上的空白隨身碟
一台Windows的電腦
並且準備好ubuntu-16.04.3-server-amd64.iso映像檔
下載ISOtoUSB將我們的映像檔製作成可以安裝系統的隨身碟
做完後請將隨身碟插入Server並開機
它會自動進入此畫面

語言選English
選Install Ubuntu Server
再選一次English
地區的部分
選Other→Asia→Taiwan
Locale選United States
進入設定鍵盤的部分
選Yes
依照對話框上面的指示鍵入鍵盤上有的符號
看到這個畫面就完成了
按下Continue繼續
進行安裝程序中...請稍後

Hostname為mec
Full name為mec
Username為mec
輸入密碼
再次輸入密碼
加密你的目錄
自動偵測時區
如果正確選yes
Guided - use entire disk and setup LVM
選擇要安裝的磁碟區
確定你的選擇選Yes
輸入提示當中的最大空間數量,並按Continue
確定你的選擇選Yes
安裝中
若需要Proxy請依指示輸入
系統自動更新的方式
(少擷取到一個要安裝的套件)
請移動圖標到OpenSSH server並按下空白鍵選取之
完成安裝選Continue
重新啟動完成後輸入剛剛的密碼就可以登入了





























2018年9月20日 星期四

[教學] 教你如何 成為準...電信業者 - NextEPC安裝教學 / SIM卡燒錄教學

上星期在交大舉辦了一個5G的Workshop
主要是提供4G/5G的概念
並且宣傳實驗室正在執行計畫的內容

小弟負責主講
實驗室開發的5G Open Source核心網路的基底 - NextEPC概念與安裝教學
知識的分享
是促進國家進步的重要過程
在這裡也分享給大家

在進行安裝之前
先準備好一台主機
以及一個Ubuntu的系統
可以灌在實體或虛擬機上
但我推薦灌在虛擬機上
原因是
如果不小心做錯步驟
還能夠還原到上個snapshot或是直接砍掉重練

先簡單介紹一下NextEPC是什麼
他是一個4G開源核心網路專案
大家以前可能較常聽過的是Openair-cn
(但是他很爛,很難安裝,功能又很陽春)
NextEPC這個專案的兩個賣點是
現今開源專案中實作最完整(具備MME, HSS, S-GW, P-GW, PCRF)
最新版(符合行動網路標準組織3GPP的Release 13)

這邊以KVM當作虛擬機的Hypervisor
詳細安裝步驟可參考這裡

接下來灌好一個Ubuntu的VM
在我們的場景下這個VM需要兩張網卡
一張是用於對外連線的(Internet)
一張是用於對內連線的(eNB)

預設的VM會建立一個NAT的網卡
就是第一張網卡(對外)的功能

另一張對內的網卡採用Bridge的模式到對應的實體網卡
完成之後即可開始安裝NextEPC
NextEPC安裝指令集:https://hackmd.io/s/ryWBaxU6Om

簡介一下上面安裝步驟的意義
第1步是給HSS使用的database
第2~6步設定TUN裝置,這個裝置的目的是從核網轉送封包到Internet
第7~9步針對NextEPC的原始碼進行編譯
第10~12步安裝WebUI,控制HSS的database介面,並且加入subscriber的資訊
第13步是設定核網的一些資訊
第14步是設定轉送封包的規則
第15步是NextEPC執行指令

接下來是製作自己的SIM卡

我們採用的SIM卡是可以進行資料改寫的款式
可以在這購買
讀卡機就找市面上可以讀晶片卡的那種即可

SIM卡燒錄指令集:https://hackmd.io/s/rkPxfLTdm
提醒:先準備好要燒進去的K/OP(OPc)/IMSI/ADM1 key

Acknowledgement:
張霽和朱家佐協助步驟整理
謝承穎學長坐在旁邊支持我XD

2017年3月6日 星期一

[袁賢銘的OS作業]HW1筆記 [圖+文]

第一步驟

在Ubuntu16.04 LTS上安裝KVM

在安裝KVM前必須先符合以下兩點需求:
1.CPU必須支援hardware virtualization
雖然是這樣說
我沒有支援但還是可以裝OAO

2.使用64位元的Host-OS(建議,但不一定要)
因為如果使用32位元的系統
在KVM上的VM記憶體最多只能給到2GB的大小

接下來開始安裝KVM

$ sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
安裝好以後
通常預設自動會把你的username加入到libvirtd群組
因此執行下面這行
$ sudo adduser `id -un` libvirtd
會顯示已經加入群組了
The user `username' is already a member of `libvirtd'.

接下來檢查有無安裝成功
$ sudo virsh list --all
如果有成功會顯示
Id Name                 State
----------------------------------
這樣就OK了
等到之後在KVM上安裝VM後
再次執行這個指令就會有東西了

第二步驟

安裝VMM(Virtual Machine Manager)

這裡以virt-manager來示範
$ sudo apt-get install virt-manager
這是一個透過GUI來控制並管理KVM虛擬機的程式

以最高權限執行
$ sudo virt-manager

第三步驟

在KVM上建立虛擬機器

接下來開始透過KVM建立虛擬機器


看你的系統映像檔要從哪個來源取得
第一個是已經事先下載好iso檔到電腦本地/使用光碟安裝
第二個是從網路上的連結直接取得
第三和第四沒有研究XD

本篇文章以第一個做示範
選好之後按Forward


在這裡選取你的光碟機位置(點第一個)或者iso檔的存放位置(點第二個)
點選Browse
如果畫面上找不到你的iso檔案
在下面有一個Browse Local的按鈕
點下去就會跳出熟悉的開啟舊檔視窗


找到後點Choose Volumey再點Forward

這裡調整你要個VM的記憶體大小及CPU數量



這裡指定硬碟空間大小


這裡指定VM的名稱
並且!!!
請將Customize....的框框打勾
因為要避免在之後安裝遇到一個問題
就是滑鼠在KVM的VM中會亂跑
如圖順序操作
就會開始安裝了
慢慢等吧~~~~


第四&第五步驟

讓VM的OS可以被 Host OS 不需密碼透過SSH登入
這次目標是
從Host OS免密碼登入VM
因此要把Host OS的相關資訊給VM知道
這個資訊我們藉由public key來達成
有興趣的人可以網路google原理

輸入
$ ssh-keygen
過程之中為了方便起見就不設定passphrase
一直按enter直到出現這個可愛的正方形即可
產生這台電腦的public key


$ sudo vim /etc/hosts
讓電腦名稱和電腦IP對應
如果不知道自己電腦的IP
就輸入ifconfig
在inet addr那欄的就是


將VM的兩台電腦的IP位置輸入進去
進行測試一下能不能連線到遠端電腦
$ ping (PC name)
如果可以的話你會看到如下面的圖

接下來就是把你的public key傳送到遠端電腦
$ scp ~/.ssh/id_rsa.pub john@johnPC1:~/.ssh/a.pub
!!!如果遠端電腦沒有.ssh這個資料夾請自行建立!!!

這行的意思是透過網路
將本地的id_rsa.pub傳送到johnPC1的john帳戶中
~/.ssh這個資料夾內
並且命名為a.pub(這名字不重要任意取就好)

接下來到遠端電腦這邊輸入
$ cat ~/.ssh/a.pub >> ~/.ssh/authorized_keys
將a.pub這個檔案的內容輸出到authorized_keys這個檔案之中

$ chmod 600 ~/.ssh/authorized_keys
將authorized_keys這檔案的權限調整成只有電腦使用者可以做更改

接下來將密碼認證的部分關閉
(這是為了讓電腦只接受authorized_keys檔案清單之內的電腦連進來)
$ sudo vim /etc/ssh/sshd_config
往下拉找到PasswordAuthentication這一行
把yes改no
若這一行前面有#也把它刪掉
這樣就可以停用密碼認證了
並且只允許authorized_keys檔案清單之內的電腦連進來

接著就是要重新啟動SSH服務
讓所有的設定值生效
$ sudo service ssh restart

最後就是測試啦~~~~~~~~~~~~~
$ ssh (account name)@(PC name)
如果沒有輸入密碼的提示
並且如下圖所示
恭喜你成功了~
完成!!!

參考內容出處:
https://help.ubuntu.com/community/KVM/Installation
http://www.tecmint.com/install-and-configure-kvm-in-linux/
http://www.arthurtoday.com/2009/11/ssh-linux-client.html