数学建模社区-数学中国
标题:
实战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* U
1 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% s
1、修改与共享内存相关的核心参数
`# 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 /*<=1 100 max num of ops per semop call*/
& f% S1 k; r$ P* k2 _5 o
改为#define SEMOPM 900 /*<=1 100 max num of ops per semop call*/
: ~, ?% E4 R3 ~3 @- T& z0 }; e4 k1 r
3、修改与消息队列有关的核心参数
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/ G
3、配置内核
4 ]; W( r! L& |7 |0 h: g
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"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 M
1、建立编译时所需的从属文件
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 {- Y
1、将新内核和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' {* m
2、配置/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 \/ H
read-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