linux内核源码编译

linux内核编译

下面我将讲一下我在redhat-2.6.18内核服务器上进行更高版本的内核源码编译过程,以及在整个编译过程中出现的问题。

1.首先具备下面的测试环境,建议在vmware下安装rehl.xx.iso,比如rhel-server-5.5-i386-dvd.iso,最好安装成英文环境。

2.下载最新的linux-2.6.39.tar.gz源码包,在kernels.org官方网站。

3.配置win7操作系统与vmware虚拟机的网络连通性,用coreftp上传到/usr/src目录下。

4.执行#tar -xzvf linux-2.6.39.tar.gz 解压缩包 生成linux-2.6.39,里面的文件就是linux内核的源码文件。

5.cd linux-2.6.39

6.make menuconfig 生成.configure文件,进去之后可以直接退出保存,也可以根据需要进行参数修改。

有下面的菜单属性配置:

代码成熟度选项:

Code maturity level options —> [*] Prompt for development and/or incomplete code/drivers [*] Select only drivers expected to compile cleanly 打开使用开发中、不完全的代码/驱动会让内核配置多出很多选项,由于我们需要使用一些正在开发中的功能,因此必需打开这一选项。 通用设置选项,

General setup —>

() Local version – append to kernel release 这里填入的是64字符以内的字符串,你在这里填上的字符口串可以用uname -a命令看到。 [*] Support for paging of anonymous memory (swap) 这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。 [*] System V IPC 表示系统5的Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来 [*] POSIX Message Queues 这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上 [*] BSD Process Accounting 这是充许用户进程访问内核将账户信息写入文件中的。这通常被认为是个好主意,建议你最好将它选上。

[*] BSD Process Accounting version 3 file format [*] Sysctl support 这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。建议你最好将它选上 [ ] Auditing support 审记支持,用于和内核的某些子模块同时工作,例如SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用 (15) Kernel log buffer size (16 => 64KB, 17 => 128KB) 内核日志缓存的大小,12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB for x86 NUMAQ or IA-64,17 => 128 KB for S/390[*] Support for hot-pluggable devices 是否支持热插拔的选项,肯定要选上 [*] Kernel Userspace Events 内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。 [*] Kernel .config support 将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置 [*] Enable access to .config through /proc/config.gz [ ] Configure standard kernel features (for small systems) —> 这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。 — Configure standard kernel features (for small systems) [ ] Load all symbols for debugging/kksymoops 是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。 [*] Enable futex support 不选这个内核不一定能正确的运行使用glibc的程序,当然要选上 [*] Enable eventpoll support 不选这个内核将不支持事件轮循的系统调用,最好选上 [*] Optimize for size 这个选项使gcc使用-Os的参数而不是-O2的参数来优化编译,以获得更小尺寸的内核,建议选上。 [*] Use full shmem filesystem 除非你在很少的内存且不使用交换内存时,才不要选择这项 (0) Function alignment (0) Label alignment (0) Loop alignment (0) Jump alignment

可加载模块: Loadable module support —> [*] Enable loadable module support [*] Module unloading 不选这个功能,加载的模块就不能卸载 [ ] Forced module unloading [ ] Module versioning support (EXPERIMENTAL) [ ] Source checksum for all modules [*] Automatic kernel module loading

处理器类型及特性: Processor type and features —> Subarchitecture Type (PC-compatible) —> Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) —> [ ] Generic x86 support 这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586之类的才选这个 [*] HPET Timer Support HPET是替代8254芯片的下一代时钟处理器。这里你可以安全的选上这一选项。如果硬件不支持的话,将仍使用8254时钟处理器 [*] Symmetric multi-processing support 对称多处理器支持,在单CPU的机器上,不选这个选项会更快一些。由于超线程技术,看起来是两颗CPU,因些要选上这个选项 (1) Maximum number of CPUs (2-255) 支持的最大CPU数 [ ] SMT (Hyperthreading) scheduler support [*] Preemptible Kernel 这个选项能使应用程序即使内核在高负载时也很可靠,建议最好选上 [*] Machine Check Exception 这个选项能让CPU检测到系统故障时通知内核,一般我用组装的台式机会选这项。 < > Toshiba Laptop support < > Dell laptop support < > /dev/cpu/microcode – Intel IA32 CPU microcode support < > /dev/cpu/*/msr – Model-specific register support < > /dev/cpu/*/cpuid – CPU information support

