国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Ubuntu 編譯安裝 Linux 4.0.5 內核,并修復 vmware 網絡內核模塊編譯錯誤

2024-06-28 13:20:09
字體:
來源:轉載
供稿:網友
Ubuntu 編譯安裝 linux 4.0.5 內核,并修復 vmware 網絡內核模塊編譯錯誤

.

.

.

.

.

今天把 Ubuntu 14.04 升級到了最新的 4.0.5 的內核版本,本來不打算記錄下來的,但是升級的過程中確實遇到了一些問題,所以還是記錄下來,分享給遇到同樣問題的猿友。

先去官網下載最新的內核壓縮包:https://www.kernel.org/

網速不給力,只能用虛擬機里的迅雷下載,然后再拷貝出來。

LZ 把源碼包拷貝到 /usr/src 下面,直接就在這里編譯安裝了:

# 切換到 root 身份>$ su# 解壓縮源碼,得到文件夾 /usr/src/linux-4.0.5># tar xvf linux-4.0.5.tar.xz># cd linux-4.0.5# make mrPRoper 命令用來清理以前編譯時留下的臨時文件,# 因為 LZ 是解壓縮的新包,所以不需要這步># make mrproper# 把當前正在使用的內核編譯配置文件拷過來作為模板># cp /boot/config-`uname -r` .config# 啟動基于ncurse庫繪制的圖形配置界面,已經按照當前正在使用的內核的配置選好相關選項了,再啟用一些新特性即可># make menuconfig# 正常是要執行下面這三條命令的,但是 Ubuntu 上不用這么麻煩># make install># make modules># make modules_install# Ubuntu 上用包管理器可以把內核和相關模塊編譯成 deb 包,熟悉 Ubuntu 的童鞋這下覺得好辦多了吧?# 如果提示沒有 make-kpkg 命令的話,可以先用 apt-get 安裝># apt-get install kernel-package#> make-kpkg clean# 與 make 命令一樣,j8 參數可以指定 8 個線程同時編譯#> make-kpkg --initrd kernel-image kernel-headers -j8# 坐等編譯完成吧,會在上一級目錄中生成兩個 deb 包,接下來安裝它們:># dpkg -i linux-image-4.0.5_4.0.5-10.00.Custom_amd64.deb># dpkg -i linux-headers-4.0.5_4.0.5-10.00.Custom_amd64.deb# grub 貌似不用更新也可以,安裝 deb 的時候會自動更新># update-grub# 重啟系統,進入新的內核吧># reboot

編譯、安裝、重啟都很順利,但是發現在新內核中啟動 vmware 的時候提示必須更新內核模塊,可是在編譯網絡模塊的時候死活過不去,LZ 猜測可能是由于內核中某些接口被修改了,而 vmware 的驅動源碼卻不跟最新的內核接口不匹配,所以才報了一些語法錯誤,沒辦法,只能手工修改了。

在 shell 中啟動 vmware,讓它自己編譯安裝模塊,編譯失敗之后會在 shell 中留下編譯失敗的錯誤提示,沿著提示修改代碼。

>$ vmware/tmp/modconfig-WpjYEn/vmnet-only/userif.c: In function ‘VNetCopyDatagram’:/tmp/modconfig-WpjYEn/vmnet-only/userif.c:526:4: error: implicit declaration of function ‘skb_copy_datagram_iovec’ [-Werror=implicit-function-declaration]    return skb_copy_datagram_iovec(skb, 0, &iov, len);    ^/tmp/modconfig-WpjYEn/vmnet-only/driver.c: In function ‘VNetFileOpUnlockedIoctl’:/tmp/modconfig-WpjYEn/vmnet-only/driver.c:1194:20: error: ‘struct file’ has no member named ‘f_dentry’    if (filp && filp->f_dentry) {                    ^/tmp/modconfig-WpjYEn/vmnet-only/driver.c:1195:19: error: ‘struct file’ has no member named ‘f_dentry’       inode = filp->f_dentry->d_inode;... 此處省略一千行

錯誤很明顯,是userif.c 的 526 行和 driver.c 的 1194 行、1195 行出現了問題。

可是報出來的文件路徑卻怎么也找不到,而且每次編譯,這個報錯的路徑都在變,應該是編譯時現解壓縮出來的,而編譯后自動刪除了,所以需要找到這兩個源文件的壓縮包在哪才行。

經過一番 Google 之后終于找到了源碼包所在的位置,接下來就可以修改了。

# 切換到 root 身份>$ su# 進入源碼目錄># cd /usr/lib/vmware/modules/source/# 解開網絡相關的源碼包,注意只是 tar 包,不是壓縮包,所以解包不要加 -z 參數># tar xvf vmnet.tar# 解包后得到 vmnet-only/ 文件夾,進入># cd vmnet-only/# 一個一個的收拾># vim userif.c +526// 直接把這句替換成下面的一段 return skb_copy_datagram_iovec(skb, 0, &iov, len);#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)                                                                                                                return skb_copy_datagram_iovec(skb, 0, &iov, len);#else   struct iov_iter to;   iov_iter_init(&to, READ, &iov, 1, len);   return skb_copy_datagram_iter(skb, 0, &to, len);#endif># vim driver.c +1194// 直接把原來的代碼注釋掉,使用 file_inode() 函數獲取 inode#if 0                                                                                                                                                            if (filp && filp->f_dentry) {      inode = filp->f_dentry->d_inode;   }#endif   inode = file_inode(filp);# 備份源碼包># mv vmnet.tar vmnet_bak.tar# 重新打包>#tar cf vmnet.tar vmnet-only# 再運行一次 vmware,發現編譯順利通過了,哦耶>$ vmware# 清理># rm -rf vmnet-only/ vmnet_bak.tar># exit>$

這個問題就這樣解決了。。

第一次發現,原來 Ubuntu 安裝內核居然可以把內核打包成 deb 的形式。。

新內核先繼續體驗著,等感覺穩定了再卸載原內核。

其實卸載也很簡單:

# 先查看安裝了哪些內核>$ sudo dpkg --get-selections | grep linux # 查看當前正在使用的內核,別把正在使用的內核給卸載了>$ uname -r# 卸載舊的內核>$ sudo apt-get purge linux-image-3.13.0-24-generic # 看看舊的內核是不是已經消失了>$ sudo dpkg --get-selections | grep linux # 更新 grub 菜單>$ sudo update-grub

參考:

Ubuntu編譯內核

VMware – Backward-Compatible 3.19 Fix..

Linux host - Kernel 3.19 breaks VMware (vmnet)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 金沙县| 古蔺县| 宜宾县| 堆龙德庆县| 汶上县| 比如县| 铜山县| 无为县| 公安县| 织金县| 华容县| 中牟县| 镇远县| 牟定县| 冷水江市| 金堂县| 樟树市| 芜湖市| 米林县| 简阳市| 凤冈县| 巴彦县| 科技| 湛江市| 长沙市| 玛多县| 惠安县| 奉节县| 葵青区| 廉江市| 上高县| 宿迁市| 建阳市| 高邮市| 浑源县| 永仁县| 蛟河市| 固安县| 渝北区| 鄯善县| 古田县|