实验基于Centos 6.2
升级linux内核
直接在一个有编译环境的设备上,编译升级内核很简单。
make menuconfig
或者
拷贝现有系统的.config文件
修改.config文件 CONFIG_DEBUG_INFO=n (避免编译产生文件过大)
make oldconfig
make all -j4
make modules_install
make install
制作linux内核安装包
有时需要在虚拟机上编译好内核后,安装到另外的设备上,而设备上工具有限,没有编译开发环境等。一种方式是通过nfs挂载,在设备上直接make modules_install,然后make install。
另外一种,就是手动拷贝安装。下面介绍怎么制作一个内核安装包,可以直接在设备上安装。以下以内核3.5.3为例说明。
1、编译
make all -j4
2、准备各种目录及文件
新建文件夹 kernel-3.5.3
export INSTALL_MOD_PATH=kernel-3.5.3
执行make modules_install 模块会安装到文件夹kernel-3.5.3中
拷贝源码目录下scripts中的depmod.sh 到kernel-3.5.3中
拷贝源码目录下arch/x86/boot/bzImage 到kernel-3.5.3中
拷贝源码目录下System.map到kernel-3.5.3中
拷贝源码目录下arch/x86/boot/install.sh 到kernel-3.5.3中
所有文件准备好了
kernel-3.5.3
--lib
--firmware
--modules
--3.5.3
--bzImage
--depmod.sh
--install.sh
--System.map
3、编写安装脚本
在这之前,首先需要修改下install.sh脚本
在文件适当位置加上变量定义
INSTALLKERNEL=installkernel
然后编写安装脚本 install_kernel.sh
#!/bin/bash PROGRAM=install_kernel.sh if [ "$0" != "${PROGRAM}" ]; then if [ "$0" != "./""${PROGRAM}" ]; then echo "ERROR: ****** !" exit fi fi echo "0%..." /bin/cp -rf lib/modules/3.5. /lib/modules/ echo "30%..." /bin/sh depmod.sh /sbin/depmod 3.5. echo "60%..." sh install.sh 3.5. bzImage System.map "/boot" echo "100%" echo "install success !"
4、现在有个问题,你会发现,目录下有个install.sh脚本,有个install_kernel.sh脚本,为了避免使用时混乱,我们吧install.sh重命名一下。
mv install.sh kernel_install
mv install_kernel.sh install.sh
然后重新编辑下我们的install.sh(原来的install_kernel.sh),并加入修改grub的功能,默认启动到新内核中。
#!/bin/bash PROGRAM=install.sh
GRUB_CONF="/boot/grub/grub.conf"
line_no="" modify_grub()
{
line_no=`sed -n '/^default/=' $GRUB_CONF`
if [ $line_no ] ;then
sed -i "${line_no}cdefault=0" $GRUB_CONF
fi
} if [ "$0" != "${PROGRAM}" ]; then
if [ "$0" != "./""${PROGRAM}" ]; then
echo "ERROR: ****** !"
exit
fi
fi echo "0%..."
/bin/cp -rf lib/modules/3.5. /lib/modules/ echo "30%..."
/bin/sh depmod.sh /sbin/depmod 3.5. echo "60%..."
sh kernel_install 3.5. bzImage System.map "/boot" echo "90%..." modify_grub echo "100% OK!"
5、打包kernel-3.5.3文件夹下的内容
制作完成,拿到设备上,解压,执行install.sh即可完成内核安装。
制作linux模块编译环境
好,现在你制作了一个内核安装包,现在有人要将以前的驱动,重新编译,以适应这个新的内核。你总不能把你编译的源码打个包给他的吧,太大了。
其实只要拷贝几个必要的目录就可以了,以下还是以3.5.3为例,制作一个模块编译环境的安装包。
新建文件夹 kernel-3.5.3-devel
kernel-3.5.3-devel下新建usr/src/kernel/3.5.3目录
拷贝源码目录下arch/x86 到3.5.3/arch下 (可以把boot文件夹删掉,节省空间)
拷贝源码目录下include到3.5.3下
拷贝源码目录下scripts到3.5.3下
拷贝源码目录下usr 到3.5.3下
拷贝源码目录下 .config Kbuild Kconfig Makefile Module.symvers modules.builtin modules.order System.map到3.5.3下
Kernel-3.5.3下新建目录lib/modules/3.5.3
然后lib/modules/3.5.3中,建立build连接文件,连接到../../../usr/src/kernel/3.5.3
好,打包kernel-3.5.3-devel文件夹下的文件和目录,就做好了一个编译环境的安装包,使用者先使用内核安装包安装内核,然后使用本安装包,直接解压到自己设备的根目录。重启切换到3.5.3内核下,即可进行模块的开发和编译了。