数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 14:20
标题: 实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi  
. o- D4 _0 O- {" C; u- K) q' i国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。 $ |" P; F: g7 ]% N. ^
/ e* g9 i# m6 n+ {- |! Z
欢迎转载,但请注明出处。
# b  `8 Q  Y& S# |" p$ D0 e$ p# K
$ b$ v, O" q; s( H& z1 h     一、备份重要文件 " l; l% h# P2 z. k
备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。
1 r7 r1 x5 i' g9 h$ S1、备份内核和启动文件 ' S( ^  b: [  z, `% P0 I
# cd  / ' O8 l4 }/ u0 w! v, K0 H# i
# tar cvzf  boot.tar.gz  boot - C3 [0 q8 {7 U+ U0 D/ A7 p) r4 p
2、备份系统函数头文件
- H* m: K1 n' B" _# cd  /usr/include . L" q" {0 Q, f1 R
# tar cvzf  linux.tar.gz  linux  & o. K* F% q3 J4 k, |) Q
3、备份模块中的库文件
* x* ?+ H! p/ ?9 M! }# O8 t9 s# cd /lib/modules ( W6 p5 i1 A/ r7 l! K: t( \4 Z
# tar cvzf  2.4.7-10.tar.gz  2.4.7-10
0 w( |7 M% f- Z; q# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug
4 l2 u( }) g' u2 E3 Z4、备份linux源码 $ A( Y; }7 m' b  p) o# F% }' F: p
# cd  /usr/src
+ q+ G$ p0 k5 \4 E: Y4 m! U& b3 ]! {* D# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10
, `# o0 d  A4 ~# P2 l( |# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug + W+ Y+ z: r  ]) V
5、备份重要配置目录
3 ?9 k; [7 s; n6 u3 `. R# cd  /
7 D( M3 ]% ]- \3 M% g) P7 A& k# tar cvzf  etc.tar.gz  etc
* C- z2 Q- @/ G1 F二、修改核心参数(PGC2000需要)
1 a5 B) ]0 T) ^. Y0 l5 N1、修改与共享内存相关的核心参数 5 ?4 m& u  y- J7 f( c/ Z3 R
# cd  /usr/include/linux
9 m+ E+ a  u3 g' v$ w1 D# vi  shm.h
: J0 P7 d/ d( V; C4 W把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/
) Q" Y+ Z& q$ |1 `1 V* G  {改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/
7 ]$ J, J; U, t7 n2、修改与信号量相关的核心参数 3 ?6 k+ q6 U- z( a
# cd /usr/include/linux ; ~( x- M" M- ?9 O
# vi sem.h
1 ?: ^( X: E6 K! O把 #define SEMOPM  32 /*&lt;=1 100 max num of ops per semop call*/ 5 Y: L8 H( O2 `- j/ _. f" O0 ~7 U/ g
改为#define SEMOPM 900 /*&lt;=1 100 max num of ops per semop call*/ 7 N+ J2 ~+ h' V3 m5 V( h, [
3、修改与消息队列有关的核心参数
" t0 N% t5 Q  T- Q7 Z# cd /usr/include/linux
9 a" W( R( z% X8 c# vi  msg.h ) ]' Y# Q( x: z3 e$ @- N
找到以下三行(注释忽略): . j- N! W# q* V- J- y  u
#define  MSGMNI  16 ( j: N* m' F7 ~  r* j' @% ?* c8 D
#define  MSGMAX  8192 0 c+ G; q- f8 b2 H( m
#define  MSGMNB  16384
( C7 R. U$ ^( N9 j) D) a- E5 G% o将其修改为:
% X6 M% N" n. l9 M8 Q* B" B#define  MSGMNI  128
9 r% P# S( Z$ X; k#define  MSGMAX  131072
, l- b) m  \1 G+ V2 r/ a9 H#define  MSGMNB  20000000
( c+ C+ O% k( F& a7 N4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 ) b4 U9 |( l- j& _4 a( U4 Z
三、下载释放核心源代码
, {5 ?# ~+ X  O5 N% m1 ]7 r! O如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。
! M* X+ u' k2 V- t9 N5 N1、用tar命令释放内核源代码
! U' j8 T1 [' r6 G+ C# cd  /usr/src
' D$ U* Z* m6 \6 \' v  Z. d# tar zxvf  linux-2.4.7-12.tar.gz
) z/ J! f! M% o  ?: H7 _文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。 ' B9 D3 Z; `) D5 e7 e
2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。 ( x" q! r9 U$ |5 w1 y
# cd /usr/include - M# ~1 @$ l" y/ D5 w6 M  C7 r0 k9 j
  # rm -Rf asm linux
- q$ Z8 q! S7 I0 u9 T0 a  # ln -s /usr/src/linux/include/asm-i386 asm  
- A! f; n; A+ O4 A( m6 k: W6 N1 l# ln -s /usr/src/linux/include/linux linux  
3 \* P, o2 X) ]7 ]$ x/ \  B6 e: i, ]' m# ln -s /usr/src/linux/include/scsi scsi 4 F6 G6 p" Q" a- @0 w0 k6 I
四、配置内核 5 Y' T' h: I8 z( W0 N' F: q8 B" z0 R
1、删除源代码目录中残留的.o文件和其它从属文件。  
% f. R: ~* e3 b- @" e  # cd /usr/src/linux-2.4  
2 _6 S" v2 S& Z0 U6 c# make mrproper  / k- N' i) D5 g6 \! x  m' _8 P  W
2、启动内核配置程序
2 s; A/ f# O* S) g3 u: s- V9 Q5 Z# cd /usr/src/linux-2.4
9 n5 C8 S+ c. l$ T7 F3 c) @# make  xconfig
: ]( t' D5 A/ g. b. `3、配置内核
( h& v( g7 Z- T* n) iLinux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。 ! s* v, e; c/ J$ e) e( W5 }( a- @
五、编译内核 * p" y" d9 q) k/ c3 f; g
1、建立编译时所需的从属文件 : M$ q0 k* s& v* y: A6 D
# cd  /usr/src/linux-2.4
; q1 V$ A' e  T, B* L0 `2 w; ~* ~6 K  |# make  dep
% q' y% y" p7 Y  `* w+ |2、清除内核编译的目标文件
* N; Y* H" H) W' C. i9 A; C# make  clean
! ~( A$ c/ D9 N3、编译内核
1 Q7 ?' K0 ?9 n8 v1 A' r. N* M5 n# make bzImage   (注意大小写) - T3 K* K+ f) L. A* Y! I3 z
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。 % f! b1 @  u. i+ Q* N2 M+ b) @
六、编译可加载模块  
) M. T, c( m4 `* ~如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。  & M/ T* z% ?9 t9 i+ J
  # make modules
! g: i+ x0 x% b; s8 T- J# make modules_install  
4 B* z: a5 |$ K2 X/ `5 Q" v6 b编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。
8 q1 ^) O2 z) p9 C6 v' E9 U七、启动新内核 " f' g0 g4 _* f+ [; B8 b5 q
1、将新内核和System.map文件拷贝到/boot目录下  8 [4 T+ y  A, X) s1 L+ P
# cp /usr/src/linux-2.4/arch/i386/boot/bzImage  /boot/vmlinuz-2.4.7-10custom 8 Z" }& Z' i, ]3 H  E
# cp /usr/src/linux-2.4/System.map  /boot/System.map-2.4.7-10custom
# v$ o) e1 \; ^; A# cd /boot  $ |3 n" d  G. R- q1 M" _6 V
# rm -f System.map   (删除原来的连接) # l6 K" r7 M3 `' D5 d7 m' a# I5 {
# ln -s System.map-2.4.7-10custom  System.map  (重新建立连接)  
" e. L# Y7 F; p% s& J; J2、配置/etc/lilo.conf文件,在该文件中加入下面几行: 3 B) o5 I6 I1 z5 |
image=/boot/vmlinuz-2.4.7-10custom  ! @% i( P1 n# k. l) q9 M! V) j
label=linux-custom
4 X8 G! Q0 a$ }& r, o8 W9 y3 _initrd=/boot/initrd-2.4.7-10.img 1 [9 r# E4 i# k. H& S" X/ d) X
read-only
3 q2 W0 y' ~9 proot=/dev/hda3            (参考lilo.conf文件中现有的配置) ( z% }7 k- d" S! k4 e1 _
并把default=linux改为default=linux-custom
, G9 ^" C% k' a9 M3、使新配置生效
( ?8 B  Y1 j- ~4 I3 x, J # /sbin/lilo 0 Z$ g9 J8 Z, Q3 w
4、重新启动系统  + O% v% R' n# {0 [
 # /sbin/reboot - O: c# [$ ~# R# ?% h. S: t  C
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。




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