第六十二讲——linux内核 本文共有17408个字,关键词: 虽然linux内核源码很长,有上千万行,但是实际上我们使用到的功能是比较有限的,在编译内核的时候按照我们的需求进行编译,编译完成后内核的大小可能只有几十兆,在经过压缩,几兆大小也是可以实现的。 但是对于red hat、debian等发行版来说,为了使操作系统弄安装在各个平台上,且内核不臃肿,只能够将功能模块化,这些模块是被能被进程使用的,只有内核才能调用,所以这些外部的模块称你为ko(kernel object)内核对象,因此内核由核心和内核对象组成。内核是动态加载模块的,模块存放在/lib/modules目录下。 系统上可以有多个内核并存,且每个内核在/lib/modules目录下都有一个跟内核版本号完全相同的目录,即以内核版本号命名的目录,在这个目录下有对应内核所需要的各种外围模块,而模块同各应用程序一样,存在依赖关系。在内核的内部有一个模块依赖关系的文件,用来识别这种依赖关系。 在大多的系统上,内核的命名为vmlinuz /lib/modules下的*.dep文件是内核的模块依赖关系(自动生成) /lib/modules下的*.*map为映射表,或者叫符号链接表 /lib/modules/内核版本号/kernel 下为内核模块 arch 平台驱动(驱动CPU) crypto 加密解密相关 drives 驱动 fs 文件系统 kernel 内核自身的其他功能 lib 库 mm 内存管理 net 网络管理(TCP/IP协议栈,并不是网络驱动) sound 声卡 那么此时问题来了,我们的驱动都放在了/lib/modules下,而我们的内核在驱动根文件系统时是需要先驱动硬盘,而硬盘的驱动在根文件系统下,这样就进退两难了,难道我们还得将驱动程序放入内核中?那样一来我们费劲心思模块化减少内核体积的意义便荡然无存了。 于是我们只能妥协,寻找一个中间人来完成驱动硬盘的工作,这个中间人只能向内核提供硬盘的驱动程序,用以挂载根文件系统。 那么这个中间文件是否会臃肿? 这个我们就得从操作系统的安装说起,在操作系统安装的过程中,安装程序会知道内核要访问的“根”在哪个地方,也会知道设备的类型,所需要的驱动程序,于是在安装完成的最后一个步骤安装程序会通过脚本或者命令自动收集内核访问这个设备所需要的程序有哪些,并动态生成这个中间文件,而这个文件就是一个桥接,将内核与文件系统建立联系。 那么这个中间文件是如何被访问的?它不存放在硬盘中? 我们之前说过,内核要访问任何文件都必须通过文件系统来访问,这样的设计风格、访问接口、访问方法才能够一致。这也就意味着这个中间文件得是一个独立的文件系统,但是我们之前也说过,访问任何文件系统得先驱动硬盘,且得通过根文件系统进行访问,于是这个中间的文件系统就是一个根文件系统,我们称之为虚根,只是用于临时过渡,在一个操作系统中虽然两个根文件系统不能同时存在,但是根文件系统是可以切换的。 当虚根的任务完成以后就会自动切换到真正的根文件系统。 #chroot命令就能够完成根目录的切换,可以将一个临时的目录作为根来使用。使用的时候只需要在命令后跟上目录即可。 #chroot /path/to/somewhere 在临时目录下应当有/bin目录,且/bin下应有一个bash程序用于与计算机交互,这样就可以运行了?实际上不是的,从我们前面所学的bash环境的配置文件来看,至少是需要一些配置文件的,我们也说过,程序的运行是需要依赖库文件的,因此我们可以大胆猜测,在临时目录下仅有/bin/bash是不能够切换成功的,因为bash程序不能成功的运行。 事实上,单独的bash不能成功切换根,此时我们需要将bash程序所依赖的库文件cp到临时目录的/lib下,因为临时目录切换为根之后,整个的运行机制是一样的。 #ldd /bin/bash 显示bash程序共享库的依赖关系 #ldd /path/to/somewhere(可执行程序的路径),显示一个程序运行所依赖的库文件。 我们手动将ldd /bin/bash 显示出来的库文件cp到临时目录下的/lib下,再次使用chroot命令切换根,我们会发现切换是切换了,但是提示符什么的就不是我们登录操作系统的时候的提示符了,原因就是我们登录后是bash程序的配置文件生效,才有了命令提示符的格式,我们如果将对应的配置文件放到对应的目录下也可以实现。 由于我们chroot改变了根,于是将临时目录作为根,根下仅有bash程序,也就是说,之前所有的服务都会挂掉,而且只能使用bash的内建命令,所有的外部命令无法使用。 外部命令和内部命令使用的帮助命令是有区别的,内建命令使用—help查看,外部命令使用man命令查看。 通俗点说,我们进行根切换就是画地为牢,将活动限制在一定范围内,而虚根进行切换时,机制同上,但是使用的命令是完全不一样的,虚根的切换时完完全全的切换,在切换时将虚根上的所有文件都搬运到真正的根上。 /proc 内核映射 在rhel5上,借助nash提供的switch_root命令完成根切换,而switch_root就是运行在临时根文件系统上的命令,这个命令能够将临时根中的文件搬运到真实根目录中,并以真实的根目录作为根,虚根这个文件能载入内存,并能够将内存中的一段空间模拟成磁盘空间使用,通常被称为ramdish,在rhel6上叫ramfs,所以在rhel5上这个文件的名字叫initrd,在rhel6上叫initramfs。这个跟红帽操作系统本身没有关系,而是跟红帽采用的机制又关系。 所以,内核要访问根,一般来讲需要两个模块。 一是这个设备的驱动 二是这个设备上的文件系统 我们再来梳理一下系统的系统流程: POST-->BIOS(Boot seqence)-->MBR(boot loader,446byte)-->kernel-->initrd(initramfs)-->/sbin/init 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2017-01-31 评论 1638 次浏览