数学建模社区-数学中国

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

作者: huashi3483    时间: 2004-9-27 14:20
标题: 实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi  ! V/ R, M* {. i* p6 ^. T
国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。
) K* {& N- ^+ L& y  b& q; l
- T. N# Q0 l6 Y- y; ]2 H欢迎转载,但请注明出处。 2 _' B/ l! ?( ]  Y& z- y
, }. I, z" X+ v7 M5 m! O
     一、备份重要文件
2 I& {9 u/ v. ~( w& M- b0 o( q$ `备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。
" ~) A3 Z# X, v  B. b1、备份内核和启动文件
$ o7 D) S' D9 ^) {% B# cd  /
- u. d. m/ i# `, P$ U0 D* s; `# tar cvzf  boot.tar.gz  boot ; z0 U1 t: A3 U# H& O1 D" E5 A
2、备份系统函数头文件
% c$ F, s- c- l; `  h. b/ E2 g) x# cd  /usr/include
. T- D! |  Y9 [, I# i. t( y" j# tar cvzf  linux.tar.gz  linux  2 [& t# V- x& o5 R
3、备份模块中的库文件
2 ~4 c, p% V5 H/ y# d3 M# cd /lib/modules
: J( i4 G  A8 M# tar cvzf  2.4.7-10.tar.gz  2.4.7-10 8 M" W, A( V5 I9 k  C  u  F
# tar cvzf  2.4.7-10debug.tar.gz  2.4.7-10debug + k$ x3 B( v3 a
4、备份linux源码 * u3 |4 s: q+ @7 [, l9 ]+ K
# cd  /usr/src 2 z- R, i' v5 x) n
# tar cvzf  linux-2.4.7-10.tar.gz  linux-2.4.7-10
$ U7 ^- S. E) u" z# tar cvzf  linux-2.4.7-10debug.tar.gz  linux-2.4.7-10debug
  h  E" U2 E% H- ?5 o/ |+ I3 l" W  ^5、备份重要配置目录 ' @, g6 u2 O# r. J5 T  |
# cd  / ; K* y, {6 E1 E0 A% f4 x; P
# tar cvzf  etc.tar.gz  etc
! e$ x! Z3 ]- g/ r% g二、修改核心参数(PGC2000需要)
( J& K% X: j/ v$ n1 J7 p1、修改与共享内存相关的核心参数
9 w3 G7 ~7 F8 k3 T8 ]! e4 B# z# cd  /usr/include/linux ( f9 F1 D3 B9 P  l
# vi  shm.h
- W; h% ]2 M1 j% s把 #define SHMMAX  0X2000000   /*max shared seg size(bytes)*/ * H5 i) T% a" O0 N6 Z
改为#define SHMMAX  0Xa0000000  /*max shared seg size(bytes)*/ " u7 S, E3 e/ C$ @+ `3 B
2、修改与信号量相关的核心参数 % f4 z" U1 A8 m( s$ K
# cd /usr/include/linux 4 b6 p  k7 B3 H/ @
# vi sem.h
  H- g5 ]7 H9 y" z" b, O5 ]. w把 #define SEMOPM  32 /*&lt;=1 100 max num of ops per semop call*/ / ^' Y/ w" S3 {. r5 S! U- q
