2005年11月15日

首先还是要说在 RH8/RH9 上最好升级回与原版本相同的内核(如 kernel-2.4.xx )否则会因为版本差别太大而造成很多不必要的麻烦。废话少说,下面开始升级

一. 在升级前必须对以下的组件升级
1. 升级 device-mapper,在 ftp://sources.redhat.com/pub/dm下载
cd /usr/src
tar -zxvf device-mapper.1.01.04.tgz
cd device-mapper.1.01.04
./configure –perfix=/
make all
make install

2. 安装 LVM2,在 ftp://sources.redhat.com/pub/lvm2下载
cd /usr/src
tar -zxvf LVM2.2.01.14.tgz
cd LVM2.2.01.14
./configure –perfix=/
make all
make install

3. 升级 mkinitrd 在 http://rpm.pbone.net/ 下查找
rpm -Uvh mkinitrd-3.5.11-3.9.i386.rpm

4.update modutils 在 ftp://ftp.kernel.org/pub/linux/utils/kernel/modutils/下载
cd /usr/src
tar -zxvf modutils-2.4.27.tar.gz
cd modutils-2.4.27
./configure –perfix=/
make all
make install

5.安装module-init-tools,在 ftp://ftp.kernel.org/pub/linux/utils/kernel/module-init-tools 下载
cd /usr/src
tar -zxvf module-init-tools-3.2-pre9.tar.gz
cd module-init-tools-3.2-pre9
./configure –prefix=/
make moveold

ps:"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等,是非常重要的一步! 如果忘记了这一步也不要紧张, 可以按照上面的步骤4重装一遍modutils就可以了.

make

ps: 用module-init-tools-3.1 编译时会出现 "make: *** [modprobe.conf.5] Error 127"

建议用 3.0 或 3.2-pre 版

make install
./generate-modprobe.conf /etc/modprobe.conf

二. 升级内核,
ftp://ftp.kernel.org/pub/linux/kernel/ 下载
cd /usr/src
tar -zxvf linux-2.6.13.3.tar.gz
cd linux-2.6.13.3.tar
bzip2 -dc patch-2.6.13.3.bz2 | patch -p1 -R ;打补丁
make mrproper ;初次编译可以不运行这一步
make clean ;初次编译不用运行这一步,第2次编译时把上一次编译出来的删除掉
make menuconfig ; 配置内核

ps:另外可以用以下命令代替
1. make config ;基于文本的最为传统的配置界面
2. make oldconfig ;自动保存为旧版的设置
3. make menuconfig ;txt界面下的菜单设置
4. make xconfig ;kernel 2.6 下新图形窗口模式的配置界面需要PQ库的支持
5. make gconfig ;旧的图形窗口模式的配置界面

要点: 1. Device Drivers –>Block devices–〉Initial RAM disk (initrd) support 一定要选上(Y),Default RAM disk size一定要改成16384以上
2. 有SCSI卡(如VMware 中的BusLogic BT946C) 的要把它编译成模块(M) 不然会在make install 出错
3. USB support 选模块(M) USB HID Boot Protocol drivers 中的 Keyboard/Mouse选(M)
4. Sound card support 可以选上新支持的模块Advanced Linux Sound Architecture ,至于旧的Open Sound System 模块就不要再选了.
关键是把Sound card support 以及 Advanced Linux Sound Architecture 里面的选项选成模块(M)
5. 通过lspci 命令查看硬件设备, 如有列出的一定要在 config 时选上

make ;漫长的编译过程,你可以走出去喝茶吃包,回来还没有编译完…
ps:在kernel 2.6 下已经省略了 make dep这一步

make modules_install install ; 安装内核及模块。安装完成后可以重启进入新的内核

三. 在新内核里发现有不少的改变,如果要正常运行必须要做一些修改,
1.在修改之前先备份以下文件(好的习惯)
/etc/rc.sysinit
/etc/fstab
/etc/rc.d/init.d/halt
/etc/modprobe.conf

2.新增的文件系统 sysfs
1. mkdir /sys
2. 在 /etc/rc.sysinit 中
找 mount -f /proc 在其后加上在下面加上 mount -f /sys
再顺便把下一行 [ -f /proc/bus/usb/devices ] && mount -f -t usbdevfs usbdevfs /proc/bus/usb 改成 [ -f /sys/bus/usb/devices ] && mount -f -t usbfs usbfs /sys/bus/usb

找 action $"Mounting proc filesystem: " mount -n -t proc /proc /proc 在其后加上在下面加上 action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
3. 在/etc/fstab中加上一行 none /sys sysfs defaults 0 0
4. 修改 /etc/rc.d/init.d/halt
找 awk ‘$2 ~ /^/$|^\/proc|^\/dev/{next}
改成 awk ‘$2 ~ /^/$|^\/proc|^\/sys|^\/dev/{next}
找 [ -f /proc/bus/usb/devices ] && umount /proc/bus/usb
改成 [ -f /sys/bus/usb/devices ] && umount /sys/bus/usb
5.找 rc.sysinit和/etc/rc.d/init.d/halt 中的所有 /proc/bus/usb 改成 /sys/bus/usb

2.ps/2鼠标设备从原来的/dev/psaux 改成 /dev/input/mice
rm /dev/psaux
ln -s /dev/psaux /dev/input/mice

3.USB模块名的更改
打开 /etc/rc.sysinit,找
usb=0

if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then

aliases=`/sbin/modprobe -c | awk ‘/^alias usb-controller/ { print $3 }’`

if [ -n "$aliases" -a "$aliases" != "off" ]; then

modprobe usbcore

for alias in $aliases ; do

[ "$alias" != "off" ] && action $"Initializing USB controller ($alias): " modprobe $alias

done

[ $? -eq 0 -a -n "$aliases" ] && usb=1

fi

fi



if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then

usb=1

fi



if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then

action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb

fi



needusbstorage=

if [ $usb = "1" ]; then

needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`

LC_ALL=C grep ‘hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null

action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null

fi

改成

modprobe usbcore
action $"Initializing USB controller (uhci-hcd): " modprobe uhci-hcd

usb=1



if [ $usb = 1 -a ! -f /sys/bus/usb/devices ]; then

action $"Mounting USB filesystem: " mount -t usbfs usbfs /sys/bus/usb

fi



needusbstorage=

if [ $usb = "1" ]; then

needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`

action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null

action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null

action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null

fi

ps: 2.6中模块名已经改了
usb_huic –> uhci-hcd ; uhci-hcd 是通用控制器/ ochi-hcd USB-1.1控制器 / ehci-hcd USB-2.0控制器
hid –> usbhid ;输入模块
keybdev –> usbkbd ;键盘模块
mousedev –> usbmouse ;鼠标模块
4.新增的声卡模块ALSA
1). 首先把Sound card support 以及 Advanced Linux Sound Architecture 里面的选项编译成模块(M)
2). 把 /etc/modprobe.conf 里有关声卡的选项除了 alias char-major-14-* soundcore 外都删除掉
ps:ALSA是需要soundcore的支持.通过命令modinfo soundcore 可以看到以下信息
description: Core sound module
author: Alan Cox
license: GPL
alias: char-major-14-*
vermagic: 2.6.13 PENTIUM4 REGPARM gcc-3.2
depends:
srcversion: 6E1C8780DE9ADFFB5BCD439

3). 启动新内核后必须要安装 alsa-lib-1.0.9.tar.bz2 和 alsa-utils-1.0.9.tar.bz2 你可以到官方网站 http://www.alsa-project.org/ 下载。
cd /usr/src
tar -jxvf alsa-lib-1.0.9.tar.bz2
tar -jxvf alsa-utils-1.0.9.tar.bz2
cd alsa-lib-1.0.9
./configure;make;make install
cd ../alsa-utils-1.0.9
./configure;make;make install

4). 装完alsa-lib / alsa-utils 后就可以通过alsaconf来对声卡作设置
5). 用lsmod看到声卡模块被加载
6). 用alsamixer设置声卡音量
7). 测试声卡可以 aplay /usr/share/sounds/alsa/Front_Center.wav,终于能发声了,兴奋ing…
Cool. 重启内核后发现声卡模块可能无法正常加载, 可以在 /etc/rc.d/rc.local 加入 modprobe 声卡模块名 让内核启动时自动加载声卡
9). 有关 ALSA 的详细说明请在官方网站 http://www.alsa-project.org/alsa-doc/ 选上你声卡的型号查看

5.rpm 问题,在新内核起动后,rpm有些功能不能使用,并出现下列错误
rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 – Resource temporarily unavailable (11)
error: cannot open Packages database in /var/lib/rpm
no packages

解决方法是,运行 export LD_ASSUME_KERNEL=2.2.5 并把才句加入 /etc/bashrc 里面
再 rpm -q mkinitrd 看一下, 正常了。

6.CD-ROM 模块的改变
1). vi /etc/fstab 把

/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0

改成

/dev/hdc /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0

2). mount /dev/hdc

2005年11月14日

2.6内核编译安装和驱动开发

      2.4内核和2.6内核有了很大的不同。我在开发Ver2.6版本的linux驱动的时候,需要升级redhat9.0 kernal 2.4.20-8 kernal2.6.1,其中碰到了很多问题!现在把我在网上找到的内容和我的实际问题写出来,便于别的朋友可以少走弯路


2.6内核编译安装和驱动开发
 
1.     2.6内核的编译和安装

2.4内核和2.6内核有了很大的不同。我在开发Ver2.6版本的linux驱动的时候,需要升级redhat9.0 kernal 2.4.20-8 kernal2.6.1,其中碰到了很多问题!现在把我在网上找到的内容和我的实际问题写出来,便于别的朋友可以少走弯路。

(1)    先说明2.6内核的一些显著的不同之处
改进包括改善对硬件构架的支持。在新版内核中增加对最新AMD 64位Opteron CPU以及PowerPC 64位CPU的支持;
把ucLinux中的一些部分集成,可以支持很多嵌入式处理器
更好地支持多处理器系统,将支持16个或以上的CPU、更好地支持嵌入式设备、对点击鼠标和键盘的反应速度更快和彻底改善了块设备软件插件等。
使用新的new 0(1) 调度程序;
使用真正的异步I/O以改善企业应用;
提高了文件系统的性能;
改进了线程功能,可以支持更多的线程;
改进了对宽带联网的支持等。
 
(2)准备工作

下面是在文档中给出了欲成功地升级到kernel-2.6.x所需的最小系统软件要求

o Gnu C 2.95.3 # gcc –version
o Gnu make 3.79.1 # make –version
o binutils 2.12 # ld -v
o util-linux 2.10o # fdformat –version
o module-init-tools 0.9.10 # depmod -V

o e2fsprogs 1.29 # tune2fs
o jfsutils 1.1.3 # fsck.jfs -V
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
o xfsprogs 2.6.0 # xfs_db -V
o pcmcia-cs 3.1.21 # cardmgr -V
o quota-tools 3.09 # quota -V
o PPP 2.4.0 # pppd –version
o isdn4k-utils 3.1pre1 # isdnctrl 2>&1|grep version
o nfs-utils 1.0.5 # showmount –version
o procps 3.2.0 # ps –version
o oprofile 0.5.3 # oprofiled -version
对于RH8/9的用户而言, 上述要求基本上都能满足. 大概只有两个程序需要更新: modutils工具包和mkinitrd程序. 在我用Redhat9.0升级到2.6.1内核的过程中,没有升级mkinitrd,如果要升级mkinitrd.请参考如下方法:
可以到站点http://people.redhat.com/arjanv/2.6/RPMS.kernel/去下载最新的mkinitrd-3.5.15.1-2.i386.rpm包. 由于mkinitrd程序包依赖于device-mapper包, 而device-mapper包又倚赖于lvm2包, 因此你还要同时下载device-mapper-1.00.07-1.i386.rpm包和lvm2-2.00.08-2.i386.rpm包.

  1. 安装module-init-tools-3.0.tar.gz工具包

