数学建模社区-数学中国
标题:
实战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$ S
1、备份内核和启动文件
' 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 Z
4、备份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 N
1、修改与共享内存相关的核心参数
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 n
2、修改与信号量相关的核心参数
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 /*<=1 100 max num of ops per semop call*/
5 Y: L8 H( O2 `- j/ _. f" O0 ~7 U/ g
改为#define SEMOPM 900 /*<=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 N
4、按上面方法同样修改/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 N
1、用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) i
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"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 N
3、编译内核
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; J
2、配置/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 p
root=/dev/hda3 (参考lilo.conf文件中现有的配置)
( z% }7 k- d" S! k4 e1 _
并把default=linux改为default=linux-custom
, G9 ^" C% k' a9 M
3、使新配置生效
( ?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