GKaLinux联盟
Linux启动顺序 GKaLinux联盟
内核加载完成后,传统的Unix和Linux系统会执行一个系统应用软件作为初始化进程。该应用软件在系统的/sbin/init目录下。一般情况下,初始化进程是所有进程的第一步,是系统所有进程的铺路石,用户可以使用“ps”命令调出进程状态列表。初始化进程可以对/etc/inittab文件进行读取,从而识别系统启动、进程和程序列表的方法。 GKaLinux联盟
使用初始RAM磁盘启动 GKaLinux联盟
如果用户系统使用初始RAM磁盘作为根文件系统,系统的启动程序便多了一步。系统的第一步不是执行初始进程,而是对初始RAM磁盘进行解压并安装,并执行/linuxrc文件。该文件必须是可以执行的,可以作为一个提供其它可执行命令列表的命令文件。另外该文件还必须是一个像BusyBox一样的复调用二进制命令,或者作为一个连接复调用二进制命令或/sbin/init进程自身的符号链接。 /linuxrc文件执行完毕便可进入初始RAM磁盘的安装进程。这一进程由内核源代码文件init/do_mounts_initrd.c来指定。/linuxrc文件实际上是一个命令程序,其形式如下(出自无devfs 文件系统或udev的Red Hat 9.0): GKaLinux联盟
#!/bin/nashecho Mounting /proc filesystemmount -t
proc /proc /procecho Creating block devicesmkdevices /
devecho Creating root devicemkrootdev /dev/rootecho 0x0100 >
/proc/sys/kernel/real-root-devecho Mounting root filesystemmount -o defaults
--ro -t ext3 /dev/root /sysrootpivot_root /sysroot /
sysroot/initrdumount /initrd/proc |
由此可见,使用初始RAM磁盘的Red Hat系统中的缺省/linuxrc文件可执行一系列系统初始化命令。 GKaLinux联盟
如果用户正在对一个拥有本地存储器的Linux系统进行移植,并且该系统并不局限于初始RAM磁盘,那么命令文件中的最后一组命令可将根文件系统安装到存储设备中,并使用“pivot_root”命令改变“/”目录下的系统主旨。linux-utils套件中的“pivot_root”命令可以将系统的根目录由初始RAM磁盘改为可提供长期存储器的硬件设备。如果用户正在使用GRUB,该硬件可以通过系统中的根参数root=value进行识别。 GKaLinux联盟
在升级使用初始RAM磁盘的定制Linux系统时,用户需要完成下列工作: GKaLinux联盟
安装并检验初始RAM磁盘,检查它是如何使用/linuxrc文件的。如果/linuxrc文件是一个命令程序,用户需要检验它所执行的命令,从而确定这些命令与2.6内核相适应。如果它特别引用了一些诸如“modprobe”或“insmod”之类的命令,那么用户必须确定已经在初始RAM磁盘和其它文件系统中安装了这些工具软件与2.6内核相兼容的版本。用户的初始RAM磁盘必须包括一些为2.6内核搭建的内核模块,并且遵循2.6内核使用的命名规则,即使用.ko扩展名,而不是.o扩展名。 GKaLinux联盟
如果/linuxrc文件是一个连接/sbin/init程序的符号链接或硬链接,那么用户需要确定初始程序使用的命令文件不是2.4内核专用的。用户同样要遵循上述原则进行检测和重名命。 GKaLinux联盟
假设用户的系统可以正确地执行/linuxrc文件,系统通常可以将系统文件的根改变到一个新的“/”目录下,或 者手动执行/sbin/init进程。Linux内核为了寻找初始进程而执行一次顺序搜索。较旧版本的内核需要用户来确定作为启动进程的一部分而执行的文件名称,方法是使用启动加载程序中的initrd=value参数。如果用户使用初始RAM磁盘或/linuxrc文件中的“exec”命令,可自动启动初始化进程而不需要以上步骤。 GKaLinux联盟
标准的Linux初始化次序 GKaLinux联盟
在桌面Linux系统或较大的Linux系统中,大多数系统使用一整套的应用软件(SysVInit套装软件)和一套相关的小程序(initscripts套装软件)对系统启动进程和启动次序进行识别。 GKaLinux联盟
大多数桌面Linux系统使用“运行级别”这一概念识别系统执行的应用程序和执行顺序。不同的运行级别是定义系统使用模块所对应的某组应用软件的简单方法。例如,运行级1通常被称为单一用户模式,主要用来对系统进行维护。当系统处于第一运行级时,处理运行状态的只有系统管理员用来与系统进行交互和维护所需的核心应用程序。 GKaLinux联盟
同时使用SysVInit和initscripts套装软件的系统启动过程是:当内核加载完毕并开始运行时,它会调用初始化进程进行工作。该进程将读取/etc/inittab文件,并识别该命令文件启动的基本进程和程序。 GKaLinux联盟
在/etc/inittab文件中,缺省的运行级由包含“initdefault”字符串的命令行来识别,例如id:2:initdefault:。 GKaLinux联盟
在此例中,缺省的运行级是2。/etc/inittab文件中的额外入口将对初始化系统所运行的命令程序进行识别,例如si::sysinit:/etc/rc.d/rc.sysinit。 GKaLinux联盟
系统初始化程序运行后,使用SysVInit和initscripts的Linux套件将对系统进入某一特定运行级时发生的事件进行定义。例如,用户在/etc/inittab文件结尾部分的一些命令行中,可能会看到有关运行级2的额外信息,例如l2:2:wait:/etc/init.d/rc 2。 GKaLinux联盟
此命令行指明,当系统进入运行级2时,/etc/init.d/rc命令将随参数“2”一起被执行。结果导致“rc”命令执行所有在/etc/rc2.d目录下的适当文件。此目录下的文件名都为S+NN+名称或K+NN+名称,且这些文件都是可执行的外壳程序。这些程序中还包含有其它系统命令的列表。当系统进入某一特定的运行级时,名称以“S”打头的文件便会被执行。系统离开某一特定运行级时,名称以“K”打头的入口命令便会被执行。命令的执行次序依照NN所代表的两位数字的大小进行排列。至于名称则由用户自己定义,但一般应能够被文件启动的程序和子系统调用。 GKaLinux联盟
对启动次序中的定制进行检查 GKaLinux联盟
在向2.6内核进行移植过程中,用户要确定进行如下修改: GKaLinux联盟
◆ 用户必须将所有强制可加载内核模块复制到用户所使用的初始RAM磁盘中。为了能与2.6内核一起工作,这些模块必须使用新的.ko命令规则。 GKaLinux联盟
◆ 初始RAM磁盘中的/linuxrc文件或正常启动次序中的其它文件不能包含任何使用旧模块命名规则的模块加载索引信息。 GKaLinux联盟
Target Configurator工具的一大优势就是它可以自动建立一个初始RAM磁盘和一个适应2.6内核的根文件系统。如果用户手工建立根文件系统或初始RAM磁盘,那么用户需要先确定根文件系统中包含有适当的初始化命令。 GKaLinux联盟
如果用户正在将一个基于2.4内核的TimeSys Linux系统移植到一个2.6内核下,而且用户已经对系统的启动次序或所需执行的应用软件进行了定制,那么用户必须同时对2.6内核下的系统启动次序做同样的定制。正如上文提到的,如果用户的2.4系统为特定的驱动程序或子系统加载了内核模块,那么用户必须确定已安装了这些工具软件适用于2.6内核的版本。用户的初始RAM磁盘和文件系统必须包含有为2.6内核建立的内核模块,并且以2.6内核的命名规则进行命名。 GKaLinux联盟
如果用户的2.6系统使用的是devfs文件系统,而不是标准的Linux文件系统或udev,那么用户也许还需要对硬件或文件系统索引进行升级。例如,如果用户正在使用2.4内核下标准的dev文件系统,并且要升级到适用于2.6内核的devfs文件系统,那么用户需要升级硬件的索引,例如,将dev文件系统中的硬件名/dev/md0改为devfs文件系统中的硬件名/dev/md/0。 GKaLinux联盟
2.4和2.6内核之间的另一个重要区别是,在2.6内核下,许多应用程序由于升级已无法支持GLIBC或uClibc库。在这种情况下,用户还需要确定用户的初始RAM磁盘或根文件系统中还包含有应用程序所需的新版共享库。如果用户正在创建新的初始RAM磁盘或根文件系统,那么就不必担心这一问题了。但是如果用户是对已有的初始RAM磁盘或根文件系统进行升级,那么这一点十分重要。 GKaLinux联盟
小结 GKaLinux联盟
不同内核下的Linux系统启动过程并未发生变化,但是值得注意的是,在进行内核移植过程中,用户必须了解系统是如何初始化的。尽管启动过程本身没发生变化,但是一些与内核模块相关的规则发生了变化。因此明确现在启动命令是否还能正确运行是十分重要的。用户还必须了解系统启动时所执行的文件和应用程序,以便决定哪儿需要做相应的修改。总之,只要用户了解系统的启动次序并仔细检验系统启动进程中执行的文件,移植任何定制Linux系统的实施方案都是可行的。 GKaLinux联盟