如何將Linux打造成OpenFlow Switch:Openvswitch

因為工作上被指派去做SDN,自然需要SDN的網路設備才可以。問題是SDN Switch賣的超級貴的,一台差不多要30萬台幣。這跟當初推廣SDN的人說法完全不一樣!他們當初說SDN網路設備會變得比較便宜,因為網路設備上不需要在堆疊這麼多的網路協定,因此硬體可以Cost Down,也可以省下軟體的錢。問題是,如果單單賣純種SDN Switch根本是不可能的事情啊,因為缺少可以在上面跑的軟體和控制器,所以只好保留傳統設備上的功能,再多加OpenFlow的支援,並提供給使用者選擇的開關。這樣當然只會更貴不會便宜啊!!

在沒錢、沒人、沒資源的情況下,要怎麼辦呢?用模擬軟體?可惜要Demo的時候行不通。那就只好自己來打造一台SDN Switch了。雖然沒有晶片的支援,但只要不牽扯到效能的話,應該沒太多問題。下面是我和同事想過的一些解決方案:
  1. 自己打造OpenFlow的Agent,反正OpenFlow的網路協定並不複雜,然後透過Linux Kernel的netfilter來模擬晶片的行為。因為是用軟體模擬,所以效率會比較差,但反過來說,因為是軟體,所以我可以滿足所有OpenFlow的要求,不會有做不到的事情。不過這個提案被一個PM的同事封殺了,理由是這不能賣錢 ... 
  2. 有一個同事找到一個有趣的專案FlowForwarding。這個專案提供了Open Source的OpenFlow Agent: LINC。LINC是用Erlang所開發的軟體。雖然我根本不會Erlang,但程式語言不是我考慮的重點,我好奇的是它要怎麼模擬晶片來處理封包。從網頁上看到,LINC在使用上需要libpcap的函式庫,初步猜測,LINC應該是把所有的封包透過libpcap攔截到user space以後進行修改。這樣做的效率應該會比我的解決方案更差。
  3. OpenVswitch。這是大部份產品的解決方案。我聽過一堆公司宣稱自己有了SDN Switch,而內容只不過是把Openvswitch移植到自己原有的產品上罷了。一樣,我好奇它要怎麼模擬晶片來處理封包,看了編譯過程,它會產生openvswitch.ko,在加上它利用bridge的特性,所以應該是在linux bridge那邊進行hook後修改。
考量到移植的方便性,所以後來我個人選擇openvswitch作為SDN Switch的解決方案。在開始介紹移植步驟前,先來介紹openvswitch。Openvswitch這個專案是Nicira為了解決網路虛擬化所開發的原始碼專案,傳統的虛擬機都是運行在同一台主機上,而虛擬機的網卡透過作業系統的Bridge進行相連。然而在資料中心的年代,當虛擬機橫跨不同的主機時,這個網路要如何管理?對外部的管理軟體來說,因為bridge的特性,所以只能夠看到主機上的那張網卡,而管理上也只能針對主機所在實體交換機,而無法對虛擬機的網路進行操控。要解決這個問題,Nicira提出的辦法就是,在各虛擬基下面再多加一層虛擬的交換器,而外部的管理工具就可以直接對這虛擬交換器進行管理、控制。架構如下所示:

也因此,openvswitch的目標是打造虛擬的switch,而且讓這台switch可以接受來自外部的管理。管理switch的protocol有很多種,OpenFlow不過是其中之一,而我就是要利用這之一的功能,來打造SDN OpenFlow Switch。再說一次,openvswitch是要在主機上模擬一台switch,雖來本意是要給在上面的虛擬機使用,不過就算沒有虛擬機也還是運作的好好的。

下面紀錄移植的步驟,因為時間的關係,很多設定不求甚解,之後補上吧。

