.

.

.

.

.

今天把 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..tar.xz
># cd linux-4.0.
# make mrproper 命令用来清理以前编译时留下的临时文件,
# 因为 LZ 是解压缩的新包,所以不需要这步
># make mrproper
# 把当前正在使用的内核编译配置文件拷过来作为模板
># cp /boot/config-`uname -r` .config
# 启动基于ncurse库绘制的图形配置界面,已经按照当前正在使用的内核的配置选好相关选项了,再启用一些新特性即可
# 如果出现如下错误,那么可能是没有安装 ncurse 库,执行 apt-get install libncurses5-dev 命令安装。
# In file included from scripts/kconfig/mconf.c:23:0:
# scripts/kconfig/lxdialog/dialog.h:38:20: fatal error: curses.h: No such file or directory
# #include CURSES_LOC
># 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 猜测可能是由于内核中某些 API 被修改了,而 vmware 的驱动源码跟最新的内核中的 API 不匹配了,所以才报了一些语法错误,没办法,只能手工修改了。

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

>$ vmware
/tmp/modconfig-WpjYEn/vmnet-only/userif.c: In function ‘VNetCopyDatagram’:
/tmp/modconfig-WpjYEn/vmnet-only/userif.c::: error: implicit declaration of function ‘skb_copy_datagram_iovec’ [-Werror=implicit-function-declaration]
return skb_copy_datagram_iovec(skb, , &iov, len);
^
/tmp/modconfig-WpjYEn/vmnet-only/driver.c: In function ‘VNetFileOpUnlockedIoctl’:
/tmp/modconfig-WpjYEn/vmnet-only/driver.c::: error: ‘struct file’ has no member named ‘f_dentry’
if (filp && filp->f_dentry) {
^
/tmp/modconfig-WpjYEn/vmnet-only/driver.c::: 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 +
// 直接把这句替换成下面的一段 return skb_copy_datagram_iovec(skb, 0, &iov, len);
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
return skb_copy_datagram_iovec(skb, , &iov, len);
#else
struct iov_iter to;
iov_iter_init(&to, READ, &iov, , len);
return skb_copy_datagram_iter(skb, , &to, len);
#endif ># vim driver.c + // 直接把原来的代码注释掉,使用 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.--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)

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. DuoCode测试

    http://duoco.de/ DuoCode 只能引用自己编译的DLL,不能引用外部DLL.这么做可以保证”代码编得过,就一定能跑“. SharpKit 遇到过这样的问题.在代码中使用了 list ...

  2. .NET Core On Mac 第一步,配置环境

    话说.NET Core出来这么久了,也没搞搞,实在是羞愧难当啊.既然选择了开始那就不能半途而废啊..NET 跨平台了,那我就用Mac试试吧. 安装步骤一:安装Homebrew 其中会遇到权限不够的问题 ...

  3. 黄聪:No 'Access-Control-Allow-Origin' header is present on the requested resource解决办法

    在.htaccess文件里面添加下面代码: <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*& ...

  4. 【巩固】CSS3的3D动画 ——3D旋转(1)

    最近学了妙味的css3的动画,2D,3D的都有,先写一个最简单的3d翻转效果,鼠标移入div,正反面翻转效果. 注意点有: 要给正反面外面加个父级: transform-style: preserve ...

  5. LINUX下动态库及版本号控制

    针对同一动态组件的不同版本链接和加载. 一.概念                  DLL HELL字面意思是DLL"灾难",是由于com组件(动态库)升级引起的程序不能运行的情况 ...

  6. 1.注册或登录页面设计:UILabel,UIButton,UITextField

    学习iOS开发已经有一段时日了,之前一直没有系统的对iOS开发的相关知识进行归纳总结,导致很多知识点云里雾里在脑子里形不成iOS开发的思想,现将自己在学习过程中遇到的一些知识进行总结,希望能对iOS初 ...

  7. Zero Requiem

    “最后是在游行.暴君鲁路修高居王座,两侧列着所有反对者的代表:黑色骑士团.黎星刻.原圆桌骑士名列第三的吉诺,以及一身女囚装的娜娜丽,他们都即将被公开处死.尤菲米娅在第一次“特别行政区•日本”成立仪式上 ...

  8. (LinkedList)Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  9. strong & weak

    Here is a quick summary: A strong reference will keep the object it points to from being deallocated ...

  10. dedecms代码研究五

    上一次留几个疑问: 1)DedeTagParse类LoadTemplet方法. 2)MakeOneTag到底在搞什么. 从DedeTagParse开始前面,我们一直在dedecms的外围,被各种全局变 ...