`
tuoxie007
  • 浏览: 162730 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编译开源软件手记之2--Linux Kernel

阅读更多

这是此系列的第二篇文章,记录编译Linux内核的过程。

按说内核的编译本是很简单的过程,但本人第一次编译,还是遇到了一些小问题,记录下来希望可以帮到新手。

 

本文主要参考:

《如何编译一个内核 - Ubuntu方式》

《ubuntu环境下编译内核详解》

《Ubuntu下的 Linux 内核》

《Ubuntu 10.04 编译安装最新版本Linux-2.6.34内核》

 

编译环境是Ubuntu 10.04 64位,kernel: 2.6.32

目标内核版本:2.6.34.1

 

Ubuntu和Debian下有两种编译的方法,一种是传统的make,一种是debian提供的make-kpkg,我用的是后者。

 

过程:

1. 安装所需软件

apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

 2. 下载内核

在kernel.org首页上下载最新的本版

cd /usr/src
sudo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2
sudo tar xvf linux-2.6.34.1.tar.bz2
sudo ln -s linux-2.6.34.1 linux   #以后使用方便,可以省略
cd linux

3. 准备工作

据说是第一次可以省略,第二次之后需要执行,没有考证

sudo make mrproper
 

4. 配置内核

由于menuconfg配置复杂,再次使用系统当前的配置:

sudo cp /boot/config-`uname -r` ./.config 
sudo make menuconfig

 选择Load an Alternate Configuration File一项,出现.config文件,这就是我刚才cp过来的,选择OK

 

5. 开始编译

sudo make-kpkg clean
sudo make-kpkg -initrd --initrd --append-to-version=dell1400 kernel_image kernel-headers

对于第二天命令的说明:

1. 此处的dell1400是参考文章中使用的,我本想改成自己的,但不小心多复制了回车,所以就执行了,那就执行了吧,不是原则问题。

2. 此命令比较随意,所以有些文章讲的不太一样。你可以make-kpkg --help看以下,我试过很多中参数的组合,但都有问题,问题在最后安装的时候都没有生成initrd文件,然后grub.cfg里也就没有添加启动项,后面我会介绍如何解决。但此处我认为比较合理的命令应该是

sudo make-kpkg --initrd [--append-to-version <custom>] kernel_image [kernel-headers]

--initrd是针对initrd方式的,但我加和不加,或者向上面用的加两个-initrd --initrd,效果都是一样不能生成initrd文件。

--append-to-version可要可不要,custom是自定义的本版号,ubuntu里一般有generic,就是这个东西。

 headers不要应该也行,就是不生成headers文件,我们不做开发的话不用装headers的。

 

6. 安装新内核

此时生成了两个deb文件(不加headers就只有一个)

cd ..
sudo dpkg -i linux-image-2.6.34.1dell1400_2.6.34.1dell1400-10.00.Custom_amd64.deb

 此时生成几个新的文件在 /boot/ 下。

前面提到,此时没有生成initrd文件,怎么办呢?我本认为是make-kpkg命令使用的问题,所以变化参数执行很多此,每次都要2个小时,很TMD Shit,还是不知道,如果有朋友知道的话告诉我一声。

我看到另外一种用make编译的方法,受到启发,在此时执行

cd linux
sudo mkinitramfs -o /boot/initrd.img-2.6.34

 结果真的生成了,然后在grub.cfg文件中手动添加启动项。

sudo chmod +w /boot/grub/grub.cfg
sudo vim /boog/grub/grub.cfg

 添加项:

menuentry "Ubuntu, Linux 2.6.34.1" {
        insmod ntfs
        set root='(hd0,3)'
        search --no-floppy --fs-uuid --set 9a8c81748c814ba7
        loopback loop0 /ubuntu/disks/root.disk
        set root=(loop0)
        linux /boot/vmlinuz-2.6.34.1dell1400 root=/dev/sda3 loop=/ubuntu/disks/root.disk ro   quiet splash
        initrd /boot/initrd.img-2.6.34
}
menuentry "Ubuntu, Linux 2.6.32-23-generic" {
        insmod ntfs
        set root='(hd0,3)'
        search --no-floppy --fs-uuid --set 9a8c81748c814ba7
        loopback loop0 /ubuntu/disks/root.disk
        set root=(loop0)
        linux /boot/vmlinuz-2.6.32-23-generic root=/dev/sda3 loop=/ubuntu/disks/root.disk ro   quiet splash
        initrd /boot/initrd.img-2.6.32-23-generic
}
 

上面一个所我添加的,下面一个是原来的,只是标题,vmlinuz,initrd文件不同。

 

7. 重启

进入系统之后在终端下执行

uname -r

 查看内核版本号,输出:2.6.34.1dell1400

是新的内核了。

 

虽然可以启动,但启动新内核的时候会报出一些错误,说是找不到modules.dep文件,参考一篇文章的解决方法

sudo su
cd /boot
cp initrd.img-2.6.34 initrd-2.6.34.old (先做一个备份以防万一,哈哈)
depmod -a
update-initramfs -k 2.6.34 -c
cd /tmp
gzip -dc /boot/initrd.img-2.6.34| cpio -id
cp lib/modules/2.6.32.23-generic lib/modules/2.6.34 -r
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.34.new
gzip /boot/initrd.img-2.6.34.new
cd /boot
mv initrd.img-2.6.34.new.gz initrd.img-2.6.34

 错误提示不见了。

 

进入系统之后发现貌似显卡驱动没弄好。拖动窗口会闪。

 

还有两个新的体验:

    在终端里敲tab键,声音好听了一些;

    重启的时候快了一些,没有提示说要重启了之类的。

其他地方是不是有变化,是不是快些,我还没测试。

 

就此结束。

 

本人新博客:tuoxie.me

 

0
0
分享到:
评论

相关推荐

    arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2.7z

    可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2.7z交叉编译器必须安装在32为主机上,...

    arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

    ARM Linux交叉编译工具链,arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

    Linux系统中安装gcc和kernel-devel的方法

    kernel-devel:linux内核,安装软件时需要编译内核,故需要保持内核版本一致性 1.Linux操作系统安装好以后,查看gcc是否已经安装; # gcc -v //如果后面出现一大段,则已经安装; 2.查看内核是否一致; #uname -r  ...

    树莓派的交叉编译工具链arm-linux-gnueabihf(64位linux)

    树莓派的交叉编译工具链,适用于安装在x86的64位ubuntu系统上,用于编译arm平台树莓派上可运行的程序 文件名:gcc-linaro-arm-linux-gnueabihf-raspbian-x64.zip

    海思编译链工具arm-hisiv300-linux.7z

    海思编译链工具arm-hisiv300-linux.7z是一款专为海思hisiv300系列处理器设计的Linux系统编译环境。在嵌入式开发领域,编译链工具是至关重要的,它负责将源代码转化为可以在目标硬件上运行的二进制程序。这款工具集...

    树莓派的交叉编译工具链arm-linux-gnueabihf(32位linux)

    树莓派的交叉编译工具链,适用于安装在x86的32位ubuntu系统上,用于编译arm平台树莓派上可运行的程序 文件名:gcc-linaro-arm-linux-gnueabihf-raspbian.zip

    mips-sde-elf-i686-pc-linux-gnu.tar.bz2

    mips-sde-elf-i686-pc-linux-gnu.tar.bz2 下载这里来编译mips

    arm-none-linux-gnueabi 交叉编译工具

    交叉编译工具。用于进行linux上搭建交叉编译环境。该版本为2010.09版。解压后将bin目录放入PATH即可使用。

    交叉编译环境的建立arm-linux-gcc-4.3.2的安装

    ### 交叉编译环境的建立与arm-linux-gcc-4.3.2的安装 在进行嵌入式系统开发时,经常会遇到需要为不同的目标平台编译代码的情况,这就涉及到了交叉编译的概念。交叉编译是指在一个平台上编译代码,并生成可以在另一...

    kernel-devel-3.10.0-1160.el7.x86-64.rpm 及其他版本下载地址信息

    `kernel-devel`包对于Linux开发者来说至关重要,它为构建针对特定内核版本的模块或驱动程序提供了必要的头文件和符号链接。本文将深入探讨`kernel-devel-3.10.0-1160.el7.x86_64.rpm`及其相关版本的细节,并提供下载...

    kernel-ntfs-2[1].4.20-8.i686.rar_kernel ntfs _kernel-ntfs_linux

    "kernel-ntfs"项目是开源社区的努力成果,它允许Linux用户在保持与Windows文件系统兼容的同时,能够无缝地访问NTFS分区。这在跨平台工作环境或者需要共享Windows和Linux文件的场景中非常有用。 驱动的实现主要分为...

    curl-7.83.1源代码编译的android库,android-ndk-r20b编译64位

    ./configure --prefix=/usr/local/android --host aarch64-linux-android --with-pic --disable-shared make -j4;make install 在wsl下面用ndk20编译的, aarch64-linux-android29-clang++ aarch64-linux-android-...

    arm-unknown-linux-gnueabi.tar.gz

    其采用32位ARMv7架构,支持Thumb-2指令集,具备多线程和超标量处理能力,能提供较高的计算性能。 二、交叉编译工具链 交叉编译工具链是一组特殊设计的编译器,用于在一个平台上生成另一个平台上运行的代码。在本例...

    MacOX下ARM交叉编译工具链arm-linux-gnueabihf

    使用crosstool-ng制作的MacOS下arm-linux交叉编译器,编译器版本linaro 7.2.1,支持armv8,cortex-a53,neon-vfpv4。可以在Mac下开发树莓派3程序。MacOS下需要安装到区分大小写的分区中,具体方法网上找。

    kernel-headers-3.10.0-1160.zip

    - **编译内核模块**:有了kernel-headers,开发者能够使用`gcc`命令编译内核模块,例如`gcc -o mymodule mymodule.c -I/usr/src/kernels/3.10.0-1160.2.1.el7.x86_64/include/ -Wall`,其中`-I`选项指定了头文件的...

    arm-none-linux-gnueabi-linux-4.8.1

    arm-none-linux-gnueabi-linux-4.8.1 已验证可用,请放心下载。arm-none-linux-gnueabi-gcc是 Codesourcery...可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。

    apr-util linux 编译成功

    在Linux环境中,`apr-util`是一个非常重要的工具集,它是Apache Portable Runtime Utility的缩写,是Apache HTTP服务器项目的一部分。...同时,这也是一种学习开源文化的方式,因为很多开源项目都需要自行编译和配置。

    kernel-headers-3.10.0-957.el7.x86_64

    在Linux世界中,内核头文件是编译内核模块、用户空间工具或者需要利用内核API的软件时必不可少的部分。它们包含了一系列C语言的头文件,定义了内核提供的函数原型、数据结构和常量。 “3.10.0-957”是内核的具体...

    aarch64-himix210-linux.tgz

    标题 "aarch64-himix210-linux.tgz" 暗示这是一个针对64位ARM架构(aarch64)的软件开发工具包,特别为海思(HiSilicon)SD3403处理器优化。描述指出,这个压缩包包含了一个交叉编译工具链,用于在x86架构的Linux...

    kernel-devel-3.10.0-1127.19.1.el7.x86_64 依赖包

    在Linux系统中,`kernel-devel`是一个特殊的软件包,包含了当前运行内核版本的源代码、头文件和其他构建工具,这些工具对于编写和编译内核模块至关重要。这里的`3.10.0-1127.19.1.el7.x86_64`表示的是具体的内核版本...

Global site tag (gtag.js) - Google Analytics