很多时候我们在使用Ubuntu的时候,想修改一下内核配置,然后编译,安装到Ubuntu中。这也是进行Ubuntu内核开发的前提。

获取当前Ubuntu对应代码

有很多方法可以获得Ubuntu内核代码,但是下面两种非常方便。

uname -r显示当前内核的版本号,apt-get source则用来获取package的source code:

  1. apt-get source linux-image-$(uname -r)

另一种方法是使用git,每个发行版的内核库都会在kernel.ubuntu.com找到。如果想下载,只需要git clone一个库到本地即可:

  1. git clone git://kernel.ubuntu.com/ubuntu/ubuntu-<release codename>.git

其中release codename通过lsb_release -a获取,比如Ubuntu 16.04的Codename为xenial。

Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial

PS:从实际使用来看,apt-get source的方式更方便,也不容易出错,获取的内核代码和当前使用的是同一个版本。

编译环境配置

如果需要编译内核,还需要安装一个package。可以使用如下命令:

  1. sudo apt-get build-dep linux-image-$(uname -r)

修改内核配置

整个编译过程使用的配置文件分布在若干子配置文件中,使用如下命令可以将这些配置文件集中,调用menuconfig进行修改。

使用chmod解决部分脚本可执行权限问题,

  1. chmod a+x debian/rules
  2. chmod a+x debian/scripts/*
  3. chmod a+x debian/scripts/misc/*
  4. fakeroot debian/rules clean
  5. fakeroot debian/rules editconfigs # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later

编译内核

进入内核代码的根目录,执行如下命令:

  1. fakeroot debian/rules clean
  2. # quicker build:
  3. fakeroot debian/rules binary-headers binary-generic binary-perarch
  4. # if you need linux-tools or lowlatency kernel, run instead:
  5. fakeroot debian/rules binary

如果编译成功,在根目录下会生成若干.deb包。

如下是4.4.0-57-generic内核在AMD64系统上生成的.deb包:

安装内核镜像

使用dpkg -i安装若干.deb文件到系统中,然后重启:

  1. sudo dpkg -i linux*4.4.0-57*.deb
  2. sudo reboot

Debug符号表

有时进行Debug需要符号表,这就需要在编译的时候进行配置。首先需要安装pkg-config-dgbsym,然后在执行编译binary-*的时候增加’skildbg=false’:

  1. sudo apt-get install pkg-create-dbgsym
  2. fakeroot debian/rules clean
  3. fakeroot debian/rules binary-headers binary-generic binary-perarch skipdbg=false

删除Ubuntu内核

如果部分内核不需要,可以选择删除。需要先查看当前使用的内核版本:

uname -a可以获取当前内核版本号。

在Ubuntu内核镜像包含了以下的包。

  • linux-image-: 内核镜像
  • linux-image-extra-: 额外的内核模块
  • linux-headers-: 内核头文件

首先检查系统中安装的内核镜像:

dpkg --list|grep linux-image

dpkg --list|grep linux-headers

输出如下结果:

al@al:~/data/ubuntu-kernel$ dpkg --list|grep linux-image
ii  linux-image-3.13.0-105-generic                       3.13.0-105.152                                amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
rc  linux-image-3.13.0-32-generic                        3.13.0-32.57                                  amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-4.4.0-57-generic                         4.4.0-57.78                                   amd64        Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-105-generic                 3.13.0-105.152                                amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
rc  linux-image-extra-3.13.0-32-generic                  3.13.0-32.57                                  amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-4.4.0-57-generic                   4.4.0-57.78                                   amd64        Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii  linux-image-generic                                  4.4.0.57.60                                   amd64        Generic Linux kernel image
al@al:~/data/ubuntu-kernel$ dpkg --list|grep linux-headers
ii  linux-headers-4.4.0-57                               4.4.0-57.78                                   all          Header files related to Linux kernel version 4.4.0
ii  linux-headers-4.4.0-57-generic                       4.4.0-57.78                                   amd64        Linux kernel headers for version 4.4.0 on 64 bit x86 SMP
ii  linux-headers-generic                                4.4.0.57.60                                   amd64        Generic Linux kernel headers

在列出的内核镜像中,你可以移除一个特定的版本(比如3.13.0-105和3.13.0-32)。

sudo apt-get purge linux-image-3.19.0-15

这就会将3.19.0-15相关的内核模块删除。通过下面dpkg --list再验证如下:

dpkg --list|grep linux-headers

还可以通过sudo update-grub2来更新grub列表。

参考资料:

BuildYourOwnKernelhttps://wiki.ubuntu.com/Kernel/BuildYourOwnKernel

KernelGitGuidehttps://wiki.ubuntu.com/Kernel/Dev/KernelGitGuide

编译自己的Ubuntu内核的更多相关文章

  1. 编译、裁剪、安装、删除 Ubuntu内核和模块管理

    一.下载最新内核文件 地址:http://www.kernel.org,一般下载Full Source版本. 下载完毕后,放到任意文件夹中,使用命令: tar jxvf linux-x.x.x.tar ...

  2. 编译Android源代码与内核总结

    这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.and ...

  3. 【Android 系统开发】 编译 Android文件系统 u-boot 内核 并烧写到 OK-6410A 开发板上

    博客地址 : http://blog.csdn.net/shulianghan/article/details/40299813  本篇文章中用到的工具源码下载 : -- ok-6410A 附带的 A ...

  4. Centos7编译4.7.2内核

    由于想要编译kvm-kmod,编译的时候提示内核版本太低,所以就不得不升级下linux内核,目前最新版内核是4.7.2,编译内核并不是一件很难的事,但是这么久没编译过,还是有必要记录下这一过程. 首先 ...

  5. 编译Linux-2.6.23内核中遇见的错误

    编译linux-2.6.23 错误[1]: elf_x86_64: 没有那个文件或目录 原因是 gcc 4.6 不再支持 linker-style 架构.在 arch/x86/vdso/Makefil ...

  6. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...

  7. <摘录>Linux 环境下编译 0.11版本内核 kernel

    系统环境:Fedora 13 + gcc-4.4.5 最近在看<linux内核0.11完全注释>一书,由于书中涉及汇编语言的地方众多,本人在大学时汇编语言学得一塌糊涂,所以实在看不下去了, ...

  8. (10)ubuntu内核源码树

    ubuntu内核源码树目录: root@ubuntu:/lib/modules/3.13.0-32-generic/build#

  9. Suse环境下编译linux-2.6.24内核

    Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...

随机推荐

  1. MAC终端命令行下用sublime、vscode、atom打开文件或目录

    要知道,有时候一些小技巧,能极大的加大我们的工作效率. 在MAC下开发,用的最多的还是终端,我的终端环境是iterm2+ohmyzsh:步入正题前先给大家介绍几个小技巧: 第一个: 打开findle, ...

  2. Java泛型

    什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...

  3. 如何实现一个php框架系列文章【2】实现类的自动加载

    根据前一篇文章的设计原则,我们暂时把php文件分为3类,类名和文件名都遵守如下约定.   类名 文件名 路径 模型类m {$app}Mod  {$app}.mod.php {$app}/model   ...

  4. windows7 x64下maven安装和配置

    http://maven.apache.org/download.cgi下载maven 环境配置 验证配置是否成功 本地仓库配置 这是原来的配置文件: 更改为: link 离线安装 eclipse m ...

  5. Atitit.数据采集器 dataspider

    Atitit.数据采集器 dataspider /atiplat_cms/src/com/attilax/WebInfoX.java  @dep http://cl.cmcher.com/thread ...

  6. ES5概述(ECMAScript262/5.1)

    ES5概述(ECMAScript262/5.1) 本文参考:ES5概述 ECMAScript 是基于对象的: 基本语言和宿主设施都由对象提供,ECMAScript 程序是一组可通信的对象.ECMASc ...

  7. Shiro安全框架入门篇(登录验证实例详解与源码)

    转载自http://blog.csdn.net/u013142781 一.Shiro框架简单介绍 Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权.Shiro在JavaSE和J ...

  8. 阶段一:为View设置阴影和弹出动画(天气应用)

    “阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 上一篇阶段一:通过网络请求,获得并解析JSON数据(天气应用)完成了应用的核心功能,接下来就要对它进行优化.今天我 ...

  9. HotApp小程序统计,第一个专业的微信第三方小程序统计工具

    1.什么是HotApp小程序统计 HotApp小程序统计是第一个微信第三方小程序统计工具,就像做android 和 ios开发的人知道友盟统计一样,小程序也需要有个统计工具. 通过这个工具,可以知道小 ...

  10. Eclipse安装SVN插件

    Eclipse 安装最新SVN插件 下载地址 下载最新的Eclipse,我使用的是eclipse-jee-kepler-SR2-win32-x86_64.zip(Eclipse IDE for Jav ...