.

.

.

.

.

今天把 Ubuntu 14.04 升级到了最新的 4.0.5 的内核版本,本来不打算记录下来的,但是升级的过程中确实遇到了一些问题,所以还是记录下来,分享给遇到同样问题的猿友。

先去官网下载最新的内核压缩包:https://www.kernel.org/

网速不给力,只能用虚拟机里的迅雷下载,然后再拷贝出来。

LZ 把源码包拷贝到 /usr/src 下面,直接就在这里编译安装了:

  1. # 切换到 root 身份
  2. >$ su
  3. # 解压缩源码,得到文件夹 /usr/src/linux-4.0.5
  4. ># tar xvf linux-4.0..tar.xz
  5. ># cd linux-4.0.
  6. # make mrproper 命令用来清理以前编译时留下的临时文件,
  7. # 因为 LZ 是解压缩的新包,所以不需要这步
  8. ># make mrproper
  9. # 把当前正在使用的内核编译配置文件拷过来作为模板
  10. ># cp /boot/config-`uname -r` .config
  11. # 启动基于ncurse库绘制的图形配置界面,已经按照当前正在使用的内核的配置选好相关选项了,再启用一些新特性即可
  12. # 如果出现如下错误,那么可能是没有安装 ncurse 库,执行 apt-get install libncurses5-dev 命令安装。
  13. # In file included from scripts/kconfig/mconf.c:23:0:
  14. # scripts/kconfig/lxdialog/dialog.h:38:20: fatal error: curses.h: No such file or directory
  15. # #include CURSES_LOC
  16. ># make menuconfig
  17. # 正常是要执行下面这三条命令的,但是 Ubuntu 上不用这么麻烦
  18. ># make install
  19. ># make modules
  20. ># make modules_install
  21. # Ubuntu 上用包管理器可以把内核和相关模块编译成 deb 包,熟悉 Ubuntu 的童鞋这下觉得好办多了吧?
  22. # 如果提示没有 make-kpkg 命令的话,可以先用 apt-get 安装
  23. ># apt-get install kernel-package
  24. ># make-kpkg clean
  25. # 与 make 命令一样,j8 参数可以指定 8 个线程同时编译
  26. #> make-kpkg --initrd kernel-image kernel-headers -j8
  27. # 坐等编译完成吧,会在上一级目录中生成两个 deb 包,接下来安装它们:
  28. ># dpkg -i linux-image-4.0.5_4.0.5-10.00.Custom_amd64.deb
  29. ># dpkg -i linux-headers-4.0.5_4.0.5-10.00.Custom_amd64.deb
  30. # grub 貌似不用更新也可以,安装 deb 的时候会自动更新
  31. ># update-grub
  32. # 重启系统,进入新的内核吧
  33. ># reboot

编译、安装、重启都很顺利,但是发现在新内核中启动 vmware 的时候提示必须更新内核模块,可是在编译网络模块的时候死活过不去,LZ 猜测可能是由于内核中某些 API 被修改了,而 vmware 的驱动源码跟最新的内核中的 API 不匹配了,所以才报了一些语法错误,没办法,只能手工修改了。

