参考 2.4.20 2.6.X
Linux-2.6.10 内核升级下载内核源代码 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz 放置到 /usr/src/下 解压 tar zxvf linux-2.6.6.tar.gz #cd linux-2.6.6 #make menuconfig (如果装了X11 可用Xconfig 命令) 配置内核 一定要
Linux-2.6.10 内核升级
下载内核源代码
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.gz
放置到 /usr/src/下
解压 tar zxvf linux-2.6.6.tar.gz
#cd linux-2.6.6
#make menuconfig (如果装了X11 可用Xconfig 命令) 配置内核 一定要选自己的网卡驱动!
不选的为空 选的是*号 M 是编译为模块形式,日后可手动插入模块
升级module-init-tools软件包
要编译与正常运行新的内核你需要升级一些软件包,这些信息在源码目录下的Documentation/Changes文件中,请根据你的实际情况选择升级。
特别要说明的是,因为2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包.,我下载module-init-tools-3.0.tar.gz源码包的地方是:
http://www.kernel.org/pub/linux/kernel/people/rusty/modules/module-init-tools-3.0.tar.gz
接下来, 按照下列步骤安装module-init-tools工具包:
tar -zxvf module-init-tools-3.0.tar.gz
在module-init-tools-3.0目录下,
# 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.
如果你使用devfs系统你还需要复制modprobe.devfs 到/etc目录下。
当你升级完相关软件包之后,准备工作就算完成了,下面我们将进入到编译阶段。
1. Code maturity level options
代码成熟等级。此处只有一项:prompt for development and/or incomplete code/drivers,如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须把该项选择为Y了;否则可以把它选择为N。
2. Loadable module support
对模块的支持。这里面有三项:
Enable loadable module support:除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。
Set version information on all module symbols:可以不选它。
Kernel module loader:让内核在启动时有自己装入必需模块的能力,建议选上。
3. Processor type and features
CPU类型。内容蛮多的,不一一介绍了,有关的几个如下:
Processor family:根据你自己的情况选择CPU类型。
High Memory Support:大容量内存的支持。可以支持到4G、64G,一般可以不选。
Math emulation:协处理器仿真。协处理器是在386时代的宠儿,现在早已不用了。
MTTR support:MTTR支持。可不选。
Symmetric multi-processing support:对称多处理支持。除非你富到有多个CPU,否则就不用选了。
4. General setup
这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。下面介绍一下经常使用的一些选项:
Networking support:网络支持。必须,没有网卡也建议你选上。
PCI support:PCI支持。如果使用了PCI的卡,当然必选。
PCI access mode:PCI存取模式。可供选择的有BIOS、Direct和Any,选Any吧。
Support for hot-pluggabel devices:热插拔设备支持。支持的不是太好,可不选。
PCMCIA/CardBus support:PCMCIA/CardBus支持。有PCMCIA就必选了。
System V IPC
BSD Process Accounting
Sysctl support:以上三项是有关进程处理/IPC调用的,主要就是System V和BSD两种风格。如果你不是使用BSD,就按照缺省吧。
Power Management support:电源管理支持。
Advanced Power Management BIOS support:高级电源管理BIOD支持。
5. Memory Technology Device(MTD)
MTD设备支持。可不选。
6. Parallel port support
串口支持。如果不打算使用串口,就别选了。
7. Plug and Play configuration
即插即用支持。虽然Linux对即插即用目前支持的不如Windows好,但是还是选上吧,这样你可以拔下鼠标之类的体验一下Linux下即插即用的感觉。
8. Block devices
块设备支持。这个就得针对自己的情况来选了,简单说明一下吧:
Normal PC floppy disk support:普通PC软盘支持。这个应该必选。
XT hard disk support:
Compaq SMART2 support:
Mulex DAC960/DAC1100 PCI RAID Controller support:RAID镜像用的。
Loopback device support:
Network block device support:网络块设备支持。如果想访问网上邻居的东西,就选上。
Logical volume manager(LVM)support:逻辑卷管理支持。
Multiple devices driver support:多设备驱动支持。
RAM disk support:RAM盘支持。
9. Networking options
网络选项。这里配置的是网络协议。内容太多了,不一一介绍了,自己看吧,如果你对网络协议有所了解的话,应该可以看懂的。如果懒得看,使用缺省选项(肯定要选中TCP/IP networking哦)就可以了。让我们看看,TCP/IP、ATM、IPX、DECnet、Appletalk……支持的协议好多哦,IPv6也支持了,Qos and/or fair queueing(服务质量公平调度)也支持了,还有kHTTPd,不过这些都还在实验阶段。
10. Telephony Support
电话支持。这个是什么东东?让我查查帮助,原来是Linux下可以支持电话卡,这样你就可以在IP上使用普通的电话提供语音服务了。记住,电话卡可和modem没有任何关系哦。
11. ATA/IDE/MFM/RLL support
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省的选项吧,如果你使用了比较特殊的设备,比如PCMCIA等,就到里面自己找相应的选项吧。
12. SCSI support
SCSI设备的支持。我没有SCSI的设备,所以根本就不用选,如果你用了SCSI的硬盘/光驱/磁带等设备,自己找好了。
13. IEEE 1394(FireWire)support
这个是什么?低版本的没有见过,看看帮助再说。原来是要Fireware硬件来提高串行总线的性能,我没有,不选了。
14. I2O device support
这个也不清楚,帮助里说是这个需要I2O接口适配器才能支持的,在智能Input/Output(I2O)体系接口中使用,又是要硬件,不选了。
15. Network device support
网络设备支持。上面选好协议了,现在该选设备了,可想而知,内容肯定多得很。还好还好,里面大概分类了,有ARCnet设备、Ethernet(10 or 100 Mbit)、Ethernet(1000Mbit)、Wireless LAN(non-hamradio)、Token Ring device、Wan interfaces、PCMCIA network device support几大类。我用的是10/100M的以太网,看来只需要选则这个了。还是10/100M的以太网设备熟悉,内容虽然多,一眼就可以看到我所用的RealTeck RTL-8139 PCI Fast Ethernet Adapter support,为了免得麻烦,编译到内核里面好了,不选M了,选Y。耐心点,一般说来你都能找到自己用的网卡。如果没有,你只好自己到厂商那里去要驱动了。
16. Amateur Radio support
又一个不懂的,应该是配置业余无线广播的吧,没有,不要了。
17. IrDA(infrared)support
这个要红外支持,免了。
18. ISDN subsystem
如果你使用ISDN上网,这个就必不可少了。自己看着办好了。
19. Old CD-ROM drivers(not SCSI、not IDE)
做的可真周到,原来那些非SCSI/IDE口的光驱谁还在用啊,自己选吧,反正我是用的IDE的CD-ROM,不选这个。
20. Character devices
字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改。把大类介绍一下吧:
I2C support:I2C是Philips极力推动的微控制应用中使用的低速串行总线协议。如果你要选择下面的Video For Linux,该项必选。
Mice:鼠标。现在可以支持总线、串口、PS/2、C&T 82C710 mouse port、PC110 digitizer pad,自己根据需要选择。
Joysticks:手柄。即使在Linux下把手柄驱动起来意义也不是太大,游戏太少了。
Watchdog Cards:虽然称为Cards,这个可以用纯软件来实现,当然也有硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。
Video For Linux:支持有关的音频/视频卡。
Ftape, the floppy tape device driver:
PCMCIA character device support:
21. File systems
文件系统。内容又太多了,老法子,在缺省选项的基础上进行修改。介绍以下几项:
Quota support:Quota可以限制每个用户可以使用的硬盘空间的上限,在多用户共同使用一台主机的情况中十分有效。
DOS FAT fs support:DOS FAT文件格式的支持,可以支持FAT16、FAT32。
ISO 9660 CD-ROM file system support:光盘使用的就是ISO 9660的文件格式。
NTFS file system support:ntfs是NT使用的文件格式。
/proc file system support:/proc文件系统是Linux提供给用户和系统进行交互的通道,建议选上,否则有些功能没法正确执行。
还有另外三个大类都规到这儿了:Network File Systems(网络文件系统)、Partition Types(分区类型)、Native Language Support(本地语言支持)。值得一提的是Network File Systems里面的两种:NFS和SMB分别是Linux和Windows相互以网络邻居的形式访问对方所使用的文件系统,根据需要加以选择。
22. Console drivers
控制台驱动。一般使用VGA text console就可以了,标准的80*25的文本控制台。
23. Sound
声卡驱动。如果你能在列表中找到声卡驱动那自然最好,否则就试试OSS了。
24. USB supprot
USB支持。很多USB设备,比如鼠标、调制解调器、打印机、扫描仪等,在Linux都可以得到支持,根据需要自行选择。
25. Kernel hacking
配置了这个,即使在系统崩溃时,你也可以进行一定的工作了。普通用户是用不着这个功能的。
配置完内核后就可以开始编译了,linux 2.6.6 简化了程序只需执行如下命令就可以了
#make //编译内核和模块
#make modules_install //安装模块
#make install //安装内核和修改grub.conf 文件
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,1)
# kernel /vmlinuz-version ro root=/dev/hda3
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
title Red Hat Linux (2.6.6)
root (hd0,1)
kernel /vmlinuz-2.6.6 ro root=LABEL=/
initrd /initrd-2.6.6.img
title Red Hat Linux (2.4.20-
root (hd0,1)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
initrd /initrd-2.4.20-8.img
title Windows Server 2003
rootnoverify (hd0,0)
chainloader +1
如果以上步骤没有出错的完成,那表示就可以了。
#reboot 后启动 linux-2.6.6 内核吧!
如果编译完 又不必要的模块比如USB 声卡等设备 可在 /etc/modprobe.conf文件中注释掉!这样在启动时就不会启USB模块了!
modprobe.conf 内容如下:
alias eth0 e100
#alias usb-controller ehci-hcd
#alias sound-slot-0 i810_audio
#post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >;/dev/null 2>;&1 || :
#pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >;/dev/null 2>;&1 || :
#alias usb-controller1 usb-uhci
前面介绍了与2.6内核相关的变化,解释了新硬件驱动程序的编译进程,并讨论了2.6内核的新功能对于已有硬件驱动程序的影响。这里将主要阐述将已有驱动程序、开发系统、应用软件和定制Linux配置移植到2.6内核的方法步骤。
因为2.6内核增加了许多新功能,特别是在硬件驱动程序和系统软件级方面,所以需要对管理工具进行相应的改变。基于2.6内核的系统需要新的启动程序。该程序必须能识别新的模块命名规则,使用新的设置文件和新的2.6内核功能。例如sysfs文件系统,该文件系统是一个虚拟的文件系统。它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。sysfs文件系统主要供Linux系统内部使用。2.6内核已开始为存储用户信息的新型文件系统提供集成支持。诸如JSF与XFS之类的新日志文件系统和OpenAFS之类的新网络文件系统,都需要最新的针对具体文件系统的工具。
用户只需要安装与2.6内核新功能相关的工具,不需要的可以暂时略去。例如,如果用户使用的不是JFS文件系统,那么可以通过禁止JFS支持而缩减内核占用的空间。同样,也可以通过清除与JFS相关的工具,减少根文件系统占用的空间。如果用户使用的不是基于2.6内核的Linux系统,那么需要确定所安装的Linux系统套装软件内是否拥有所有2.6内核所需的特性。
对重要的套装软件进行验证和升级
所谓套装软件就是满足不同需求的一系列工具软件的集合。这些软件可以一起作为一个整体安装到系统中。不同的Linux系统所提供的套装软件和从属管理软件,首先要检测系统中是否安装了它们依赖的其它软件,而且这些软件的版本必须足够新。这些套装软件的管理器常常会对全系统范围的数据库进行维护。该数据库存储所有已安装应用软件名称和版本。最普通的套装软件格式是RPM(Red Hat Package Manager,也用于Fedora、Mandrake、SuSE和TurboLinux套件)和DEB(Debian Linux,也用于Knoppix和Xandros套件)格式。其它的套装软件格式有标准压缩程序文件TGZ格式,主要应用于Slackware Linux,自身不包括从属信息。
表1列出了不同的Linux套装软件。这些套件大多存在于基于2.4内核的Linux系统,而且可安装在所有用于软件开发的桌面Linux系统中。诸如嵌入式计算领域的专门系统也许并非缺一不可。然而如果用户正在升级某一专门系统,那么了解这些套装软件需要在哪里升级是一件非常重要的事。
如果用户正在将一个桌面Linux系统升级到2.6内核,那么对表1中的套装软件进行升级和验证的惟一场所就是用户的桌面系统。如果用户正在移植一个诸如嵌入式Linux系统之类的专门系统,那么必须首先要升级所有的交叉编译程序和正在使用的相关软件,以便为嵌入式系统生产软件。然后,才能升级嵌入式系统的文件系统中使用的所有套装软件。
当准备在现有的系统中使用2.6内核时,必须对所有安装在原系统且在表1中列出的套装软件的版本进行验证。如果版本低于表中的最低版本限制,那么必须对它们进行升级。用户只要执行第三栏中的命令,就可以查到套装软件的版本了。
如果用户计划使用某一特定的文件系统、硬件设备或管理体制,那么除了表1中列出的套装软件外,也许还需要升级其它的套装软件。
升级内置模块的特殊处理
如果想实现2.6/2.4双内核启动,那么还需要对表1列出的内置模块工具套装软件进行特殊处理。内置模块工具的套装软件可为系统应用软件提供模块加载(insmod和 modprobe)、卸载(rmmod)、列表(lsmod)和从属关系分析(depmod)功能。由于新内核的模块命名和加载规则发生了变化,所以不能简单地对这些工具的现有版本进行覆盖,否则将无法正常管理2.4内核模块。因此,内置模块工具的套装软件的升级过程首先包括对2.4内核下的工具软件重新命名,例如utility.old。这样可以保留2.4内核需要的套装软件版本。如果内置模块工具的套装软件经编译后支持向下兼容,那么套件中的工具软件可以自动执行这些工具的旧版本。这样用户可以不加任何修改,就实现双内核启动的目标。
如果用户使用诸如DEB或RPM事先建立的套件升级内置模块工具的套装软件,而且仍然需要双内核启动,那么在安装新版本前,应该先检查套件中是否包含一个预装的小程序。该程序可以对已有相关模块的二进制命令进行重命名。更简单的方法是,从源代码中为用户的系统建立内置模块工具的套装软件,此时“make”命令的目标之一是moveold,它可以复制已有相关模块的二进制命令,以便它们在新版本安装时不会丢失。这里给出对内置模块工具的套装软件进行设置、组建和安装的过程如下:
#./configure --prefix=/
#make moveold
#make
#make install
上面代码中,第一行命令对内置模块工具的套装软件进行设置,以便它与原套件安装在同一位置。第二行命令对现有的二进制命令进行重命名。第三行命令在内置模块工具的套装软件中建立应用软件。第四行命令对这些软件进行安装。
当然,从源代码建立并安装这些套装软件不会升级任何已安装应用软件的数据库。这些数据库通常由套件管理器进行维护。
安装新版内置模块工具的套装软件的最后一步是运行一个外壳软件。该软件可以将2.4内核使用的模块设置文件登录口,转换成为同等的2.6内核的(/etc/modprobe.conf)。该外壳软件名为generate-modprobe.conf程序,只有一个参数,就是已有modules.conf文件的路径名。运行完毕后,用户还需检查新文件,并根据两个版本下硬件名称变化,对它进行适当的升级。
需要升级的其它套装软件
除了表1列出的套装软件外,如果用户使用的功能恰巧由另外一些套装软件支持,那么用户也许还需要升级其它的套件。表2列出了一些可能需要升级的套装软件。这些套装软件并非在所有Linux套件中都缺省存在,它们对于一些子系统或驱动程序具有特殊的意义。例如ISDN、PCMCIA卡、内核轮廓分析、配额文件系统、特殊的网络或日志文件系统(nfs-utils、jfsutils、reiserfsprogs和 xfsprogs)。
应用高级Linux声音架构
如果用户使用的系统音频功能不仅限于内置的扬声器和相关的发声装置,那么2.6内核的一个主要变化就是它采用了高级Linux声音架构(ALSA)。ALSA目前是播放并管理音频录制和回放的缺省数字音频架构。ALSA很早以前就代替开放声音系统(OSS)应用于Linux平台。尽管在2.6内核下,ALSA可提供一种OSS模拟模式对旧的应用软件提供支持,但是升级系统使用ALSA才是长久之计。
TimeSys公司发现在升级内核前便采用ALSA是十分明智的。这样,在用户升级内核时可以减少多个不确定因素,并确保ALSA与硬件一起工作正常。此外,用户还能避免一些内核升级过程中遇到的困难,并确保ALSA模块设置命令已经存在于/etc/modules.conf文件中。
ALSA升级步骤如下:
◆ 从预先准备好的套装软件中获取最新版本的ALSA驱动程序、库和工具。虽然,2.6内核源代码中有ALSA驱动程序,但用户最好事先准备好ALSA套件。这样用户就可以在升级内核前,将系统升级到ALSA。如果用户想使用ALSA的OSS模拟模式,那么也需要用户获取它的源代码并安装ALSA套件。
◆ 配置、编译并组建ALSA套件,或者在系统中安装二进制命令。
◆ 使用Alsaconf应用软件对ALSA软件进行配置。该软件可搜索用户安装的声音软件,生成当前模块加载信息,并选择性地升级/etc/modules.conf文件。
◆ 使用alsamixer应用软件激活ALSA。该软件可开启ALSA的设置(ALSA最初是关闭着的)。
◆ 将/etc/rc.d/init.d/alsasound启动文件与系统启动时执行的命令文件连接起来。
◆ 执行generate-modprobe.conf程序,从而将ALSA模块设置移植到/etc/modprobe.conf文件。它可与2.6内核需要的模块工具一起工作。
ALSA与OSS相比有许多优势。ALSA可以支持更多的音频端口、声卡和模块化的驱动程序。由于内核和用户空间是分开的,这样可以简化编写、维护驱动程序和音频应用软件的过程。
升级系统设置文件
除了升级套装软件外,用户通常需要手工升级一些系统启动和设置程序,以便安装使用新的文件系统,并支持2.6内核使用的模块命名规则。
在升级内核时,用户必须在/etc/fstab目录下,为sysfs文件系统添加一行指令,建立一个入口。该入口指令的形式如下:
none /sys sysfs noauto 0 0
该入口可以为用户的系统提供识别安装sysfs文件系统的相关信息。如果用户只想从2.6内核启动,那么用户只需指定defaults安装选项,而不需指定noauto。这样,无论何时当用户执行“mount -a”命令时,系统就会自动安装sysfs文件系统。
如果系统既能以2.4内核启动,也可以2.6内核启动,那么当以2.4内核启动时,noauto安装选项将禁止用户的系统自动安装sysfs文件系统。
升级系统启动和关闭程序
正如上文提到的,与2.6内核相关的变化,诸如不同的文件名、模块名和新功能,使得用户在增加2.6内核启动选项时需要对系统的启动程序进行升级。
用户需要改变的文件依赖于用户的系统启动顺序和系统执行的启动和关闭程序。不同的Linux套件在启动过程中使用的具体文件不同,尽管大多数基于SysVinit和initscripts套装软件。可以同时应付2.4内核和2.6内核启动过程的增强版套装软件可以直接由支持Linux系统的生产商提供。如果无法获得此类套装软件,那么下面将告诉用户需要做哪些改变。
如果用户要建立一个双内核启动系统,但是Linux生产商无法提供升级后的启动和关闭程序,那么根据用户选择的启动内核为启动程序设置条件是一个不错的解决方案。最简单的方法是,在识别运行内核的基础上,设置一个环境变量,示例如下:
#VERSION=`uname -a | sed -e 's;.* /(2/.6/).*;/1;'`
接下来用户可以检查这一变量的值,并执行与内核版本相适应的命令,例如:
if [ "x$VERSION" = "x" ] ; then
VERSION="2.4"
fi
if [ "x$VERSION" = "x2.6" ] ; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi
使用2.6内核时,用户需要对启动程序所做的第一个修改便是添加安装sysfs文件系统的命令行。用户的系统启动程序之一,也许是/etc/rc.sysint或是 /etc/rc.d/rc.sysinit,包含着一个安装proc系统的入口。这个入口可以在系统启动时在/proc目录下安装Proc文件系统。
用户还需要在安装点/sys(用户可以使用“mkdir /sys”命令建立)下为sysfs文件系统的安装添加一个类似的入口。该入口在文件中的位置与/proc文件系统的安装位置十分类似。
同样,在2.6内核下,proc文件系统中包含内核符号信息的文件名也发生了变化。为了保证启动程序可以找到内核符号,用户需要将系统启动文件中/proc/ksyms的所有示例变成/proc/kallsyms,后者的文件名可以被Linux2.6内核使用。
为了迎合2.6内核的特点,proc文件系统中的一些用于2.4内核的文件已移植到sysfs文件系统中。例如,USB硬件列表在2.4内核下存储在/proc/bus/usb/devices文件中,而在2.6内核下则存储在/sys/bus/usb/devices文件中。
此外,用户还要对系统关闭过程中调用的所有程序进行相应的修改。例如,在Red Hat系统中,关闭进程会调用/etc/init.d/halt程序。该程序引用的是proc文件系统,而不是同等的sysfs文件系统。
内核编译的简便方法
在前面第一篇文章中,曾详细介绍了Linux 2.6内核的设置。如果用户正在为一个已有的系统安装2.6内核,并且自己对内核进行设置,那么最简单的方法是重新使用现有系统中的内核设置文件。用户可以通过“make oldconfig”命令来设置目标。它是一个基于文本的接口,可以调出已有的设置文件并对所有从内核源代码中找到的设置变量进行排序。
要想顺利地将现有系统移植到2.6内核,还应注意在同一时间应尽可能少地修改。前文已经介绍了对套装软件、系统设置文件和启动程序的修改。然而,如果用户还要为系统增加ALSA支持,并按上文建议的在移植到2.6内核前便将系统升级至ALSA,那么用户在确定2.6内核系统工作正常前,不要改变ALSA支持作为一个可加载内核模块的特性。这样,即使内核无法正常工作,用户仍然可以在集成ALSA支持的基础上对内核进行重新设置。
如果用户要将一个商业Linux套件移植到2.6内核,那么也许不必为系统硬件的细节担心。诸如Red Hat和SuSE等商业Linux套件的优势之一就是它们拥有众多集成或可加载内核模块,可以为各种各样的PC或嵌入式硬件设备提供支持。
如果正在移植一个商业Linux系统,而且拥有它的源代码和内核设置文件,那么可以先按照上文的指示将设置文件移植到2.6内核下,并可激活用户感兴趣的各种功能和支持,例如ALSA。然后,便可以安装设置2.6内核和各种相关模块,重启并测试系统。如果用户没有系统的设置文件,那么可以通过执行2.6内核源代码目录下的“make defconfig”命令,建立一个缺省的设置文件。不同的系统架构和不同的处理器拥有不同的内核设置变量。用户可以通过在命令行指定目标的方式,看到不同架构下的设置变量。以PowerPC (PPC)系统为例,指定命令如下:
#make defconfig ARCH=ppc
生成缺省的2.6内核设置文件后,用户必须对内核进行设置,以便提供系统硬件所需要的驱动程序。
这里无法介绍所有平台的硬件识别方案,但是在大多数Linux套件中,硬件识别最常用的两个工具是Lspci和Lsusb。Lspci工具可以显示所有PCI总线信息,并列出与它们相连的硬件设备。Lspci对于集成声卡和显卡的X86主板尤其有用,因为它可以识别使用在主板PCI电路中的确切芯片。Lsusb工具可提供USB总线和连接设备的同类信息。
在建立内核设置文件的过程中,用户需要的其它硬件信息还包括CPU的型号。用户可以使用xconfig设置编译程序中的Processor或Processor type and features面板设置这些信息。
用户也可以从/proc/cpuinfo文件中找到有关处理器型号的信息,只要执行“cat /proc/cpuinfo”命令就可以了。
最后,还需要根据系统定制的内核功能,对新内核设置文件进行一些修改。例如,用户要查看内核支持或使用的文件系统。执行“cat /proc/filesystems”命令,从/proc/filesystems文件中获得有关文件系统类型的信息。例如,SuSE Linux系统作用的根文件系统是Reiserfs文件系统,但是Reiserfs文件系统在2.6内核下的缺省状态是未被激活的。同样,在2.6内核下,缺省状态下无法使用初始RAM,也不支持访问SMB和CIFS文件系统。这些都需要事先进行设置。
小结
如果用户已经按照这里介绍的方法移植或建立了内核设置文件,并对它进行了设置,那么就可以着手搭建并安装内核和需要的模块了。内核的搭建可以通过顶级内核源代码目录下的“make”命令来完成。“make”命令成功执行后,如何安装内核和模块需要看系统的类型了。如果要升级的是一个桌面x86系统,那么可以使用“make install”和“make modules_install”命令安装内核和相关模块。如果用户正在为一个嵌入式系统交叉编译2.6内核,那么“make”命令的目标要根据内核二进制命令的安装位置和方式来确定。
综上所述,向2.6内核移植桌面系统虽然需要许多步骤,但即使对于一个新手来说,这些步骤也并不困难。而移植专门Linux系统的过程就复杂得多了。TimeSys公司的TimeStorm Linux开发套件使专门系统向新内核和新硬件的移植变得十分简单。(T111)
作为一个积极推进软件业革新的领头羊,Linux操作系统已成为开放系统运动的优秀代表。作为各种Linux发行版的共同核心,Linux内核多年来一直不间断地引进新技术进行革新,逐步提高自身的各种性能,例如可伸缩性、可用性和技术支持等。众多的改进都是围绕增加对其它架构、处理器、总线、端口和外设的支持而进行的。从Linux 2.2内核开始,因为每个新内核的诞生都要经过严格的检验和测试,所以其开发周期大约都保持在两年左右。
除了增加的新功能外,每个新版稳定的Linux内核都会对大量原有功能进行改进,对内部接口进行定制使其更加标准,提高与其它设备的兼容性,并简化对新设备和子系统的支持过程。这些改进中的一部分只与内核开发人员和硬件驱动程序编写者有关,而其它的则影响到系统启动、系统管理和应用软件设置等方面。
如果用户正在把现有的应用软件移植到一个基于2.6内核的Linux套件上,例如TimeSys Linux系统,那么也许不会花费多少功夫,原因是TimeSys Linux的性能已大大改进。此外还增加了对行业标准的支持,例如对POSIX的支持。然而,如果用户正在进行硬件驱动、定制系统级的应用软件或可定制的Linux根文件系统的移植,那么可以参考内核在内部构件、子系统、系统启动和系统管理上发生的基本变化。这会为用户节省许多开发时间,并大大减少用户在移植过程可能遇到的难题。
这里主要介绍如何将现有的硬件驱动、应用软件和嵌入式Linux组件移植到一个基于2.6内核的Linux套件中(我们以TimeSys Linux为例子)。并结合一些软件工具为用户提供所需的信息,帮助用户加快开发进程,控制软件转换和改进成本,甚至可以加快基于Linux系统的设备、系统和应用软件进入市场的速度。这里所列举的软件是TimeStorm Linux工具套件之类的工具软件。它们可以在开发、移植、调试和验证周期等方面为用户提供帮助。
基于2.6内核的设置
内核是Linux操作系统的核心。它管理着所有的系统线程、进程、资源和资源分配。与其它操作系统不同的是,Linux操作系统允许用户对内核进行重新设置。用户可以对内核进行“瘦身”,增加或消除对某些特定设备或子系统的支持。在开发嵌入式系统时,开发人员经常会减少系统对一些无用设备的支持,将节省下来的内存分配给各种应用软件。
Linux内核对各种硬件和端口的支持要靠各种硬件驱动程序来实现。这些驱动程序可以被直接写入内核,也可以针对某些特定硬件在需要时自动加载。通常情况下,可以被自动加载进内核的内核编码称为自动加载内核模块。
Linux内核的设置是通过内核设置编辑器完成的。内核设置编辑器可对每个内核设置变量进行描述,帮助用户决定哪些变量需要被清除,哪些需要写入内核,或者编成一个可加载内核模块在需要时进行加载。
建立新内核的第一步是对内核进行设置。当用户对内核进行设置时,必须先对内核和其它可加载内核模块进行编写和安装。如果用户要对原系统的内核进行构建设置,那么这一步是十分简单的。但如果用户要将原系统内核编译应用于其它目标系统,那么这一步就会变得相对困难一些。例如,当用户修改嵌入式系统的Linux内核时,很可能会先在一个桌面系统上对内核进行设置,然后再通过一套编译工具将其移植到嵌入式系统中。此类编译工具被称为交叉编译程序。
交叉编译程序在一类系统运行的同时会生产一系列二进制编码。这些编码是专门为另一类系统而设计的。两种系统有着完全不同的处理器或架构。在对内核或模块的编译过程中,用户必须通过多种多样的环境变量或Makefile设置来确定具体的交叉编译程序。用户还可以直接使用一个诸如TimeSys之类的集成开发环境来实现这一目标。TimeStorm可以帮助用户很容易地选择交叉编译程序。同样,当用户对Linux的内核和模块进行交叉编译使之应用于嵌入式系统时,如果没有TimeStorm之类的软件,那么用户必须通过额外的设置和Makefile手工修改,才能确定内核和模块的安装过程和安装位置。
基于Linux 2.6内核的设置较以往已经简便多了。Linux 2.6内核采用新的图形设置编辑器使内核的编译和设置变量的从属关系确定变得更加简单。过去基于2.x的内核为用户提供了四种基本的内核设置编辑器:
◆config 服务于内核设置的一个冗长的命令行界面;
◆oldconfig 一个文本模式的界面,主要包含一个已有设置文件,对用户所发现的内核资源中的设置变量进行排序;
◆menuconfig 一个基于光标控制库的终端导向编辑器,可提供文本模式的图形用户界面;
◆xconfig 一个图形内核设置编辑器,需要安装X-Window系统。
前三种编辑器在设置2.6内核时仍可使用,在运行“make xconfig”后,原有的界面被两个新的图形设置编辑器所代替。这需要具体的图形库和X-Window系统的支持。另外,用户还可以通过“make defconfig”命令,利用所有内核设置变量的缺省值自动建立一个内核设置文件。
用新图形编辑器设置内核
当用户运行“make xconfig”命令后,会产生一个更加健壮的新的图形编辑器。新的内核设置编辑器使用Trolltech公司的Qt工具套件。许多Linux系统并没有集成Qt工具套件,但是用户可以从http://www.trolltech.com的网站上免费下载它。图1展示了新的内核设置界面。
如图1所示,内核设置编辑器是一个由三个面板组成的图形界面,左侧面板可展开的树状结构显示有效的内核设置选项,右上面板显示左侧面板选择项的具体设置信息,右下面板显示所选设置选项的相关帮助信息。
图1 2.6内核设置界面
图2 gconfig内核编辑器界面
当用户执行命令“make gconfig”时,屏幕会显示第二个图形设置编辑器。该设置编辑器最初显示一个由两个面板组成的图形界面,如图2所示。用户可以通过鼠标点击工具栏上的“Split”按钮,将gconfig改变成与xconfig界面类似的图形界面。该内核设置编辑器需要GTK2(GIMP Toolkit, Version 2)工具的支持。大多数桌面Linux都自带有GTK2工具。
通常情况下,由“make gconfig”命令调出的编辑器界面不如“make xconifg”命令调出的界面详尽和易用。除非用户拥有一些诸如TimeSys、 TimeStorm Linux开发套件之类的设置工具,不然建议用户使用“make xconfig”命令对内核进行设置。
内核设置技巧
内核设置选项内容很多,这里限于篇幅只列举几个通用的技巧和建议。对Linux 2.6内核的设置要比以前版本简单得多,但是它却有着更多的设置选项。这意味着对于一个无法在硬件上启动并运行,或者无法支持现有应用软件的内核进行设置将变得更加容易。
作为一个常用技巧,在xconfig或gconfig编辑器Options选单下提供了几种非常有用的内核设置选项。
◆ Show all options选项。系统显示所有可用的内核设置选项,即使是某选项由于各种原因无法被选取(通常情况下是由于与之相关的选项未被选取)。这一选项可以帮助用户了解所需要的选项是否存在于内核资源中。
◆ Show debug info选项。系统显示与帮助窗口中所选选项相关的内核设置变量。这一选项可以帮助用户了解激活其它内核设置选项所需的前提选项。
◆ Show Name选项。系统显示与每个内核设置选项相关的内核设置变量的名称,可以帮助确定内核设置变量间的从属关系。
如果用户已经根据需要对内核进行了设置,而且用来对内核进行编译和安装的“make”命令与Linux 2.6内核不同,那么为了方便起见,用户可以使用“make help”命令来显示设置2.6内核的所有有效选项。
其它的“make”命令还包括“make dep”。该命令可以提供变量从属关系信息。此外,“make”命令还可以对内核和其它选择安装的驱动程序进行编译。其中,“make install”和“make modules_install”是两个基本、常用的“make”命令。
建立新的内核设置文件
对Linux内核进行设置的有效手段之一是使用“make oldconfig”命令。该命令可以在现有内核设置文件的基础上建立一个新的内核设置文件。如果用户目前没有内核设置文件,可以通过执行这条命令或启动任意一个图形内核设置编辑器建立一个。
在内核升级设置过程中,“make oldconfig”命令十分有用。“make oldconfig”命令可以使内核设置进程读取用户已有的设置信息,从而提示用户输入某一内核设置变量的值。这一变量在已有的内核设置文件中是找不到的。
现在进行一个测试,将现有的内核设置从基于2.4内核的Linux套件移植到基于2.6内核的Linux套件中。首先将名为.config的文件复制到Linux 2.6内核源代码所在的目录下。例如,这里要把一个定制设置文件从基于2.4内核的TimeSys Linux 4.1移植到基于2.6内核的TimeSys Linux中,主要步骤如下:
# cd /opt/timesys/linux/4.1/iq80315/src/2.4.21-timesys-4.1/kernel
# cp .config /opt/timesys/linux/5.0/iq80315/src/2.6-timesys-5.0/kernel
# cd /opt/timesys/linux/5.0/iq80315/src/2.6-timesys-5.0/kernel
# make oldconfig
这时,系统会提示用户输入表示当前所有未定义内核设置变量的值。输入完毕后,“make oldconfig”命令会自动生成一个升级的内核设置文件。这时用户就可以着手建立新内核了。当然用户也可以继续使用功能更强大的内核设置编辑器对内核进行设置,例如xconfig。
小结
对于基于2.6内核的Linux发行版而言,简化系统设置显得更加重要。新的图形设置编辑器大大简化了用户对2.6内核的设置。目前,TimeSys工具软件在2.6内核设置中的应用十分广泛。然而,随着新技术的不断涌现,每个新的架构、端口、子系统和其它设备都会增加内核设置变量的数量,这些变量都是用户需要了解的。
其它软件工具可为内核设置提供集成支持,例如Target Configurator。作为TimeStorm Linux开发套件中的一个组件,Target Configurator由Open Source Eclipse架构提供动力。为了进一步简化内核设置,TimeSys Linux包括已定制的内核设置文件,这些文件将带来良好的性能、常规开发方式和较强的纠错能力。无论用户使用哪种工具和套件,对Linux 2.6内核的设置都改进了很多。(T111)
硬件驱动程序是界于硬件和Linux内核之间的软件接口,是一种低级的、专用于某一硬件的软件组件。这种软件组件可以使硬件与更普遍的高级应用程序接口产生互动。为某一具体的子系统或硬件端口(例如SCSI、USB或PCMCIA)提供支持,不同于为所有SCSI、USB或PCMCIA硬件设备提供支持。由于新的硬件每天都在产生,因此测试每一个可能用于某一具体子系统的硬件是不可能的。内核只为具体的一些子系统提供支持,硬件驱动程序也只是为使用这些子系统具体的某些硬件提供支持。新内核保持高级应用程序接口与低级硬件功能的分离。用户可以通过编写合适的硬件驱动程序或修改内核,更容易地为现有系统增加对新硬件的支持。
Linux硬件驱动可以通过两种方式集成到内核中:一是将其直接编译进行内核从而一劳永逸;二是将其编写成一种目标格式,在需要添加某种硬件时,内核可以将其调入。当用户对Linux内核进行设置时,每个内核设置编译器都可显示各个可用内核设置变量的描述信息,从而使用户决定哪个变量要被消除,哪个需要写入内核,还有哪个可以编写成一种可加载内核模块。
直接将硬件驱动程序写入内核优点在于,用户可以随时对它进行调用而无需安装。但是这样大大增加内核占用的空间。将硬件驱动程序编写成一种可加载的内核模块,虽然会因为寻找驱动模块而增加系统资源的占用和运行时间,但是与庞大的内核所消耗的资源相比显得微不足道。将硬件驱动程序编写成一种可加载的内核模块,还可为软件开发提供许多便利。当用户需要对某一硬件驱动程序进行开发或纠错时,用户可以动态地卸载旧的版本并加载新的版本,但是如果用户的驱动程序已写入内核,那么必须对内核进行重新编写,并且每次对修改后的程序进行测试时,都必须重新启动系统。另外,将硬件驱动程序视为可加载的内核模块进行开发和配置,这样用户就可以将硬件驱动程序作为一种独立的系统进行升级,而不必对内核进行改动了。
用户要做的只是编译并安装可加载内核模块,其它的工作由模块自已来完成。当系统首次访问某一硬件设备时,只要存在使用“depmod”命令建立的模块从属关系树,与之对应的模块就可以自动加载。可加载内核模块通常情况下安装在系统/lib/modules目录的一个子目录下。该子目录的名称由建立内核的Makefile中的VERSION、PATCHLEVEL、SUBLEVEL和EXTRAVERSION等变量的值决定。
Linux 2.6内核为硬件驱动程序带来一个新的、统一的框架。用户对原本运行于旧版本内核下的硬件驱动程序进行定制。新驱动程序框架通过定义各种接口,为硬件的即插即用和电源管理提供全面支持。子系统可以通过这些接口与各个驱动程序进行通信。新驱动程序框架更加明确了总线和驱动程序之间的责任界限。Linux 2.6内核还引入了sysfs文件系统为每个系统的硬件树进行分级处理。Linux 2.6内核还对可加载内核模块规定了新的命名方法,使用的是.ko扩展名,而不是旧版本标准的.o (object)扩展名。
这里将重点阐述2.6内核下的硬件驱动程序与以往内核下的硬件驱动程序在主体结构上的不同之处。
升级硬件驱动程序的基本结构
Linux 2.4内核下的硬件驱动标准模板如下:
#define MODULE
#include linux/module.h>;
#include linux/config.h>;
#include linux/init.h>;
static int __init name_of_initialization_routine(void) {
/*
* code here
*/
}
static void __exit name_of_cleanup_routine(void) {
/*
* code here
*/
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);
旧版本内核下的硬件驱动程序有一个普遍的问题,就是对初始化模块和清除功能的名称进行假设。当开发人员编写旧版本内核下的硬件驱动程序时,如果使用缺省的名称init_module()和cleanup_module(),那么就不需要对初始化模块和清除功能的名称进行记录。这种方法经常会出现错误,已逐渐被淘汰。在2.6内核下,用户必须使用module_init()宏和module_exit()宏对初始化和退出规程的名称进行记录。
另外,在2.6内核下,用户无论是在源代码中还是在Makefile文件中都不再需要对#define MODULE进行描述。内核搭建系统会自动对此类符号进行定义并校验。当用户为2.6内核编写硬件驱动程序时,必然会用到此类搭建系统。
要想对已有的模块进行编译,并使之加载到2.6内核,必须首先完成一些基本的结构变化。然而,当用户利用此类结构加载模块时,会注意到在标准输出设备和系统日志上会显示一个坏模块的出错信息。为了消除这条信息,用户需要为MODULE_LICENSE()宏增加一个示例,例如MODULE_LICENSE("GPL"。这种2.4内核以后的版本才引入的宏,可以将模块定义为获得GPL Version 2或更新版本许可的模块。其它有效的值还有"GPL v2"、"GPL and additional rights"、"Dual BSD/GPL"(选择BSD或GPL许可)、"Dual MPL/GPL"(选择Mozilla 或GPL许可)和"roprietary"。
2.6内核下硬件驱动程序最简单的类属模板如下:
#include img src="/files/misc/lt.gif">;linux/module.h>;
#include img src="/files/misc/lt.gif">;linux/config.h>;
#include img src="/files/misc/lt.gif">;linux/init.h>;
MODULE_LICENSE("GPL";
static int __init name_of_initialization_routine(void) {
/* code goes here */
return 0;
}
static void __exit name_of_cleanup_routine(void) {
/* code goes here */
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);
除了硬件驱动自身所需要的变化外,在Linux 2.6内核下,与之相应的最重要的变化是在内核搭建过程中完成的。
模块搭建过程中的变化
对于所有开发可加载硬件驱动程序的人来说,对他们影响较大的一个基本变化不是源于内核源代码,而是将外部模块编译过程整合为标准的内核搭建机制。如果用户使用的不是集成开发环境(例如TimeSys公司的TimeStorm,它可以检测内核版本并自动建立Makefile),那么用户需要手工为硬件驱动程序建立Makefile。
在2.4和更旧版本的内核下,模块的开发和编译位置不受限制,只要将适当的编译标记移到命令行或模块的Makefile中就可以了。这些标记包括两个编译模块时必须的符号定义和一个指针。该指针指向包含有内核所含文件的目录。以下面的语句为例,用户可以建立一个名为testmod.o的可加载内核模块:
#gcc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4.21/include -O2 -c testmod.c
为2.6内核搭建模块的过程比较简单,但是要想满足所有成功编译所需要的条件就不那么容易。用户既不需要手工指定以模块为导向的说明(例如MODULE, __KERNEL__等),也不必指定新的符号(如KBUILD_BASENAME和KBUILD_MODNAME等),只要对外部模块植入标准内核搭建系统的过程进行整合就可以了。用户也不必指定诸如-O2之类的选项,因为用户编译的模块与其它可加载内核模块一样,进程会自动调用所有的强制性标志。至于Makefile的编写就简单得多了,例如为testmod.ko模块编写的可与2.6内核兼容的Makefile如下所示:
obj-m := testmod.o。
然而,为了建立外部模块,用户必须先完成内核源代码树接口的编写。这样可以建立一些临时目录以供编译时使用。下面是一个为2.6内核构建模块的命令行。它可以从包含模块源代码目录下执行:
# make -C /usr/src/linux-2.6.1 SUBDIRS=$PWD modules
此示例命令假设用户的模块源代码和Makefile所在的目录与用户正在运行的命令中的相同。如果用户不使用POSIX命令(例如BASH),那么可以通过“SUBDIRS=`pwd`”命令,用$PWD变量代替SUBDIRS参数。这样用户就可以使用“pwd”命令识别工作目录。建立出口的命令如下所示:
#make: Entering directory `/usr/src/linux-2.6.1'
*** Warning: Overriding SUBDIRS on the command line can cause
*** inconsistencies
make[1]: `arch/i386/kernel/asm-offsets.s' is up to date.
Building modules, stage 2.
MODPOST
CC /home/wvh/timesys/2.6/testmod/testmod.mod.o
LD [M] /home/wvh/timesys/2.6/testmod/testmod.ko
#make: Leaving directory `/usr/src/linux-2.6.1'
"make"命令的成功完成将产生testmod.ko模块。对该模块的命名使用的是新的内核模块命名规则。如果用户已经对系统的启动程序进行了修改,以便通过名称清楚地加载模块,那么用户需要确定在升级到2.6内核后,这些模块的命名是否遵循了新的命名规则。
适应2.6内核的内部变化
Linux 2.6内核还带来了许多内部变化,用户需要改变已有的驱动程序以适应这种变化。这些变化包括内核的异步I/O机理、DMA支持层、存储器与页分配机理、数据块硬件驱动程序和新的类属硬盘接口等。例如,用来分配并管理存储器与页的功能就发生了新的变化。在2.6内核下,系统使用了一种名叫mempool的标准接口。对模块参考计数的使用和管理也发生了变化。模块参考计数主要用于决定一个模块是否正在使用,并对没有被使用的模块进行安全卸载。在2.6内核下,命令序列已被工作序列所代替,其中,对大量不同驱动程序产生影响的一个重要变化是参数模块的新接口。MODULE_PARM()宏已由详细的参数说明所代替。这种说明来源于新的module_param()宏。
Linux 2.6内核的优先能力和对SMP的识别能力,为驱动程序编写人员带来一些新问题。在单处理机系统中,在无优先能力的Linux内核下,一些驱动程序可以假设在两个处理器间不必再提供重入接口,因为它们无法同时运行驱动程序。驱动程序可以使用“spinlock”或“mutex”命令来保护那些可从多进程访问的数据。这些问题的考虑对于为嵌入式环境(如TimeSys Linux)编写高性能和实时硬件驱动程序的人来说尤为重要。
其它考虑因素
如果用户较为依赖Linux 2.6内核的工作,那么还需要对驱动程序做一些其它的改动。例如,尽管自从2.3内核诞生后,devfs文件系统已经被写入内核,并且在2.6内核设置中被标注为舍弃指令,但是它却经常在一些特殊领域中使用。例如在嵌入式计算中, devfs可提供较强的灵活性和一个紧缩的/dev文件名。devfs文件系统是介于hardcoded硬件节点间的中间步骤。此类节点主要用于早期的Linux和Unix系统中。同时,它还是udev、hotplug和sysfs文件系统的综合。对udev的支持技术目前正在被写入Linux 2.6内核。TimeSys公司已经开发出了拥有此类技术的商业Linux系统。如果用户正在使用其它的Linux发行版,那么用户也许会发现devfs支持和集成技术对于驱动程序来说十分重要。
如果用户想使用devfs文件系统,那么必须首先在搭建内核时激活对它的支持。这一步可以在内核设置编辑程序的File systems→Pseudo filesystems中完成。使用devfs还需要改变硬件驱动程序对硬件节点的识别方法。当用户使用传统的/dev目录作为Linux硬件描述符文件的放置位置时,硬件驱动程序通过启动register_blkdev() 或register_chrdev()函数来注册新硬件。具体使用哪一个,要看驱动程序注册的是一个数据块硬件还是字符硬件,而且必须事先知道硬件的主号码和次号码。另外,因为udev是一个可热插拔程序,它可以自动建立并删除/dev目录下的登录项,所以这一方法同样也适用于新的udev硬件机理。
使用devfs硬件文件系统时,硬件驱动程序必须使用devfs_register()系统呼叫来注册它们的硬件。驱动程序可以继续使用此前指定的主次编码,也可通过为devfs_register()呼叫指定DEVFS_FL_AUTO_DEVNUM 标志,由devfs自动指定编码。
小结
用户常常由于提高系统性能、增加系统功能、实现系统单一化和标准化等原因对内核进行修改。每一个新版本Linux内核都会带来许多新的变化,这些变化在不同层次上对开发人员有很大的影响。本文概括了在2.6内核下硬件驱动程序的变化及模块搭建过程的变化。诸如TimeStorm之类的工具可以为用户提供升级驱动程序的模板,并可自动为可加载内核模块建立并管理Makefile。然而,如果用户正在手工维护现有的硬件驱动程序或开发新的硬件驱动程序,那么用户将需要认真的考虑2.6内核的变化,做出正确的选择。(T111)
编译安装2.6.10内核全过程
June.Hn. 2004-12-31
QQ:67842531
email:junehn@126.com
明天就是2005年了,所以今天把这篇文章写出来,算是2004年的最后一件想做的事不吧,希望能对大家有所帮助.
我用2.6的内核一经很久了,从2.6.0到2.6.10,几乎每一次更新我都会重新编译.但一直有几个问题没有解决:usb keyboard,usb mouse,HID,EHCI,OHCI,相信有不少人也遇到过这些问题,这两天天狠下一条心,顶着考试的压力终于把问题解决了.
我的配置:
p4 2.0GHz
声卡:i810 AC97
显卡;Intel 845G
OS:Red Hat 9.0
一.准备工作:
1.安装module-init-tools-3.0.tar.bz2http://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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)