【Linux鸟哥笔记】20-启动流程、模块管理与Loader


前言
最近兄弟@programer_cao 在装ROS 系统,奈何实验室的服务器太拉跨,三天一奔溃两天一死机,前端时间装的Ubuntu18.04 系统经常报错,问题主要集中在可以出现Grub 界面但之后卡在初始化内存盘界面(无法进入Ubuntu 的开机界面),定位错误后发现Grub 中的配置文件被修改导致开机程序无法正确启动,因此学习一下原理,期待能够对这类问题有更深入的了解。

目录浏览

  1. Linux 启动流程分析
  2. 内核与内核模块
  3. Boot loader: Grub
  4. 启动过程中的问题解决

章节学习

引导装载程序(Boot Loader)Grub(主流)、LILOspfdisk

启动流程

  1. 加载BIOS自我测试
  2. 获取第一个启动设备内MBR或者UEFIBoot Loader
  3. 加载内核Kernel
  4. kernel加载驱动并检测硬件
  5. 硬件驱动成功后,调用init进程,取得run-level信息
    • init 执行 /etc/rc.d/rc.sysinit来准备操作环境——网络、时区等
    • init 执行run-levelscript方式启动各个服务
    • init 执行 /etc/rc.d/rc.local文件
    • init 执行 mingetty 终端机模拟程序、启动login进程,最后等待登陆

BIOS加载

在启动电源后,主板会加载存储中的BIOS(Basic Input Output System),通过BIOS程序加载CMOS信息,获得主机的硬件配置,进行POST开机自检,初始化硬件检测并确定可启动的设备顺序,为读取启动程序做好基础。
Boot Loader同时安装在启动设备的第一个sector内,BIOS需要通过Boot Loader 程序加载Kernel文件。
Kernel 开始驱动周边设备。
这里注意几个点:

  1. 读取Boot Loader:
    BIOS 可以通过INT 13 这条信道来确保读取磁盘的MBR 分区,从而实现读取Boot Loader 程序。
  2. 多个Boot Loader:
    整个主机存储中可以分成两个部分,即MBR 分区和文件系统分区(如windows 文件系统和Linux 文件系统等),文件系统分区中保留一个引导扇区(Boot Sector)用于安装Boot Loader,但是电脑启动时,只会启动MBR 分区中的Boot Loader,因此在安装操作系统时需要主要MBR 分区的安装(可能会被新安装系统的Boot Loader 给覆盖)。
    为了实现多重系统,还需要进行多重引导,以Linux 系统为例,Linux Loader 中具有菜单选择、直接启动等功能,其中选择菜单提供了其它Loader 选项,因此我们在Grub 界面中可以选择想要启动的系统。
    Q:为什么实现多系统需要先装windows再装linux?
    A:注意MBR 分区最后被linux loader 所覆盖。
  3. 内核在哪?
    /boot 路径下

内核功能

