数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 14:20
标题: 实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi  / Z% l3 ~6 {) U! m8 w7 `; n
国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。
  r" n2 e& c+ f" g# B
3 L2 ]! c  L9 W0 Q6 R& I欢迎转载,但请注明出处。 ! X4 s: [, |! k' r0 m) _* ]

6 o0 r1 V8 `2 ]$ r     一、备份重要文件
" O0 I; t& D8 ^备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。 * ^4 j# P; Q3 W/ `! M
1、备份内核和启动文件 + v) {) r; o& f$ I
# cd  /
% t1 b  V4 ~2 L' i, x# tar cvzf  boot.tar.gz  boot
& q/ _/ H' D& m" r. E, l, c7 ], k9 h2、备份系统函数头文件   y  e- ]+ K6 [- p3 p% A7 D2 Z
# cd  /usr/include
( S. `& J. w, M8 ~& R& w) r# tar cvzf  linux.tar.gz  linux  ; Z% @7 B2 I& O9 c6 H
3、备份模块中的库文件 " z) x' _/ o( X
# cd /lib/modules
( N  }' G- d9 Y& J" H3 ~5 u# tar cvzf  2.4.7-10.tar.gz  2.4.7-10
# E: k6 \) y) @. X) i$ j& P# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug ) F* A: F4 H& t4 C" q; q/ E: Z* D
4、备份linux源码 ; ~3 ?. S5 T, G1 i+ M' x# X
# cd  /usr/src
' L5 ]0 W! r. P; a( y# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10 5 P8 H5 E  G* N! @1 H+ X
# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug . x2 K# [# K9 j: [9 R/ W, g) {
5、备份重要配置目录
$ \+ [) `' y) i9 b8 H: t# cd  /
1 B/ f3 m4 I( q$ h# tar cvzf  etc.tar.gz  etc 2 K) X5 ]# z- w/ y( t. d# _
二、修改核心参数(PGC2000需要) # a! T' n- d0 j- P; u2 j) |& F( C
1、修改与共享内存相关的核心参数
1 |$ ^" s5 W; Q3 y. `# cd  /usr/include/linux " o- c% F& j$ M" n
# vi  shm.h ! N7 b7 Z! a. Z. J
把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/
. a! B' @- g* I' U  x2 Y# f" x改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/
* ]" \# [' \/ x# _0 f2、修改与信号量相关的核心参数 * q1 h! F  N3 O3 _; N
# cd /usr/include/linux ( O* P7 ?% i1 `0 p8 V5 ~5 N$ y
# vi sem.h 5 C) O1 t5 \, P2 }
把 #define SEMOPM  32 /*&lt;=1 100 max num of ops per semop call*/ 0 d& E! _. n9 ]8 @  H) W5 r$ Z
改为#define SEMOPM 900 /*&lt;=1 100 max num of ops per semop call*/ 0 J) |& B6 @9 P( H7 _! y& T/ T
3、修改与消息队列有关的核心参数
5 q9 |8 e7 ]# W7 {4 A9 x) v# cd /usr/include/linux
& Y4 A" t% X( g9 K, Q! G4 y# vi  msg.h - `1 i; [" X% C+ g7 C
找到以下三行(注释忽略):
6 d% s3 i% d1 j#define  MSGMNI  16 2 x2 q# \# A8 E+ b
#define  MSGMAX  8192
6 Q& A: ?4 n  g) s3 {% z: g#define  MSGMNB  16384 9 w) |$ i4 F2 h/ H3 ^& h
将其修改为:
+ L8 H1 S0 t: Z0 K6 ?#define  MSGMNI  128 1 x. v8 ]0 W: @" i7 v6 t8 m9 s2 G/ j& n
#define  MSGMAX  131072
, h' i/ E( Z# f#define  MSGMNB  20000000 / W# _: N; `* E, N
4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 : N3 q! {" y4 T  s6 Q5 N# v
三、下载释放核心源代码
& b4 H% w" h, p$ v9 _如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。 , i' r' q& X1 [+ n3 b1 Z- ^
1、用tar命令释放内核源代码 0 s4 M; O- n7 k6 o- {
# cd  /usr/src - `: }- V* f$ @6 o7 R/ _3 a6 @
# tar zxvf  linux-2.4.7-12.tar.gz ! b+ C9 B3 W& C; f0 V& d5 j3 n3 f
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。 . V+ D/ n1 v/ P
2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。
6 N# O3 o  P; ~' ~; _5 T/ p# cd /usr/include
7 m9 F2 U! K3 G, C+ [  # rm -Rf asm linux
& L$ \* q5 l. d+ Q9 t& _  # ln -s /usr/src/linux/include/asm-i386 asm  4 R8 X. J& o) ~& r: t, S
# ln -s /usr/src/linux/include/linux linux  0 E3 X$ j0 f! A; H6 ~0 a
# ln -s /usr/src/linux/include/scsi scsi 6 o& G2 T0 \& n3 Z9 o
四、配置内核 4 |! i- C, d. P+ K' l/ z$ ?1 l( M0 W
1、删除源代码目录中残留的.o文件和其它从属文件。  9 @- J5 u, k- P' ?( t( K
  # cd /usr/src/linux-2.4  
8 M  a7 _* m+ @# make mrproper  : b- z! I9 \: l: b0 @+ C
2、启动内核配置程序 * ~: d! `. M2 A  `6 B" Z
# cd /usr/src/linux-2.4
# `" d: D6 m" V# make  xconfig
! ~7 m7 D. ?$ v' b' W" ^4 @0 F3、配置内核
- u( Y( E! r* b" oLinux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。 2 o( G! E3 W1 A$ _" b, |, F
五、编译内核
% X% z3 m8 p8 K8 X1、建立编译时所需的从属文件
# Q% p3 O/ t; a3 O# cd  /usr/src/linux-2.4 0 G; ~8 z# k9 c7 U. v
# make  dep 1 M8 D$ z6 b: X& `! ]
2、清除内核编译的目标文件 - O% W) D7 k. A: C- ]
# make  clean ( ^, t( Z; M  C0 H
3、编译内核
& o6 Z# a& p8 f: k# R- T# make bzImage   (注意大小写)   K. |/ a2 s. p5 R
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。
; l( C& w- J3 o# Q6 a( g7 u0 I六、编译可加载模块  
" E2 {2 W& f- k  d; \9 k  U如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。  
, l# K; E" E. x/ x  # make modules
2 ?$ z; b9 O" m( F' k: X4 k# make modules_install  % f, p+ V  x# s1 Y: Y& `* j
编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。 / L# D: \/ V! v% D2 i0 z9 u. ~
七、启动新内核 . g$ S! z1 X# a1 t
1、将新内核和System.map文件拷贝到/boot目录下  
4 _$ p  M! i! L7 ~- V2 Y+ _0 n# cp /usr/src/linux-2.4/arch/i386/boot/bzImage  /boot/vmlinuz-2.4.7-10custom
* _, `. n) t- D3 h3 p# cp /usr/src/linux-2.4/System.map  /boot/System.map-2.4.7-10custom ; ?0 F' z7 L: a1 ~6 F
# cd /boot  
$ g1 K, u" w: K% c/ t, L% F& U" f# rm -f System.map   (删除原来的连接) 1 j7 A, _4 x$ O8 ~/ v9 h
# ln -s System.map-2.4.7-10custom  System.map  (重新建立连接)  ' C7 b" M  R: i/ ^% k6 a$ v
2、配置/etc/lilo.conf文件,在该文件中加入下面几行:
  L* v" @6 i8 @$ R) h2 t" Y& C3 yimage=/boot/vmlinuz-2.4.7-10custom  
/ S* v( c2 v! H% Rlabel=linux-custom
. `) s5 k! e6 z0 L% }* `* _4 tinitrd=/boot/initrd-2.4.7-10.img 4 F, y# r3 ~$ h/ t: G% Y
read-only % F/ [/ |0 W! S% ]% R8 Q  n  Q
root=/dev/hda3            (参考lilo.conf文件中现有的配置)
: B9 M5 w/ }" ]. w并把default=linux改为default=linux-custom
) \+ D8 T: y$ }1 z3、使新配置生效
5 C: N  `# d" }' F/ U4 G- \ # /sbin/lilo
, A: @/ Q9 m( n: D$ I  s4 g# p6 X4、重新启动系统  
  q5 w: a. l" P0 Y0 G4 ^4 f- H # /sbin/reboot 8 C5 H8 q0 o. s) U; b% c+ v) M
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。




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