Linux initrd有很多值得学习的地方,这里我们主要介绍Linux initrd,包括介绍nash等方面,Linux initrd 讲究了很多重要的事情,init的执行在这里分为以下几部操作,请对所区分的各个部分加以了解。
定义主目录(root)的路径
mkrootdev指令是nash这一支shell所提供的功能,主要就是在要转换之前先行将主目录定义清楚,默认会将GRUB中kernel command line所设置root=xxx中的xxx路径先建立好。
将root 路径mount到/sysroot下将刚刚找到的root 路径mount到Linux initrd中的/sysroot下,但要注意,这时的/sysroot就好像rescue mode的/mnt/sysimage目录,是一样的意思,都只是先将实体操作系统存在的实体路径mount到一个虚拟操作系统(在这里是initrd)的暂存目录中,再通过切换的方式转为实体的主目录。不同的是,在rescue mode中用的是chroot;但在Linux initrd用的则是switchroot指令,之所以会有这样的差异,是因为rescue mode直接使用了操作系统的指令,而initrd在加载时,并没有操作系统的指令可用,因此是通过nash内置的指令。或许有人会问,rescue mode不也是以Linux initrd的方式加载的吗?是的,但要在此补充说明的是,虽然都是Linux initrd,但rescue mode中的initrd是光盘直接提供的,而这里所说的Linux initrd则是安装操作系统后由操作系统直接产生的,两者有很多不同之处。您若有兴趣,不妨将光盘的initrd文件打开来看(如图4-45所示),将会发现该Linux initrd中的init文件并不是一个脚本文件,而是一个真正可以在操作系统下执行的程序。
当然,存放在CD或DVD中的Linux initrd文件是为用户安装操作系统所使用的,会遇到许多软、硬件的不同需求,因此,initrd的文件所需存放的资料(像module)远比操作系统开机所需加载的Linux initrd文件多得多。像图4-46 中Fedora Core 6安装光盘中的initrd文件几乎是操作系统下initrd文件的4倍之多。
建立其他的文件系统
在主目录(在initrd阶段为/sysroot)建好之后,setuproot指令开始运行,将Linux initrd通过init建立好的/proc、/sys、/de目录中所有资料转移到/sysroot,以方便转换到新的实体操作系统,这也是nash内置的功能,但笔者在nash的使用手册竟无法找到任何有关setuproot的描述,不知为何独漏这一支。
切换到新的root目录,并开始执行实体系统下的init文件
switchroot是nash在2.6版kernel以后的版本才可使用的新功能,刚刚setuproot把所有和操作系统有关的目录都建立在/sysroot后,setuproot会将/sysroot切换为实体操作系统下的主目录(/),完成后会顺便将所有之前Linux initrd存在内存中的资料清空,如同所有在虚拟文件系统(包括/sys、/proc或/dev等)中的资料,因此,当switchroot执行完成时,内存中就不会再有Linux initrd所建的任何目录及文件,完全由实体操作系统来运行。
总结
在此要特别强调,千万不要在您的计算机实验上述所提到nash支持的setuproot及switchroot两种功能,虽然本章一开始就说明了如何执行nash及如何实际使用nash中的功能,但如果使用到setuproot及switchroot两者其中之一,都会对操作系统造成破坏,尤其是switchroot。原因是这两者原本就是要为切换到实体操作系统做准备,但并不会理会本身所存在的路径是属于内存或是实体硬盘。
当用户执行时,会强迫由setuproot将原本在操作系统中/proc、/sys及/dev的文件先做搬移操作,这样在开机时,就会因为被删除掉许多重要文件而造成无法正常开机,更惨的是,接着会执行switchroot,我们提过这个功能会将切换过后遗留的文件全部清掉,这在实体操作系统所代表的就是将硬盘中的资料全数删除,因此,在执行完switchroot后,就只剩原本console的画面陪伴你,重开机后就一个不剩了,想做实验的用户,千万要考虑清楚再下手。
当然,在switchroot执行后,就进入操作系统程序,而这个重责大任就交给存在于实体操作系统中的init这个程序,下一章将以init开头,直到进入登录画面的每一步,都会交待得清清楚楚,当然,Linux initrd在每一个版本及每一套不同的操作系统厂商(如Red Hat、SuSE、Debian等)都或多或少有些许的不同之处,但毕竟都是使用Linux initrd的kernel,了解其中一个之后,对每个版本一定都会有较清楚的认知。
【编辑推荐】