<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi - w$ S6 t+ D* O' Y+ K' o
国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。 & ?* q; p. J) `9 K) [5 S. e& A
; Z1 l* W8 O6 J! X& D Q欢迎转载,但请注明出处。 " |& a/ B. k+ i. |5 d ( D6 X, [) d/ \% s/ c) Y! T5 x/ v 一、备份重要文件 0 ~7 r9 F2 y7 k4 |. ? ?
备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。 2 ^8 R& o0 y2 c# s5 S: r6 U* l1、备份内核和启动文件 7 S/ J# [4 O3 _) b
# cd / $ H- i! ~( h: \6 m3 @8 T2 ^) M
# tar cvzf boot.tar.gz boot % _( Q/ d/ |$ U+ {5 A8 ]: K
2、备份系统函数头文件 ' N* |2 \6 r- |' [! @# cd /usr/include ) r- I- ?3 p1 j4 ^: E
# tar cvzf linux.tar.gz linux 7 s4 ]7 G% W, Y6 h% i
3、备份模块中的库文件 % S4 J$ e2 p1 Z1 k# cd /lib/modules * K- s! I3 A2 F7 U; [9 I- {3 L( ^% D
# tar cvzf 2.4.7-10.tar.gz 2.4.7-10 ' v& O4 r: n& ^0 U1 B! p
# tar cvzf 2.4.7-10debug.tar.gz 2.4.7-10debug ; V1 g: Y" V; t+ M( [4、备份linux源码 4 f+ `0 q4 K/ r! Y: t
# cd /usr/src 4 u, a1 e5 ?' @2 [# tar cvzf linux-2.4.7-10.tar.gz linux-2.4.7-10 ( k) V: E% ^1 y9 V8 }# tar cvzf linux-2.4.7-10debug.tar.gz linux-2.4.7-10debug : c+ n, [3 u- n5 a
5、备份重要配置目录 + T9 C6 ?0 D& F- d5 b/ @# cd / $ c. y% v1 W& ~/ ^$ a# f
# tar cvzf etc.tar.gz etc # w+ R" G" M- n: d4 s
二、修改核心参数(PGC2000需要) ) T- m. S! I" T7 D9 ?1、修改与共享内存相关的核心参数 ! P3 g5 \ f6 y! u( g
# cd /usr/include/linux A+ |% e% `, a0 L y# vi shm.h 1 S* I1 \( `7 [8 Y
把 #define SHMMAX 0X2000000 /*max shared seg size(bytes)*/ ' J" _7 x) L4 i! d @
改为#define SHMMAX 0Xa0000000 /*max shared seg size(bytes)*/ 1 m! Z4 k m1 r
2、修改与信号量相关的核心参数 5 |, g7 h( W' N2 A# cd /usr/include/linux 6 M: b# u5 @9 O5 Z) n5 Q" A# vi sem.h 0 l! s' {& R; \) ]5 b. h把 #define SEMOPM 32 /*<=1 100 max num of ops per semop call*/ " g2 F. B1 `3 o1 ~' z改为#define SEMOPM 900 /*<=1 100 max num of ops per semop call*/ * b6 R) P& q1 j( H- h' `; x3、修改与消息队列有关的核心参数 & ^' }, g' G( d1 |' R* J( D# cd /usr/include/linux 5 C9 N/ c8 |9 f J# vi msg.h ; w/ w, _6 C& B/ }& X5 _
找到以下三行(注释忽略): : m& R* H# C7 s* |" F" }#define MSGMNI 16 " V. H8 h8 y$ g$ S#define MSGMAX 8192 9 R+ t# s8 o$ X5 g# ]8 N#define MSGMNB 16384 6 y& `- h2 K( H; ~2 l+ d; J将其修改为: - [' W, A0 E; D: a#define MSGMNI 128 ! c2 O }3 l, n$ u% i#define MSGMAX 131072 ; m$ P+ q8 T/ D$ s9 B, h: c4 w/ p) S
#define MSGMNB 20000000 + g& b* d/ `: w8 g" W
4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 * l1 K/ A" |4 b6 C" k) H& ]( x三、下载释放核心源代码 # m K0 [8 T, B5 D8 k如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。 7 l$ J; {% }$ t: P+ Y
1、用tar命令释放内核源代码 , [4 W0 V* Y0 h$ b& y# cd /usr/src 0 m' _+ \! e6 s2 l" R& y' `) m# tar zxvf linux-2.4.7-12.tar.gz 3 p( {& ?, F% V: I# X+ z# \ Y
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。 5 A/ L& J" N2 q3 c2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。 3 m3 Y. @( b- I9 j. h2 ]% p$ g
# cd /usr/include 0 g) ~0 @* F9 ?4 u
# rm -Rf asm linux + |6 y' m9 s" ?4 I/ V- e% \9 O3 i # ln -s /usr/src/linux/include/asm-i386 asm 1 k- h/ j& F$ A7 w. F
# ln -s /usr/src/linux/include/linux linux $ Q! V9 n7 l" r% y8 o' N$ f9 l/ W$ [4 D# ln -s /usr/src/linux/include/scsi scsi , k0 R( B/ M& U; X7 T! z* P- s四、配置内核 % l" p- l/ R) l" p& J6 r, q
1、删除源代码目录中残留的.o文件和其它从属文件。 ' p& v8 u! A! g/ p9 p # cd /usr/src/linux-2.4 3 X, V% S; e2 \6 l1 q' @1 V# make mrproper # ], l! C; b1 b
2、启动内核配置程序 ( m2 ^* \3 @2 N$ H8 ^3 [: ~
# cd /usr/src/linux-2.4 - @, w8 v& r, U2 A8 B# make xconfig 0 d+ ~, X2 `. `( j) c
3、配置内核 " {1 M$ B4 d+ q0 U( c" _Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。 6 i" W" a: v0 o
五、编译内核 + y1 k1 x/ v& }! k
1、建立编译时所需的从属文件 ; C& y) b7 K4 M; p# cd /usr/src/linux-2.4 - ]$ r& T) k0 T3 ^- E# make dep 4 ~2 ?; I( x9 |+ r% p2、清除内核编译的目标文件 8 |( x0 Q; X! H+ }# make clean * M% a$ e% R! F/ q5 \" |
3、编译内核 2 u& S2 l4 w$ _$ x4 V, ^ r' P# make bzImage (注意大小写) n0 O9 d, P s# T% l" M内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。 % r5 x% C( P( q5 L6 z! \
六、编译可加载模块 8 _1 I D1 Z R/ T如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。 9 m( w& E6 O) T/ b# e M( I, |6 w4 y
# make modules ) e8 m; f7 s9 h& l/ ^
# make modules_install % c/ H S s. P3 o4 M( s0 s; L编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。 4 V5 Y6 m& d1 c: S
七、启动新内核 # d( G% |8 _: T J1、将新内核和System.map文件拷贝到/boot目录下 8 B1 Q4 o7 Y9 `% B7 H: k# cp /usr/src/linux-2.4/arch/i386/boot/bzImage /boot/vmlinuz-2.4.7-10custom & V# I# k( y. |2 Z' K" L% f# cp /usr/src/linux-2.4/System.map /boot/System.map-2.4.7-10custom 3 p: F; b' v, t6 q$ f+ N3 j# cd /boot 9 y% h, D9 o; e# rm -f System.map (删除原来的连接) $ H, J0 a5 i# @% M3 g& _# ln -s System.map-2.4.7-10custom System.map (重新建立连接) * T8 h; R9 Y8 u5 l% r2 |8 {: t
2、配置/etc/lilo.conf文件,在该文件中加入下面几行: 6 p+ w* s( z7 `' ]image=/boot/vmlinuz-2.4.7-10custom 6 C3 S5 u! E( E6 o, p
label=linux-custom & Z# f8 I9 v( f% i8 o+ d( {
initrd=/boot/initrd-2.4.7-10.img , M" ]& D* }+ K# S6 r! h/ wread-only " q9 L, v$ z$ s+ y" ?root=/dev/hda3 (参考lilo.conf文件中现有的配置) 2 t0 W: ]+ Q& a# U
并把default=linux改为default=linux-custom * s: X! J0 C6 ~% ?& ]4 x
3、使新配置生效 : T2 l7 }( P" `. Y g; r& ? # /sbin/lilo 2 L" O* z8 T0 }- `/ ~4、重新启动系统 # e- l. s2 F, H$ w h. p8 V/ b' K # /sbin/reboot 7 e$ e$ {: _' w0 i新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。