# configure –prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf

命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.
    新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf /etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf. 但是令人不爽的是, 这个生成的新配置文件存在BUG, 下面我们将会提到。主要是一些相应的设备驱动别名的变化,还有/proc/中系统目录的变化。

  1. 升级modutils工具包

先下载modutils-2.4.21-23.src.rpm的软件包。我升级的时候,下载的是modutils-2.4.27-1的软件包。

#rpm -e –nodeps modutils (强行卸载原有的modutilsRPM包)

#rpm -ivh modutils-2.4.21-23.src.rpm (把源代码包安装到了/usr/src/redhat目录下)

#cd /usr/src/redhat/SPECS (进入规范文件目录下)

#rpmbuild –bb modutils.spec (生成二进制的RPM包)

#cd ../RPMS/i386 (转入刚生成的二进制的RPM包所在位置)

#rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpmmodutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包,全部安装)

c. 更改说明

◆ 如果是从以前的redhat低版本升级,需要修改/etc/rc.d/rc.sysinit文件,原因是在2.4内核下的/proc/ksysms命令到了2.6中就不存在了。

打开#vi /etc/rc.d/rc.sysinit

找到如下得语句

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null && [ -f /proc/ksyms ]; then

USEMODULES=y

fi

替换成:

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then

USEMODULES=y

fi

这样子在新的内核才能加载模块!

还有一种改法: 2.6系统下,原来/proc/ksyms改名/proc/kallsyms,做相应的替换修改。对于支持Hotplug,就要把所有的ksyms修改过来!
 
◆ 关于rpm命令不能用的问题,就版本的rpm存在bug, 在可以选择升级或者修改profile文件,如下:

#vi /etc/profile (在文件的末尾加上几句如下)
if [`uname -r`="2.6.0" ];then
export LD_ASSUME_KERNEL=2.2.5
fi

输出LD_ASSUME_KERNEL用来骗过rpm

当然也可以直接键入 #export LD_ASSUME_KERNEL=2.2.5

(3) 内核的编译顺序

  在官方网站上来,下载2.6的内核的开发包,解压:

#make mrproper (刚解开的tar包不需此步骤,用来清除以前编译的文件)

#make gconfig (需要Gtk开发库的支持)

make config(文本方式)

make menuconfig(文本方式下的,菜单模式)

make xconfig(需要Qt开发库的支持) 我用的这个.

配置内核是很重要的一步,错误的选择很可能导致新编译的内核无法启动。

o 关于"Loadable Module support"选项, 一定要选上"Module unloading"和"Automatic kernel module loading"这两个选项.
o 关于"Processor type and features"选项, 一定要选上"Preemptible Kernel"选项, 这是2.6.x内核优于2.4.x内核的重要原因之一.
o 关于"Block Devices"的配置, 一定要选上对loopback和ramdisk的支持.
o 关于"Multi-device support(RAID and LVM)", 要选上"device mapper".
o 关于"Input device support", 记得要选上"Keyboards"和"Mice"的支持.
o 关于"Graphics support", 要选上对frame buffer的支持.
o 关于ALSA, 要选上"OSS API emulation"选项. OSS可以不用了.
o 关于USB, 能选的都选上吧
o 关于文件系统, 选上常用的那几种就可以了. 如果要体验sysfs的话, 要选上对sysfs的支持.

需要强调的是,为了防止文件系统挂接问题,定制内核配置文件时把对Ext3Ext2文件的支持直接编译进内核。不要选成Module方式!

      开始编译,make dep对于2.6已经不需要了。
# make bzImage
# make modules
# make modules_install
# make install
使用Grub作为引导程序,make install会自动把相应的引导配置写入Grub,很是方便。如果用lilo需要自己修改。

新内核的问题,对于usb的设备,通用USB host控制器驱动程序的别名更改为uhci-hcd (以前为usb-uhci)。支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse。usbcore2.6内核的usb设备核心。如果使用usb设备,需要修改相应的rc.sysinit文件。

另外一个比较大的变化,驱动的后缀名,从2.4*.o 变成 *.ko,对应有的驱动配置文件,要做相应的修改,在可以安装。
2.     2.6内核的驱动开发

  通过上面的修改,我们已经存在一个可以开发和测试Linux驱动的环境了,下面让我们了解一下2.6的驱动做了那些修改。

变化的内容比较多,我们只讲一些主要的。具体请参考参考文档[5]
内核版本检查
需要在多个文件中包含<linux/module.h>时,不必定义__NO_VERSION__
老版本:在多个文件中包含<linux/module.h>时,除在主文件外的其他文件中必须定义_
_NO_VERSION__,防止版本重复定义。
内存分配头文件变更
所有的内存分配函数包含在头文件<linux/slab.h>,而原来的<linux/malloc.h>不存在
老版本:内存分配函数包含在头文件<linux/malloc.h>
结构体的初试化
gcc开始采用ANSI Cstruct结构体的初始化形式:
static struct some_structure = {
.field1 = value,
.field2 = value,
..
};
老版本:非标准的初试化形式
static struct some_structure = {
field1: value,
field2: value,
..
};
DMA的变化
未变化的有:
void *pci_alloc_consistent(struct pci_dev *dev, size_t size,
dma_addr_t *dma_handle);
void pci_free_consistent(struct pci_dev *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);
变化的有:
1 void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag);
void dma_free_coherent(struct device *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);
2
、列举了映射方向:
enum dma_data_direction {
DMA_BIDIRECTIONAL = 0,
DMA_TO_DEVICE = 1,
DMA_FROM_DEVICE = 2,
DMA_NONE = 3,
};
3
、单映射
dma_addr_t dma_map_single(struct device *dev, void *addr,
size_t size,
enum dma_data_direction direction);
void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
size_t size,
enum dma_data_direction direction);
4
、页面映射
dma_addr_t dma_map_page(struct device *dev, struct page *page,
unsigned long offset, size_t size,
enum dma_data_direction direction);
void dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
size_t size,
enum dma_data_direction direction);
5
、有关scatter/gather的函数:
int dma_map_sg(struct device *dev, struct scatterlist *sg,
int nents, enum dma_data_direction direction);
void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
int nhwentries, enum dma_data_direction direction);
6
、非一致性映射(Noncoherent DMA mappings
void *dma_alloc_noncoherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, int flag);
void dma_sync_single_range(struct device *dev, dma_addr_t dma_handle,
unsigned long offset, size_t size,
enum dma_data_direction direction);
void dma_free_noncoherent(struct device *dev, size_t size,
void *cpu_addr, dma_addr_t dma_handle);
7
DAC (double address cycle)
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
void pci_dac_dma_sync_single(struct pci_dev *dev,
dma64_addr_t dma_addr,
size_t len, int direction);
中断处理
1、中断处理有返回值了。
IRQ_RETVAL(handled)
2cli(), sti(), save_flags(), restore_flags()不再有效,应该使用local_save
_flags() local_irq_disable()
3synchronize_irq()函数有改动
4、新增int can_request_irq(unsigned int irq, unsigned long flags);
5 request_irq() free_irq() <linux/sched.h>改到了 <linux/interrupt.h>
网络驱动
1struct net_device *alloc_netdev(int sizeof_priv, const char *name,
void (*setup)(struct net_device *));
struct net_device *alloc_etherdev(int sizeof_priv);
2
、新增NAPI(New API)
void netif_rx_schedule(struct net_device *dev);
void netif_rx_complete(struct net_device *dev);
intnetif_rx_ni(struct sk_buff *skb);
(
老版本为netif_rx())
 

上面列到很多不同,实际开发驱动的时候,是另外一回事情。我们比较一下linux2.4.20,2.4.26,2.6.1网卡驱动的不同来分析驱动的变化。

 

比如我对2.4.262.6.1via_rhine.比较,其中via-rhine.c2.6.1的。

正在比较文件 via-rhine.c VIA-RHINE_2.4.C

