linux启动和修复

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/[内核版本]/
       

组成部分
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程序,进入登录状态

  1. 加载BIOS的硬件信息,获取第一个启动设备
  2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
  3. 加载核心操作系统的核心信息,核心开始加压缩,并尝试驱动所有的硬件设备
  4. 核心执行init程序,并获取默认的运行信息
  5. init程序执行/etc/rc.d/rc.sysyinit文件
  6. 启动核心的外挂模块
  7. init执行运行的各个批处理文件(脚本文件)
  8. init执行/etc/rc.d/rc.local
  9. init执行/etc/login程序,等待用户信息
  10. 登录之后开始以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.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(用于修复的命令)
       

系统初始化

  • 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然后重启
  • 重启后会会出现黑屏的画面
  • 机器起不来,重启用光盘进入救援模式 

光盘进入救援模式

  • 都选择默认的选项回车,由于这个不需要配置网络所有就 不配网络了 

mark

  • 进入命令行后首先要确认那个是boot目录,由于根和boot目录是在一个分区上所以先找到根分区用df命令 
  • 我们可以看到/mnt/sysimage这个分区是根分区,用chroot命令切换到根分区中
  • 在用mkinitrd /boot/initramfs-uname -r.img uname -r执行这条命令修复grub文件 
  • 修复完后不要急着重启,需要等待几分钟让数据写入磁盘中,然后重启
  • 在重启会比以前重启慢一些是正常的 
  • 这样系统就正常启动了
  •  

猜你喜欢

转载自blog.csdn.net/LuckyQueen0928/article/details/85231029