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;
完
- Linux内核:编译内核
- 【LINUX内核】LINUX内核编译
- Android编译 & Linux内核编译
- linux内核编译kernel编译
- Linux编译内核详解
- Linux编译内核详解
- linux内核编译
- 菜鸟编译Linux内核
- linux内核编译详解
- LINUX内核编译(ZT)
- Linux 内核编译 全功略
- 第一次编译linux内核
- linux内核编译步骤
- Linux内核编译步骤
- Linux 内核编译详解
- Linux内核编译详解
- Linux内核编译
- linux内核编译
- java基础部分面试题
- 编译Android 7.0遇到的问题
- 【spring mvc】PUT/POST 请求参数接收
- maven的profiles节点
- Mosquitto Windows7 编译&Debug
- Linux内核编译
- CVPR 2017—Deep Joint Rain Detection and Removal from a Single Image
- HDU6040-Hints_of_sd0061-STL/快排思想/线性时间找第k大
- 弹出框及层的屏蔽功能实现
- 万圣节派对
- 二叉排序树:POJ2418-Hardwood Species(外加字符串处理)
- Mybatis知识点整理
- unity切换窗口焦点后,程序依然运行
- 关于action向JSP传值