openvswitch2.11.0修改源碼后重新編譯(2)


一:前提

已經正常安裝了SDN環境(mininet和openswitch2.11.0和Ryu)

使用前面教程安裝環境SDN實驗---使用git安裝Mininet

(一)測試ovs是否正常使用

1.ryu啟動

2.mn啟動測試

二:原始信息

三:修改程序

(一)修改源碼:在vport.c和.h中添加代碼---文件寫入信息《慎用》(未修改調試,出現問題)

1.vport.h文件

//custom function to log info
void send_msg(const char* filename,const char* info);
//file operation function 
struct file *file_open(const char *path, int flags, int rights);

void file_close(struct file *file);

int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size);

int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size);

2.vport.c文件

//custom function to log info
void send_msg(const char* filename,const char* info)
{
    loff_t f_pos;
    struct file* fp = file_open(filename,O_RDWR|O_CREAT,0666);
    f_pos = fp->f_pos;
    file_write(fp,f_pos,info,strlen(info)+1);
    file_close(fp);
}

//file operation function 
struct file *file_open(const char *path, int flags, int rights) 
{
    struct file *filp = NULL;
    mm_segment_t oldfs;
    int err = 0;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);
    if (IS_ERR(filp)) {
        err = PTR_ERR(filp);
        return NULL;
    }
    return filp;
}

void file_close(struct file *file) 
{
    filp_close(file, NULL);
}

int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_read(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}   

int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
    mm_segment_t oldfs;
    int ret;

    oldfs = get_fs();
    set_fs(get_ds());

    ret = vfs_write(file, data, size, &offset);

    set_fs(oldfs);
    return ret;
}

3.檢查日志

(二)使用日志打印(推薦)

1.使用sublime在datapath文件夾中搜索log,pr等信息,找到可用的內核輸出函數pr_info("Open vSwitch switching datapath %s\n", VERSION);

2.使用pr_info在vport.c函數中輸入調試信息

 

3.進行下面編譯方法

4.結果顯示:使用dmesg方法查看即可

四:實驗開始

(一)重新編譯前檢查

1.查看內核模塊openvswitch是否正在被占用(若是被占用,不能被安裝)

lsmod | grep openvswitch

第一行,第三列為1則被占用,為0未被占用(此處未被占用)

2.若是被占用,此時使用sudo ovs-dpctl show查看內核,應該會有一個ovs-system的datapath

此時需要使用sudo ovs-dpctl del-dp ovs-system刪除剛才看到的datapath。

3.使用sudo rmmod openvswitch來移除openvswitch內核模塊,再使用lsmod|grep openvswitch應該就沒有openvswitch字樣。

(二)開始重新編譯

1.進入openswitch文件夾中

2.啟動boot.sh腳本

 

 3.make clean清除上次的make命令所產生的object文件(后綴為“.o”的文件)及可執行文件。

因為我們之前安裝openswitch編譯過一次,我們需要先清除上一次的文件。
沒有錯誤的時候不用clean,這樣編譯會快很多,編譯器會自動編譯變動的部份。
當排除錯誤時就應當clean一下(當出現莫名其妙的錯誤時,就要想到可能是沒有clean導致的)---出錯可以參考上一篇文章openvswitch2.11.0修改源碼后重新編譯

4.使用sudo ./configure --with-linux=/lib/modules/`uname -r`/build配置

./configure是源代碼安裝的第一步,主要的作用是對即將安裝的軟件進行配置,檢查當前的環境是否滿足要安裝軟件的依賴關系,但並不是所有的tar包都是源代碼的包,可以ls看看有沒有configure這個文件,如果是二進制的包,解壓后直接就能使用

5.進行編譯sudo make

6.進行sudo make install

7.在編譯內核模塊之前,我們將之前的ko模塊備份出去

查看ko文件位置 modinfo openvswitch

備份原始ko文件,刪除原始文件

8.開始編譯內核文件sudo make modules_install

lsmod | grep bridge    查看原始程序是否在運行(我們前面以及關閉了,這里應該沒有輸出信息)
lsmod | grep openvswitch

9.加載內核模塊sudo modprobe openvswitch

使用lsmod | grep open查看是否加載了內核

查看內核信息

10.后面還有操作 modprobe -D openvswitch 進行內核模塊插入

 

modinfo /lib/modules/4.15.0-20-generic/extra/openvswitch.ko 

原本在二中,沒有這個extra文件夾和這些內核模塊。在make modules_install后出現

原始源文件中,被刪除了openswitch.ko,編譯后沒有在這個文件中出現

11.初始化數據庫配置文件---一定要做

sudo mkdir -p /usr/local/etc/openvswitch
sudo ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema
ls /usr/local/etc/openvswitch

重點補充:若是在后面出現pr_info無法輸出,說明我們編譯的新的內核並沒有插入到系統中,我們需要進行以下操作

首先移除原有內核

sudo rmmod openvswitch

進入ovs根目錄下的datapath/linux:

然后執行insmod操作,進行插入操作: 

insmod openvswitch.ko

五:后續問題

(一)使用mn進行測試,出現下面錯誤

*** Creating  network
*** Adding controller
*** Adding hosts:
h1 h2 
*** Adding switches:
ovs-vsctl: unix:/usr/local/var/run/openvswitch/db.sock: database connection failed (No such file or directory)
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"

(二)網上查找解決方案

ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
ovs-vsctl --no-wait init
ovs-vswitchd --pidfile --detach --log-file

(三)出現不能創建/usr/local/var/run/openvswitch/db.sock,沒有這個文件或者目錄

 

原本沒有run目錄,無法創建遞歸目錄導致錯誤。我們使用sudo mkdir -p /usr/local/var/run/openvswitch/
解決問題

(四)將(三)上面的解決方案,設置為sh腳本

boot_ovs.sh就是,sudo chmod 777 ./boot_ovs.sh 
啟動即可

(五)啟動過程中,因為在虛擬機中啟動,可能出現客戶端禁用cpu,導致Ubuntu系統卡死---修改內核出錯導致

之前我給了2個cpu,一個2核。應該適當降低

其實:這里應該是因為我們上面使用的內核文件操作函數有問題,導致的。因為后面發現一使用復雜拓撲就失效了,依舊出現CPU禁用現象

五:測試結果

(一)開啟mn

sudo mn --test pingall

(二)結果顯示如二中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM