数学建模社区-数学中国

标题: 实战linux内核编译 [打印本页]

作者: huashi3483    时间: 2004-9-27 14:20
标题: 实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi  & r6 `9 \) C0 s( @
国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。
: U2 U! t8 s, q  i5 d- j- Y5 ]1 R% `7 [# Z
欢迎转载,但请注明出处。
; C3 T# i$ F/ l) E1 K8 y: R  N+ L4 u( E0 A0 r, L( c
     一、备份重要文件 5 w+ R! {8 M' m
备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。 + C9 |, ]4 \# }' c4 o$ _$ U
1、备份内核和启动文件 0 S  ?8 e7 x4 `+ ]& [* u
# cd  /
2 t* a8 D3 a1 |8 p# tar cvzf  boot.tar.gz  boot
  [& Y+ T$ U  i' K2 ]2、备份系统函数头文件
4 k$ A3 F( H5 F# cd  /usr/include
* U9 O8 ]' F8 o" {8 \# tar cvzf  linux.tar.gz  linux  % S) ^4 d* e% r0 \% S8 d
3、备份模块中的库文件 9 M+ R* l/ t+ ?: w7 f* ^( W( ^1 g
# cd /lib/modules " v/ ?, Z/ ?  U3 _. z$ L4 ~& \+ ?+ S
# tar cvzf  2.4.7-10.tar.gz  2.4.7-10 : @: u" \) T$ J: @9 n
# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug
8 S9 J  n4 z( a' t6 T9 N% T4、备份linux源码 7 b- M. D% p: d* E+ b2 Z
# cd  /usr/src 9 ~: l) }% H' l! p% X# t7 s
# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10 ( L+ g; {% a% _- q" k9 \4 w
# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug 6 R5 f( ?/ z, j% r, ~. R. C1 \
5、备份重要配置目录
( L. K1 t* h* M& h7 t# cd  /
3 R$ t" U6 }- E! x# tar cvzf  etc.tar.gz  etc
! ?6 d: h  f1 z$ S3 `# J二、修改核心参数(PGC2000需要)
. _4 O7 ~" j" x7 s: ~) w1、修改与共享内存相关的核心参数 3 z7 t! t+ ?0 ^8 y0 B) I2 z
# cd  /usr/include/linux / _4 X) r+ b  U, ]3 @
# vi  shm.h 6 T4 h, f' p( W7 ]/ h8 g/ o
把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/ 3 N2 x0 D. U$ S0 e7 B
改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/
! B. V3 N4 f# m2、修改与信号量相关的核心参数 : j% ~% w% V) y. U
# cd /usr/include/linux ! }0 d6 D5 Q2 ?" q
# vi sem.h + P, e3 g0 E) W- ?% n# L. ]" p
把 #define SEMOPM  32 /*&lt;=1 100 max num of ops per semop call*/
) C& Y6 q/ I2 o- a' L改为#define SEMOPM 900 /*&lt;=1 100 max num of ops per semop call*/ 6 w- a9 _# T; j  W7 \3 m: }
3、修改与消息队列有关的核心参数 & {0 ~: b2 S; {" n, s& p
# cd /usr/include/linux
' r5 B$ ]7 p( ~1 t# vi  msg.h
. r5 }5 k* }' Z& o. \找到以下三行(注释忽略): " N4 ~/ n1 O  U7 s5 ?, `
#define  MSGMNI  16 % ~/ g0 f+ J5 X6 n: L$ S8 h) f6 L4 x" K
#define  MSGMAX  8192
# V' @0 ~2 I3 ?; _+ U#define  MSGMNB  16384
- m( l# G0 l; M将其修改为:
1 q0 n* F- e, L1 j) P8 _#define  MSGMNI  128
" E1 q' ?( Z! }' r: U5 x#define  MSGMAX  131072
- s) Z2 J2 T" `' r#define  MSGMNB  20000000
/ b+ w# ]- P1 I4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 ) H4 L4 Y8 |  c8 t) E1 {( h# v1 k
三、下载释放核心源代码 ' F( G7 v1 p' o8 u
如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。 : K" D) t, j8 x' K* x+ k
1、用tar命令释放内核源代码
  _+ R. Q  A' ~( `7 o# cd  /usr/src 7 n+ X8 ?- i! P* D! r1 v; V2 C