硬體:Pandaboard ES + 2*usb網卡
作業系統:Ubuntu 12.04 Server
參考資料:
http://networkstatic.net/installing-and-configuring-openvswitch-on-ubuntu-12-04-precise-pangolin/
http://networkstatic.net/openvswitch-configure-from-packages-and-attaching-to-a-floodlight-openflow-controller/

  1. 安裝移植所需要的軟體:
    apt-get install -y git automake autoconf gcc uml-utilities libtool build-essential git pkg-config linux-headers-`uname -r`
  2. 下載openvswitch並解壓縮:
    wget http://openvswitch.org/releases/openvswitch-1.11.0.tar.gz
    tar zxvf openvswitch-1.11.0.tar.gz
  3. 編譯openvswitch:
    cd openvswitch-1.11.0
    ./boot.sh
    ./configure --with-linux=/lib/modules/`uname -r`/build
    make
    sudo make install
  4. 載入openvswitch kernel module:
    sudo insmod datapath/linux/openvswitch.ko
  5. 建立openvswitch的設定檔以及資料庫:
    touch /usr/local/etc/ovs-vswitchd.conf
    sudo mkdir -p /usr/local/etc/openvswitch
    sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
  6. 啟動ovs資料庫(看不懂也不打算深究):
    ovsdb-server /usr/local/etc/openvswitch/conf.db \
    --remote=punix:/usr/local/var/run/openvswitch/db.sock \
    --remote=db:Open_vSwitch,manager_options \
    --private-key=db:SSL,private_key \
    --certificate=db:SSL,certificate \
    --bootstrap-ca-cert=db:SSL,ca_cert --pidfile --detach --log-file
  7. 啟動openvswitch
    sudo ovs-vsctl --no-wait init
    sudo ovs-vswitchd --pidfile --detach
    sudo ovs-vsctl show
  8. 設定網路,使網路卡變成openvswitch上面的port
    sudo ovs-vsctl add-br br0
    sudo ovs-vsctl add-port br0 eth0
    sudo ovs-vsctl add-port br0 eth1
    sudo ovs-vsctl add-port br0 eth2
    sudo ifconfig eth0 0
    sudo ifconfig eth1 0
    sudo ifconfig eth2 0
    sudo ifconfig br0 192.168.8.232 netmask 255.255.255.0
    sudo route add default gw 192.168.8.1 br0
    從這些指令大概可以猜出openvswitch所使用的trick。要特別注意的地方在於,前面幾行ovs-vsctl的指令只要設定過一次即可,下次openvswitch啟動時候自動執行,這是因為設定已經被寫入資料庫的關係。可是下面設定IP的動作還是要自己來。
  9. 連到OpenFlow Controller
    sudo ovs-vsctl set-controller br0 tcp:192.168.8.203:6633
做完了,超級簡單又不用大腦 ... 如果真的要 porting的話,要注意的是那個 kernel module吧

接下來補充一些常用的 openvswitch 指令:

  1. $ ovs-vsctl set bridge br0 protocols=OpenFlow10,OpenFlow13
    顧名思義,這是設定這台 switch 所使用的 OpenFlow 版本。
  2. $ ovs-vsctl set-fail-mode ovs-br standalone
    這是一個很有趣的設定,每台 OpenFlow switch 都必須接受起碼一台 OpenFlow Controller 的管理,那如果和 OpenFlow Controller 中間的連線斷了怎麼辦?這個指令可以讓 openvswitch 自動切換到一般普通 switch 的功能。
  3. $ ovs-vsctl show
    呈現這台 openvswitch 的狀態。
  4. $ ovs-ofctl dump-flows br0 -O openflow13
    把所有的 Flow Entries 顯示出來。
  5. $ ovs-ofctl del-flows br0 -O openflow13
    刪除 Flow Entries。可以刪除就可以新增。一般來說,這些 Flow 的規則應該是要由 Controller 那邊帶過來的,但是 openvswitch 允許使用者自己在 switch 的本機端新增或是刪除這些 Flow 的規則。
In-Band vs. Out-of-Band

其實當初在看 OpenFlow 的技術時,我腦海中的第一個念頭就是,當一台 OpenFlow switch 剛開機,裏面一條 Flow Entry 都沒有,這時候是要怎麼透過 tcp (ssl/tls) 連到 OpenFlow Controller 呢?實際玩過幾台 OpenFlow switch 以後發現,大部份實際的設備都會把對 Controller 的 Port 給獨立出來不歸 OpenFlow 管,也就是在那個 Port 上會跑完整的 protocol stack (要不然怎麼建立 ssl/tls),這種情況我們稱之為 Out-of-Band。要怎麼在 openvswitch 上面設定 out-of-band 呢?很簡單,以上面的設定範例來說,不要把 eth0 拿來加入 openvswitch 的 bridge 裏面就好了。這樣 eth0 就可以拿來當作對 Controller 的獨立 port ,不歸 OpenFlow 管。

