数学建模社区-数学中国
标题:
实战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 K
8 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% T
4、备份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: ~) w
1、修改与共享内存相关的核心参数
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# m
2、修改与信号量相关的核心参数
: 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 /*<=1 100 max num of ops per semop call*/
) C& Y6 q/ I2 o- a' L
改为#define SEMOPM 900 /*<=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 I
4、按上面方法同样修改/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 p
1、删除源代码目录中残留的.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/ {( l
1、建立编译时所需的从属文件
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* T
2、清除内核编译的目标文件
/ {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- E
image=/boot/vmlinuz-2.4.7-10custom
# V7 F+ {- n* d) P- w) C/ P6 ]
label=linux-custom
1 ~8 b2 x0 _& ^$ |- V2 e& @% J
initrd=/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& X
4、重新启动系统
; 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