CentOS 5和6的启动流程
linux组成
linux:是有kernel和+rootfs (linux内核加应用程序)
- kernel :进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
- rootfs: 程序和glibc(库)
- 库:函数计划,function,调用接口(头文件负责描述)
- 过程调用: procedure,无返回值
- 函数调用: function(一堆命令的集合)
- 程序:二进制执行文件
内核设计流派
- 单内核(monolithic kernel);linux
- 把系统最重要的东西放在一个单一的文件中
- 把所有功能集成于同一个程序
- 当某个功能出现问题则导致其它功能可能也无法使用
- 微内核(micro kernel):Windows ,solaris
- 每种功能使用一个单独子系统实现
- 当某一个功能出现问题则对其它功能不好产生太坏的影响
linux内核特点
- 支持模块化:.ko (内核对象),每一个ko文件对应的都是一个功能模块。如文件系统,硬件驱动,网络协议等。
- 支持内核模块的动态装载和卸载,就是会自动根据设备的类型装载驱动,如当我们插入u盘时内核会自动加载u盘驱动模块,当我们拔掉u盘则自动的卸载u盘驱动模块
- 当然管理员手动装载和卸载也是可以的
- modprobe - r 卸载模块
- 当然管理员手动装载和卸载也是可以的
- 模块文件存放路径
- /lib/modules/[内核版本]/
- /lib/modules/[内核版本]/
组成部分
linux最核心的文件
- 核心文件:/boot/vmlinuz- VERSION -release(linux kernel)
1.[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64
2.vmlinuz-2.6.32-696.el6.x86_64
- ramdisk : 辅助的伪根系统,和linux 内核有关联,里面存放着必要的驱动模块,如果这里文件破坏,也会造成系统无法启动
- CentOS 5: /boot/initrd- VERSION -release.img
- CentOS 6,7: /boot/initramfs- VERSION -release.img
- 模块文件 :/bin/modules/VERSION-release
驱动模块存放在哪里
1.最核心最重要的在linux内核文件中存放vmlinuz- VERSION-release
2.有一小部分重要的在initramfs- VERSION -release.img中存放的是和启动相关的驱动模块
3.还有一些在/bin/modules/VERSION-release,绝大部分的驱动模块在这里
CentOS6,5启动流程
1. 首先POST加电自检,主要是检查计算机硬件是否存在,或者损坏
2. MBR引导,第1块磁盘的第0个扇区中前446个字节中,存放着于计算机启动的相关程序,在centos6中叫GRUB,GRUB的一部分就是存放在446个字节中,还有一部分在别的地方
3. GRUB在加载启动完后
4. 加载内核,就是boot下的vmlinuz-版本号
1.[root@centos6 boot]# ls vmlinuz-2.6.32-696.el6.x86_64
2.vmlinuz-2.6.32-696.el6.x86_64
1.内核加载完后就启动系统的第一个进程,init进程,centos7是systemctl
2.init进程启动后会读取它的核心配置文件就是/etc/inittab文件,/etc/init/*.conf文件
7.使用/etc/rc.d/rc/sysinit初始化脚本
3.执行/etc/rc.d/rc 脚本
1.会加载/etc/rc#,#为默认级别要启动的服务
4.执行/etc/rc.d/rc.local脚本(管理员想要某个服务在那个级别开机启动时放进就会开机启动,最后一个加载)
10. 执行/bin/login程序,进入登录状态
- 加载BIOS的硬件信息,获取第一个启动设备
- 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
- 加载核心操作系统的核心信息,核心开始加压缩,并尝试驱动所有的硬件设备
- 核心执行init程序,并获取默认的运行信息
- init程序执行/etc/rc.d/rc.sysyinit文件
- 启动核心的外挂模块
- init执行运行的各个批处理文件(脚本文件)
- init执行/etc/rc.d/rc.local
- init执行/etc/login程序,等待用户信息
- 登录之后开始以shell控制主机
启动流程详细过程描述
post
- power-on-self-test,加电自检,是BIOS功能的一个主要部分。负责完成对cpu、主板、内存、硬盘子系统显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况检查
- ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入出程序,系统信息设置、开机加电自检程序和系统启动自举程序等
- RAM:CMOS互补金属氧化物半导体,保存各项参数的设定
- 按次序查找引导设备,第一个有引导程序的设备为本次启动设备
bootloader:引导加载器,引导程序
- Windows:ntloader ,仅启动OS,不可以启动linux
- linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核,可以启动Windows
- LILO:linux loader 很早以前centos5开始不使用
- GRUB : grand unified bootloader
- grub 0.x :grub legacy,grub2
- centos 5 和6 都是0.97版本
- centos 7 是2.02版
MBR
- 446字节:bootloader,64字节:分区,2字节:55aa结束位
- 当系统启动时会加载bootloader
GRUB
- GRUB 分为3个阶段
- 1阶段是MBR的446个字节中
- 当我们执行完1阶段后,不属于文件,就是以二进制存放
- 1阶段是MBR的446个字节中
- 1.5阶段是集成了必要的驱动模块,当我们执行完一阶段后,会执行1.5阶段,因为1.5阶段所对应的文件是/boot/initramfs文件,这是一个压缩文件,是一个伪根系统,因为系统要访问文件必须要有文件系统才可以,在我们第一阶段只有446个字节不可能存放着文件系统,如果这样就无法进入到根下,也无法启动系统,但是intramfs这个文件是伪根系统,而访问系统是不需要文件系统的,这样就可以执行
kernel 加载内核
- 自身初始化
- 探测可识别到的所有硬件设备
- 加载硬件驱动程序(借助ramdisk加载驱动)
- 以只读方式挂载根文件系统
- 运行用户空间的一个应用程序:/sbin/init
ramdisk :
- 内核中的特性之一:使用缓冲和缓冲来加速对磁盘上的文件访问,并加载相应的硬件驱动
- ramdisk —> ramfs 提高速度
- centos 5 :initrd
- 工具程序:mkinitrd
- centos 6,7 :initramfs
- 工具程序:mkinitrd ,dracut(用于修复的命令)
- 工具程序:mkinitrd ,dracut(用于修复的命令)
系统初始化
- POST—> bootsequence(BIOS)—> Bootloader(MBR)—> Kelner(加载内核)—> rootfs(只读) –> init(systemd)
如果把initramfs 文件删除如何修复,没有重启机器情况下
1.[root@centos6 boot]# rm initramfs-2.6.32-696.el6.x86_64.img
2.rm: remove regular file `initramfs-2.6.32-696.el6.x86_64.img'? yes
3.[root@centos6 boot]# ls initramfs-2.6.32-696.el6.x86_64.img
4.ls: cannot access initramfs-2.6.32-696.el6.x86_64.img: No such file or directory
5.[root@centos6 boot]# mkinitrd initramfd-`uname -r`.img `uname -r` (后面跟的是内核版本号)
6.[root@centos6 boot]# ls initramfd-2.6.32-696.el6.x86_64.img
7.initramfd-2.6.32-696.el6.x86_64.img
把initramfd 删除后重启修复
- 当我们把initramfs 这个文件删除也就是1.5阶段的grub然后重启
- 重启后会会出现黑屏的画面
- 机器起不来,重启用光盘进入救援模式
- 都选择默认的选项回车,由于这个不需要配置网络所有就 不配网络了
- 进入命令行后首先要确认那个是boot目录,由于根和boot目录是在一个分区上所以先找到根分区用df命令
- 我们可以看到/mnt/sysimage这个分区是根分区,用chroot命令切换到根分区中
- 在用mkinitrd /boot/initramfs-
uname -r
.imguname -r
执行这条命令修复grub文件 - 修复完后不要急着重启,需要等待几分钟让数据写入磁盘中,然后重启
- 在重启会比以前重启慢一些是正常的
- 这样系统就正常启动了