有 Out-of-Band 就有 In-Band,顧名思義就是 OpenFlow switch 對 OpenFlow Controller 的連線所使用的 Port 一樣是讓 OpenFlow 管理。可是這種情況我上面提到的問題就會發生。那 In-Band 是怎麼做到的?答案很簡單,openvswitch 一開機就加入一些隱性的 Flow Entry就好了,至於加入的 Entry是哪些,我們可以透過下面的指令來查詢:

$ ovs-appctl bridge/dump-flows br0

這個指令可以印出隱性規則(hidden flow entries)。至於設定成 Out-of-Band 的方法則是可以利用下面的指令:

$ ovs-vsctl set controller br0 connection-mode=out-of-band  

設定成 out-of-band 模式,設定完所有的  hidden flow entries 應該都會消失了。


20140624


看到有些留言說跟我使用相同的版本,問題是這文章已經有點舊了,希望大家能夠更新到新的版本。在撰寫這段文字的時候,最新版是 openvswitch 2.1.2。


20140710

補充現在所使用的 openvswitch 開機後所執行的 script,採用 systemd 的寫法:

ovsdb-server.service:
[Unit]
Description    =  Open vSwitch Database Server
Documentation  =  man:ovsdb-server

[Service]
PIDFile=/run/openvswitch/ovsdb-server.pid
ExecStart=/usr/sbin/ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --pidfile=/run/openvswitch/ovsdb-server.pid


ovs-vswitchd.service:
[Unit]
Description    = Open vSwitch Daemon
Documentation  = man:ovs-vswitchd
Wants          = network.target
Before         = network.target
Requires       = ovsdb-server.service
After          = ovsdb-server.service

[Service]
ExecStartPre = /sbin/modprobe openvswitch
PIDFile = /run/openvswitch/ovs-vswitchd.pid
ExecStart = /usr/sbin/ovs-vswitchd --pidfile=/run/openvswitch/ovs-vswitchd.pid

[Install]
WantedBy       = multi-user.target



