14-CentOS启动流程 本文共有5606个字,关键词: CentOS启动流程粗讲(细讲见本文档) 1. POST:Power On Self Test 加电自检 ROM中存放了BIOS系统和自检程序,当主板加电后会将BIOS载入内存空间执行检测,当检测通过后会通过检测boot顺序读取MBR 2. 读取MBR中前446个字节,boot loader,引导加载器 boot loader有grub|grub2|Lilo等,当BIOS载入bootloader后,将控制权交给bootloader(GRUB),grub去加载内核,grub首先要能够识别文件系统,grub中应当声明内核的位置,在第二阶段的boot基本磁盘分区中,/boot/grub/grub.conf中定义了内核位置信息 /boot/grub/grub.conf default=0 默认启动的内核 timeout=5 默认等待时间 hiddenmenu 隐藏式菜单,需按任意键显示 splashimage=(hd0,0)/grub/splash.xpm.gz 可使用Imagemagick包安装convert生成xpm格式的图片 图片的要求必须是XPM格式 必须使用gzip压缩 最多使用14位颜色显示 分辨率640*480 GRUB的功能 1) 选择要启动的内核或者操作系统 能够隐藏选择界面 2) 交互式接口 e 编辑模式 3) 基于密码保护 启用内核映射,password段定义在相应的title下,对内核进行加密 传递参数[进入编辑模式],password端定义在全局段中 加载VMLinux至内存 3. kernel运行 通过initrd加载根文件系统,initrd中包含根文件系统所在设备的驱动和相关程序,是kernel能够识别并加载根文件系统的桥梁 4. init运行 /sbin/init 配置文件:/etc/inittab /etc/init/*.conf 通过/etc/init/rcS.conf & /etc/init/rc.conf 确认系统的启动级别 进入相应的目录/etc/rc.d/rc#.d/S*,执行对应启动级别下的服务 脚本的实际位置:/etc/init.d/* init的任务 1) 设定默认的运行级别 2) 指定系统运行的初始化脚本-->/etc/rc.sysinit 3) 启动指定级别下需要启动的服务 4) 定义Ctrl+Alt+Delete组合键的动作 5) 初始化字符终端(对应的设备是/dev/*,调用login-->/etc/issue) 6) 启用图形终端(X-window桌面管理器) init级别定义 0 关机 1 singe 单用户模式 2 无网络的完全模式 3 完整的多任务多用户的模式 4 保留 5 图形界面 6 重启 系统初始化脚本完成的任务 1) 设置主机名 2) 打印文本欢迎信息-->/tec/issue 3) 激活SELinux和udev 4) 激活swap 5) 挂载/etc/fstab中定义的本地文件系统 6) 检测文件系统并以读写的方式挂载 7) 设置系统时钟 8) 装载键盘映射 9) 根据/etc/sysctl.conf设置内核参数 10) 激活软RAID和LVM设备 11) 清理操作 root忘记密码的操作方式 1.进入单用户模式-->e-->选择内核版本e-->编辑:1/single 回车保存-->b 重启进入单用户 2.使用启动盘,进入修复模式更改root的密码,按照提示进行 ~]# chroot /mnt/sysimage #切换到真实操作系统目录下 ~]# passwd root #修改用户密码 ~]# exit #退出当前根 ~]#reboot #重启 手动安装GRUB 使用光盘进入救援模式 ~]# chroot /mnt/sysimage ~]# grub >root (hd0,0) #第一块磁盘的第一个分区 >setup (hd0) >quit ~]# exit ~]# reboot linux启动流程细讲: centos的启动流程(5&6) linux:kernel+rootfs kernel的功能:进程管理、内存管理、网络管理、驱动管理、文件系统、安全管理 glibc (gnu lib) C标准库(系统调用的再封装) glibc已经属于用户空间,在根文件系统上 库:函数的集合,function(功能),调用的接口为函数。库也是二进制程序,但是库文件没有独立的运行接口,只能被调用。 库文件:*.so (share object) 共享对象。 过程调用:procedure,无返回值的代码片段,它的作用可能是环境的准备,并不需要返回值。 函数调用:function,有返回值。 内核的设计流派 : 1. 单内核设计:把所有的功能集成到同一程序 2. 微内核设计:windows、solaris,微内核的设计能真正意义上实现线程模型,每种功能使用一个单独的子系统实现。 linux的特点: 1. 支持模块,linux将支持的功能做成模块 内核模块 只能被内核调用,称为内核对象 .ko (kernel object)内核对象 2. 支持模块的动态装载、卸载 模块化的设计使得内核不会变得过于庞大,需要的时候装载模块,不需要的时候卸载模块。 组成部分: 核心文件:/boot/vmlinuz-VERSION-release (内核也被做成rpm包,release为rpm包的release号) 模块文件:/lib/modules/Version-Release/kernel/.... /lib/modeles下的文件(目录)名与内核版本号和发行号保持严格一致。 虚根(微型的根文件系统) 内核借助它来驱动硬盘上的文件系统,这个微型的根文件系统是在操作系统安装时生成的(安装程序时一定能够识别硬盘类型的),里面记录了这个操作系统上文件系统的驱动,这使得内核能够加载根文件系统上的模块,从而启动起来 ramdisk(辅助工具,虚根)是基于内存的磁盘,本地回环设备文件,将文件当做磁盘来使用,在系统启动时直接被装入内存,在内存中把一段空间当做磁盘使用,从而使得内核能够加载到根,能运行根上的应用程序,能装载根上的群东程序。 为了避免内核意为加载到虚根后完成任务,因此还需要做根切换 /boot/initrd-Version-release.img CentOS5中ramdisk模拟成硬盘 /boot/initramfs-Version-release.img CentOS 6/7中模拟成文件系统,可以提高存储效率 Tips:硬盘驱动是硬件层次的识别,如插入设备后BIOS会进行扫描,在BOOT选项中可以看到 CentOS系统启动流程(X86平台) POST加电自检: ROM芯片:CMOS固化程序,CMOS中科做一些设定 CMOS中的设定叫做BIOS,(Basic Input and outpout system) 用于设定硬件之间的协作方式,启动硬件哪些功能,这些程序需要CPU才能运行(执行) 内存是由ROM和RAM构成,32位编址,ROM先进行编址,再编址RAM,CPU加电就你能够完成自举,即去固定的地址空间加载一段程序,这个地址空间就是ROM提供的,从而完成加电自检,自检完成后出现BIOS界面(不选择就不会进入BIOS界面) BIOS会通过设定好的BOOT Sequence(引导顺序)加载对应磁盘上的MBR中的bootloader,只要在按顺序查找的任何一个设备可被引导,无论是否能加载操作系统,都不会去找下一个设备。 按boot sequence查找可引导的设备,第一个有引导程序的设备即为本次启动的设备。 boot loader:引导加载器(一段程序),任何操作系统安装时提供并安装的。 windows的boot loader为NTloader linux:linux loader(LILO 较老) 不支持1024柱面后的分区,在移动设备上使用广泛 GRUB(Grand unifrom bootloader)统一引导加载器 GUB2(是完全重写的,二者不是同一个东西),常用的版本为0.97版的一代G boot loader 找到操作系统所在磁盘分区,将内核加载至内存中,并且将控制权常常移交给内核程序 boot loader放在MBR中的前446bytes中,接下来的64字节为磁盘分区表,每16字节表示一个分区,最后的两字节表示bootloader是否有效 MBR位于0盘面、0磁道、0扇区 bootloader是安装操作系统的时候安装的,手动也可以安装,只要存在分区,MBR中的64bytes分区表一定在使用,但bootloader不一定被使用。 bootloader会提供一个菜单,允许用户选择要启动的操作系统内核的版本,当内核装载至指定的内存空间内自解压,展开后硬件的控制权限交给内核。 GRUB分为两个阶段: 第一阶段是放在boot loader中的,(1st stage)的主要作用是找到硬盘上的第二阶段 第二阶段位于硬盘上,(2nd stage),于是GRUB的菜单就变得非常漂亮,功能也变得完善。 GRUB还有一个1.5阶段,是帮助GRUB识别文件系统的 /boot/grub 许多1.5*文件,都是各类型的文件系统,是为了让第一阶基于这些内容去识别第二阶段,文件系统也叫驱动,但这些文件系统放在分区上,因此,这也是操作系统安装时就设定好的,将安装时选用的文件系统对应的1.5*驱动放在MBR随后的一段空间上,这里存放的一定是能驱动文件系统的驱动文件,从而使得GRUB进入第二阶段 kernel:大多数的内核是自解压的,展开后进行初始化 内核接管后会探测各硬件,如有驱动就安装驱动,挂载根文件系统并启动init,当没有硬件驱动时,使用基本的驱动访问或不加载驱动 内核的初始化: 探测可识别的硬件设备,架子啊硬件驱动程序,有可能会借助ramdisk加载驱动。 以只读的方式挂载根文件系统,运行用户空间的第一个应用程序/sbin/init init程序的类型: sysv风格:init centos5:以脚本的方式运行启动程序,效率很低,且服务启动有先后顺序,不能够并行运行。 upstart:由Ubuntu研发,不用等前一个服务完全启动,差不多一并行的方式进行,通过内核间的一种通信方式来实现,启动的任然是脚本,在CentOS上使用init命名,以service进行服务的管理。 systemd:无需脚本来启动,systemd本身就是一个强大的解释器,需要借助其他程序来启动服务,自身就能够完成加载并提交给内核,不需要bash参与。只要暂时用不到的服务在启动时不启动,但会告诉内核所有的服务都启动了,当用户第一次访问到该服务时才会将该服务启动,这使得开机可以完成秒级启动。 CentOS7上 systemd保留了原名,由systemctl进行服务的管理 内核的特性之一:使用缓冲和缓存来加速对磁盘上文件的访问 ramdisk: initrd加载仅内存后将该段内存当做磁盘使用,但是内核会认为任何磁盘的性能都比较慢,会将数据先加载到内核的缓冲区,因此,本身就处于内存中的数据还要缓存一次,因此,使用ramdisk的方式较慢。 ramfs:initramfs装载进内存后,被内核识别为文件系统,文件系统自身能完成缓冲和缓存的管理。 initrd/initramfs 是由操作系统安装后根据用户的实际环境动态生成的,动态生成需要工具。 CentOS 5 initrd 工具程序 mkinitrd(脚本) CentOS 6 initramfs 工具程序 dracut centos5 上 initrd 配置文件在/etc/inittab centos6 兼容/etc/inittab,/etc/init/*.conf upstart程序的配置文件,启动服务时可以通过写入配置文件来实现,但是在CentOS上依然采取了/etc/init.d/*.sh的方式来完成服务的启动,因此启动的速度提升不明显。 centos7 system配置文件存放目录 /usr/lib/systemd/system /etc/systemd/system 内核一旦装载并运行init程序,接下来的工作都由init完成,内核在启动过程中完成。 系统的初始化: POST-->BOOTsequence(BIOS)-->BootLoader(MBR)-->kernel(ramdisk)-->rootfs(只读)-->init 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 基础笔记综合整理 2018-10-09 评论 1630 次浏览