Firmware Drivers —> < > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL) High Memory Support (4GB) —> [ ] Allocate 3rd-level pagetables from highmem [ ] Math emulation [*] MTRR (Memory Type Range Register) support [ ] Boot from EFI support (EXPERIMENTAL) [*] Enable kernel irq balancing [ ] Use register arguments (EXPERIMENTAL)

电源管理: Power management options (ACPI, APM) —> [*] Power Management support [ ] Power Management Debug Support [ ] Software Suspend (EXPERIMENTAL) ACPI (Advanced Configuration and Power Interface) Support —> APM (Advanced Power Management) BIOS Support —> CPU Frequency scaling —>

ACPI (Advanced Configuration and Power Interface) Support —> [*] ACPI Support 这是一种电源管理方式,你可以看看你的BIOS是否支持。如果支持的话建议你选上这项 [ ] Sleep States (EXPERIMENTAL) < > AC Adapter < > Battery <*> Button 捕获Power、Sleep、Lid(我也不知道这是什么按钮)等按钮是否按下,并做相应的动作 <*> Video 集成在板上的显卡的ACPI支持,对有些板卡可能不起作用 < > Fan <*> Processor <*> Thermal Zone < > ASUS/Medion Laptop Extras < > IBM ThinkPad Laptop Extras < > Toshiba Laptop Extras (0) Disable ACPI for systems before Jan 1st this year [ ] Debug Statements [*] Power Management Timer Support

APM (Advanced Power Management) BIOS Support —> < > APM (Advanced Power Management) BIOS support 高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。 [ ] Ignore USER SUSPEND [*] Enable PM at boot time [ ] Make CPU Idle calls when idle [ ] Enable console blanking using APM [ ] RTC stores time in GMT 按Unix的标准,硬件的时钟应该设为格林威治时间 [ ] Allow interrupts during APM BIOS calls [*] Use real mode APM BIOS call to power off

[*] CPU Frequency scaling 这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。 [ ] Enable CPUfreq debugging < > /proc/cpufreq interface (deprecated) Default CPUFreq governor (performance) —> — ‘performance’ governor <*> ‘powersave’ governor <*> ‘userspace’ governor for userspace frequency scaling [ ] /proc/sys/cpu/ interface (2.4. / OLD) <*> ‘ondemand’ cpufreq policy governor自动调节主频 <*> CPU frequency table helpers 多数的CPU需要这一项来调节主频 <*> ACPI Processor P-States driver 报告处理器的状态 < > AMD Mobile K6-2/K6-3 PowerNow! < > AMD Mobile Athlon/Duron PowerNow! < > AMD Opteron/Athlon64 PowerNow! < > Cyrix MediaGX/NatSemi Geode Suspend Modulation <*> Intel Enhanced SpeedStep Intel的变频技术支持 [ ] Use ACPI tables to decode valid frequency/voltage pairs — Built-in tables for Banias CPUs < > Intel Speedstep on ICH-M chipsets (ioport interface) < > Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface) < > Intel Pentium 4 clock modulation < > nVidia nForce2 FSB changing < > Transmeta LongRun < > VIA Cyrix III Longhaul — shared options [ ] /proc/acpi/processor/../performance interface (deprecated)

[ ] Relaxed speedstep capability checks

总线类型: [*] PCI support PCI access mode (Any) —>强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。 [ ] Message Signaled Interrupts (MSI and MSI-X) [ ] Legacy /proc/pci interface [ ] PCI device name database [ ] ISA support [*] EISA support [*] Vesa Local Bus priming [*] Generic PCI/EISA bridge [*] EISA virtual root device [ ] EISA device name database [ ] MCA support < > NatSemi SCx200 support PCCARD (PCMCIA/CardBus) support —> PCI Hotplug Support —>

PCCARD (PCMCIA/CardBus) support —>一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。

