Linux内核编译

来源:互联网 发布:马歇尔 知乎 编辑:程序博客网 时间:2024/05/29 21:16

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。

一、准备内核

下载内核源代码的压缩包并用tar指令释放

wget http://kb.linuxvirtualserver.org/images/b/b7/Linux-2.6.32-220.23.1.el6.x86_64.lvs.src.tar.gz     #这个是fullnat模式的lvs服务器的内核

tar xzvf Linux-2.6.32-220.23.1.el6.x86_64.lvs.src.tar.gz

cd /root/linux-2.6.32-220.23.1.el6.x86_64.lvs


二、准备编译环境

现在得到的只是源代码,即许多文本文件,要想使这些文件成为可以运行的程序,需要使用编译器进行编译以及链接。安装开发工具:

yum install gcc* ncurses-devel bc openssl openssl-devel libssl-dev perl rpm-build -y


三、配置内核

内核的功能非常多,需要哪些部分,每个部分编译成什么形式(编进内核还是编成模块),每个部分的工作参数如何,这些都是可以配置的。配置内核可以使用make menuconfig命令进入字符界面不过我下载的内核自带了配置,所以这一步可以不做。


四、编译并安装内核

make -j8 (数字最大为cpu核心数的2倍)

make modules_install

make install


五、编译Linux内核rpm包并安装

为了方便部署服务器,一般将内核编译成rpm包。

make binrpm -pkg

rpm -ivh --force xxx.rpm

dracut -f /boot/initramfs-2.6.32.img 2.6.32 (制作initramfs)

emacs /boot/grub/grub.conf (修改grub引导表)

default=1

timeout=5

splashimage=(hd0,1)/boot/grub/splash.xpm.gz

title CentOS (2.6.32-431.el6.x86_64)              #旧内核

        root (hd0,1)

        kernel /boot/vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=e68276e7-66c9-4\

e80-a21f-28e4b283bf01 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 \

rd_NO_MD SYSFONT=latarcyrheb-sun16 rd_NO_LVM crashkernel=auto rhgb quiet rd_NO_\

DM rhgb quiet

        initrd /boot/initramfs-2.6.32-431.el6.x86_64.img


title CentOS (2.6.32)                                  #新内核

        root (hd0,1)

        kernel /boot/vmlinuz-2.6.32 ro root=UUID=e68276e7-66c9-4e80-a21f-28e4b2\

83bf01 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us LANG=en_US.UTF-8 rd_NO_MD SYSFON\

T=latarcyrheb-sun16 rd_NO_LVM crashkernel=auto rhgb quiet rd_NO_DM rhgb quiet

        initrd /boot/initramfs-2.6.32.img

重启。运行uname -a查看内核版本。


PS:编译过程出现错误解决方法如下。

错误1:
make binrpm-pkg --target: unknown option
解决方法:修改文件scripts/package/Makefile,L73
  $(RPM) $(RPMOPTS) --define "_builddir $(objtree)" --target \
==>
  rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \

错误2:
do_hypervisor_callback编译错误
解决方法:
emacs -nw arch/x86/kernel/entry_64.S
Ln1321
END(do_hypervisor_callback)
==>
END(xen_do_hypervisor_callback)

错误3:
  gcc: error: elf_x86_64: No such file or directory
  gcc: error: unrecognized command line option ‘-m’
  OBJCOPY arch/x86/vdso/vdso.so
  objcopy: 'arch/x86/vdso/vdso.so.dbg': No such file
  make[2]: *** [arch/x86/vdso/vdso.so] Error 1
  make[1]: *** [arch/x86/vdso] Error 2
  make: *** [arch/x86] Error 2
  解决方法:修改文件arch/x86/vdso/Makefile,把"-m elf_x86_64"改为"-m64";把"-m elf_i386"改为"-m32"

错误4:
  In file included from drivers/scsi/pmcraid.c:57:0:
  drivers/scsi/pmcraid.h: At top level:
  drivers/scsi/pmcraid.h:601:8: error: duplicate member 'sense_buffer'
  drivers/scsi/pmcraid.c: In function 'pmcraid_abort_cmd':
  drivers/scsi/pmcraid.c:2940:33: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  drivers/scsi/pmcraid.c: In function 'pmcraid_ioctl_passthrough':
  drivers/scsi/pmcraid.c:3745:5: warning: variable 'access' set but not used [-Wunused-but-set-variable]
  drivers/scsi/pmcraid.c: In function 'pmcraid_check_ioctl_buffer':
  drivers/scsi/pmcraid.c:4052:6: warning: variable 'access' set but not used [-Wunused-but-set-variable]
  make[3]: *** [drivers/scsi/pmcraid.o] Error 1
  make[2]: *** [drivers/scsi] Error 2
  make[1]: *** [drivers] Error 2
  make[1]: Leaving directory `/home/ashish/litmus-rt'
  make: *** [debian/stamp/build/kernel] Error 2 
  解决办法:在drivers/scsi/pmcraid.h中注释掉571行,及//u8 *sense_buffer;



原创粉丝点击