留言

  1. 請問Openvswitch的port數有限制嗎?

    回覆刪除
    回覆
    1. 你說的 port 是機器實體的 port 個數嗎?我沒有 trace 過 openvswitch 的程式碼,所以不敢說。不過,現在很多在外面賣號稱支援 openflow 的 switch,其實只不過是把 openvswitch 移植上去的產品,而這些產品都有數十個 port,所以我想應該可以符合你的需求。

      PS. 你是交大的學生吧,你們學校有個大產學合作計劃,所以在學校應該可以借到不少的 openflow switch 唷。

      刪除
    2. 你好,我們已經測試過在我們做實驗的範圍內(48 ports)都是可以運作的喔!另外抱歉中間去弄其他的東西了所以沒有繼續Follow您的網誌。
      從2天前開始,我把一個Raspberry Pi打造成Openvswitch,剛剛才成功中間還要去下載什麼kernel module的後面很多步驟都很卡,不過很感謝您的步驟都很有用!

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 請問你的Controller是用nox or pox幾版的?

    回覆刪除
    回覆
    1. ㄟ,都不是ㄟ。出於公司「政治」上的理由,我所使用的是 Ryu。而且目前在 Open Source 「比較」支援 OpenFlow 1.3 版本的只有 Ryu。

      刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. 請問將機器關機後重開是否要再重做哪些步驟? 我重開後執行#sudo ovs-vsctl show
    就跟我說db.sock connection fail(no such file or directory)
    難道重開機之後他的內容就會跑掉了嗎?

    回覆刪除
    回覆
    1. 載入 kernel module
      sudo insmod datapath/linux/openvswitch.ko

      啟動 DB server
      ovsdb-server /usr/local/etc/openvswitch/conf.db \
      --remote=punix:/usr/local/var/run/openvswitch/db.sock \
      --remote=db:Open_vSwitch,manager_options \
      --private-key=db:SSL,private_key \
      --certificate=db:SSL,certificate \
      --bootstrap-ca-cert=db:SSL,ca_cert --pidfile --detach --log-file

      執行 daemon
      sudo ovs-vswitchd --pidfile --detach

      刪除
  6. 作者已經移除這則留言。

    回覆刪除
  7. 上次很謝謝你的答覆!
    而最近我們實驗室要自己做openvswitch 面臨到port數量不足的問題
    目前不考慮買較多PCI槽的主機板
    而是選擇購買2 port的網卡來擴充port數量
    想請問openvswitch可透過此方式來擴充嗎? 謝

    回覆刪除
    回覆
    1. 基本上在 Linux 系統裏面可以看到該網卡的話都沒有問題。以我自己來說,是多接usb的網卡(畢竟我是用 Pandaboard 而不是電腦)。也許考慮一些網路設備的開發版是個不錯的選項。上面有留言說到 48 port 都沒有問題。

      刪除
  8. 執行sudo insmod datapath/linux/openvswitch.ko 會有問題,我看網路寫的都說是個bug,這要如何解決?
    ps.跟你用的是同樣的版本

    回覆刪除
    回覆
    1. 我當初並沒有遇到這個問題。提供你幾個意見供參考:

      1. 如果可以請提供更多的資訊,除了 openvswitch 的版本以外,linux kernel 的版本以及執行的平台還有錯誤訊息都請提供。這樣比較容易找到問題。

      2. 如果不堅持要最新版的 ovs,對一般的 distribution 來說通常套件庫裏面都有現成的版本可以使用。

      3. 我和同事後來有更新到更新版的 ovs,也沒遇到問題,供你參考。

      刪除
  9. 你好 我想請問個問題
    我目前使用 Ryu 以及 Open vswitch (version 2.0) 實現 Openflow
    在安裝好上述兩者後仍可對外上網 而當我進行設定控制器
    ovs-vsctl set-controller br0 tcp:127.0.0.1:6633
    並將網卡與橋接器連接後 便不能與對外網路連接了

    版大是否有遇到這類的問題 是如何解決的呢

    回覆刪除
    回覆
    1. 因為問題有點不完整,所以我有點腦補,你看看是不是這樣。你似乎是在一台電腦上同時安裝 openvswitch 以及 openflow controller (Ryu),並且在順利啟動以後還希望透過該台電腦對外連線,不曉得你是不是要這樣做。

      1. 通常我們不會這樣做,畢竟會讓一台 Controller 管理多台的 switch,所以我不是很清楚你這樣架設的理由。另外,對於一台 OpenFlow switch 而言,為什麼會有主動對外連線的需求呢?我猜你可能是利用自己的電腦就架設出這樣的環境,並同時還想要上網做其他事情吧。很有實驗精神,不過一般我們會希望把實驗的機器和一般使用的設備分開。

      2. 我沒試過,但你可以參考上面我提到 In-Band 和 Out-of-Band 的概念,我猜想 In-Band 也許可以達成你的需求。

      3. 加油,有問題歡迎討論。

      刪除
  10. 作者已經移除這則留言。

    回覆刪除
  11. 您好

    因為設備資源的問題,我也是把控制器跟switch安裝在同一台電腦上
    我使用環境是ubuntu 12.04.4 LTS,open vSwitch 2.0,ryu 3.10
    並透過指令ovs-vsctl add-port br0 eth0 將網卡加入橋接器底下,然後就不能上網了

    後來在網路上找到這篇文章http://goo.gl/XABQAu ( 3.4. OpenVSwitch (Part2) )
    將eth0 設定為混雜模式之後,就可以對外連線上網了
    但是還是不太懂其的原理? (希望版大可以幫忙解釋一下)


    另外,我想請教一下
    我還有新增另一張網卡eth1,要跟另一台電腦做內網溝通、傳輸使用(eth0 與 eth1為不同網段)
    也是透過指令ovs-vsctl add-port br0 eth1 將網卡加入橋接器底下,一樣不能進行傳輸
    我嘗試過修改route table,但是一樣沒有辦法連線
    想跟您請教一下要怎麼設定才有辦法正常連線呢?

    謝謝。

    回覆刪除
    回覆
    1. 1. 理由你可以看看我上面的文章,有新增的內容。最主要可能的原因大概是這台 OpenFlow Switch 沒有任何的 Flow Entry,也就是封包傳送的規則,所以無法傳送資料。請記住,這已經不是電腦(Host),這是Switch了。你可以用紙跟筆畫畫看這樣的網路,在你畫的時候應該就會覺得有點頭大了 :p

      2. 為什麼 promiscuous mode 可以?你可以查查看什麼是 promiscuous mode,這樣你就會知道為什麼 wireshark 可以去聽到本來不屬於自己的封包,也大概可以知道為什麼網路可以通了。

      3. 當你要找 OpenFlow 的資料時,強烈建議不要找和 openStack 相關的資料(這是很離經叛道的發言唷),因為 OpenStack 過於龐大了,要花太多時間才能夠掌握,會有本末倒置的效果。

      4. 做實驗我還是建議把 switch 和 host 分開。當然,目前市面上的 OpenFlow switch 偏貴,大概 10-40 萬。想順便問問看,如果有一台 OpenFlow switch 大概 3000-4000 左右,你會有興趣嗎?

      刪除
  12. 謝謝版主給的回應與建議 !! 我大概了解問題的原因了! 謝謝:))
    不過因為設備資源有限,所以我只能勉強把switch 跟 controller 裝在一起了

    回覆刪除
  13. 會有這樣的錯誤

    ovsdb-server: "db:Open_vSwitch,manager_options": invalid syntax

    回覆刪除
    回覆
    1. 我之前使用的版本和你不同,你這問題也許可以參考下面的連結
      http://openvswitch.org/pipermail/discuss/2013-October/011704.html

      刪除
  14. 在啟動時

    ovsdb-server /usr/local/etc/openvswitch/conf.db \
    --remote=punix:/usr/local/var/run/openvswitch/db.sock \
    --remote=db:Open_vSwitch,manager_options \
    --private-key=db:SSL,private_key \
    --certificate=db:SSL,certificate \
    --bootstrap-ca-cert=db:SSL,ca_cert --pidfile --detach --log-file

    我用的是openvswitch2.1.2

    回覆刪除
    回覆
    1. 請問steve大大你怎麼解決這個問題的?
      我也遇到同樣的問題

      刪除
  15. 你好
    我執行sudo insmod datapath/linux/openvswitch.ko
    然後出現錯誤訊息: insmod: error inserting 'datapath/linux/openvswitch.ko': -1 File exists
    請問版大這個問題該如何解決?
    我的openvswitch版本是2.1.2
    謝謝

    回覆刪除
    回覆
    1. insmod: error inserting 'datapath/linux/openvswitch.ko': -1 File exists
      看起來是 kernel 中已經有這個 module 了
      你可以透過 lsmod 進行確認,Good Luck

      刪除
  16. 你好
    請問一下在OpenvSwitch Interface那裡都不用做設定嗎?
    維持OpenvSwitch Interface default就好了嗎?
    還有就是版大你有安裝RYU相關的分享嗎?
    謝謝

    回覆刪除
    回覆
    1. 不太清楚你所說的 "OpenvSwitch Interface 都不用做設定" 是代表什麼意思
      麻煩你再說明清楚一點
      我比較方便回覆
      安裝 Ryu 的分享,我其實覺得 http://osrg.github.io/ryu/ 上面寫的已經很簡單了
      看你是要用 pip 安裝還是從 git 下載都可以
      不過我倒是有考慮要不要寫如何來開發 Ryu 上面的 application

      刪除
    2. 補充一個我朋友寫的網誌
      或許對你安裝 Ryu 會有幫助
      http://blog.linton.tw/posts/2014/01/11/install-ryu-3-5-sdn-framework

      刪除
  17. 你好
    我的Linux有兩張網卡
    然後我照著步驟
    sudo ovs-vsctl add-br br0
    sudo ovs-vsctl add-port br0 eth0
    sudo ovs-vsctl add-port br0 eth1
    sudo ifconfig eth0 0
    sudo ifconfig eth1 0
    然後就不能上網了
    那我要怎麼和controller連線呢? (我的controller是裝在另一台主機上)
    謝謝

    回覆刪除
    回覆
    1. 你好像忘了設定 br0 的 IP 了。

      至於怎樣讓 switch 和 controller 相連,可以參考上面 in-band 和 out-of-band 的內容,有問題可以再提出來。

      Good Luck!

      刪除
  18. 作者已經移除這則留言。

    回覆刪除
  19. 你好
    想請問一下,如何設定interface 讓兩個open vswitch 之間建立link ?
    我的環境有兩個實體機分別都安裝 open vswitch 但是要怎麼設定interface 讓Controller( Open Daylight) 可以顯示有兩個open vswitch 之間有建立一個link ?

    回覆刪除
    回覆
    1. 我沒有用過 opendaylight (個人喜好),但你的問題應該不是 open vswitch 的怎麼建立 link,因為這件事情拿條網路線去連接兩台 switch 就做完了。你應該要檢查看看 open vswitch 是不是有正確的將 controller 設成 opendaylight。你可以透過 opendaylight 的介面來看看是否能正確看到該台 vswitch 的資料作為判斷。

      如果你覺得我講的不清楚或是留言的方式無法正確的描述你的問題,你可以 mail 給我。

      Good Luck

      刪除
    2. 我在兩台實體機上分別都裝上open vswitch 用網路線串接兩台機器的eth0介面 。A機器的eth0 和eth1 bridge 成ovs-br 並設 ip 為192.168.30.100 ,B機器的 eth0 和eth1 bridge 成ovs-br 並設 ip 設192.168.30.101 ,但是100卻無法ping到101 兩邊的open vswitch 似乎無法溝通
      不知道如何解決?

      刪除
    3. 請先將兩台 vswitch 的 flow entries 給顯示出來看看,相關步驟可以參考上面的網誌內容(也請參考上面提到的 in-band 和 out-of-band 的內容)。另外 controller (以你的例子來說是 opendaylight)是否也已經啟動並聯接了?如果還有問題,歡迎把 topology 畫出來寄到我的信箱。我這邊也許可以建立出類似的環境來試試看。Good Luck。

      刪除
    4. 請問是否可以提供您的E-mail呢

      刪除
    5. 請看右上角關於我的資訊

      刪除
  20. 你好
    我目前的架設在實體PC上 Ryu + Ovs *2
    兩個OVS在不同網域下運作 並且用跳線與Ryu做連接

    Ryu 192.168.10.10
    Ovs1 192.168.10.20
    Gateway1 192.168.10.1

    Ryu 192.168.20.10
    Ovs1 192.168.20.20
    Gateway1 192.168.20.1

    以下是問的問題

    若我下ryu-manager --verbose啟動後

    1.是否能在控制器端是否可以看到 ovs 上的規則呢

    2.能夠在控制器端 啟動前/後 下規則給ovs嗎 還是必須透過啟動時的python來下規則呢?
    (手動在ovs端上下規則再啟動是沒問題的)

    回覆刪除
    回覆
    1. 政達你好,答案當然是可以啊。你可以透過 Ryu 原生的 Restful API 來達成相關的功能。詳細資料可以參考下面的連結。(如有問題可以再詢問我,這是我朋友翻譯的)
      Ryubook: http://osrg.github.io/ryu-book/zh_tw/html/

      刪除
  21. 您好:

    我目前打算用3台VM來實作環境,想問問看架構上是否正確,
    2台裝ovs,1台裝floodlight controller,而2台ovs透過橋接介面模式連向controller,
    最後controller使用NAT連接實體網路

    回覆刪除
    回覆
    1. 這樣的環境當然是沒有問題囉,不過要思考的問題是,你應該是把 ovs 當作 OpenFlow Switch,既然是 Switch ,那應該就要連接 Host (把它想像成一般電腦),並讓 Host 之間彼此互通。請問你知道在你的環境裏面要怎麼設定 Host 呢?這部份就和你所使用的 VM 是哪一套有關了。加油!

      刪除
    2. 感謝說明,看來應該還要再增加兩台host,原本以為ovs可以當作host裡面進來的一個接口,看來我是被某篇paper的環境架構圖給誤導了... 謝謝!!

      刪除
  22. 作者已經移除這則留言。

    回覆刪除
  23. 您好, ovs-vsctl set-fail-mode ovsbr0 standalone 這句的bridge名字寫錯了??

    回覆刪除
  24. 你好 我在載入openvswitch kernel module:sudo insmod datapath/linux/openvswitch.ko時會顯示"-1 Unknown symbol in module",請問是哪裡出了問題呢?有按照步驟來,前面也都有成功,但每次都會出現這個問題。

    回覆刪除

張貼留言

這個網誌中的熱門文章

我弟家的新居感恩禮拜分享:善頌善禱

Openssl 範例程式:建立SSL連線

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包