改为#define SEMOPM 900 /*&lt;=1 100 max num of ops per semop call*/
5 A3 f1 W! V4 H* q& u3、修改与消息队列有关的核心参数
6 |3 R" y; l9 I% t/ H- v# cd /usr/include/linux 2 w  g2 A! ?* M) R$ S7 K
# vi  msg.h
5 q  {  v; f9 s3 U+ B; l* U6 G找到以下三行(注释忽略): 0 F# Y8 i1 |5 z" i& g
#define  MSGMNI  16 * Y& {) i+ x1 U; H# V! V
#define  MSGMAX  8192
: n! p' `  ~8 ]$ z4 R#define  MSGMNB  16384
$ O! O0 Y8 x9 s  B将其修改为:
- W! N1 R* R' K/ j#define  MSGMNI  128 5 L/ ^6 f- _, \' X3 _
#define  MSGMAX  131072
8 x+ g- K2 j% e#define  MSGMNB  20000000
; C% \( |$ x, Y& \0 M$ j4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。 7 m6 k1 r: l/ }7 C, Q  U& t
三、下载释放核心源代码
5 H( w# r: y1 @) I如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。
9 i* V- L7 B: M, B# m  G1、用tar命令释放内核源代码 3 K* a4 F: Y' }# `. `2 e
# cd  /usr/src
) g9 [8 v, k6 K' n# tar zxvf  linux-2.4.7-12.tar.gz 0 [  Y* r+ A7 d5 [
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。
1 n, Q0 ], s$ V+ E3 u. B2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。 7 [5 S* L' }. F. ?! p# ^) i, k
# cd /usr/include ' v$ ~9 U3 ]+ d! m8 e" E0 D2 e- b1 j* n4 x
  # rm -Rf asm linux
2 H: S! D, }; |4 {" k  # ln -s /usr/src/linux/include/asm-i386 asm  
' q  ]  _* g' h2 L5 X5 m# ln -s /usr/src/linux/include/linux linux  
- [  W! k/ b) T- `! R* e+ F) o# ln -s /usr/src/linux/include/scsi scsi 5 l0 u4 G; |2 ]5 o8 J/ y& Y
四、配置内核
9 U( _" ]$ H9 T, ~1、删除源代码目录中残留的.o文件和其它从属文件。  6 N/ T: f8 A/ y# Z$ C
  # cd /usr/src/linux-2.4  3 M; ?/ W+ X7 v* b1 H- i
# make mrproper  
* Q4 _. j. F& q$ B& m4 e2、启动内核配置程序
/ V3 q7 @+ r& d  ~2 S$ ?6 q% ]# cd /usr/src/linux-2.4
! P! v7 ^! ~. G2 _# T6 W/ [# make  xconfig
( O  w( }- H# ^3、配置内核
# w2 |: ~: F0 cLinux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。
2 Y9 Q& i% C, n1 T' G五、编译内核
  J! T2 _. E, a* X7 s' n( W* r; Q$ |1、建立编译时所需的从属文件
+ ?8 X1 s1 v' i9 F- }) t9 p# ^& w# cd  /usr/src/linux-2.4 , w7 I1 [6 l9 e1 t
# make  dep + y2 y+ T# n: _) C8 s
2、清除内核编译的目标文件 3 Q0 E# f1 h/ w* v/ O
# make  clean ! |0 L6 X/ i8 L& u9 e
3、编译内核
, ?$ |- w, ]8 u  i2 K% m* t* Y& O: F# make bzImage   (注意大小写) ; E) f! a/ ~6 g2 o2 U
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。 . I# M# k) x6 d3 c1 K
六、编译可加载模块  6 c0 q! f( C6 o% ^  Y# r( {
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。  . E' J, S5 q6 y4 p
  # make modules 1 \* \5 T6 O3 ^" y- |5 v/ P* a) t. w
# make modules_install  
! ]% |1 r! S1 \编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。
8 y% m6 w  s! r9 V4 v七、启动新内核 8 l4 n( x0 A1 c# p' }; W5 s* Y
1、将新内核和System.map文件拷贝到/boot目录下  5 o: S" {- i& D/ ^* y
# cp /usr/src/linux-2.4/arch/i386/boot/bzImage  /boot/vmlinuz-2.4.7-10custom
: n$ M$ `" }( Z, j$ e# cp /usr/src/linux-2.4/System.map  /boot/System.map-2.4.7-10custom 0 S" N: x* N9 D9 q5 J! P3 C0 u
# cd /boot  6 B5 e6 m5 m% ^7 s, s# S" W" r
# rm -f System.map   (删除原来的连接) + d0 I% O3 B' d; H/ S: m" X$ J; K
# ln -s System.map-2.4.7-10custom  System.map  (重新建立连接)  ' ?" g7 p" W5 \* P7 W
2、配置/etc/lilo.conf文件,在该文件中加入下面几行: ) U: x- C  s4 x4 K7 `: V) M
image=/boot/vmlinuz-2.4.7-10custom  
5 U7 ^( O* e  |  D3 F) S9 h, Vlabel=linux-custom
4 B* ~( V2 w' {& b9 \" \" ^initrd=/boot/initrd-2.4.7-10.img 0 E: W* {! N, y" E: ]
read-only , b1 x' B0 [, a+ L1 y3 k0 y2 |
root=/dev/hda3            (参考lilo.conf文件中现有的配置) 3 s6 J2 M$ `  m8 |- f. w
并把default=linux改为default=linux-custom ( w$ c$ ]* E7 A, ~: O( j! W
3、使新配置生效
( p5 D8 K+ u+ {5 u+ M( ~ # /sbin/lilo
2 [" P2 Y" j. M2 E1 X4、重新启动系统  / K' L* t1 D8 m. _
 # /sbin/reboot
5 Q  T. T9 L: B新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。




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