|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。
Linux的initrd手艺是一个十分广泛利用的机制,linux2.6内核的initrd的文件格局由本来的文件体系镜像文件变化成了cpio格局,变更不但反应在文件格局上,linux内查对这两种格局的initrd的处置有着截然的分歧。
initrd的英文寄义是bootloaderinitializedRAMdisk,就是由bootloader初始化的内存盘。在linux内核启动前,bootloader会将存储介质中的initrd文件加载到内存,内核启动时会在会见真实的根文件体系前先会见该内存中的initrd文件体系。在bootloader设置了initrd的情形下,内核启动被分红了两个阶段,第一阶段先实行initrd文件体系中的"某个文件",完成加载驱动模块等义务,第二阶段才会实行真实的根文件体系中的/sbin/init历程。这里提到的"某个文件",Linux2.6内核会同之前版本内核的分歧,以是这里临时利用了"某个文件"这个称号,前面会具体讲到。第一阶段启动的目标是为第二阶段的启动扫清统统障爱,最次要的是加载根文件体系存储介质的驱动模块。我们晓得根文件体系能够存储在包含IDE、SCSI、USB在内的多种介质上,假如将这些设备的驱动都编译进内核,能够设想内核会何等复杂、痴肥。
Linux2.4内查对Initrd的处置流程
为了使读者明晰的懂得Linux2.6内核initrd机制的变更,在重点先容Linux2.6内核initrd之前,先对linux2.4内核的initrd举行一个复杂的先容。Linux2.4内核的initrd的格局是文件体系镜像文件,本文将其称为image-initrd,以区分前面先容的linux2.6内核的cpio格局的initrd。linux2.4内查对initrd的处置流程以下:
1.bootloader把内核和/dev/initrd的内容加载到内存,/dev/initrd是由bootloader初始化的设备,存储着initrd。
2.在内核初始化过程当中,内核把/dev/initrd设备的内容解紧缩并拷贝到/dev/ram0设备上。
3.内核以可读写的体例把/dev/ram0设备挂载为原始的根文件体系。
4.假如/dev/ram0被指定为真实的根文件体系,那末内核跳至最初一步一般启动。
5.实行initrd上的/linuxrc文件,linuxrc一般是一个剧本文件,卖力加载内核会见根文件体系必需的驱动,和加载根文件体系。
6./linuxrc实行终了,真实的根文件体系被挂载。
7.假如真实的根文件体系存在/initrd目次,那末/dev/ram0将从/挪动到/initrd。不然假如/initrd目次不存在,/dev/ram0将被卸载。
8.在真实的根文件体系长进行一般启动历程,实行/sbin/init。linux2.4内核的initrd的实行是作为内核启动的一其中间阶段,也就是说initrd的/linuxrc实行今后,内核会持续实行初始化代码,我们前面会看到这是linux2.4内核同2.6内核的initrd处置流程的一个光鲜明显区分。
Linux2.6内查对Initrd的处置流程
linux2.6内核撑持两种格局的initrd,一种是后面第3部分先容的linux2.4内核那种传统格局的文件体系镜像-image-initrd,它的制造办法同Linux2.4内核的initrd一样,其中心文件就是/linuxrc。别的一种格局的initrd是cpio格局的,这类格局的initrd从linux2.5起入手下手引进,利用cpio工具天生,其中心文件不再是/linuxrc,而是/init,本文将这类initrd称为cpio-initrd。只管linux2.6内查对cpio-initrd和image-initrd这两种格局的initrd均撑持,但对其处置流程有着光鲜明显的区分,上面分离先容linux2.6内查对这两种initrd的处置流程。
cpio-initrd的处置流程:
1.bootloader把内核和initrd文件加载到内存的特定地位。
2.内核判别initrd的文件格局,假如是cpio格局。
3.将initrd的内容开释到rootfs中。
4.实行initrd中的/init文件,实行到这一点,内核的事情全体停止,完整交给/init文件处置。
image-initrd的处置流程:
1.bootloader把内核和initrd文件加载到内存的特定地位。
2.内核判别initrd的文件格局,假如不是cpio格局,将其作为image-initrd处置。
3.内核将initrd的内容保留在rootfs下的/initrd.image文件中。
4.内核将/initrd.image的内容读进/dev/ram0设备中,也就是读进了一个内存盘中。
5.接着内核以可读写的体例把/dev/ram0设备挂载为原始的根文件体系。
6..假如/dev/ram0被指定为真实的根文件体系,那末内核跳至最初一步一般启动。
7.实行initrd上的/linuxrc文件,linuxrc一般是一个剧本文件,卖力加载内核会见根文件体系必需的驱动,和加载根文件体系。
8./linuxrc实行终了,惯例根文件体系被挂载
9.假如惯例根文件体系存在/initrd目次,那末/dev/ram0将从/挪动到/initrd。不然假如/initrd目次不存在,/dev/ram0将被卸载。
10.在惯例根文件体系长进行一般启动历程,实行/sbin/init。
经由过程下面的流程先容可知,Linux2.6内查对image-initrd的处置流程同linux2.4内核比拟并没有光鲜明显的变更,cpio-initrd的处置流程比拟于image-initrd的处置流程却有很年夜的区分,流程十分复杂,在前面的源代码剖析中,读者更能体味各处理的简便。
cpio-initrd同image-initrd的区分与上风
没有找到正式的关于cpio-initrd同image-initrd对照的文献,依据笔者的利用体验和内核代码的剖析,总结出以下三方面的区分,这些区分也恰是cpio-initrd的上风地点:cpio-initrd的制造办法加倍复杂。cpio-initrd的制造十分复杂,经由过程两个命令就能够完成全部制造历程。
#假定以后目次位于筹办好的initrd文件体系的根目次下:
bash#find.|cpio-c-o>../initrd.img
bash#gzip../initrd.img
而传统initrd的制造历程对照烦琐,必要以下六个步骤,#假定以后目次位于筹办好的initrd文件体系的根目次下:
bash#ddif=/dev/zeroof=../initrd.imgbs=512kcount=5
bash#mkfs.ext2-F-m0../initrd.img
bash#mount-text2-oloop../initrd.img/mnt
bash#cp-r*/mnt
bash#umount/mnt
bash#gzip-9../initrd.img
</p>
系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo、pswho |
|