数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 14:20
标题: 实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi  
2 c8 W! e6 A3 O% h国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。
+ B1 I$ K( k- U* U1 D4 n2 x1 f& R/ P- V  y; X4 p
欢迎转载,但请注明出处。 0 G) ?( s4 O$ q4 O5 Q# U0 Q  `; j
7 G' ?% U) j, y; }
     一、备份重要文件
% R& p0 u2 E$ N! E备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。 6 o+ {3 F3 o$ w3 o/ z- a8 H- F7 J( ^
1、备份内核和启动文件
; ~3 V; o& C$ k) |# cd  /
! H$ I5 b$ K2 k( ^# tar cvzf  boot.tar.gz  boot " N, c4 i* v# [4 z- {
2、备份系统函数头文件 4 ]3 S; c) }  t$ A, o# a. a8 E  j
# cd  /usr/include 6 d" z7 @5 J/ V4 u
# tar cvzf  linux.tar.gz  linux  5 I2 R9 h4 p0 w
3、备份模块中的库文件
6 Z" ]) r' y$ ]& C' L+ A% D% T4 E# cd /lib/modules
: {  m9 L' v! _# tar cvzf  2.4.7-10.tar.gz  2.4.7-10 ! _5 u! o2 n& R% B: h
# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug
0 ?; c. F, ~' `4、备份linux源码 9 \5 Y- y" ~2 ~
# cd  /usr/src
/ ~# M# _2 ^1 t8 c3 A1 B# W) a# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10
' k; M; U, N) ?# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug ( z: S7 |' t, m  m; @1 h0 V0 p
5、备份重要配置目录 % J$ _4 g; P3 G) j3 S
# cd  / * G* C/ ^" X/ e+ _. @
# tar cvzf  etc.tar.gz  etc - @1 B+ l8 }  E$ t
二、修改核心参数(PGC2000需要)
' U  ^& O! V: O: A5 D% s1、修改与共享内存相关的核心参数
  `# w' n2 r4 G8 \) x# cd  /usr/include/linux 2 m. d+ w, V" v/ A
# vi  shm.h ' e8 S1 T' }  Z2 \1 S8 N
把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/
: l$ S! H3 y( S8 @) c' h改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/ 5 }% Q1 h3 d9 \
2、修改与信号量相关的核心参数
9 B) w; N# s+ B' c2 T" @4 m" [2 F# cd /usr/include/linux 5 a" |2 Q& O3 K  M* `9 R* w1 O  O
# vi sem.h
% a  E3 [' ^7 x7 A/ \7 F( b# c* G# r把 #define SEMOPM  32 /*&lt;=1 100 max num of ops per semop call*/
& f% S1 k; r$ P* k2 _5 o改为#define SEMOPM 900 /*&lt;=1 100 max num of ops per semop call*/
: ~, ?% E4 R3 ~3 @- T& z0 }; e4 k1 r3、修改与消息队列有关的核心参数
9 J$ O) X$ Z) ^/ O$ j8 |# cd /usr/include/linux # L- [- q7 M7 J6 v* K+ S4 l; l4 Q
# vi  msg.h
6 o2 e! U5 ^" O! G" X找到以下三行(注释忽略): ( J1 X2 s( p5 x9 c- V
#define  MSGMNI  16
& P5 M: G& u* c$ p#define  MSGMAX  8192 ' ?5 Q' \' ?6 v3 K3 U' F9 O
#define  MSGMNB  16384
! Q* S; z1 k0 R. N将其修改为: 5 \3 i* ~, X' F) g1 p
#define  MSGMNI  128
8 N. O4 j# A3 {#define  MSGMAX  131072   @, S) ^- d: c& C- w
#define  MSGMNB  20000000 5 _( z9 D* ~: m4 g5 D
4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 % J6 j1 p% M4 i. h# Y' {
三、下载释放核心源代码 6 m7 N- [! X7 E& S
如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。 ) F2 w9 [3 A$ G6 H' ?
1、用tar命令释放内核源代码
+ [; q/ R; o( @7 e8 H# cd  /usr/src - z, l& I; u: I3 v+ D/ x
# tar zxvf  linux-2.4.7-12.tar.gz $ Z  G0 u" D2 U7 [
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。 4 ~3 ~8 i3 ]! a" Q5 Q! ^
2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。
# Z9 g3 X0 I5 q, s2 \) C$ L5 I! Y6 [# cd /usr/include
3 P& y* z  y: C: u  Z  # rm -Rf asm linux % |' f( c1 L  V0 x4 \. i3 x: K
  # ln -s /usr/src/linux/include/asm-i386 asm  4 X  F& F5 G! |+ x0 t, Y: A9 ^' P
# ln -s /usr/src/linux/include/linux linux    v4 D0 j. L. J/ T
# ln -s /usr/src/linux/include/scsi scsi
2 d% F3 n9 m+ ^$ G$ z" X四、配置内核 " U# v, ]6 ]7 R' `$ H8 C! N5 a
1、删除源代码目录中残留的.o文件和其它从属文件。  
( Q4 x! a  m2 |& h, V9 K  # cd /usr/src/linux-2.4  
6 d: U/ }9 ]# m/ [# G# make mrproper  3 e: a1 y6 }5 Q( R1 T) ~
2、启动内核配置程序
  c, _4 g! h& _# ~7 d# cd /usr/src/linux-2.4
) U( [3 P3 X, k  z' Q* _' R% W! ?# make  xconfig
+ S# |+ V8 k7 ]% J% v" Y/ G3、配置内核
4 ]; W( r! L& |7 |0 h: gLinux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。 2 N: A% C, G" G* d0 b$ W
五、编译内核
4 x/ {* q$ }6 J& F2 b# m: y$ o7 M1、建立编译时所需的从属文件 4 ?# g. E) ^2 Y! J7 l
# cd  /usr/src/linux-2.4
7 u4 Z( q; o7 E# make  dep 8 ^# D$ z5 @4 ?& N- L
2、清除内核编译的目标文件 1 S2 U: l+ A8 l7 z; e) J
# make  clean 5 A% s- F4 y- h3 i: ^; G
3、编译内核
" E- P, _% X: h4 p  H& m# make bzImage   (注意大小写)
4 \3 X0 ]8 b4 l) q( I$ K& Z- K内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。 & c: f5 c2 j/ [
六、编译可加载模块  1 X8 w- ?; r( L4 G
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。  6 _. m3 U" C7 _6 \
  # make modules 7 R: `3 J  C$ I' o2 ]
# make modules_install  3 A! u0 p% |4 A- U
编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。   c( h) m3 D# t" W' v, i6 f, s
七、启动新内核
- `/ F- R+ [. J4 {- Y1、将新内核和System.map文件拷贝到/boot目录下  
# j- S+ [6 N( n9 P# cp /usr/src/linux-2.4/arch/i386/boot/bzImage  /boot/vmlinuz-2.4.7-10custom
1 V! I/ @& M' i9 I# cp /usr/src/linux-2.4/System.map  /boot/System.map-2.4.7-10custom
1 W: ^3 z+ I8 B1 |6 V; e# cd /boot  
# {7 v+ u9 R# L- q9 r0 }8 s# rm -f System.map   (删除原来的连接)
% k7 ~) H3 b. q% z8 n# ln -s System.map-2.4.7-10custom  System.map  (重新建立连接)  
( w/ c! E& p: c; y' v2 h' {* m2、配置/etc/lilo.conf文件,在该文件中加入下面几行: 8 |' u) \: B* a5 G" F: `
image=/boot/vmlinuz-2.4.7-10custom    s* }% o. p* A8 R" Q
label=linux-custom : \4 }  z4 H. Z3 R3 K
initrd=/boot/initrd-2.4.7-10.img
- o% d' e8 v- W- _" V9 V  \/ Hread-only 8 U  |4 A" N- X- s3 c7 L
root=/dev/hda3            (参考lilo.conf文件中现有的配置) ' L- F! z6 J$ {+ w% \+ W8 T5 b
并把default=linux改为default=linux-custom " w" V  W. X) l$ N# Q
3、使新配置生效 ! i+ S% q. E9 a  @
 # /sbin/lilo / N1 l- @* f+ V" R: {. M% H9 P% g
4、重新启动系统  / x: t( L' }) ^7 ]1 C/ v
 # /sbin/reboot $ _  n& L* K: D$ X( f
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。




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