PCI Hotplug Support —> < > Support for PCI Hotplug (EXPERIMENTAL) 一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。 可执行文件格式, [*] Kernel support for ELF binaries ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台 < > Kernel support for a.out and ECOFF binaries <*> Kernel support for MISC binaries 此选项允许插入二进制的封装层到内核中,当使用Java、.NET、Python、Lisp等语言编写的程序时非常有用

硬件设备相当复杂,看得偶头晕,大家针对自己的设备慎重选择(手边最好准备一本汉英字典:)如果想使用adsl,记得网络部分除了TCP/IP协议还得把ppp部分编译进内核,想当初偶就是把这个给忘了,郁闷了许久。

文件系统, <*> Second extended fs support [*] Ext2 extended attributes [*] Ext2 POSIX Access Control Lists [*] Ext2 Security Labels <*> Ext3 journalling file system support [*] Ext3 extended attributes [*] Ext3 POSIX Access Control Lists [*] Ext3 Security Labels [ ] JBD (ext3) debugging support <*> Reiserfs support [ ] Enable reiserfs debug mode [ ] Stats in /proc/fs/reiserfs [*] ReiserFS extended attributes [*] ReiserFS POSIX Access Control Lists [*] ReiserFS Security Labels JFS filesystem support [*] JFS POSIX Access Control Lists [ ] JFS debugging [ ] JFS statistics XFS filesystem support [*] Realtime support (EXPERIMENTAL) [*] Quota support [*] Security Label support [*] POSIX ACL support < > Minix fs support < > ROM file system support [*] Quota support < > Old quota format support Quota format v2 support [*] Dnotify support < > Kernel automounter support < > Kernel automounter version 4 support (also supports v3) CD-ROM/DVD Filesystems —> DOS/FAT/NT Filesystems —> Pseudo filesystems —> Miscellaneous filesystems —> Network File Systems —> Partition Types —> Native Language Support —> Profiling support —> Kernel hacking —> Security options —> Cryptographic options —> Library routines —>

7.执行make,切忌要在linux-2.6.39目录下执行,开始内核的编译。

8.make modules_install install 安装编译后的模块以及进行模块配置。

内核编译的工作就基本完成。。。。

但是在整个编译的过程中会存在这样那样的问题,下面我将把我遇到的问题,以及解决的方法罗列出来。

1.安装完成后启动默认还是原来的内核。

解决办法:

cd /boot/grub

more grub.conf

[root@localhost grub]# more grub.conf# grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00# initrd /initrd-version.img#boot=/dev/hdadefault=1timeout=5splashimage=(hd0,0)/grub/splash.xpm.gz#hiddenmenu 注释掉这个隐藏菜单,下面的titile就是新编译后的内核信息title Red Hat Enterprise Linux Server (2.6.39) root (hd0,0) kernel /vmlinuz-2.6.39 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd.imgtitle Red Hat Enterprise Linux Server (2.6.18-194.el5) root (hd0,0) kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet initrd /initrd-2.6.18-194.el5.img[root@localhost grub]#

2.重启后,进入到新内核2.6.39后启动不起来,报initrd.img等相关信息错误。

解决办法:

cp /boot/initrd-2.6.39.img /tmp

cd /tmp/

mkdir newinitrd

cd newinitrd/

zcat ../initrd-2.6.39.img | cpio -i

[root@bogon newinitrd]# lsbin dev etc init lib proc sbin sys sysroot

编辑init,删掉其中重复的四行中的两行echo "Loading dm-region-hash.ko module"insmod /lib/dm-region-hash.koecho "Loading dm-region-hash.ko module"insmod /lib/dm-region-hash.ko

重新打包initrdfind . | cpio -c -o > ../initrd11538 blockscd ..gzip -9 < initrd > initrd.imglsinitrd-2.6.39.img initrd initrd.img newinitrd

将新打包后的initrd.img拷贝到/boot目录下,并且修改/boot/grub/grub.conf的对应titile的initrd.img,将原来的initrd-2.6.39改为initrd.img

再重启后,就可以进入到新的内核。

通过uname -a 可以验证内核已经升级成功!

有一些喷着香水闻不到的空气,有一些在写字楼里永远遇不见的人。

linux内核源码编译

相关文章:

你感兴趣的文章:

标签云: