现在的位置: 首页 > 综合 > 正文

ubuntu 编译内核

2013年09月04日 ⁄ 综合 ⁄ 共 2808字 ⁄ 字号 评论关闭

第一步 安装必要的工具

首先要安装必要的包。 
包有: libncurses5-dev ( menuconfig 需要的)和 essential 
sudo apt-get install build-essential kernel-package(内核打包deb的可以不用装手动安装) 
sudo apt-get install make
sudo apt-get install gcc
另外,查看系统是否有这样的两个命令 
mkinitramfs mkisofs
这两个工具在编译内核时用来生成 *.img 文件的。如果没有就需安装。

第二步 下载内核

到 www.kernel.org 下载新内核到 /usr/src 
我下载的是 linux-2.6.30.tar.gz

解压 linux-2.6.30.tar.gz 到 linux-2.6.30
cd /usr/src

sudo tar zxvf linux-2.6.30.tar

cd linux-2.6.30/

第四步 开始编译

以下所有的工作都在 /usr/src/linux-2.6.30 下完成 
sudo make menuconfig // 用 menuconfig 的话还需要 Ncurses ,或者用 
sudo make xconfig

 

sudo make menuconfig // 一般是用 menuconfig

配置完以后保存(系统中保存的一份内核配置文件是在 /usr/src/linux-2.6.30 下名为 .config, 你也可以自己在别的地方另存一份)

不会配置,就选用默认配置可能也能用(就是make menuconfig 后直接退出) 
sudo make dep     // 也许系统会提示现在不必要进行 make dep ,那就下一步 2.6.30 的我编译就没有使用过。 
sudo make clean // 清除旧数据 ,新解压的内核源码就不需要这一步了

sudo make –j4    // -jn 参数指要衍生的作业数,一般每个处理器2个作业,所以,双核可以选择-j4 
sudo make bzImage // 编译内核,将保存到 /usr/src/linux-2.6.30/arch/i386/boot/ 下 
sudo make modules // 编译模块 
sudo make modules_install // 安装模块  把编译好的模块安装到系统的/lib/modules下 

sudo mkinitramfs -o /boot/initrd-2.6.30.img  2.6.30 #根据安装好的模块做镜像后面的参数号是指你的版本号,也就是modules下你安装的文件夹名 

此时可能提示找不到这样的一个文件夹“ /lib/firmware/2.6.30 ”,你需要手工创建一个这样的文件夹。

sudo mkdir /lib/firmware/2.6.30
sudo make install // 安装内核

#以上的几个步骤不能乱来要搞清楚各个步骤的实质内容   编译(包括内核和模块)->安装模块->做模块镜像->安装内核顺序不能乱

经过以上几步,内核就编译安装好了。然后就是修改grub,能够引导我们自己的新内核。如果对grub如何修改不是很了解,请看另一篇我转载的文章 《ubuntu9.10之grub.cfg详解》我就是添加了

menuentry “Ubuntu, Linux 2.6.30″ {
insmod ext2
set root=(hd0,8)
search –no-floppy –fs-uuid –set f255285a-5ad4-4eb8-93f5-4f767190d3b3
linux /boot/vmlinuz-2.6.30    root=UUID=f255285a-5ad4-4eb8-93f5-4f767190d3b3 ro quite splash
initrd /boot/initrd.img-2.6.30
}

 

修改完grub重启后出现了出现

warning:can't open directory /lib/modules/2.6.30-rc8-bfs311t5250,no such directory,估计没有配置好内核。

后来根据如下命令启发,修改后成功新内核。

######################################

cd /boot
cp initrd.img-2.6.29.4 initrd-2.6.29.4.old (Just making a backup)
depmod -a
update-initramfs -k 2.6.29.4 -c
cd /tmp
gzip -dc /boot/initrd.img-2.6.29.4| cpio -id
touch lib/modules/2.6.29.4/modules.dep
find ./ | cpio -H newc -o > /boot/initrd.img-2.6.29.4.new
gzip /boot/initrd.img-2.6.29.4.new
cd /boot
mv initrd.img-2.6.29.4.new.gz initrd.img-2.6.29.4

######################################

补充:
make 包括 内核部件和模块部件一起编译
make bzImage 只编译内核#可以在menuconfig后就使用 只编译内核 但是接着要编译 模块不能省
make modules 只编译模块
make modules_install 把编译好的内核安装到/lib/modules/X.x.x下面 XX是你自己定义的版本号
sudo mkinitramfs -o /boot/initrd-2.6.24.img 2.6.24就对 /lib/modules/XX。X下面的模块库进行的一个镜像快照当内核需要没有被编入内核的模块是会去initrd.img找如果启动过程中需要的部 分都在内核中。就不会访问该文件!

内核安装过程中,实际做了三件事:
1.安装modules到/lib/modules下面。
2.复制内核vmlinuz和模块镜像initrd.img到/boot/下
3.在/下面创建vmlinux和initrd两个链接。是方便没法指明路径的引导程序直接到/目录下找到/boot/的启动文件!(grub可以设定路径,不用做链接也可以)
4.在grub里面加入新内核的引导路径!
完!

 

 

出现这个错误了

Re: FATAL: modprobe: Could not load /lib/modules/.../module.deb

删掉了之前生成的/boot/initrd.img-2.6.28,执行

#cd /usr/src/linux

#update-initramfs –c –k 2.6.28

这样,重新在/boot下创建initrd.img-2.6.28,
sudo update-grub
重启后,进入了新内核,内核编译升级成功。
在Ubuntuserver9.10下测试成功

抱歉!评论已关闭.