在 shell 中启动 vmware,让它自己编译安装模块,编译失败之后会在 shell 中留下编译失败的错误提示,沿着提示修改代码。

  1. >$ vmware
  2. /tmp/modconfig-WpjYEn/vmnet-only/userif.c: In function VNetCopyDatagram’:
  3. /tmp/modconfig-WpjYEn/vmnet-only/userif.c::: error: implicit declaration of function skb_copy_datagram_iovec [-Werror=implicit-function-declaration]
  4. return skb_copy_datagram_iovec(skb, , &iov, len);
  5. ^
  6. /tmp/modconfig-WpjYEn/vmnet-only/driver.c: In function VNetFileOpUnlockedIoctl’:
  7. /tmp/modconfig-WpjYEn/vmnet-only/driver.c::: error: struct file has no member named f_dentry
  8. if (filp && filp->f_dentry) {
  9. ^
  10. /tmp/modconfig-WpjYEn/vmnet-only/driver.c::: error: struct file has no member named f_dentry
  11. inode = filp->f_dentry->d_inode;
  12. ... 此处省略一千行

错误很明显,是 userif.c 的 526 行和  driver.c 的 1194 行、1195 行出现了问题。

可是报出来的文件路径却怎么也找不到,而且每次编译,这个报错的路径都在变,应该是编译时现解压缩出来的,而编译后自动删除了,所以需要找到这两个源文件的压缩包在哪才行。

经过一番 Google 之后终于找到了源码包所在的位置,接下来就可以修改了。

  1. # 切换到 root 身份
  2. >$ su
  3. # 进入源码目录
  4. ># cd /usr/lib/vmware/modules/source/
  5. # 解开网络相关的源码包,注意只是 tar 包,不是压缩包,所以解包不要加 -z 参数
  6. ># tar xvf vmnet.tar
  7. # 解包后得到 vmnet-only/ 文件夹,进入
  8. ># cd vmnet-only/
  9. # 一个一个的收拾
  10. ># vim userif.c +
  11. // 直接把这句替换成下面的一段 return skb_copy_datagram_iovec(skb, 0, &iov, len);
  12. #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
  13. return skb_copy_datagram_iovec(skb, , &iov, len);
  14. #else
  15. struct iov_iter to;
  16. iov_iter_init(&to, READ, &iov, , len);
  17. return skb_copy_datagram_iter(skb, , &to, len);
  18. #endif
  19.  
  20. ># vim driver.c +
  21.  
  22. // 直接把原来的代码注释掉,使用 file_inode() 函数获取 inode
  23. #if 0
  24. if (filp && filp->f_dentry) {
  25. inode = filp->f_dentry->d_inode;
  26. }
  27. #endif
  28. inode = file_inode(filp);
  29.  
  30. # 备份源码包
  31. ># mv vmnet.tar vmnet_bak.tar
  32. # 重新打包
  33. >#tar cf vmnet.tar vmnet-only
  34. # 再运行一次 vmware,发现编译顺利通过了,哦耶
  35. >$ vmware
  36. # 清理
  37. ># rm -rf vmnet-only/ vmnet_bak.tar
  38. ># exit
  39. >$

这个问题就这样解决了。。

第一次发现,原来 Ubuntu 安装内核居然可以把内核打包成 deb 的形式。。

新内核先继续体验着,等感觉稳定了再卸载原内核。

其实卸载也很简单:

  1. # 先查看安装了哪些内核
  2. >$ sudo dpkg --get-selections | grep linux
  3. # 查看当前正在使用的内核,别把正在使用的内核给卸载了
  4. >$ uname -r
  5. # 卸载旧的内核
  6. >$ sudo apt-get purge linux-image-3.13.--generic
  7. # 看看旧的内核是不是已经消失了
  8. >$ sudo dpkg --get-selections | grep linux
  9. # 更新 grub 菜单
  10. >$ sudo update-grub

参考:

Ubuntu编译内核

VMware – Backward-Compatible 3.19 Fix..

Linux host - Kernel 3.19 breaks VMware (vmnet)

Ubuntu 编译安装 Linux 4.0.5 内核,并修复 vmware 网络内核模块编译错误的更多相关文章

  1. 源代码编译安装 PHP5.5.0,解决curl_exec訪问HTTPS返回502错误的问题

    近期碰到一个奇怪的问题. PHP使用 curl_exec 訪问 HTTPS 网页时, 返回502错误, 訪问HTTP网页时没有问题,  用   echo   phpinfo() ;  查看. 支持op ...

  2. Ubuntu 16.04.2 安装Linux kernel 4.10 内核并解决 VMware 问题

    http://www.linuxidc.com/Linux/2017-03/141456.htm

  3. 编译安装linux内核步骤

    编译安装linux内核步骤: 一.获取内核源码 源码网址:www.kernel.org 二.解压内核源码 首先以root帐号登录,然后进入/usr/src子目录.如果用户在安装Linux时,安装了内核 ...

  4. [笔记] Ubuntu 18.04源码编译安装OpenCV 4.0流程

    标准常规安装方法安装的OpenCV版本比较低,想尝鲜使用4.0版本,只好源码安装. 安装环境 OS:Ubuntu 18.04 64 bit 显卡:NVidia GTX 1080 CUDA:10.0 c ...

  5. CentOS7 编译安装 nginx-1.10.0

    对于NGINX 支持epoll模型 epoll模型的优点 定义: epoll是Linux内核为处理大批句柄而作改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著的 ...

  6. 在CUDA8.0下编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0(网上有 ...

  7. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  8. 在CUDA8.0下指定位置编译安装OpenCV3.1.0来实现GPU加速(Compiling OpenCV3.1.0 with CUDA8.0 support)

    在CUDA8.0下指定位置编译安装OpenCV3.1.0 一.本人电脑配置:ubuntu 14.04, NVIDIA GTX1060. 二.编译OpenCV3.1.0前,读者需要成功安装CUDA8.0 ...

  9. CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14

    准备篇: CentOS 7.0系统安装配置图解教程 http://www.osyunwei.com/archives/7829.html 一.配置防火墙,开启80端口.3306端口 CentOS 7. ...

随机推荐

  1. LeetCode 【190. Reverse Bits】

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  2. LeetCode【217. Contains Duplicate】

    Given an array of integers, find if the array contains any duplicates. Your function should return t ...

  3. 使Maven 2在package、install等阶段跳过运行Test的配置

    方法1: To skip running the tests for a particular project, set the skipTests property to true.<proj ...

  4. [Freemarker] - 使用struts的component调用freemarker的ftl模板方法

    struts中的component标签,可以用来调用freemarker的ftl模板文件,使用component标签传参可以这样写: 使用property方式写法: <s:component t ...

  5. KO+bootstrap 模态窗全选绑定

    HTML <div id="modalAreaID01"> <button type="button" class="btn btn ...

  6. HTML5外包团队-技术分享【使用HTML5的VIDEO标记播放RTSP视频流】

    使用HTML5的VIDEO播放RTSP实时视频流源代码: <!DOCTYPE html> <html><head> <meta http-equiv=&quo ...

  7. IntelliJ IDEA热加载自动更新(Update classes and resources )

          IntelliJ IDEA默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化.想要jsp文件改动后立刻看到变化,可以通过修改配置来实现.       ...

  8. struts2 Demo

    参考资料 :http://www.cnblogs.com/yangy608/archive/2010/11/08/1871962.htmlhttp://www.yiibai.com/struts2/s ...

  9. gerrit: Error in POST /accounts/self/preferences

    转载:https://code.google.com/p/gerrit/issues/detail?id=3157 1. Migrated from 2.8.6.1 to 2.10 2. In UI ...

  10. Linux scp复制文件,不需要输入密码的技巧

    当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码. 把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假 ...