Linux 启动过程

##加载BIOS 无论计算机使用何种操作系统,启动的第一步一定是加载BIOS,利用BIOS确定硬件信息,例如CPU,内存显卡,当然最重要的还是储存信息和启动顺序,即从哪个设备加载bootloader。 ##硬盘分区信息加载 传统的MBR:

众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。 系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。

GPT:
GPT一般配合UEFI标准使用,而使用UEFI+GPT分区启动则必须专门为启动而创建一个大约256KB的分区来存储分区表信息。GPT分区在表头仍然会存放一个MBR兼容扇区,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫做保护MBR。在支持从GPT启动的操作系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。然后会加载256KB左右的EFI分区,官方名称叫Primary GPT header。从这里读取分区信息。
GPT详细资料

##引导程序 现在一般流行的Linux发行版一般都是使用GRUB2作为引导程序。GRUB2其实是一个miniOS,用来初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。然后会读取/boot/grub/grub.cfg配置文件,根据配置信息去硬盘中内核所在的分区加载引导内核。

##加载内核 根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。 系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。

PS vmlinuz和initrd

  • vmlinuz
    vmlinuz是可引导的、压缩的内核
  • initrd
    全称boot loader initialized RAM disk,当前流行的Linux版本一般都采用模块化的内核,这种方式可以在不重新编译构建内核的情形下增加功能模块,但是如果你的Linux的root文件系统所在设备的驱动是一个模块(没有编译进内核映象),就不能被引导程序(例如loadlin)直接加载这时会用到initrd方式来启动你的Linux系统。(非必须)
      这种方式包括两个阶段:
      1)在一个RAM disk上建立一个临时的root文件系统,在这个RAM disk上包含着你需要的驱动模块
      2)载入所需驱动模块,挂载实际的root文件系统 ,启动Linux

##init初始化inittab
Linux现在有多种init系统,除了SysVinit,还有upstart(ubuntu),systemd(RHEL 7)和openrc(gentoo),这里只讨论广泛使用久经考验的SysVinit。像Systemd甚至已经颠覆了传统Linux运行等级的概念
内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式(用于系统维护,root重新设定等)
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启

PS 如果你设置成6,那你就开不了机了,开机就会重启。另外你也可以用init 6来重启,init 0来关机

##init进程执行rc.sysinit 在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等,集中存放在/etc/rc.d/sysinit.

根据/etc/rc.d/sysinit的内容大致如下:

取得网络环境与主机类型:
读取网络配置档 /etc/sysconfig/network ,取得主机名称与默认通讯闸 (gateway) 等网络环境。
测试与挂载内存装置 /proc 及 U盘 装置 /sys:
除挂载内存装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置, 若有则会主动加载 usb 的驱动程序,并且尝试挂载 usb 的文件系统。
决定是否启动 SELinux :
SELinux 在此时进行一些检测, 并且检测是否需要帮所有的文件重新编写标准的 SELinux 类型 (auto relabel)。
启动系统的乱数产生器
乱数产生器可以帮助系统进行一些口令加密演算的功能,在此需要启动两次乱数产生器。
配置终端机 (console) 字形:
配置显示於启动过程中的欢迎画面 (text banner);
配置系统时间 (clock) 与时区配置:需读入 /etc/sysconfig/clock 配置值
周边设备的侦测与 Plug and Play (PnP) 参数的测试:
根据核心在启动时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等周边设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
使用者自订模块的加载
使用者可以在 /etc/sysconfig/modules/*.modules 加入自订的模块,则此时会被加载到系统当中
加载核心的相关配置:
系统会主动去读取 /etc/sysctl.conf 这个文件的配置值,使核心功能成为我们想要的样子。
配置主机名称与初始化电源管理模块 (ACPI)
初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来配置好的。
初始化 LVM 的文件系统功能
以 fsck 检验磁碟文件系统:会进行 filesystem check
进行磁碟配额 quota 的转换 (非必要):
重新以可读写模式挂载系统磁碟:
启动 quota 功能:所以我们不需要自订 quotaon 的动作
启动系统虚拟乱数产生器 (pseudo-random):
清除启动过程当中的缓存文件:
将启动相关资讯加载 /var/log/dmesg 文件中。

##启动内核模块 具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。如果你配置可initrd的话,这个步骤在加载内核过程中也会执行一次。

##执行不同运行级别的脚本程序 根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。这几个脚本分别存放在/etc/rcX.d/中,X对应0到6

##执行/etc/rc.d/rc.local rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。注意一定要加上exit 0或者错误时返回相应的错误值。

##执行/bin/login程序 简单的说就是启动登陆程序,也就是输入用户名密码登陆了。

转载于:https://my.oschina.net/u/1242185/blog/361420

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值