# tar zxvf  linux-2.4.7-12.tar.gz 8 p, T9 `( l0 M7 ^
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。
& o- P- m8 X, O, q  R# n0 |2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。 ! J7 u7 S; y5 b. m2 E) J
# cd /usr/include
8 ~; f2 X9 w7 M8 @) `  # rm -Rf asm linux 5 R  _1 R7 m1 b
  # ln -s /usr/src/linux/include/asm-i386 asm  
+ y! i8 J% z+ ~  z  w, U# ln -s /usr/src/linux/include/linux linux  
7 O" W3 h! F2 A* C: Q# ln -s /usr/src/linux/include/scsi scsi
& a# b! ^5 T/ R/ P+ T. N四、配置内核
0 f7 F$ K% I% V1 o6 p1、删除源代码目录中残留的.o文件和其它从属文件。  & P, i7 z; g% I$ s: G
  # cd /usr/src/linux-2.4  
, ^9 y% X8 o% a! |' }( ?# make mrproper  
5 a+ a* M, l6 n/ [( z* C& y; ~2、启动内核配置程序 5 e0 k' b' I5 X4 Y+ O  K9 ?; w8 Q* a
# cd /usr/src/linux-2.4 8 D% R) s2 H# l+ P
# make  xconfig
7 _/ P" T. w6 J1 j. w2 @3、配置内核
4 a/ j7 ?& o6 _' C( z7 z: B0 [Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。
- ]: _+ J+ |: ]五、编译内核
" v* ]& P* B/ {( l1、建立编译时所需的从属文件 5 y+ G# O3 u/ K% {8 v
# cd  /usr/src/linux-2.4 2 Q" B' v: q' Y  O/ u* ]  _8 B2 Y/ {4 |
# make  dep
, j, B. E2 u: `" J; X- S* S9 n' g* T2、清除内核编译的目标文件
/ {6 {/ @6 ]1 g$ t) ~# make  clean : M' W1 G- m% G: @% R9 y5 d+ @
3、编译内核 # w6 d% k: Z0 ~
# make bzImage   (注意大小写)
# n; a: W2 {/ h" M) v( r内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。
" o# l) ]( G  Z! ?六、编译可加载模块  : ~4 p+ C6 j" s, p( w: u
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。  ( l; B. k" v% Z/ L  o- ]  L
  # make modules
! w2 ~  v+ k% {- ]7 N# V6 f# make modules_install  
9 Y) W- a4 V" Y& j; m编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。 3 I, W# P) S, h
七、启动新内核 $ w0 d1 B* ~, y; h  G- Q
1、将新内核和System.map文件拷贝到/boot目录下  3 N3 e' o1 x/ {- b
# cp /usr/src/linux-2.4/arch/i386/boot/bzImage  /boot/vmlinuz-2.4.7-10custom # C$ _0 x1 M& l: y
# cp /usr/src/linux-2.4/System.map  /boot/System.map-2.4.7-10custom + G3 `+ ]7 F8 t9 t8 Z# u) T) O
# cd /boot  
- Q" D3 E! q# S6 K# rm -f System.map   (删除原来的连接)
1 y6 c2 x& O* b# t4 _6 X# ln -s System.map-2.4.7-10custom  System.map  (重新建立连接)  ) Z& y1 z; O1 i9 f, g6 u7 o6 r
2、配置/etc/lilo.conf文件,在该文件中加入下面几行:
& E& q' }, k/ N- Eimage=/boot/vmlinuz-2.4.7-10custom  # V7 F+ {- n* d) P- w) C/ P6 ]
label=linux-custom
1 ~8 b2 x0 _& ^$ |- V2 e& @% Jinitrd=/boot/initrd-2.4.7-10.img 3 V7 \! ^4 @6 E6 w6 X8 Y" D
read-only ) f' X! @2 m4 s# M4 V) w% c  O
root=/dev/hda3            (参考lilo.conf文件中现有的配置)
3 |7 p- l0 {* |! W. m' n4 A并把default=linux改为default=linux-custom 0 x8 L7 I! j* x, L% Z
3、使新配置生效 , a1 p- {+ v7 Z, n, `# x- _9 X
 # /sbin/lilo
9 }) K3 s- u5 M$ K/ E& X4、重新启动系统  
; Y. P- I" M# h& W' X! f) R% E! e. | # /sbin/reboot 0 p% Q7 J) R7 I: P2 S
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5