数学建模社区-数学中国
标题:
实战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. b
1、备份内核和启动文件
$ 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 p
1、修改与共享内存相关的核心参数
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 /*<=1 100 max num of ops per semop call*/
/ ^' Y/ w" S3 {. r5 S! U- q
改为#define SEMOPM 900 /*<=1 100 max num of ops per semop call*/
5 A3 f1 W! V4 H* q& u
3、修改与消息队列有关的核心参数
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$ j
4、按上面方法同样修改/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 G
1、用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. B
2、将/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 e
2、启动内核配置程序
/ 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 c
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"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, V
label=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 X
4、重新启动系统
/ K' L* t1 D8 m. _
# /sbin/reboot
5 Q T. T9 L: B
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5