数学建模社区-数学中国
标题:
实战linux内核编译
[打印本页]
作者:
huashi3483
时间:
2004-9-27 14:20
标题:
实战linux内核编译
<B>实战linux内核编译</B>http://www.chinaunix.net 作者:zhaosi
/ Z% l3 ~6 {) U! m8 w7 `; n
国庆快到了,送给大家一篇文章作礼物吧,也作为在chinaunix这个大家庭中我曾得到过许多热心朋友的大力支持的回报,下文是我工作中总结的文档,有些核心参数的调节是为安装oracle数据库而使用,无此方面应用的朋友可以跳过。
r" n2 e& c+ f" g# B
3 L2 ]! c L9 W0 Q6 R& I
欢迎转载,但请注明出处。
! X4 s: [, |! k' r0 m) _* ]
6 o0 r1 V8 `2 ]$ r
一、备份重要文件
" O0 I; t& D8 ^
备份以下这些文件可以在系统发生错误或崩溃时,能较快速的恢复系统原来的状态。
* ^4 j# P; Q3 W/ `! M
1、备份内核和启动文件
+ v) {) r; o& f$ I
# cd /
% t1 b V4 ~2 L' i, x
# tar cvzf boot.tar.gz boot
& q/ _/ H' D& m" r. E, l, c7 ], k9 h
2、备份系统函数头文件
y e- ]+ K6 [- p3 p% A7 D2 Z
# cd /usr/include
( S. `& J. w, M8 ~& R& w) r
# tar cvzf linux.tar.gz linux
; Z% @7 B2 I& O9 c6 H
3、备份模块中的库文件
" z) x' _/ o( X
# cd /lib/modules
( N }' G- d9 Y& J" H3 ~5 u
# tar cvzf 2.4.7-10.tar.gz 2.4.7-10
# E: k6 \) y) @. X) i$ j& P
# tar cvzf 2.4.7-10debug.tar.gz 2.4.7-10debug
) F* A: F4 H& t4 C" q; q/ E: Z* D
4、备份linux源码
; ~3 ?. S5 T, G1 i+ M' x# X
# cd /usr/src
' L5 ]0 W! r. P; a( y
# tar cvzf linux-2.4.7-10.tar.gz linux-2.4.7-10
5 P8 H5 E G* N! @1 H+ X
# tar cvzf linux-2.4.7-10debug.tar.gz linux-2.4.7-10debug
. x2 K# [# K9 j: [9 R/ W, g) {
5、备份重要配置目录
$ \+ [) `' y) i9 b8 H: t
# cd /
1 B/ f3 m4 I( q$ h
# tar cvzf etc.tar.gz etc
2 K) X5 ]# z- w/ y( t. d# _
二、修改核心参数(PGC2000需要)
# a! T' n- d0 j- P; u2 j) |& F( C
1、修改与共享内存相关的核心参数
1 |$ ^" s5 W; Q3 y. `
# cd /usr/include/linux
" o- c% F& j$ M" n
# vi shm.h
! N7 b7 Z! a. Z. J
把 #define SHMMAX 0X2000000 /*max shared seg size(bytes)*/
. a! B' @- g* I' U x2 Y# f" x
改为#define SHMMAX 0Xa0000000 /*max shared seg size(bytes)*/
* ]" \# [' \/ x# _0 f
2、修改与信号量相关的核心参数
* q1 h! F N3 O3 _; N
# cd /usr/include/linux
( O* P7 ?% i1 `0 p8 V5 ~5 N$ y
# vi sem.h
5 C) O1 t5 \, P2 }
把 #define SEMOPM 32 /*<=1 100 max num of ops per semop call*/
0 d& E! _. n9 ]8 @ H) W5 r$ Z
改为#define SEMOPM 900 /*<=1 100 max num of ops per semop call*/
0 J) |& B6 @9 P( H7 _! y& T/ T
3、修改与消息队列有关的核心参数
5 q9 |8 e7 ]# W7 {4 A9 x) v
# cd /usr/include/linux
& Y4 A" t% X( g9 K, Q! G4 y
# vi msg.h
- `1 i; [" X% C+ g7 C
找到以下三行(注释忽略):
6 d% s3 i% d1 j
#define MSGMNI 16
2 x2 q# \# A8 E+ b
#define MSGMAX 8192
6 Q& A: ?4 n g) s3 {% z: g
#define MSGMNB 16384
9 w) |$ i4 F2 h/ H3 ^& h
将其修改为:
+ L8 H1 S0 t: Z0 K6 ?
#define MSGMNI 128
1 x. v8 ]0 W: @" i7 v6 t8 m9 s2 G/ j& n
#define MSGMAX 131072
, h' i/ E( Z# f
#define MSGMNB 20000000
/ W# _: N; `* E, N
4、按上面方法同样修改/usr/src/linux-2.4.7-10/include/linux下的shm.h、sem.h和msg.h文件。
: N3 q! {" y4 T s6 Q5 N# v
三、下载释放核心源代码
& b4 H% w" h, p$ v9 _
如果只是修改编译内核,这一步可以省去。当我们从Internet站点上下载了新的内核文件(如linux-2.4.7-12.tar.gz),这步是必须的。
, i' r' q& X1 [+ n3 b1 Z- ^
1、用tar命令释放内核源代码
0 s4 M; O- n7 k6 o- {
# cd /usr/src
- `: }- V* f$ @6 o7 R/ _3 a6 @
# tar zxvf linux-2.4.7-12.tar.gz
! b+ C9 B3 W& C; f0 V& d5 j3 n3 f
文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包括了源代码。
. V+ D/ n1 v/ P
2、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。
6 N# O3 o P; ~' ~; _5 T/ p
# cd /usr/include
7 m9 F2 U! K3 G, C+ [
# rm -Rf asm linux
& L$ \* q5 l. d+ Q9 t& _
# ln -s /usr/src/linux/include/asm-i386 asm
4 R8 X. J& o) ~& r: t, S
# ln -s /usr/src/linux/include/linux linux
0 E3 X$ j0 f! A; H6 ~0 a
# ln -s /usr/src/linux/include/scsi scsi
6 o& G2 T0 \& n3 Z9 o
四、配置内核
4 |! i- C, d. P+ K' l/ z$ ?1 l( M0 W
1、删除源代码目录中残留的.o文件和其它从属文件。
9 @- J5 u, k- P' ?( t( K
# cd /usr/src/linux-2.4
8 M a7 _* m+ @
# make mrproper
: b- z! I9 \: l: b0 @+ C
2、启动内核配置程序
* ~: d! `. M2 A `6 B" Z
# cd /usr/src/linux-2.4
# `" d: D6 m" V
# make xconfig
! ~7 m7 D. ?$ v' b' W" ^4 @0 F
3、配置内核
- u( Y( E! r* b" o
Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。不合理的配置可能造成内核编译失败。
2 o( G! E3 W1 A$ _" b, |, F
五、编译内核
% X% z3 m8 p8 K8 X
1、建立编译时所需的从属文件
# Q% p3 O/ t; a3 O
# cd /usr/src/linux-2.4
0 G; ~8 z# k9 c7 U. v
# make dep
1 M8 D$ z6 b: X& `! ]
2、清除内核编译的目标文件
- O% W) D7 k. A: C- ]
# make clean
( ^, t( Z; M C0 H
3、编译内核
& o6 Z# a& p8 f: k# R- T
# make bzImage (注意大小写)
K. |/ a2 s. p5 R
内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件bzImage。如果用make zImage编译,内核很大的话,系统会提示你使用make bzImage命令来编译。
; l( C& w- J3 o# Q6 a( g7 u0 I
六、编译可加载模块
" E2 {2 W& f- k d; \9 k U
如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。
, l# K; E" E. x/ x
# make modules
2 ?$ z; b9 O" m( F' k: X4 k
# make modules_install
% f, p+ V x# s1 Y: Y& `* j
编译成功后,系统会在/lib/modules目录下生成一个2.4.7-10custom子目录,里面存放着新内核的所有可加载模块。
/ L# D: \/ V! v% D2 i0 z9 u. ~
七、启动新内核
. g$ S! z1 X# a1 t
1、将新内核和System.map文件拷贝到/boot目录下
4 _$ p M! i! L7 ~- V2 Y+ _0 n
# cp /usr/src/linux-2.4/arch/i386/boot/bzImage /boot/vmlinuz-2.4.7-10custom
* _, `. n) t- D3 h3 p
# cp /usr/src/linux-2.4/System.map /boot/System.map-2.4.7-10custom
; ?0 F' z7 L: a1 ~6 F
# cd /boot
$ g1 K, u" w: K% c/ t, L% F& U" f
# rm -f System.map (删除原来的连接)
1 j7 A, _4 x$ O8 ~/ v9 h
# ln -s System.map-2.4.7-10custom System.map (重新建立连接)
' C7 b" M R: i/ ^% k6 a$ v
2、配置/etc/lilo.conf文件,在该文件中加入下面几行:
L* v" @6 i8 @$ R) h2 t" Y& C3 y
image=/boot/vmlinuz-2.4.7-10custom
/ S* v( c2 v! H% R
label=linux-custom
. `) s5 k! e6 z0 L% }* `* _4 t
initrd=/boot/initrd-2.4.7-10.img
4 F, y# r3 ~$ h/ t: G% Y
read-only
% F/ [/ |0 W! S% ]% R8 Q n Q
root=/dev/hda3 (参考lilo.conf文件中现有的配置)
: B9 M5 w/ }" ]. w
并把default=linux改为default=linux-custom
) \+ D8 T: y$ }1 z
3、使新配置生效
5 C: N `# d" }' F/ U4 G- \
# /sbin/lilo
, A: @/ Q9 m( n: D$ I s4 g# p6 X
4、重新启动系统
q5 w: a. l" P0 Y0 G4 ^4 f- H
# /sbin/reboot
8 C5 H8 q0 o. s) U; b% c+ v) M
新内核如果不能正常启动,可以在LIL提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5