1.环境
redhat 7.2,虚拟机 vpc2007,内核版本2.4.7-10,安装了内核源码在/usr/src下
2.内核版本
系统版本是2.4.7-10,内核模块文件在/lib/modules/2.4.7-10下
因此新编译的内核不应和它冲突,那么新内核的版本如何决定呢?
答案是在源码的根Makefile里指定.
Makefile头几行是
VERSION = 2
PATCHLEVEL = 4
SUBLEVEL = 7
EXTRAVERSION = -10custom
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
还有一个
MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
可见
默认版本是2.4.7-10custom,不会冲突,模块安装路径搞清楚了。
还有内核执行时的版本信息如何控制呢?
例如/proc/version的显示中会给出
[root@mail /proc/net]# cat /proc/version
Linux version 2.4.20-8smp (bhcompile@porky.devel.redhat.com) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 SMP Thu Mar 13 17:45:54 EST 2003
这个的版本信息由init/version.c指定
#define version(a) Version_ ## a
#define version_string(a) version(a)
int version_string(LINUX_VERSION_CODE);
struct new_utsname system_utsname = {
UTS_SYSNAME, UTS_NODENAME, UTS_RELEASE, UTS_VERSION,
UTS_MACHINE, UTS_DOMAINNAME
};
const char *linux_banner =
"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
即
UTS_RELEASE
这个宏定义在
include/linux/version.h中
#define UTS_RELEASE "2.4.7-10custom"
#define LINUX_VERSION_CODE 132103
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
这个文件是由Makefile根据前面的VERSION,PATCHLEVEL和SUBLEVEL生成的
其中LINUX_VERSION_CODE 123103即十六进制0x20407
3.编译内核
路径/usr/src/linux-2.4.7-10
make menuconfig 什么都不做,直接退出保存配置
make dep
make bzImage
make modules
make modules_install
4.安装内核
cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.7-10custom
vi /etc/grub.conf
怎加三行
title Red Hat Linux (2.4.7-10custom)
root (hd0,0)
kernel /vmlinuz-2.4.7-10custom ro root=/dev/hda2
5.测试内核
reboot
在grub的菜单中选2.4.7-10custom,看能否启动内核
6.如何修改源码
在虚拟机的字符界面下修改源码不方便,可以安装并启动samba服务,设置vpc 2007的网卡为桥模式,配置linux的网卡ip地址为同网段,在本机的运行中输入\\linux ip地址,输入用户名和密码,就可以共享虚拟机中的文件了。
vpc 2007下的linux是字符界面,不方便复制和粘贴屏幕上的输出,启用linux的sshd服务,用secureCRT连接进linux,屏幕上的复制和粘贴就简单多了,还可以使用rz和sz命令在本地和linux之间方便传文件.