Linux myas5.happyboy.net.cn 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux
升级内核,并尝试使用新的文件系统reiser4
编置内核包含两大项内容,即配置内核和编译内核。这两项工作需要经常查看内核的文档,至少要查看Readme文件和Documentation目录下的Changes文件。它们对内核进行了描述,
比如升级内核可能出现的问题和内核对系统中工具的版本要求等
下载内核 http://www.kernel.org/pub/linux/kernel/
linux-2.6.22.tar.gz
reiser4的内核补丁reiser4-for-2.6.22.patch.gz
ftp://ftp.namesys.com/pub/reiser4-for-2.6/2.6.22/
reiser4组件:
ftp://ftp.namesys.com/pub/reiser4progs/libaal-1.0.5.tar.gz
ftp://ftp.namesys.com/pub/reiser4progs/reiser4progs-1.0.6.tar.gz
组件的安装可以参考ftp://ftp.namesys.com/pub/reiser4progs/README
下载的文件放在/usr/src目录中
一.安装reiser4组件
[root@happyboy src]# tar -xvzf libaal-1.0.5.tar.gz
[root@happyboy src]# cd libaal-1.0.5
[root@happyboy libaal-1.0.5]# ./configure --prefix=/usr
[root@happyboy libaal-1.0.5]# make
[root@happyboy libaal-1.0.5]# make install //该操作将库文件安装到了/usr/lib目录
[root@happyboy libaal-1.0.5]# /sbin/ldconfig //add /usr/local/lib to /etc/ld.so.conf if not already there
一般不用手动执行,在make install时最后已经自动执行过了.注意检查一下/etc/ld.so.cache,系统版本不同文件略有差异,一般是/etc/ld.so.*
[root@happyboy src]# tar -xvzf reiser4progs-1.0.6.tar.gz
[root@happyboy src]# cd reiser4progs-1.0.6
[root@happyboy reiser4progs-1.0.6]# ./configure --prefix=/usr
[root@happyboy reiser4progs-1.0.6]# make
[root@happyboy reiser4progs-1.0.6]# make install
[root@happyboy reiser4progs-1.0.6]# /sbin/ldconfig
二.解压内核建链接,打补丁
[root@happyboy src]# tar -xvzf linux-2.6.22.tar.gz
[root@happyboy src]# ln -s linux-2.6.22 linux
[root@happyboy src]# cd linux
[root@happyboy linux]# pwd
/usr/src/linux
[root@happyboy linux]# gzip -cd ../reiser4-for-2.6.22.patch.gz | patch -p1 //补丁包释放到/usr/src/linux/fs/reiser4
三.配置内核
有了要编译配置的内核,先来介绍怎么样配置内核。具体的步骤分为一下几步:
1.在开始配置内核之前,首先需要通过下面的命令清除所有的临时文件、中间件和配置文件。对于一个刚从网上下载的内核来说,它肯定是干净的,这么做只会多此一举。但是这是一个良好习惯,而且不会有坏结果。
[root@happyboy linux]# make mrproper
2. 然后要了解自己系统的硬件配置情况,比如CPU的类型、主办芯片、显卡和声卡的型号等。
3. 配置内核选项,用到的命令是:
#make
用到的
◆ config 基于交互式的文本配置界面。每个问题以线形格式出现,并被一个一个地回答,而且一旦作出了回答就不能再修改了。
◆ oldconfig 同config相似,但是使用原有的配置文件,而且只会提问有关新内核特性的问题,对于内核升级很方便。
◆ menuconfig 一个文本模式、选单驱动的配置界面。
◆ xconfig 基于Tcl/Tk的X图形配置界面。
现在开始配置内核,使用的工具为menuconfig。在命令行模式下执行下面的命令:
[root@happyboy linux]# make menuconfig
在闪过几行字之后就出现了如图所示的界面。
记得要把下面的选上
Code maturity level options
---> Prompt for development and/or incomplete code/drivers
然后确保4k stacks没有选
Kernel hacking ---> Use 4Kb for kernel stacks instead of 8Kb
记得把reiser4的选项选上
File system--->reiser4相关的全选上
其他内容根据个人硬件配置操作。
选择Save an Alternate Configuration File直接回车保存,选择
文本图形工具配置使用方法以及内容说明:
使用方向键在各选项间移动;使用“Enter”键进入下一层选单;每个选项上的高亮字母是键盘快捷方式,使用它可以快速地到达想要设置的选单项。在括号中按“y”将这个项目
编译进内核中,按“m”编译为模块,按“n”为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按“h”将显示这个选项的帮助信息,按“Esc”键将返回到上层选单。
注意,如果“make menuconfig”命令失败,很可能是ncurses库没有安装。
内核的配置选项很多,这里就主要选项进行简要说明,使大家能根据自己的情况,进行内核定制。如果某些项把握不准,可以参考documentation/Configure.help文件,也可搜索整个系统,并查看相关的选项都在哪些文件中出现了。接下来就是个选项的配置说明情况。
◆ Loadable module support(可加载模块支持)。其中“Enable loadable module support”选项可让内核支持模块;“Module unloading”选项可以让用户卸载不再使用的模块,如果不选的话用户将不能卸载任何模块(注意,有些模块一旦加载就不能卸载,与是否选择了此选项无关);“Module versioning support(EXPERIMENTAL)”选项允许用户可以使用其它版本内核中编译的模块,不过并不可靠,所以一般不选择它;“Automatic kernel module loading”选项允许内核自动调用“modprobe”命令来加载需要的模块。
模块是一小段代码,编译后可在系统内核运行时被动态地加入内核,从而为内核增加一些特性或对某种硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以缩小内核的体积。在运行时可以使用“modprobe”命令把模块加载到内核中去(在不需要时还可以卸载它)。
◆ Set version infomation on all symbols for modules(CONFIG_MODVERSIONS)是有关内核模块版本控制的选项。如果用户打算开发内核模块代码(包括当前内核源码树中之外的任何模块代码),就开启这个设置。一般的用户可以关闭。
◆(Pentium-III/Celeron(Coppermine))Processor family用来选择CPU类型。它允许内核使用高级处理器内部的特殊指令。当然,如果用户的CPU是80386,就没必要选择P4。但是如果实在不知该怎么选择,就选386。这时如果用户使用高级的CPU,内核的运行速度会比它应有的速度慢,但至少它能够运行。建议使用Help和/proc/cpuinfo获得更多的帮助
◆ High Memory Support (CONFIG_NOHIGHMEM)使内核支持大内存。通常情况下内核只支持1GB内存(实际情况是896MB,它与vmalloc()的实现有关,这超出了我们的讨论范围)。如果用户的内存数量超过了896MB,请选择内核对4GB内存的支持,甚至64GB内存的支持。
◆ Symmetric multi-processing support(CONFIG_SMP)使内核支持多处理器。如果用户有多于一个CPU,那么一定要选这项。
◆ Maximum number of CPUs(2-32)用以选择处理器数量。对于单CPU用户来说,选多少都没有意义。
◆ General setup表示通用配置。这里可设置内核对虚拟内存的支持和为System V的进程提供通信机制;通过“Sysctl support”选项可以动态地更改一些核心参数与变量,而不需要重新启动系统。
◆ File systems(文件系统)。这里的内容很多,建议在缺省的基础上进行修改。一般需要DOS FAT(FAT16、FAT32)、VFAT,EXT3、NTFS和ISO9660(标准光盘使用的文件系统)支持。
介绍完这些内核配置的主要选项,用户在根据自己的要求配置好内核之后,接下来就要编译内核。
◆ Power management options (ACPI、APM)是高级电源管理。要注意ACPI与APM不能同时使用。如果同时配置了这两者,那么在系统启动时,若发现一个可工作的ACPI设备,那么APM将被关闭,ACPI会被加载。
如果想让Linux支持高级电源管理,例如软关机、系统休眠等,需要选择“Power Management support”选项;“Software Suspend(EXPERIMENTAL)”选项可以挂起计算机(类似Windows XP中的休眠),这个功能不需要高级电源管理的支持;“Processor”选项可让处理器在空闲时节省电能,应该选上;“Thermal Zone”选项在系统温度过高时,及时调整系统的工作状态,以保护CPU(需要硬件的支持)。
◆ Bus options(PCI、PCMCIA、EISA、MCA和ISA)用以设置系统总线。根据主板参数自己进行选择。针对PCI总线的是“PCI support”选项,下面还有ISA和EISA子项,一般都是需要的;“Support for hot-pluggable devices”选项是对热插拔设备的支持;“PCMCIA/CardBus support”选项支持PCMCIA。
◆ Executable file formats表示可执行文件格式,一般全要选上。
◆ Device Drivers用来选择设备驱动程序。声卡、显卡、网卡和电视卡等驱动都在这里选择。其中“Plug and Play support”选项支持即插即用;“Block devices”选项支持块设备;“SCSI device support”选项支持SCSI 设备;“Multi-device support(RAID and LVM)”选项支持RAID和逻辑卷;“Networking support”选项支持网络,包括网络协议和网络设备,协议中肯定要“TCP/IP”项,根据自己的网卡选择相应的设备;ISDN上网必需选“ISDN subsystem”选项;“Sound”选项是声卡驱动,有两种选择,一种是ALSA驱
动,一种是Open Sound System驱动,选择支持自己声卡的那种,将之编译进内核;“USB Support”选项该项很重要,平常用的优盘就是一种USB设备;对USB而言,至少需要“Support for USB”、“USB device filesystem”、“ECHI HCD(USB 2.0)support”、“UCHI HCD(most Intel and VIA)support”、“USB Audio support”、“USB MIDI support”和“USB Mass Storage support”选项。
执行了“make ”之后,系统会在include/linux目录下生成一个autoconf.h文件。例如,在配置内核选项时选择支持NTFS文件系统,并把它编译进了内核,那么在.config中就会生成“CONFIG_NTFS_FS=y”这项,相应的在include/linux/autoconf.h中会生成“#define CONFIG_NTFS_FS 1”这项。因此所有与NTFS文件系统相关的C源文件都会包含include/config/ntfs/fs.h这个头文件。
新的2.6.0内核中增加了两个GUI配置工具,要使用xconfig必需先安装Qt库(一般发行版的光盘里都有),要使用gconfig就要先安装Gtk库。
在启动配置工具时,2.6.0内核会读取当前的系统配置,从而保持与当前配置相同的选项。这个特性是为方便以后的升级工作,在内核特性变化不大的情况下可以直接以当前的选项为基础,省去了逐项配置的麻烦。有两种方法可以让2.6.0内核以默认选项来启动配置工具,一种是将当前的配置文件/boot/config-XXX删除;另一种是在执行配置工具前先执行“make defconfig”命令。
除此之外,还为make添加了几个新选项,是allyesconfig、allnoconfig和allmodconfig。它们是为内核开发人员与测试人员准备的。
用户根据自己的要求配置好内核之后,接下来就要编译内核。
四.编译内核
编译内核的软件环境是kbuild系统,它泛指构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序、脚本、中间件、配置文件和Makefile。现在就讲解内核的编译过程,具体步骤如下:
1.“make dep”或“make depend”
kbuild调用中间件scripts/mkdep来生成描述与相关核心文件形成依赖关系的.h文件(绝大多数)列表。这个列表保存在.depend中。用户即使不执行这一步,kbuild也会自动执行的。我这里就没有手动执行,让其自动执行
2. 构建内核镜像的命令是:
#make
其参数如下:
◆ zImage 构建小内核镜像。
◆ compressed 同zImage。
◆ bzImage 构建大内核镜像。
◆ zdisk 使用zImage生成一张引导软盘。
◆ bzdisk 使用bzImage生成一张引导软盘
◆ zlilo 使用lilo作为zImage的引导器。
◆ bzlilo 使用lilo作为bzImage的引导器。
根据实际情况选择内核境象类型,大多数情况下选择“make bzImage”。
2.6.0内核的kbuild系统与2.4.23比起来有一定的差异,但是绝大多数功能都是相似的。只是构建内核镜像的命令参数增加了一下几项:
◆ fdimage 制作一张1.44M的引导软盘
◆ fdimage144 同fdimage
◆ fdimage288 制作一张2.88M的引导软盘
[root@happyboy linux]# make bzImage
3.通过下面的命令安装内核:
#make install
如果用户使用LILO,它会把内核镜像放到正确的位置并且修改LILO的配置,那么用户可以免去手动操作。如果使用别的引导器(例如GRUB),那么不使用这个命令。因为修改grub.conf需要交互式的手动编辑,自动修改可能会带来一些不可预计的错误,所以编译完毕后用户需要进行一些手动操作(见下面第6步)。
在2.6.*中“make install”更加智能,它会依此将arch/i386/boot/bzImage、System.map复制为/boot/vmlinuz-2.6.*,/boot/System.map-2.6.*,并创建vmlinuz-2.6.*的软链接vmlinuz和System.map-2.6.*的软链接System.map。kbuild还会自动创建/boot/initrd-2.6.*.img,并且修改grub.conf,以前这一切都要手动才能完成。引用别人的话来说:“2.4.x还是半自动的,而2.6.x是全自动的。”
4. 用下条命令编译所有被配置为模块的内核组件:
[root@myas5 linux]# make modules
5. 把所有编译好的内核模块按照功能拷贝到/lib/modules/2.6.22/目录下,使用下面命令:
[root@myas5 linux]# make modules_install
6.制作启动镜像文件
[root@myas5 linux]# mkinitrd /boot/initrd-2.6.22.EL.img 2.6.22
mkinitrd是一个脚本(cat /sbin/mkinitrd | more),用以制作启动映象,可以自动加载模块以及初始化系统。
它需要内核对loopback回送设备,ramdisk,initrd,tmpfs的支持,这些条件在编译内核时要注意。
另外,内核2.6.x的安装脚本会调用fedora的installkernel脚本自动生成initrd(如果你在编译内核时选上了initrd,无需自己手工制作。将内核境像文件拷贝到/boot分区
[root@myas5 linux]# cp arch/i386/boot/bzImage /boot/bzImage-2.6.22
[root@myas5 linux]# cp System.map /boot/System.map-2.6.22
该步骤并非必须,但最好形成良好的习惯。
然后修改LILO或GRUB的相关设置。这里以grub.conf为例:
[root@myas5 ~]# more /etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.22.EL)
root (hd0,0)
kernel /bzImage-2.6.22 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.22.EL.img
title Red Hat Enterprise Linux Server (2.6.18-8.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-8.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-8.el5.img
注意,在2.4.23之前的内核,通常制定LABEL参数,2.6.0内核这个参数已经被废弃了,使用root参数指定根文件系统的位置。
如果重新启动后出现“kernel panic”错误或显示应该修改“init”信息,则基本都是以上kernel语句错误。
根据发行版的不同,通常GRUB配置文件会在/etc/grub.conf、/boot/grub/menu.lst或/boot/grub/grub.conf三个地方。
开始我就错误修改了grub.conf,出现kernel panic not syncing attempted to kill init提示,因为当时选择默认分区
[root@myas5 ~]# uname -a
Linux myas5.happyboy.net.cn 2.6.22 #1 SMP Fri Dec 28 09:48:27 CST 2007 i686 i686 i386 GNU/Linux
可以看到内核已经升级到2.6.22l了
7.最后将在编译过程中的垃圾文件进行清理,命令如下:
#make clean
8、测试
[root@myas5 usr]# mkfs.
mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.msdos mkfs.reiser4 mkfs.vfat
[root@myas5 usr]# mkfs.reiser4 /dev/hdb1
Creating reiser4 on /dev/hdb1 ... done
[root@myas5 usr]# mkdir /mnt/hdb1
[root@myas5 usr]# mount /dev/hdb1 /mnt/hdb1
[root@myas5 usr]# more /etc/mtab
/dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/hda1 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
/dev/hdb1 /mnt/hdb1 reiser4 rw 0 0
[root@myas5 src]# pwd
/usr/src
[root@myas5 src]# du -sh reiser4progs-1.0.6
18M reiser4progs-1.0.6
[root@myas5 src]# cp reiser4progs-1.0.6 /mnt/hdb1/ -R
[root@myas5 src]# du -sh /mnt/hdb1/reiser4progs-1.0.6/
13M /mnt/hdb1/reiser4progs-1.0.6/