在BL 加载完内核之后)内核可以动态加载内核模块,模块放置于/lib/modules内(自定义内核模块放置在/etc/sysconfig/modules/*.modules),内核在启动过程中检测硬件并挂载根目录来额外的驱动程序。
虚拟文件系统(initialRAM Disk),放置于/boot/initrd内,该系统可被BL 加载进内存并仿真成一个虚拟根目录用以加载需要的驱动程序,完成所以驱动后内核会重新调用/sbin/init来启动系统。

init进程

回顾一下上面的内容

  1. 硬件驱动成功后,调用init进程,取得run-level信息
    • init 执行 /etc/rc.d/rc.sysinit来准备操作环境——网络、时区等
    • init 执行run-levelscript方式启动各个服务
    • init 执行 /etc/rc.d/rc.local文件
    • init 执行 mingetty 终端机模拟程序、启动login进程,最后等待登陆

针对进程执行的过程,简略的提一下各部分的原理:
首先系统会开启/sbin/init 进程,以此准备系统执行环境和run-level 配置。

  1. run-level
    run-level 是系统服务的执行等级,它规定了从关机、单用户维护模式、重启等7种服务类型(分为3类:0关机/4系统保留功能/6重启、1单用户维护模式、2无网络系统/3有网络文本系统/5有网络界面系统)。通过/etc/inittab配置文件设置run-level 等级,使用script 命令的方式来使用不同的服务。想要了解更多inittab 配置文件的信息可以参考/etc/inittab配置文件详解
    另外说一句,inittab文件可以自行修改来自行设计启动环境的配置,所以一般不要修改这个文件,以免产生未知的问题。
    关于run-level 切换等更高级的操作,等待以后再更新。

  2. /etc/rc.d/rc.sysinit 系统初始化
    一句话:设置系统环境(网络环境、挂载设备、是否启用SElink、字体、时钟、欢迎界面、文件系统等等等)详情请参考:/etc/sysconfig/

  3. 启动系统服务
    /etc/rc.d/rc N
    比如run-level=5时,会执行/etc/rc.d /rc 5来取得/etc/rc.d/rc5.d/目录下面所有脚本程序,这些程序负责各项系统服务的开关

  4. 用户自定义开机程序
    /etc/rc.d/rc.local,当你想要在开机时完成一些酷炫吊炸天的工作(例如开机程序中插入一些字符、《星球大战》电影等等),将所需执行的命令写入该文件,这样系统在启动过程中便会自动执行操作。

  5. 加载mingetty 终端机或者 X Window 界面
    一般是tty1-6 6个终端机。
    另外读者可以自己了解respawn 命令的作用。

  6. 启动配置文件
    大多数配置文件放在/etc/sysconfig/目录下,
    /etc/modprobe.conf :对模块进行参数规划
    /etc/sysconfig/* :用户身份、时钟、语言、键鼠、网络、网卡配置等文件

内核与内核模块

内核一般作为加载驱动和硬件检测的重要主体,在系统启动中具有重要的地位,也因此在日常使用中我们极少会碰到这些文件,所以一般而言内核部分只做了解即可,不用深入。
内核与内核模块更多资料请参考本链接

Boot Loader: Grub

Step1. 程序代码执行
安装在MBR 或boot sector 中,只是最小主程序,没有相关配置文件。
Step2. 设置值加载
所有配置文件(最重要的就是menu.lst )和环境参数文件,一般在/boot 目录下(与grub 有关的放在/boot/grub 下)

所以认识Grub 对于我们了解系统实际启动的流程具有很大帮助。
grub 识别硬盘:(hd0,1)代表第1块查找到的硬盘的第2个分区
grub 中的menu.lst 和grub.conf:menu是链接到conf文件上的,因此本体还是conf,通过vim打开可以看到其代码与我们的grub选择菜单具有高度的相关性。想要修改grub选择菜单中的选项就在menu.lst 文件中修改即可(注意!!!conf千万不要修改!!!conf千万不要修改!!!conf千万不要修改)
grub 的作用:加载内核文件、利用chain loader转交控制权(双系统)
在线编辑及命令行启动:选择内核文件,按e进入编辑模式即可修改启动设置。
vga设置:在编辑时加入vga=xxx,详情请参考ubuntu启动界面vga分辨率的调整

initrd 文件

辅助内核文件的加载,不作了解。

至于启动前的额外功能修改、vga设置、BIOS无法读取较大硬盘、为菜单加上密码,这些等到有使用需求的时候现学即可。

启动过程问题解决

  1. 忘记root

  2. init 配置文件错误

  3. BIOS 磁盘故障

  4. 文件系统错误而无法启动
    关键词:Loading Initial Ramdisk、载入初始化内存盘、紫屏、无能狂怒。
    问题描述:启动时停留在紫色界面,然后使用advanced 选项,新内核和旧内核的所有选项均无法打开(普通、upstart、recovery mode),均卡在载入初始化内存盘,进行检测确认initrd 进程已经加载,并且启动配置文件。
    问题定位:

    1. 起初大兄弟看了这篇文章,修改了grub 和 modules 中的部分命令,所以一开始认为是系统启动过程或者内核加载中的错误。可以参考以下文章:
      ubuntu内核损坏或误删除时的系统修复
      ubuntu无法启动的解决方法
      【linux】解决系统卡在ubuntu loading initial ramdisk
      Ubuntu16.04开机后黑屏无法进入登陆界面的解决办法
      Ubuntu开机紫屏的解决方法
      Ubuntu 16.04系统开机紫屏的解决办法
      GRUB2 hanging at ‘loading initial ramdisk’

      针对内核:启动旧内核并进行修复
      针对启动命令:进入高级选项-在线编辑并启动单用户维护模式,修改错误的命令或者取消错误的硬盘挂载。
      结果:无效。可见我们的错误并不在于启动命令的错误

    2. (有效)使用grub 自带的recovery mode 进行修复。然而在启动过程中也出现卡在加载初始化内存盘,使用在线编辑,将ro 只读改成rw 可读写,并ctrl + x引导启动,成功打开recovery mode。
      图片示例
      修复菜单大概如图所示,这时把所有选项滚一边,再次重启,成功进入登陆界面,问题得到解决。
      参考文章:
      Ubuntu 16.04 启动长时间停留在紫屏状态 - Loading Initial Ramdisk
      ubuntu的recovery mode
      ubuntu14.04无法启动使用recovery mode编辑fstab解决

  5. 切换硬盘

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值