内核的编译
--------------------------------------------------------------------------------------------
1. 解压源代码到任意目录, 如/usr/src/linux-2.6.32-220.el6.x86_64
2. 拷贝目标系统的.config文件到源码目录的根目录, 这里还是/usr/src/linux-2.6.32-220.el6.x86_64
拷贝.config文件说明。
这里编译的设备是要到目标机器运行,仅仅对源码打了很少的补丁。
打补丁方法:
patch -p1 < xxx.patch
目标系统当前运行内核的.config文件: /boot/config-<version>
cp /boot/config-2.6.32-220.el6.x86_64 /usr/src/linux-2.6.32-220.el6.x86_64/.config
3. 执行make oldconfig , 这个操作的含义是快速配置新源码中新增的,旧源码中没有的项。
4. 执行make clean , 这个操作是清理内核源码编译生成的中间文件。
5. 执行make menuconfig, 对一些相关项做配置。
重点说明, 编译内核的时候请去掉模块签名认证<Module signature verification (EXPERIMENTAL) >.
否则新编译的内核不能加载以前的内核模块。 我的理解是,开启这个功能后加载模块的时候会去检查模块签名,
如果模块不是由这个内核编译的,则不让加载。
6. 手动修改源码根目录的Makefile文件, 指定内核版本号信息。
如:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 32
EXTRAVERSION = -220.el6.x86_64
7. 执行 make -j4 , j4指告诉make系统有4个cpu核, 编译时会起四个编译进程,加快编译速度。
编译后的安装
-------------------------------------------------------------------------------------------------
编译完成后, 会生成内核文件和内核符号文件, 以 x86_64的配置文件为例。
会在 arch/x86_64/boot/ 生成bzImage, 这就是新内核。
内核的符号文件,即内核导出的函数文件,是内核根目录的 System.map。
1. 模块的安装
执行 make modules_install, 会将新的内核模块安装在/lib/modules/ 下。
会在/lib/modules/下新建一个目录,这里就与在编译时Makefile中指定的版本相关了。
我这里是 :
/lib/modules/2.6.32-220.el6.x86_64。
如果编译时指定的版本号与现有内核版本号一样,请考虑安装前先备份现有内核模块目录。
并不是内核升级就需要重新升级模块, 我对内核做一个很小的补丁,不必重新安装模块。
-----
模块中有几个文件要特别注意:
modules.dep :内核模块的依赖关系文件, 调用 depmod生成。
modules.symbols : 所有模块的接口的导出文件。
2. 内核的安装
拷贝 arch/x86_64/boot/bzImage 到/boot目录。
拷贝 System.map 到 /boot目录。 <非必须,不过严谨掉拷贝是好的习惯, 方便问题定位>
备份现有的 vmlinuz-2.6.32-220.el6.x86_64 和 System.map-2.6.32-220.el6.x86_64 。
然后重命名拷贝过来的文件为 vmlinuz-2.6.32-220.el6.x86_64 和 System.map-2.6.32-220.el6.x86_64 。
3. 内核源码树的替换
如果我们需要编译依赖新内核的程序, 这里的替换显的很有必要,否则会出现如找不到宏定义之内的错误。
备份老的build目录, 创建一个软连接到我们的新源码。
ln -s /usr/src/linux-2.6.32-220.el6.x86_64 build
到此内核升级完成。reboot以新内核启动,如果启动失败,手动在启动的等待界面修改grub,指定旧的内核文件启动。
--------------------------------------------------------------------------------------------
1. 解压源代码到任意目录, 如/usr/src/linux-2.6.32-220.el6.x86_64
2. 拷贝目标系统的.config文件到源码目录的根目录, 这里还是/usr/src/linux-2.6.32-220.el6.x86_64
拷贝.config文件说明。
这里编译的设备是要到目标机器运行,仅仅对源码打了很少的补丁。
打补丁方法:
patch -p1 < xxx.patch
目标系统当前运行内核的.config文件: /boot/config-<version>
cp /boot/config-2.6.32-220.el6.x86_64 /usr/src/linux-2.6.32-220.el6.x86_64/.config
3. 执行make oldconfig , 这个操作的含义是快速配置新源码中新增的,旧源码中没有的项。
4. 执行make clean , 这个操作是清理内核源码编译生成的中间文件。
5. 执行make menuconfig, 对一些相关项做配置。
重点说明, 编译内核的时候请去掉模块签名认证<Module signature verification (EXPERIMENTAL) >.
否则新编译的内核不能加载以前的内核模块。 我的理解是,开启这个功能后加载模块的时候会去检查模块签名,
如果模块不是由这个内核编译的,则不让加载。
6. 手动修改源码根目录的Makefile文件, 指定内核版本号信息。
如:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 32
EXTRAVERSION = -220.el6.x86_64
7. 执行 make -j4 , j4指告诉make系统有4个cpu核, 编译时会起四个编译进程,加快编译速度。
编译后的安装
-------------------------------------------------------------------------------------------------
编译完成后, 会生成内核文件和内核符号文件, 以 x86_64的配置文件为例。
会在 arch/x86_64/boot/ 生成bzImage, 这就是新内核。
内核的符号文件,即内核导出的函数文件,是内核根目录的 System.map。
1. 模块的安装
执行 make modules_install, 会将新的内核模块安装在/lib/modules/ 下。
会在/lib/modules/下新建一个目录,这里就与在编译时Makefile中指定的版本相关了。
我这里是 :
/lib/modules/2.6.32-220.el6.x86_64。
如果编译时指定的版本号与现有内核版本号一样,请考虑安装前先备份现有内核模块目录。
并不是内核升级就需要重新升级模块, 我对内核做一个很小的补丁,不必重新安装模块。
-----
模块中有几个文件要特别注意:
modules.dep :内核模块的依赖关系文件, 调用 depmod生成。
modules.symbols : 所有模块的接口的导出文件。
2. 内核的安装
拷贝 arch/x86_64/boot/bzImage 到/boot目录。
拷贝 System.map 到 /boot目录。 <非必须,不过严谨掉拷贝是好的习惯, 方便问题定位>
备份现有的 vmlinuz-2.6.32-220.el6.x86_64 和 System.map-2.6.32-220.el6.x86_64 。
然后重命名拷贝过来的文件为 vmlinuz-2.6.32-220.el6.x86_64 和 System.map-2.6.32-220.el6.x86_64 。
3. 内核源码树的替换
如果我们需要编译依赖新内核的程序, 这里的替换显的很有必要,否则会出现如找不到宏定义之内的错误。
备份老的build目录, 创建一个软连接到我们的新源码。
ln -s /usr/src/linux-2.6.32-220.el6.x86_64 build
到此内核升级完成。reboot以新内核启动,如果启动失败,手动在启动的等待界面修改grub,指定旧的内核文件启动。