***** via-rhine.c

        /* this should always be supported */

        if (pci_set_dma_mask(pdev, 0xffffffff)) {

                printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n");

***** VIA-RHINE_2.4.C

        /* this should always be supported */

        if (pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff)) {

                printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n");

*****

   这个其没有什么大的不同。

 

***** via-rhine.c

        SET_MODULE_OWNER(dev);

        SET_NETDEV_DEV(dev, &pdev->dev);  

***** VIA-RHINE_2.4.C

        SET_MODULE_OWNER(dev);

*****

   设置网络的数据块的方式变化了,在2.6.1

***** via-rhine.c

err_out_free_netdev:

        free_netdev (dev);

err_out:

***** VIA-RHINE_2.4.C

err_out_free_netdev:

        kfree (dev);

err_out:

*****

***** via-rhine.c

        free_netdev(dev);

        pci_disable_device(pdev);

***** VIA-RHINE_2.4.C

        kfree(dev);

        pci_disable_device(pdev);

*****

当然释放方式也要相应改变。

基本上只是对于netdevice的申请和释放做了修改。

 

但是对应在在低一些版本,比如2.6.1via-rhine.c2.4.20via-rhine.c进行比较,不同之处就太多了!

对于网络设备的控制,在2.6的数据结构多了,ethtools_ops这个内容。

dev->ethtool_ops = &netdev_ethtool_ops;

static struct ethtool_ops netdev_ethtool_ops = {

        .get_drvinfo            = netdev_get_drvinfo,

        .get_settings           = netdev_get_settings,

        .set_settings           = netdev_set_settings,

        .nway_reset             = netdev_nway_reset,

        .get_link               = netdev_get_link,

        .get_msglevel           = netdev_get_msglevel,

        .set_msglevel           = netdev_set_msglevel,

        .get_sg                 = ethtool_op_get_sg,

        .get_tx_csum            = ethtool_op_get_tx_csum,

};

static struct pci_driver via_rhine_driver = {

       .name              = "via-rhine",

       .id_table     = via_rhine_pci_tbl,

       .probe              = via_rhine_init_one,

       .remove             = __devexit_p(via_rhine_remove_one),

};

相应的中断方式,也更改成2.6的模式。不过Linux好的地方就是有很多参考源码,慢慢改,怎么都可以改好。

 

如何编译外部的驱动程序

对应驱动的*.o文件变成*.ko文件,编译的方式变化很到。具体原因参考附录[4]

下面给出我在2.6.1下面用的Makefile,和编译的批处理文件

Makefile:

obj-m:=mydrv.o

编译的drv.sh

#!/bin/bash

subpath=$(pwd)

osver=$(uname -r)

srcpath=/lib/modules/${osver}/build/

rm -f *o

make -C ${srcpath} SUBDIRS=${subpath} modules

 
参考文档 (主要都是在网上查的资料)
[1]  The Guide of Upgrading to linux kernel 2.6.x  作者:Rongkai Zhan 日期: 2004-3-14
[2] 菜鸟编译内核(kernel2.6.0) 作者:飘雪心辰,日期: 2004-8-19
[3] 编内核时出现:module-init-tools在线等   出处:ChinaUnix-Linux讨论区精华帖

[4] Driver porting: compiling external modules  

from   http://lwn.net/Articles/driver-porting/

[5] Linux2.6内核驱动移植参考 作者:晏渭川

下载源代码

  Linux内核总是不断发展的,最新的内核kernel2.6.0对USB2.0予以正式的支持,以及内核模块文件后缀最显著的一个变化由*.o到*.ko等等,我们可以从www.kernel.org下载到tarball的源代码包。

前期准备

  大家都知道的要先升级“module-init-tools“软件包,否则的话,等你安装内核模块文件的时候,系统会提示你:Warning: you may need to install module-init-tools See http://www.codemonkey.org.uk/post-h…4.21-23.src.rpm

  进入下载目录下并安装:

#rpm -e –nodeps modutils (强行卸载原有的modutilsRPM包)
#rpm -ivh modutils-2.4.21-23.src.rpm (把源代码包安装到了/usr/src/redhat目录下)
#cd /usr/src/redhat/SPECS (进入规范文件目录下)
#rpmbuild –bb modutils.spec (生成二进制的RPM包)
#cd ../RPMS/i386 (转入刚生成的二进制的RPM包所在位置)
#rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpm与modutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包,一起安装吧!)

  因为是在RedHat9.0的平台,RedHat的用户可能还会遇到一些麻烦,我会慢慢说的,除了要以上的升级之外,还有个文件(/etc/rc.d/rc.sysinit)可能有缺陷,因为/proc/ksyms文件在新内核(kernel2.6.0)中已经没有了,打开文件命令如下:

#vi /etc/rc.d/rc.sysinit

  找到:

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null && [ -f /proc/ksyms ]; then
USEMODULES=y
fi

  替换成:

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then
USEMODULES=y
fi

  也就是把“&& [ -f /proc/ksyms ]”去掉,保存文件(操作之前最好做备份以免删错,这个文件是系统初始脚本,重要的很),这样子内核才能加载模块,当然能启动iptable防火墙了,否则防火墙在新内核中启动时红色的“failed“非常醒目。(请在新内核中核查/proc/sys/kernel/modprobe中的内容是不是:/sbin/modprobe,也可手工注入指令:#echo "/sbin/modprobe" > /proc/sys/kernel/modprobe)。下面开始构造新内核。

一、准备源代码

  1、下载到tarball包之后,将内核tarball包复制到/usr/src目录下,假定包在当前目录中,运行以下命令:

#cp linux-2.6.0.tar.gz /usr/src

  2、转到/usr/src目录并解开tarball包,

#cd /usr/src
#tar xvzf linux-2.6.0.tar.gz

  3、如果你还下载了补丁包,则打上补丁,你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1(我偷懒不打补丁的)。

二、定制内核

  定制内核是门很大的学问,需要大量的硬件知识,特别是2.6.0的内核,如果你从2.4.N配置文件装载进去的,的确,很多人遇到过麻烦。我是重新配置文件(X窗口服务器进行),配制内核之前请清理源代码树,如果还没有进入/usr/src/linux-2.6.0目录,请进入此目录,命令如下:

#make mrproper (刚解开的tarball包不需此步骤)
#make gconfig (需要Gtk开发库的支持)
或make config
或make xconfig(需要Qt开发库的支持)

注意:如果你是ext3文件系统,则在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核,否则,等你启用新内核时机器就会当掉,出错信息如下:kernel panic : no init found ,try passing init = option to kernel……或者是:kernel panic:VFS:Unable to mount root fs on unknown-block(0,0),我一开始不知道,编译了好几次,系统总给我冷板凳坐,最后把对Ext3、Ext2文件系统的支持直接编译进内核,才解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下无法卸载内核模块(rmmod命令不能用)。

三、编译内核及模块

  定制好的内核配置文件(/usr/src/linux-2.6.0/.config)之后,激动的时刻到来了,编译内核及模块,

#make (此命令已完成make bzImage及make modules的工作)

  bzImage内核文件在arch/i386/boot目录中,你的CPU不同内核文件存放位置也不同,我是Intel的CPU。

  注意:我在RedHat7.2平台时曾出现无法编译的出错信息,出错信息如下:

/tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin’
make[1]: *** [usr/initramfs_data.o] Error 1
make: *** [usr] Error 2,

  重新装了个9.0的才解决此问题。

  说明:make命令在我的1.6GHz,128M的机器上跑了足足27分钟。

四、安装模块及内核文件

#make modules_install install

  以上这个命令可以分解成make modules_install与make install,make modules_install安装内核模块到/lib/modules/2.6.0下。make install完成mkinitrd命令及内核(bzImage)和System.map的拷贝,请查看/boot目录,文件名是有区别的,如是GRUB引导器,make install命令已帮你自动修改了引导选项,对于LILO则要手工修改,重写引导记录。

  说明:make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒,很快的哦。

五、后记

  最后的工作就是重启系统(#shutdown -r now),检验一下你的劳动成果吧。差点忘了还有一点,可能对你很重要,进入新内核之后我发现rpm命令不能用了,原来这是RPM的一个Bug,特别是对于RH9的用户,请打开/etc/profile文件,命令如下:

#vi /etc/profile (在文件的末尾加上几句如下)
if [`uname -r`="2.6.0" ];then
export LD_ASSUME_KERNEL=2.2.5
fi

    也就是给系统加上一个全局的环境变量,也可直接键入#export LD_ASSUME_KERNEL=2.2.5。
使用新内核可能出现的问题及对策:

  1、新内核根本起不来,解决方法:重新配置内核(学问挺大),也许还根引导记录有关(很少了);

  2、新内核模块无法加载,会导致很多问题,比如了防火墙没法工作了,mount不上光盘和vfat及ntfs文件系统,其解决方法:升级module-init-tools软件包(我是modutils-2.4.21-23.src.rpm包),RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件;

  3、RedHat用户rpm命令不能使用,解决办法:请把变量在全局配置文件中声明。

升级2.6内核到底需要进行哪些事情?
  贴出者为 cjacker
硬件驱动 cjacker写著 ‘升级2.6内核到底需要进行哪些事情? 升级到2.6是不是make config;make bzImage;make modules;make …到最后处理一下grub或lilo的配置这么简单? 本文讲述了一点升级到kernel-2.6最起码的事情,注意是最起码的:

升级2.6内核到底需要进行哪些事情?

升级到2.6是不是make config;make bzImage;make modules;make …到最后处理一下grub或lilo的配置这么简单?

本文讲述了一点升级到kernel-2.6最起码的事情,注意是最起码的:

首先你要知道2.6需要注意的几件事情:
多了一个sysfs虚拟文件系统
老版本的modutils不能用了,module-init-tools要安装。
modules.conf和modprobe.conf是怎么回事儿?
USB模块名都变了
声卡配置怎么办?kernel-2.6采用alsa, alsa的配置工具是什么?
升级kernel会导致一些软件不能使用吗?
什么版本的gcc都行吗?


好了,继续,我的系统环境:
MagicLinux 1.2pre4b, gcc-3.3.1

要升级的2.6版本是2.6.0test7

编译:
第一步很简单,按照惯例,打好补丁,配置,编译。
我仍然是打成了rpm包,打了cp936少数汉字错误的一个补丁。
SMBFS和系统文件系统缺省的codec都为cp936。
因为是作产品,所以打开了尽可能多的驱动,包括USB键盘和鼠标。

打了for i586, i686, athlon的3个包,成功。
编译initscripts, 编译modutils和module-init-tools, 编译mkinitrd
安装。

你会发现,系统多了一套modules命令,就是*.old,这就是不能用的命令,
新的命令基于这些old,由module-init-tools提供。

安装所有软件包,检查grub配置没有问题,重启。

启动过程中USB驱动载入错误。
发现自己在/etc/modules.conf中定义的alias char-major-188 off无效

检查,发现一个generate-modprobe.conf脚本:到/etc/运行。
generate-modprobe.conf modprobe.conf移植modules.conf配置。
重启:char-major-188模块找不到错误消失,说明alias char-major-188生效。

继续usb配置问题:发现/proc/bus/usb/根本不存在,这就是前面提到到sysfs问题:

代码:

1, mkdir /sys
2, 在/etc/rc.sysinit中,只要有mount -f /proc就在下面加上mount -f /sys
3, 在/etc/rc.sysinit中,找到:
   action $"Mounting proc filesystem: " mount -n -t proc /proc /proc
   加上:
   action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
4,在/etc/fstab中加上:
   none    /sys  sysfs   defaults  0 0
5,把/etc/rc.d/init.d/halt中的:
   awk ‘$2 ~ /^/$|^/proc|^/dev/{next}
   修改成:
   awk ‘$2 ~ /^/$|^/proc|^/sys|^/dev/{next}


重启,USB载入仍然错误。
但是/下已经多了一个文件系统/sys
/sys/bus/usb仍然不存在。

怎么办?手动probe模块测试:

modprobe hid
modprobe usbmouse(注意不是mousedev了和keybdev了)
lsmod看看,内核里确实加载了,但是usb鼠标纹丝不动。

忘了最重要的一个:
modprobe usb-uhci

系统提示不存在。
原来usb-uhci也没有了,usb-ohci当然也没有了。
而是uhci-hcd.

modprobe uhci-hcd,呵呵,鼠标可以用了。

修改/etc/rc.sysinit/
找到跟usb有关的信息:

代码:

usb=0
if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && ! LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
    aliases=`/sbin/modprobe -c | awk ‘/^alias usb-controller/ { print $3 }’`
    if [ -n "$aliases" -a "$aliases" != "off" ]; then
      modprobe usbcore
      for alias in $aliases ; do
        [ "$alias" != "off" ] && action $"Initializing USB controller ($alias): " modprobe $alias
      done
      [ $? -eq 0 -a -n "$aliases" ] && usb=1
    fi
fi

if ! LC_ALL=C grep -iq "nousb" /proc/cmdline 2>/dev/null && LC_ALL=C grep -q "usb" /proc/devices 2>/dev/null ; then
  usb=1
fi

if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
    action $"Mounting USB filesystem: "  mount -t usbdevfs usbdevfs /proc/bus/usb
fi

needusbstorage=
if [ $usb = "1" ]; then
    needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
    LC_ALL=C grep ‘hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
    action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
    action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
fi


大体解释一下:
定义usb变量为0
定义aliases变量为:
/sbin/modprobe -c | awk ‘/^alias usb-controller/ { print $3 }的执行结果。
aliases存在且不为空时:
载入usbcore
然后载入aliases定义的内容,
置usb为1
挂接usbdevfs
needusbstorage大概就是U盘了,这个变量跟下面几句没关系。
载入hid,键盘,鼠标驱动。

这里需要修改的是:

1,/proc/sys/usb定义是错的,应该是/sys
2,modprobe -c 能不能找到alias usb-controller,从而定义变量aliases为usb-uhci, 运行一下是不能的。
3,模块名不对,usbmouse和usbkbd才对。

根据逻辑,修改成:

代码:

modprobe usbcore
action $"Initializing USB controller (uhci-hcd): " modprobe uhci-hcd
usb=1

if [ $usb = 1 -a ! -f /sys/bus/usb/devices ]; then
    action $"Mounting USB filesystem: "  mount -t usbdevfs usbdevfs /sys/bus/usb
fi

needusbstorage=
if [ $usb = "1" ]; then
    needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
    action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
    action $"Initializing USB keyboard: " modprobe usbkbd 2> /dev/null
    action $"Initializing USB mouse: " modprobe usbmouse 2> /dev/null
fi


载入usbcore, uhci-hcd(也就是usb-uhci的新版本)
然后挂接usbdevfs,然后定义needusbstorage为以后的使用,然后就是载入鼠标键盘驱动。

检查一下rc.sysinit和/etc/rc.d/init.d/halt脚本,看看还有没有/proc/bus/usb的定义,通通搞成/sys/bus/usb.

重启,OK,模块正常载入,鼠标可以用了。

启动kde,没声。

对了,以前一直用oss,现在内核提供的是alsa.
找出一个配置工具alsaconf,这个是alsa-drivers的utils

配置,不行,找不到声卡,问题在于kernel-2.6的模块不再是.o而是.ko

修改alsaconf中所有的.o为.ko.
配置,OK,找到声卡为i810内嵌的,也就是ac97音效,正确的写入了
/etc/modules.conf,
lsmod一看,内核模块没有马上载入,说明alsaconf还是有点问题,
modprobe一下:
modprobe snd-intel8×0,OK了,内核驱动载入。
用alsa play播放:
aplay sample.wav
有声音了。


重启,lsmod看看,snd-intel8×0没有载入,/etc/modules.conf里不是有了吗?
以我的判断,肯定是正确的,试试generate-modprobe.conf,刚才那个
char-major-188的错误就是这么解决的。

做完之后,再重启,再lsmod看看,还是没有载入声卡驱动。
modprobe snd-intel8×0,出错,看来是modprobe.conf导致的,
把里面的sound相关配置通通删掉,重启后modprobe又可以出声了。

没有办法,好好读读alsaconf代码,发现了以前单独安装alsa的时候一个经典的东西:
alsasound启动进程。

这个东西也在alsadrivers的utils目录,找出来。

./alsasound start自动载入所有模块
./alsasound stop 自动卸载所有模块
OK,目的达到。
cp alsasound /etc/rc.d/init.d
chkconfig –add alsasound

再看看alsaconf原来可以进行测试声音的播放,只是以前从来没有把wav文件装上过,
拷贝一个wav文件,再次运行:
alsaconf
配置成功,然后自动载入模块成功,然后就是aplay这个wav.

OK,至此为止,基本的kernel-2.6升级工作完成了。

lsusb, usbview, kde 信息中心中usb目录定义仍然不对,所以通过这些命令你看不到系统任何usb信息
自己修正吧,其他的软件问题也不少,所以以上的工作是最基础的,所以建议大家没事不要赶什么潮流。

对了,忘了说了,kernel-2.6安装后,我测试重新编译kernel-2.6,gcc出现异常,连续测试7次,每次
都在随机的位置退出编译,说明gcc已经不能正常工作,可能又要LD_ASSUME_KERNEL,始终不是一件好事。
继续升级glibc, gcc再所难免’

Linux内核编译详解

一、内核简介
  内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
  Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。
  想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。

二、内核版本号

  由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral–教堂模型–对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。到目前为止,稳定树的最高版本是2.4.18;开发树的最新版本是2.5.10。下载内核版本请访问http://www.kernel.org。

三、为什么重新编译内核

  Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
  通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
  为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
  l 自己定制编译的内核运行更快(具有更少的代码)
  l 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
  l 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
  l 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些

四、内核编译模式

  要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。

五、新版本内核的获取和更新

  Linux内核版本发布的官方网站是http://www.kernel.org。新版本的内核…问剑恢质荈ull Source版本,另外一种是patch文件,即补丁。完整的内核版本比较大,一般是tar.gz或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般只有几十K到几百K,但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。
  编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为

#cp linux-2.4.18.tar.gz /usr/src

  让我们先来查看一下当前/usr/src的内容,注意到有一个linux-2.4的符号链接,指向一个linux-2.4.7-10(以REDHAT7.2为例)的目录。这就是你所装linux的kernel源代码,删除这个链接。

  现在解压我们下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,请使用下面的命令:

#tar -zxvf linux-2.4.18.tar.gz.tar.gz

  如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令

#bzip2 -d linux-2.4.18.tar.bz2
#tar -xvf linux-2.4.18.tar

  文件将解压到/usr/src/linux目录中,我们把它稍作修改:

#mv linux linux-2.4.18
#ln -s linux-2.4.18 linux

  如果下载的是patch文件,就可以进行patch操作(下面假设patch-2.4.18已经位于/usr/src目录下了,否则你需要先把该文件拷贝到/usr/src下):

#patch -p0 < patch-2.4.18

  
六、内核编译

  通常要运行的第一个命令是:

#cd /usr/src/linux
#make mrproper

  该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。
  确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码的。它们分别链向源代码目录下的真正的、该计算机体系结构(对于PC机来说,使用的体系结构是i386)所需要的真正的include子目录。如:asm指向/usr/src/linux/include/asm-i386等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

# cd /usr/include/
# rm -r asm linux scsi
# ln -s /usr/src/linux/include/asm-i386 asm
# ln -s /usr/src/linux/include/linux linux
# ln -s /usr/src/linux/include/scsi scsi

  这是配置非常重要的一部分。删除掉/usr/include下的asm、linux和scsi链接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。现在你应该明白为什么我们上面又在/usr/src下"多余"地创建了个名为linux的链接了吧?

  接下来的内核配置过程比较烦琐,但是配置的适当与否与日后Linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。
  
配置内核可以根据需要与爱好使用下面命令中的一个:

#make config(基于文本的最为传统的配置界面,不推荐使用)
#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)
#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)
#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

  这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令,界面如下:

  如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了,下图为make menuconfig的界面:


  选择相应的配置时,有三种选择,它们分别代表的含义如下:
  Y--将该功能编译进内核
  N--不将该功能编译进内核
  M--将该功能编译成可以在需要时动态插入到内核中的模块
  如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
  在编译内核的过程中,最烦杂的事情就是这步配置工作了,很多新手都不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。

linux的kernel2.6.10已经出来有一段时间了,现在简单介绍一下该内核的升级方法

一.准备工作:
1.安装module-init-tools-3.0.tar.bz2:(http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz )
tar -zxvf module-init-tools-3.0.tar.gz
cd module-init-tools-3.0
./configure –prefix=/sbin
make
make install
./generate-modprobe.conf /etc/modprobe.conf

2.安装modutils-2.4.26-9.i386.rpm:(大家可以在http://rpm.phone.net搜索你想要的RPM包,只是好象不支持多线程,下载有点慢)
rpm -ivh modutils-2.4.26-9.i386.rpm
如果安装不上,试试
rpm -Uvh modutils-2.4.26-9.i386.rpm

3.下载最新的内核(http://kernel.org/pub/linux/kernel/v2.6/)
linux-2.6.10.tar.bz2或者linux-2.6.10.tar.bz2(最好将内核拷到/usr/src,这样解压方便一点)
解压:
cd /usr/src
tar -jvxf linux-2.6.10.tar.bz2或者
tar -zvxf linux-2.6.10.tar.gz


二.配置内核
1.内核配置很费事,选项太多了,最好用默认的.在linux-2.6.10/arch下有很多关于各种机子的配置:
alpha cris ia64 m68knommu ppc sh sparc64 x86_64
arm h8300 m32r mips ppc64 sh64 um
arm26 i386 m68k parisc s390 sparc v850
找到你的机子对应的目录,里面会有一个defconfig文件,就是对应机子的默认配置,很不错,如果你的配置跟我的一样的话,几乎不许要改什么地方.
配置可以使用make menuconfig,make xconfig,make gconfig这三个命令中的任何一个,第一个图形界面和控制台下都能用,后两个只能在图形界面下使用,我喜欢在字符界面下工作,所以用make menucofig

cd /usr/src/linux-2.6.10
cp arch/i386/defconfig ./.config
make menuconfig或者make xconfig,make gconfig

三.编译
这一步没什么好说的,不需要你做什么
make
make modules
make modules_install
make install
如果你想偷懒的话可以用:
make && make modules && make modules_install && make install
然后就可以去喝杯咖啡,休息一下什么的.如果你想让它编译完连机子都关了的话,用下面这条命令
make && make modules && make modules_install && make install && poweroff

四.要解决的问题
1.不认识root=LABEL/的问题:
如果重新启动新内核无法进入出现root=LABEL/不能识别,用原来的内核启动系统,编辑/boot/grub/grub.conf
vi /boot/grub/grub.conf

找到:
title Red Hat Linux (2.6.10)
root (hd0,3)
kernel /boot/vmlinuz-2.6.10 ro root=LABEL=/
initrd /boot/initrd-2.6.10.img
去掉 root=LABEL=/
title Red Hat Linux (2.6.10)
root (hd0,3)
kernel /boot/vmlinuz-2.6.10 ro
initrd /boot/initrd-2.6.10.img
重启.

2.Hotplug问题(源自snoopyxp大哥的<<2.4->2.6内核升级指南>>)
当然, 首先要在内核配置时配置了HOTPLUG的支持. 然后, 由于/proc/ksyms改名为/proc/kallsyms, 所以必需修改启动脚本/etc/rc.sysinit. 为了兼容原有的linux-2.4.x系统, 可以加上下面几行:

#
# —– KERNEL 2.6.x support ——
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi


后, 把rc.sysinit文件中所有出现/proc/ksyms的地方都换成"$KSYMS"变量引用. 配置好后,
还必需下载hotplug的用户态辅助工具包:http://www.kernel.org/pub/linux/uti…
4_03_11.tar.gz. 解开这个包以后, 直接"make install"就可以了. 它将产生/etc/hotplug/配置目录.


3.USB问题
USB问题主要是因为2.6内核中的这些模块已经改名了
USB-2.0的host控制器的内核模块名字仍然是ehci-hcd
USB-1.1的host控制器的内核模块名字已经从usb-ohci改为ochi-hcd
通用USB host控制器的内核模块名字已经从usb-uhci该为uhci-hcd.
USB键盘的模块名字从keybdev变为usbkbd
支持USB鼠标的模块名字也从mousedev改为usbmouse
因此, 我们必需修改启动脚本/etc/rc.sysinit文件. 同时必须兼容原有的2.4.x系统:

首先修改/etc/modprobe.conf
找到:
alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

把它改为:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

修改/etc/rc.sysinit
2.6内核默认将HID编进内核,这样将不会生成hid,usbmouse,和usbkbd模块,也不会有USBMOUSE,USBKEYBOARD选项
Device Drivers—>
USB support—>
<*>USB Human Interface Device(full HID)support
[*]HID layer inout support
[ ]/dev/hiddev raw HID device support
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#MOdify by June.Hn.
#2.6内核中找不到usbdevfs
#odl:
#if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
# action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
#fi
if [ "$KERNELVER" = "2.4" ]; then
if [ $usb = 1 -a ! -f /proc/bus/usb/devices ]; then
action $"Mounting USB filesystem: " mount -t usbdevfs usbdevfs /proc/bus/usb
fi
fi
#end
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

needusbstorage=
if [ $usb = "1" ]; then
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Add by June.Hn.
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
#LC_ALL=C grep ‘hid’ /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null
else

#end
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ‘hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#Modify by June.Hn.
#2.6内核中被编进内核,不需要加载
#old:
#action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
#action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
#new:
if [ "$KERNELVER" = "2.4" ]; then
action $"Initializing USB keyboard: " modprobe keybdev 2> /dev/null
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
fi
#end
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
fi

如果把USB Human Interface Device(full HID)support编译成模块,有USBMOUSE,USBKEYBOARD选项
Device Drivers—>
USB support—>
<m>USB Human Interface Device(full HID)support
[*]HID layer inout support
[ ]/dev/hiddev raw HID device support
USB HID Boot Protocol drivers—>
[*]USB HIDBP Keyboard(simple Boot)support
[*]USB HIDBP Mouse(simple Boot)support
如果你要把它作为模块,请参考snoopyxp大哥的<<2.4->2.6内核升级指南>>中的这一段

# —– KERNEL 2.6.x support ——
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
fi

然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME. 把脚本文件/etc/rc.sysinit中的needusbstorage部分从:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ‘hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null

action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

改为:

needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ‘hid’ /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe usbhid 2> /dev/null
else
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ‘hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi

2005年11月13日
内容:


准备好了就开始轮循
日志工具
定制的日志
Webmin 中的日志配置
您生活中的日志
参考资料
关于作者
对本文的评价
相关内容:
路线图的其他文章
Addressing security issues in Linux
理解 Linux 配置文件
Linux 用户技术 FAQ
developerWorks Toolbox subscription
订阅:
developerWorks 时事通讯

使用日志

级别: 初级

Chris Walden
电子商务架构师, IBM Developer Relations
2003 年 3 月

Column iconIBM 电子商务架构师 Chris Walden 将通过他在 developerWorks 上发表的九篇系列文章来指导您如何在 Linux 环境中运用您的 Windows 操作技巧。在本部分,我们追踪、处理和轮循日志,以增强系统安全,收集信息。

成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。Linux 中提供了异常日志,并且日志的细节是可配置的。

Linux 日志都以明文形式存储,所以您不需要特殊的工具就可以搜索和阅读它们。您还可以编写脚本,来扫描这些日志,并基于它们的内容去自动执行某些功能。

Linux 日志存储在 /var/log 目录中。这里有几个由系统维护的日志文件,但其他服务和程序也可能会把它们的日志放在这里。大多数日志只有 root 才可以读,不过只需要修改文件的访问权限就可以让其他人可读。

/var/log/messages
messages 日志是核心系统日志文件。它包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO 错误、网络错误和其他系统错误都会记录到这个文件中。其他信息,比如某个人的身份切换为 root,也在这里列出。如果服务正在运行,比如 DHCP 服务器,您可以在 messages 文件中观察它的活动。通常,/var/log/messages 是您在做故障诊断时首先要查看的文件。

/var/log/XFree86.0.log
这个日志记录的是 Xfree86 Xwindows 服务器最后一次执行的结果。如果您在启动到图形模式时遇到了问题,一般情况从这个文件中会找到失败的原因。

其他日志
根据您的 Linux 发行版本以及您所运行的服务和应用程序的不同,/var/log 目录下还会有其他日志文件。例如,可能会有与邮件服务器、资源共享、自动任务等相关的日志。

准备好了就开始轮循
您将看到,/var/log 目录下有一些文件以一个数字结尾,这些是已轮循的归档文件。日志文件会变得特别大,特别笨重。Linux 提供了一个命令来轮循这些日志,以使您的当前日志信息不会淹没在旧的无关信息之中。 logrotate 通常是定时自动运行的,但是也可以手工运行。当执行后,logrotate 将取得当前版本的日志文件,然后在这个文件名最后附加一个“.1”。其他更早轮循的文件为“.2”、“.3”,依次类推。文件名后的数字越大,日志就越老。

您可以通过编辑 /etc/logrotate.conf 文件来配置 logrotate 的自动行为。通过 man logrotate 来学习 logrotate 的全部细节。

日志工具
任何文本工具都可以用来处理日志文件。下面是一些特别有用的工具。

dmesg
使用 dmesg 命令可以快速查看最后一次系统引导的引导日志。通常它的内容会很多,所以您往往会希望将其通过管道传输到一个阅读器。

dmesg | more 

上面的命令将以分页的方式显示引导信息。

tail
有时,当某些行为发生时,您会希望密切关注一个日志文件。 Tail 命令设计用于显示文本文件的最后几行。使用 -f 开关,当日志增加新的内容时, tail 将继续显示新的输出。

tail -f /var/log/messages

上面的命令将显示 /var/log/messages 文件的最后 10 行,然后继续监控那个文件,并输出新的行为。要停止 tail -f 命令,使用 Ctrl + C 来中止进程。

more
More 的工作方式与 DOS 版本相同。您可以将它指向一个文件,或者通过它以管道输出信息,以分页的方式来查看信息。例如,以分页方式显示 Xfree86 启动日志文件的内容:

more /var/log/XFree86.0.log

使用“q”或者 [Ctrl]-C 来停止查看文件。

less
Less 是另一个文本阅读器,不过它还允许在文件中滚动浏览以及检索信息。

less /var/log/messages

上面的命令将显示 /var/log/messages 文件的内容。使用“q”来停止查看文件。使用“h”来获得 less 的使用帮助。

logger
您可能会希望将自己的消息也记录到日志文件。您可以只是将日志消息附加到恰当的文本文件,但是您必须得套用日志信息格式。同样,如果日志系统被定制,您还将不得不修改您的代码。l logger 命令使您可以将自己的消息发送到日志工具。在脚本中使用它来提供关于执行和错误的消息。

定制的日志
有两个服务,或者称之为后台程序,在控制日志,分别是 klogdsyslogdklogd 只处理内核消息, syslogd 处理其他系统消息,比如应用程序。您可以通过编辑 /et/syslog.conf 和 /etc/sysconfig/syslog 来配置它们的行为。完全定制日志超出了本文的范围,不过在本文最后的 参考资料 列表中可以找到详细的资料。您也可以查看 /etc/syslogd.conf 的 man 页面来进一步学习。

本质上,软件所产生的每一条消息都提供一些信息用于确定消息是从哪里来的以及这个消息是什么。/etc/syslog.conf 文件允许您来指定如何处理那种类型的消息。您可以将它转储到消息文件,也可以将它转储到一个定制的文件。您可以将它发送到远程的主机,由远程主机来根据其自己的 syslogd 配置来处理它。远程日志是一个非常好的安全功能。通过将您的日志放置到远程系统中,您可以防止有人通过改变日志文件来掩饰其踪迹。

下面是取自 man /etc/syslog.conf 页面中的一个定制日志的例子:




              # Kernel messages are first, stored in the kernel
              # file, critical messages and higher ones also go
              # to another host and to the console
              #
              kern.*                       /var/adm/kernel
              kern.crit                    @finlandia
              kern.crit                    /dev/console
              kern.info;kern.!err          /var/adm/kernel-info

第一个规则将所有内核消息定向到 /var/adm/kernel 文件。

第二个语句将所有优先级为 crit 或者更高的内核消息定向到一个名为 finlandia 的远程主机。这是有用的,因为如果主机崩溃以及磁盘错误无法恢复,您将无法读取存储的消息。如果那些消息同时在远程主机上也存在,您就依然可以找出崩溃的原因。

第三个规则将这些消息定向到实际的控制台,这样,在这台机器上工作的人也可以看到它们。

第四行告诉 syslogd 将所有优先级为 info 到 warning 的内核消息保存到 /var/adm/kernel-info 文件。所有优先级为 err 以及更高的消息不包括在内。

像这种定制日志的能力为 Linux 环境提供了极大的灵活性与可控制性。

Webmin 中的日志配置
Webmin 有一个用于操作日志文件的模块。

图 1. Webmin 系统日志视图
图 1. Webmin 系统日志视图

显示了所有配置的日志文件。点击一个日志文件来编辑它的配置。

图 2. Webmin 日志编辑屏幕
图 2. Webmin 日志编辑屏幕

或者您可以点击 View 来查看日志文件的内容。

在控制台中查看日志文件
由于 Linux 中的日志文件以明文的形式记录,所以不需要特殊的工具来解释它们。任何文本文件阅读器都可以显示 Linux 日志文件。浏览器,比如 Mozilla,可以显示日志文件,并且提供搜索功能。Linux 还有控制台工具可以查看文本文件。 more ,如同 MS DOS 版本一样以分页方式显示文件。 less 命令将在只读阅读器中显示文件,这个阅读器具有双向滚动和搜索的功能。现在,在命令行中输入 less /var/log/messages ,体会一下这个命令。

Webmin 模块与 /etc/syslog.conf 文件相关联,因此您对其中一个所做的修改会影响另一个。

您生活中的日志
Linux 中的日志文件对于系统的故障诊断和维护来说至关重要。Linux 日志记录到文本文件,所以不需要专门的工具来查看这些文件。文本文件也容易用于定制脚本和程序。

日志被轮循,以避免变得过大,同时可以将当前信息与老的数据相分离。日志轮循是可配置的。

日志是高度可配置的,为了安全和备份,日志甚至可以存储到单独的系统中。您可以让自己的脚本和程序产生系统日志消息,这些消息将被 syslogd 后台进程识别出并进行处理。

参考资料

关于作者
Chris Walden 是位于德克萨斯州奥斯汀的 IBM Developer Relations Technical Consulting(也称为 dragonslayers )的一名电子商务架构师,该公司为 IBM 商业伙伴提供教育、实现和咨询。他致力于 Linux 相关工作,一有机会就向身边的人宣传 Linux 的种种好处。除了完成他的架构师的职责之外,他还精通 Linux 基础设施服务器的各个领域,包括混合平台用户环境下的文件、打印以及其他应用服务等。Chris 有 10 年的计算机行业经验,从现场支持到 Web 应用开发和顾问,各个领域他都曾涉足。您可以通过 cmwalden-at-us.ibm.com 与 Chris 联系。

本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。

  阅读Linux源代码,无疑是深入学习Linux的最好方法。在本文对Linux启动过程的介绍中,我们也尝试从源代码的视角来更深入的剖析Linux 的启动过程,所以其中也简单涉及到部分相关的Linux源代码,Linux启动这部分的源码主要使用的是C语言,也涉及到了少量的汇编。而启动过程中也执行了大量的shell(主要是bash shell)所写脚本。为了方便读者阅读,笔者将整个Linux启动过程分成以下几个部分逐一介绍,大家可以参考下图:

  当用户打开PC 的电源,BIOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux, Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

下面就将逐一介绍其中几个关键的部分:



  第一部分:内核的引导(核内引导)

  Red Hat9.0可以使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU的控制权,然后CPU就开始执行Linux的核心映象代码,开始了Linux启动过程。这里使用了几个汇编程序来引导Linux,这一步泛及到Linux源代码树中的“arch/i386/boot”下的这几个文件:bootsect.S、setup.S、video.S等。

  其中 bootsect.S是生成引导扇区的汇编源码,它完成加载动作后直接跳转到setup.S的程序入口。setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到特别内存中,以便以后这些参数被保护模式下的代码来读取。此外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到 0×100000。

  那么0×100000这个内存地址中存放的是什么代码?而这些代码又是从何而来的呢?

  0×100000这个内存地址存放的是解压后的内核,因为Red Hat提供的内核包含了众多驱动和功能而显得比较大,所以在内核编译中使用了“makebzImage”方式,从而生成压缩过的内核,在RedHat中内核常常被命名为vmlinuz,在Linux的最初引导过程中,是通过"arch/i386/boot/compressed/"中的head.S利用 misc.c中定义的decompress_kernel()函数,将内核vmlinuz解压到0×100000的。

  当CPU跳到 0×100000时,将执行"arch/i386/kernel/head.S"中的startup_32,它也是vmlinux的入口,然后就跳转到 start_kernel()中去了。start_kernel()是"init/main.c"中的定义的函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。start_kernel()函数中,做了大量的工作来建立基本的Linux核心环境。如果顺利执行完 start_kernel(),则基本的Linux核心环境已经建立起来了。

  在start_kernel()的最后,通过调用init ()函数,系统创建第一个核心线程,启动了init过程。而核心线程init()主要是来进行一些外设初始化的工作的,包括调用 do_basic_setup()完成外设及其驱动程序的加载和初始化。并完成文件系统初始化和root文件系统的安装。

  当 do_basic_setup()函数返回init(),init()又打开了/dev/console设备,重定向三个标准的输入输出文件stdin、 stdout和stderr到控制台,最后,搜索文件系统中的init程序(或者由init=命令行参数指定的程序),并使用 execve()系统调用加载执行init程序。到此init()函数结束,内核的引导部分也到此结束了。

第二部分:运行init



  init的进程号是1,从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序,。init程序需要读取配置文件/etc/inittab。inittab是一个不可执行的文本文件,它有若干行指令所组成。在Redhat系统中,inittab的内容如下所示(以“###"开始的中注释为笔者增加的):

  #
  # inittab This file describes how the INIT process should set up
  # the system in a certain run-level.
  #
  # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
  # Modified for RHS Linux by Marc Ewing and Donnie Barnes
  #

  # Default runlevel. The runlevels used by RHS are:
  # 0 – halt (Do NOT set initdefault to this)
  # 1 – Single user mode
  # 2 – Multiuser, without NFS (The same as 3, if you do not havenetworking)
  # 3 – Full multiuser mode
  # 4 – unused
  # 5 – X11
  # 6 – reboot (Do NOT set initdefault to this)
  #
  ###表示当前缺省运行级别为5(initdefault);
  id:5:initdefault:

  ###启动时自动执行/etc/rc.d/rc.sysinit脚本(sysinit)
  # System initialization.
  si::sysinit:/etc/rc.d/rc.sysinit

  l0:0:wait:/etc/rc.d/rc 0
  l1:1:wait:/etc/rc.d/rc 1
  l2:2:wait:/etc/rc.d/rc 2
  l3:3:wait:/etc/rc.d/rc 3
  l4:4:wait:/etc/rc.d/rc 4
  ###当运行级别为5时,以5为参数运行/etc/rc.d/rc脚本,init将等待其返回(wait)
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6

  ###在启动过程中允许按CTRL-ALT-DELETE重启系统
  # Trap CTRL-ALT-DELETE
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  # When our UPS tells us power has failed, assume we have a few minutes
  # of power left. Schedule a shutdown for 2 minutes from now.
  # This does, of course, assume you have powerd installed and your
  # UPS connected and working correctly.
  pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

  # If power was restored before the shutdown kicked in, cancel it.
  pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

  ###在2、3、4、5级别上以ttyX为参数执行/sbin/mingetty程序,打开ttyX终端用于用户登录,
  ###如果进程退出则再次运行mingetty程序(respawn)
  # Run gettys in standard runlevels
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  ###在5级别上运行xdm程序,提供xdm图形方式登录界面,并在退出时重新执行(respawn)
  # Run xdm in runlevel 5
  x:5:respawn:/etc/X11/prefdm -nodaemon

 以上面的inittab文件为例,来说明一下inittab的格式。其中以#开始的行是注释行,除了注释行之外,每一行都有以下格式:



  id:runlevel:action:process

  对上面各项的详细解释如下:

  1. id

  id是指入口标识符,它是一个字符串,对于getty或mingetty等其他login程序项,要求id与tty的编号相同,否则getty程序将不能正常工作。

  2. runlevel

  runlevel是init所处于的运行级别的标识,一般使用0-6以及S或s。0、1、6运行级别被系统保留:其中0作为shutdown动作,1作为重启至单用户模式,6为重启;S和s意义相同,表示单用户模式,且无需inittab文件,因此也不在inittab中出现,实际上,进入单用户模式时,init直接在控制台(/dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了2、3、4、5几个级别,在 Redhat系统中,2表示无NFS支持的多用户模式,3表示完全多用户模式(也是最常用的级别),4保留给用户自定义,5表示XDM图形登录方式。7- 9级别也是可以使用的,传统的Unix系统没有定义这几个级别。runlevel可以是并列的多个值,以匹配多个运行级别,对大多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。

  3. action

  action是描述其后的process的运行方式的。action可取的值包括:initdefault、sysinit、boot、bootwait等:

  initdefault是一个特殊的action值,用于标识缺省的启动级别;当init由核心激活以后,它将读取inittab中的 initdefault项,取得其中的runlevel,并作为当前的运行级别。如果没有inittab文件,或者其中没有initdefault项, init将在控制台上请求输入runlevel。

  sysinit、boot、bootwait等action将在系统启动时无条件运行,而忽略其中的runlevel。

  其余的action(不含initdefault)都与某个runlevel相关。各个action的定义在inittab的man手册中有详细的描述。

  4. process

  process为具体的执行程序。程序后面可以带参数。

  第三部分:系统初始化

  在init的配置文件中有这么一行:

  si::sysinit:/etc/rc.d/rc.sysinit

  它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

  rc.sysinit约有850多行,但是每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户可以自行阅读自己机器上的该文件,以了解系统初始化所详细情况。由于此文件较长,所以不在本文中列出来,也不做具体的介绍。

  当rc.sysinit程序执行完毕后,将返回init继续下一步。

第四部分:启动对应运行级别的守护进程



  在rc.sysinit执行后,将返回init继续其它的动作,通常接下来会执行到/etc/rc.d/rc程序。以运行级别3为例,init将执行配置文件inittab中的以下这行:

  l5:5:wait:/etc/rc.d/rc 5

  这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行 /etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受 start、stop、restart、status等参数。

  /etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以 /var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当 init改变运行级别时,所有相关的守护进程都将重启。

  至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。常见的守护进程有:

  amd:自动安装NFS守护进程
  apmd:高级电源管理守护进程
  arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库
  autofs:自动安装管理进程automount,与NFS相关,依赖于NIS
  crond:Linux下的计划任务的守护进程
  named:DNS服务器
  netfs:安装NFS、Samba和NetWare网络文件系统
  network:激活已配置网络接口的脚本程序
  nfs:打开NFS服务
  portmap:RPC portmap管理器,它管理基于RPC服务的连接
  sendmail:邮件服务器sendmail
  smb:Samba文件共享/打印服务
  syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本
  xfs:X Window字型服务器,为本地和远程X服务器提供字型集
  Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务

  这些守护进程也启动完成了,rc程序也就执行完了,然后又将返回init继续下一步。

第五部分:建立终端



  rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。init接下来会打开6个终端,以便用户登录系统。通过按Alt+Fn(n对应1-6)可以在这6个终端中切换。在inittab中的以下6行就是定义了6个终端:

  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。

  第六部分:登录系统,启动完成

  对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。而本文主要讲的还是文本方式登录的情况:

  当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。

  Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。 /etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

  在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。

  login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在 /usr/spool/mail/的对应用户名目录下)。然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。

  希望通过上面对Linux启动过程的剖析能帮助那些想深入学习Linux用户建立一个相关Linux启动过程的清晰概念,进而可以进一步研究Linux接下来是如何工作的。

2005年11月11日
linux-2.6内核升级文档(全)
http://www.chinaunix.net 作者:killua  发表于:2005-01-18 18:17:33
发表回复】【查看论坛原帖】【添加到收藏夹】【关闭




       做一件事情,首先要知道自己在干什么,而不是盲目得升级内核,现在升级内核有点泛滥,sigh

       首先让我们先了解一下2.6内核的新特性

       

一、01.模块子系统(Module Subsystem)、统一设备模型(Unified Device Model)和 PnP 支持

       模块子系统发生了重大变化。

       

    02.稳定性有所提高

           为了彻底避免内核加载或者导出正在被使用的内核模块,或者至少为了减少加载或者卸载模块的同时使用该模块的可能性

       (这有时会导致系统崩溃),内核加载和导出内核模块的过程都得到了改进。

       

    03.统一设备模型

       统一设备模型的创建是 2.6 内核最重要的变化之一。它促进了模块接口的标准化,其目的是更好地控制和管理设备,例如: 

       

       更准确地确定系统设备。

       电源管理和设备电源状态。

       改进的系统总线结构管理。

       

    04.即插即用(PnP)支持

           1.1.1 和 1.1.2 小节中提及的变化使得运行 2.6 内核的 Linux 成为一个真正即插即用的 OS。

       例如,对 ISA PnP 扩展、遗留 MCA 和 EISA 总线以及热插拔设备的 PnP 支持。

       

    05.内核基础设施的变化              

       为了区别以 .o 为扩展名的常规对象文件,内核模块现在使用的扩展名是 .ko。

       创建了新的 sysfs 文件系统,当内核发现设备树时就会描述它。

       内存支持,NUMA 支持

       支持更大数量的 RAM       

       2.6 内核支持更大数量的 RAM,在分页模式下最高可达 64GB。

       

    06.NUMA

       对非一致内核访问(Non-Uniform Memory Access - NUMA)系统的支持是 2.6 内核中新出现的。

       

    07.线程模型,NPTL

       相对于 v2.4 的 LinuxThreads,在版本 2.6 中新出现的是 NPTL(Native POSIX Threading Library)。 

       NPTL 为 Linux 带来了企业级线程支持,提供的性能远远超过了 LinuxThreads。它所基于的用户与内核线程的比率是 1:1。

       

       在 2003 年 10 月,GNU C 程序库 glibc 中融入了 NPTL 支持,Red Hat 率先在 Red Hat Linux 9 和 

       Red Hat Enterprise Linux 中使用定制的 v2.4 内核实现了 NPTL。

       

    08.性能改进       

       新的调度器算法

           2.6 Linux 内核引入了新的 O(1) 算法。在高负载情况下它运行得特别好。新的调度器基于每个 CPU 来分布时间片,

       这样就消除了全局同步和重新分配循环,从而提高了性能。

       

       内核抢占(Kernel Preemption)

       新的 2.6 内核是抢占式的。这将显著地提高交互式和多媒体应用程序的性能。

       

       I/O 性能改进

           Linux 的 I/O 子系统也发生了重大的变化,通过修改 I/O 调度器来确保不会有进程驻留在队列中过长时间等待进行输入/输出操作,

       这样就使得 I/O 操作的响应更为迅速。

       

       快速用户空间互斥(Fast User-Space Mutexes)

          “futexes”(快速用户空间互斥)可以使线程串行化以避免竞态条件,引入它也提高了响应速度。

       通过在内核空间中部分实现“futexes”以允许基于竞争设置等待任务的优先级而实现改进。



    09.扩展性改进       

       处理器数目更多

       Linux 内核 2.6 最多可以支持 64 个 CPU。支持更大的内存,归功于 PAE(物理地址扩展,Physical Address Extensions),在 32-位系统上分页模式下所支持的内存增加到了 64GB。



       用户和组

       惟一用户和组的数量从 65,000 增至 40 多亿,也就是从 16-位增加到了 32-位。 



       PID 的数量

       PID 的最大数量从 32,000 增至 10 亿。 



       打开文件描述符的数量

       打开文件描述符的数量没有增加,但是不再需要事先设置该参数,它将自行调节。



    10.支持更多的设备

           在 Linux 内核 2.6 之前,内核中有可以约束大型系统的限制,比如每条链 256 个设备。v2.6 内核彻底地打破了这些限制,

       不但可以支持更多类型的设备,而且支持更多同类型的设备。在 Linux 2.6 系统中,可以支持 4095 种主要的设备类型,

       每一个单独的类型可以有超过一百万个子设备。

       文件系统大小

       Linux 内核 2.6 所允许的可寻址文件系统大小最大为 16 TB。 



    11.文件系统

           ext2、ext3 和 ReiserFS 等传统 Linux 文件系统得到了显著的改进。最值得注意的改进是扩展属性(或文件元数据)的引入。

       最重要的是 POSIX ACL 的实现,这是对普通 UNIX 权限的扩展,可以支持更细化的用户访问控制。

       

    12.除了对传统 Linux 文件系统的改进支持以外,新的内核完全支持在 Linux 中相对较新的 XFS 文件系统。       

       Linux 2.6 内核现在还引入了对 NTFS 文件系统的改进的支持,现在允许以读/写模式安装 NTFS 文件系统。



    基于以上2.6的新特性,我决定用2.6的内核,我的系统为Red Hat Enterprise Linux AS release 3 (Taroon Update 3)

硬件环境为DELL 2850



一、下载解压并打上内核补丁

我以2.6.10为例子,patche以bk4的例子,目的只是让大家知道怎么打patch,

其实本人用的是2.6.6的内核,因为在AS3.0上升级到2.6.9以上的内核,

mount大的nfs网络硬盘时,df 显示不正确,明明是800G的盘变成4.2G,

不过还是能正常用,我升级过nfs和mount的包都没用,/var/log/message里

提示是[color=red:f40f9b3e79]kernel: nfs warning: mount version older than kernel[/color:f40f9b3e79],

还望知道的 告知一声,谢 :)    BTW:2.6.8的内核没用过 



    内核源代码:[url]http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.bz2[/url]

    最新内核补丁:[url]http://www.kernel.org/pub/linux/kernel/v2.6/snapshots/patch-2.6.10-bk4.bz2[/url]



    cd /usr/src

    rm -rf linux

    tar jxf /download/linux-2.6.10.tar.bz2

    ln -s linux-2.6.10 linux

    cd linux

    bunzip2 -dv /download/patch-2.6.10-bk4.bz2 |patch -p1

    如果在/usr/src目录下就用patch -p0



二、修改内核源代码 (升级2.6就是为了优化,干脆连源代码也改了吧)

   

    1.修改/usr/src/linux/include/linux/posix_types.h 

      设置fd_set支持的最大数量  

      #define __FD_SETSIZE 1024 —> 65536     

    

    2.修改/usr/src/linux/include/linux/fs.h 

      设置最大打开文件数量(TCP连接数量)

      #define INR_OPEN 1024 —> 65536 

      #define NR_FILE 8192 —> 65536 

      #define NR_RESERVED_FILES 10 —> 128 

     

    3.修改/usr/src/linux/include/net/tcp.h 

      设置TIMEOUT的时间为1秒

      #define TCP_TIMEWAIT_LEN (60*HZ) 60 —> 1*HZ 

      设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上 也是减少重试时间 

      #define TCP_SYNACK_RETRIES  5 —> 3 



针对RHEL-AS3本来就是稳定+优化的,不过就算你用 RHEL-AS3 自己的内核,那也要修改一下上面的参数才好呀 :)



三、安装必要的工具



    1.下载module-init-tools-3.1.tar.bz2

  [url]http://www.kernel.org/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.1.tar.bz2[/url]

[code:1:f40f9b3e79]        ./configure --prefix=/

        make moveold

        make all install

        ./generate-modprobe.conf /etc/modprobe.conf[/code:1:f40f9b3e79]

    2.下载新的mkinitrd

   [url]ftp://195.220.108.108/linux/6/fedora/core/3/i386/os/Fedora/RPMS/mkinitrd-4.1.18-2.i386.rpm[/url]

它需要lvm2 device-mapper

[url]ftp://195.220.108.108/linux/6/fedora/core/3/i386/os/Fedora/RPMS/device-mapper-1.00.19-2.i386.rpm[/url]

[url]ftp://195.220.108.108/linux/6/fedora/core/3/i386/os/Fedora/RPMS/lvm2-2.00.25-1.01.i386.rpm[/url]

如果不更新这个包在make install时会提示以下错误:

[code:1:f40f9b3e79]        No module mptbase found for kernel 2.6.10-bk4, aborting.

        mkinitrd failed

        make[1]: *** [install] Error 1

        make: *** [install] Error 2[/code:1:f40f9b3e79]

安装lvm2-2.00.25-1.01.i386.rpm时请用rpm -ivh --nodeps package name



四、make menuconfig

    [code:1:f40f9b3e79]01.Code maturity level options  --->

        [*] Prompt for development and/or incomplete code/drivers                  

        [*]   Select only drivers expected to compile cleanly                            

    02.General setup  --->

        [*] Support for paging of anonymous memory (swap)                      

        [*] System V IPC                                                                 

        [*] POSIX Message Queues                                                         

        [ ] BSD Process Accounting                                                      

        [*] Sysctl support                                                                 

        [ ] Auditing support                                                                

        [ ] Support for hot-pluggable devices                                               

        [*] Kernel Userspace Events                                                        

        [ ] Kernel .config support                                                         

        [*] Configure standard kernel features (for small systems)  --->   

      [*]   Load all symbols for debugging/kksymoops                                        

              [ ]     Do an extra kallsyms pass                                                     

              [*]   Enable futex support                                                            

              [*]   Enable eventpoll support                                                        

              [ ]   Optimize for size                                                               

              [*]   Use full shmem filesystem

    03.Loadable module support  --->         

        [*] Enable loadable module support                                         

        [*]   Module unloading                                                        

        [ ]     Forced module unloading                                              

        [ ]   Module versioning support (EXPERIMENTAL)                               

        [ ]   Source checksum for all modules                                        

        [*]   Automatic kernel module loading 

    04.Processor type and features  --->  

           Subarchitecture Type (PC-compatible)  --->   

           Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)  --->   

       [*] Generic x86 support                                    

       [ ] HPET Timer Support                                     

       [*] Symmetric multi-processing support      多CPU               

       (8)   Maximum number of CPUs (2-255)                       

       [*]   SMT (Hyperthreading) scheduler support               

       [*] Preemptible Kernel                     抢占式内核,请选上它    

       [ ] Machine Check Exception                                

       < > Toshiba Laptop support                                 

       < > Dell laptop support                                    

       < > /dev/cpu/microcode - Intel IA32 CPU microcode support  

       < > /dev/cpu/*/msr - Model-specific register support       

       < > /dev/cpu/*/cpuid - CPU information support             

           Firmware Drivers  --->                                 

           High Memory Support (4GB)  --->         高内存              

       [ ] Allocate 3rd-level pagetables from highmem             

       [ ] Math emulation                                         

       [*] MTRR (Memory Type Range Register) support              

       [*] Enable kernel irq balancing                            

       [ ] Use register arguments (EXPERIMENTAL)       

    05.Power management options (ACPI, APM)  --->    电源管理 自定 (偶没选) 

    06.Bus options (PCI, PCMCIA, EISA, MCA, ISA)  ---> 板卡支持  自定

        [*] PCI support                                                                   

        PCI access mode (Any)  --->                                               

        [ ] Message Signaled Interrupts (MSI and MSI-X)                                

        [*] Legacy /proc/pci interface                                                    

        [*] PCI device name database                                                      

        [ ] ISA support                                                                   

        [ ] MCA support                                                                   

        < > NatSemi SCx200 support

    07.Executable file formats  --->

        [*] Kernel support for ELF binaries                                               

        <M> Kernel support for a.out and ECOFF binaries                                  

        <M> Kernel support for MISC binaries       

    08.Device Drivers  --->   设备驱动及网络支持

       Generic Driver Options  --->  默认

            [*] Select only drivers that don't need compile-time external firmware                    

            [*] Prevent firmware from being built                                     

        Memory Technology Devices (MTD)  --->  不选

      Parallel port support  --->    并行端口   自定(偶没选)       

        Plug and Play support  --->    支持热插拔 自定(偶没选)

      Block devices  --->

            <*> Normal floppy disk support                                     

            < > Compaq SMART2 support                                          

            < > Compaq Smart Array 5xxx support                                

            < > Mylex DAC960/DAC1100 PCI RAID Controller support               

            < > Micro Memory MM5415 Battery Backed RAM support (EXPERIMENTAL)  

            <M> Loopback device support                                        

            < >   Cryptoloop Support                                           

            <M> Network block device support                                   

            < > Promise SATA SX8 support                                       

            <M> RAM disk support                                               

            (16)  Default number of RAM disks                                  

            (4096) Default RAM disk size (kbytes)                              

            ()  Source directory of cpio_list                                  

            [ ] Support for Large Block Devices                                

            < > Packet writing on CD/DVD media                                 

                 IO Schedulers  --->   IO调度器,都选上吧 可以在grub.conf指定用IO调度哪种方式,后面会讲的                      

                     <*> Anticipatory I/O scheduler                             

                     <*> Deadline I/O scheduler                                 

                     <*> CFQ I/O scheduler           

      ATA/ATAPI/MFM/RLL support  --->   ATA设备 自定 (偶没选)

      SCSI device support  --->       SCSI设备 自定我有scsi的设备所以有以下选项

            <*> SCSI device support                                                                

            [*]   legacy /proc/scsi/ support                                                        

            ---   SCSI support type (disk, tape, CD-ROM)                                            

            <*>   SCSI disk support                               

      因为偶式MPT的SCSI,所以以下都没选,省略之

      Multi-device support (RAID and LVM)  --->  支持RAID和LVM(逻辑卷)  自定

            [*] Multiple devices driver support (RAID and LVM)       

            <*>   RAID support                                       

            < >     Linear (append) mode                             

            <*>     RAID-0 (striping) mode                           

            < >     RAID-1 (mirroring) mode                          

            < >     RAID-10 (mirrored striping) mode (EXPERIMENTAL)  

            <*>     RAID-4/RAID-5 mode                               

            < >     RAID-6 mode (EXPERIMENTAL)                       

            <*>     Multipath I/O support                            

            < >     Faulty test module for MD                        

            <*>   Device mapper support                              

            < >     Crypt target support                             

            < >     Snapshot target (EXPERIMENTAL)                   

            < >     Mirror target (EXPERIMENTAL)                     

            < >     Zero target (EXPERIMENTAL)                 

      Fusion MPT device support  --->    偶的SCSI是这个,所以选了 还是自定               

<*> Fusion MPT (base + ScsiHost) drivers                                  

            (40)  Maximum number of scatter gather entries                              

            <*>   Fusion MPT misc device (ioctl) driver   

      IEEE 1394 (FireWire) support  --->  自定  (偶没选)

      I2O device support  --->     自定  (偶没选)

      Networking support  --->     网络选项

       [*] Networking support                                                                 

                 Networking options  --->                                       

    <*> Packet socket                                                                       

                     [ ]   Packet socket: mmapped IO                                                         

                     < > Netlink device emulation                                                            

                     <*> Unix domain sockets        如果你有网络就选                                                         

                     < > PF_KEY sockets                                                                      

                     [*] TCP/IP networking                                                                   

                     [ ]   IP: multicasting                                                                  

                     [ ]   IP: advanced router                                                               

                     [ ]   IP: kernel level autoconfiguration                                                

                     < >   IP: tunneling                                                                     

                     < >   IP: GRE tunnels over IP                                                           

                     [ ] IP: ARP daemon support (EXPERIMENTAL)                                               

                     [*] IP: TCP syncookie support (disabled per default)
     能防DOS攻击,但会降低一点性能,总的说性价比不错                               

                     < > IP: AH transformation                                                               

                     < > IP: ESP transformation                                                              

                     < > IP: IPComp transformation                                                           

                     < > IP: tunnel transformation                                                           

                     <*> IP: TCP socket monitoring interface                                                 

                      IP: Virtual Server Configuration  --->                   lvs 支持                           

                     < > The IPv6 protocol (EXPERIMENTAL)                                                    

                     [*] Network packet filtering (replaces ipchains)  --->    包过滤省略(知道的自己选,不熟悉的都选上)             

  以下都没选,省略

    [ ] Amateur Radio support  --->                                                        

            < > IrDA (infrared) subsystem support  --->                                            

            < > Bluetooth subsystem support  --->                                                  

            [*] Network device support                                                             

            < >   Dummy net driver support                这个是nis服务器的吧,不大清楚,没用过                                         

            <*>   Bonding driver support                  双网卡绑定的                                         

            < >   EQL (serial line load balancing) support                                         

            < >   Universal TUN/TAP device driver support                     

                 ARCnet devices  --->                                                             

                 Ethernet (10 or 100Mbit)  --->                                                   

                 Ethernet (1000 Mbit)  --->                        

                     < > Alteon AceNIC/3Com 3C985/NetGear GA620 Gigabit support                                   

                     < > D-Link DL2000-based Gigabit Ethernet support                                             

                     < > Intel(R) PRO/1000 Gigabit Ethernet support                                               

                     < > National Semiconduct DP83820 support                                                     

                     < > Packet Engines Hamachi GNIC-II support                                                   

                     < > Packet Engines Yellowfin Gigabit-NIC support (EXPERIMENTAL)                              

                     < > Realtek 8169 gigabit ethernet support                                                    

                     < > Marvell Yukon Chipset / SysKonnect SK-98xx Support                                       

                     <*> Broadcom Tigon3 support    

                以下都没选,省略   

        ISDN subsystem  --->                                          

        Telephony Support  ---> 

        Input device support  --->                                          

      Character devices  --->                                               

        I2C support  --->              

        Dallas's 1-wire bus  --->      

        Misc devices  --->             

        Multimedia devices  --->       

        Graphics support  --->         

        Sound  --->                    

        USB support  --->              

        MMC/SD Card support  --->    以上都没选,需要的自己选

    09.File systems  --->        文件系统      

        < > Second extended fs support                                                               

        <*> Ext3 journalling file system support                                                   

        [ ]   Ext3 extended attributes                                                             

        [*] JBD (ext3) debugging support                                                           

        < > Reiserfs support                                                                       

        < > JFS filesystem support                                                                 

        < > XFS filesystem support                                                                 

        < > Minix fs support                                                                       

        < > ROM file system support                                                                

        [ ] Quota support                                                                          

        < > Kernel automounter support                                                             

        <*> Kernel automounter version 4 support (also supports v3)                                

            CD-ROM/DVD Filesystems  --->                                              

                <*> ISO 9660 CDROM file system support                                              

                [ ]   Microsoft Joliet CDROM extensions                                           

                [ ]   Transparent decompression extension                                         

                < > UDF file system support  

            DOS/FAT/NT Filesystems  --->             floppy要用到的文件格式

                <*> MSDOS fs support                                                                                                                    

                <*> VFAT (Windows-95) fs support                                                   

                (437) Default codepage for FAT (NEW)                                               

                (iso8859-1) Default iocharset for FAT (NEW)                                        

                < > NTFS file system support                                                         

            Pseudo filesystems  --->

                [*] /proc file system support                             proc文件系统支持                              

                [ ]   /proc/kcore support                                                               

                [ ] /dev file system support (OBSOLETE)                                                 

                [ ] /dev/pts Extended Attributes                                                        

                [*] Virtual memory file system support (former shm fs)     虚拟内存支持                             

                [ ]   tmpfs Extended Attributes                                                         

                [ ] HugeTLB file system support                                                              

            Miscellaneous filesystems  --->                                      

            Network File Systems  --->                                                         

                <*> NFS file system support                      nfs
客户端支持                                                             

                [*]   Provide NFSv3 client support                                                                            

                [ ]   Provide NFSv4 client support (EXPERIMENTAL)                                                             

                [ ]   Allow direct I/O on NFS files (EXPERIMENTAL)                                                            

                < > NFS server support                           nfs
服务端支持                                                            

                < > Secure RPC: Kerberos V mechanism (EXPERIMENTAL)                                                           

                < > Secure RPC: SPKM3 mechanism (EXPERIMENTAL)                                                                

                < > SMB file system support (to mount Windows shares etc.)
       samba支持                                             

                < > CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers)             

                < > NCP file system support (to mount NetWare volumes)                                                        

                < > Coda file system support (advanced network fs)                                                            

                < > Andrew File System support (AFS) (Experimental)                   

            Partition Types  --->       

            Native Language Support  --->                 自己选     

    10.Profiling support  --->                             没选                                              

    11.Kernel hacking  --->                                没选
                                                                                             

    12.Security options  --->                              没选

    13.Cryptographic options  --->                         没选   

    14.Library routines  --->                                        

         < > CRC-CCITT functions                                

         <*> CRC32 functions                                    

         <M> CRC32c (Castagnoli, et al) Cyclic Redundancy-Check[/code:1:f40f9b3e79]



五、编译安装

    步骤:make -jn(n代表同时编译的进程,可以加快编译速度,n由你的配置决定,我的配置用15-25)

         make modules_install

         make install



六、grub的设置

    设置之前先介绍一下2.6的I/O调度器

        2.6包含的四个I/O调度器分别是No-op I/O scheduler、Anticipatory I/O scheduler、Deadline I/O scheduler与CFQ I/O scheduler。

    在后文中分别简称为ns、as、ds与cfq。



        ns是一个简化的调度程序它只作最基本的合并与排序。与桌面系统的关系不是很大,主要用在一些特殊的软件

    与硬件环境下,这些软件与硬件一般都拥有自己的调度机制对内核支持的要求很小,这很适合一些嵌入式系统环境。作为桌面用户我们一般不会选择它。



        as是当前内核中默认的I/O调度器。它拥有非常好的性能,在2.5中它就相当引人注意。在与2.4内核进行的对比测试中,在2.4中多项以分钟为单位

    完成的任务,它则是以秒为单位来完成的。正因为如此它成为目前2.6测试版中默认的I/O调度器。但它也存在着弱点,它本身是比较庞大与复杂的,

    在一些特殊的情况下,特别是在数据吞吐量非常大的数据库系统中它会变的比较缓慢。



        ds就是针对as的缺点进行改善而来的,还处于测试阶段,但已经很稳定了。目前表现出的性能几乎与as一样好。加之比as更加小巧,

    是相当有前途的调度器,值得一试:)



        cfq为系统内的所有任务分配相同的带宽,提供一个公平的工作环境,它比较适合桌面环境。事实上在测试中它也有不错的表现,

    mplayer xmms等多媒体播放器与它配合的相当好,回放平滑几乎没有因访问磁盘而出现的跳帧现象。对于喜欢在Linux下听音乐看电影的朋友不妨尝试一下。

    

    好了,下面说说怎么设置:参数的格式为elevator=调度器名



    修改/boot/grub/grub.conf,在kernel那行后门加入elevator=deadline

    

    例如:kernel /boot/vmlinuz-2.6.10-bk4 ro root=/dev/你的根分区 elevator=deadline



七、reboot

Diff and Patch

这两个程序是用于生成补丁和打补丁用的. 他们是广泛的使用于各种的
版本控制系统中, 一般的软件发布也经常使用他们. 因此, 深入了解他们是非常
重要的. 本文只是一个入门级的导引. 详细说明请参照info.

    diff比较两个文本文件, 找到他们的不同之处, 通常是连续的数行不同
, 存在很多的这种东西, 每一个连续的几行被称为一个chunk.

    我们看一看下面的例子.
    a.txt
aaa
bbb
ccc

    b.txt
    ccc
    bbb
aaa

    diff from-file to-file
    diff a b > p
    cat p
    1,2d0
    < aaa
    < bbb
    3a2,3
    > bbb
    > aaa

    patch a < p
    cat a
    ccc
bbb
aaa

    这里的p是一种diff格式, 很古老现在也基本不用了.
    GNU diff提供了两种显示上下文的diff格式. 一种叫作
context format, 另一种叫作unified format. 后一种只有
GNU系统支持, 在GPL的软件中被广泛的使用着, 我也比较喜欢这种
格式.
————————————————–
一. context format

diff -c a b > p
cat p
*** a Fri Sep 17 10:14:46 1999
— b Fri Sep 17 10:08:53 1999
***************
*** 1,3 ****
文件a的第一到第三行有不同
- aaa
- bbb
ccc
文件在这里分为两个部分
— 1,3 —-
文件b的第一到第三行有不同
ccc
+ bbb
+ aaa
这里只有一个chunk

注意: 在这两种context格式种记录了from和to的文件名. 因此
    patch < p
就可以打补丁了.
他的格式如下:
*** From-File From-File-Modification-Time
— To-File To-File-Modification-Time
以下列字符开头的有如下意义
! 这一部分有变化 在chunk的两个部分中会有对应的一些行用!标识,
当然, 这两部分中的行数可能不同.
+ 这一行插入第二个文件中
_ 这一行从第一个文件中删除

—————————————————
二. unified format

diff -u a b > p
cat p

— From-File From-File-Modification-Time
+++ To-File To-File-Modification-Time
— a Fri Sep 17 10:14:46 1999
+++ b Fri Sep 17 10:08:53 1999
一个chunk -1,3表示a的1到3行 +1,3表示b的1到3行
@@ -1,3 +1,3 @@
-aaa
-bbb
ccc
+bbb
+aaa
以’+'开头表示这一行被加入到第一个文件
以’-'开头表示这一行被从第一个文件中删除

打补丁 patch < p
————————————————-
diff的一些重要的参数:
    -b 忽略行尾的空白
    -w 忽略文件中仅仅是由空白造成的区别
    -B 忽略文件中的空行
    -i 忽略大小写的不同

    -p 对编程语言的特殊支持, 记录有变化的函数名

————————————————–
patch的一些重要的参数:
    -pn n是一个整数
    表示将补丁文件中文件名的路径部分去掉几个’/’
    当你不指定时, patch将只取出文件名,-p0 表示不修改
   
    如:
    ~/src—– a
|
    |- b

    diff src/a src/b > p
    cd ~
    patch -p0 < p 可以工作
    patch < p 提示找不到文件
    cd src
    patch < ../p 也可以工作

————————————————–   
注意:
    如果, 你自己发补丁时, 应该说明是-pnum的num.        

这里作了一个简要的说明, 近一步的了解, 可以看info和man.


这里作了一个简要的说明, 近一步的了解, 可以看info和man.