科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道全面移植2.6内核的应用程序

全面移植2.6内核的应用程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

前面介绍了与2.6内核相关的变化,解释了新硬件驱动程序的编译进程,并讨论了2.6内核的新功能对于已有硬件驱动程序的影响。

作者:Linux公社 来源:Linux公社 2007年11月8日

关键字: 程序 应用 移植 Linux

  • 评论
  • 分享微博
  • 分享邮件
前面介绍了与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,自身不包括从属信息。

    这些套件大多存在于基于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开发套件使专门系统向新内核和新硬件的移植变得十分简单。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章