引言

某出租房内,某台电脑的电源键被按下,于是开启了一段Linux启动之旅...

BIOS

系统启动,首先进入BIOS。

  ● BIOS 为 Base Input/Output System(基本输入输出系统)的简写

  ● 其执行POST(Power on self test,上电自检),在发现问题时发出告警声

  ● 在启动设备(cd-rom,网络,硬盘等)中搜寻boot loader

  ● 将boot loader stage1程序加载进内存,并执行

  ● 之后BIOS将“控制权”交给boot loader stage1

MBR

一般情况下,系统从硬盘启动,硬盘中存放boot loader stage1程序的扇区被称为MBR。

  ● MBR 为 Master boot record (主引导扇区)的简称

  ● 它是启动硬盘(/dev/sda)的首个扇区

  ● 该512字节的扇区用于存放三个部分内容:

    1) boot loader stage1程序     446字节   

    2) 硬盘分区表                        64字节   

    3) 该扇区的有效标示              2字节

我们可以使用dd命令获取该扇区内容

linux-q62c:/home/lx/test # dd  count=+ records + records  bytes ( B) copied, 4.9448e-05 s, 10.4 MB/s

然后使用strings命令进行读取:

linux-q62c:/home/lx/test # strings sectorZRrKD|f1GRUB GeomHard DiskRead Error

  ● boot loader stage1程序被执行之后,我们开始了GRUB之旅

GRUB

GRUB是主流的boot loader,GRUB分成多个阶段运行。boot loader stage1是GRUB的第一阶段,并不是其完全体。

  ● stage1的主要工作是加载stage1.5

  ● stage1.5加载kernel所在盘的文件系统,之后加载stage2

在/boot/grub目录下,我们可以看到stage1.5阶段可加载的文件系统:

linux-q62c:~ # ls /boot/grub/*stage1_5/boot/grub/e2fs_stage1_5     /boot/grub/minix_stage1_5/boot/grub/fat_stage1_5      /boot/grub/reiserfs_stage1_5/boot/grub/ffs_stage1_5      /boot/grub/ufs2_stage1_5/boot/grub/iso9660_stage1_5  /boot/grub/vstafs_stage1_5/boot/grub/jfs_stage1_5      /boot/grub/xfs_stage1_5

  ● 根据/boot/grub/menu.lst配置文件,stage2阶段显示可进入的系统列表

timeout gfxmenu (hd0,)/boot/message

title SUSE Linux Enterprise Desktop  SP1 - )    kernel /boot/vmlinuz-2.6.32.12-0.7-default root=/dev/disk/by-id/ata-Hitachi_HTS541616J9SA00_SB3441GRHSXZDE-part1 resume=/dev/disk/by-id/ata-Hitachi_HTS541616J9SA00_SB3441GRHSXZDE-part5 splash=silent showopts    initrd /boot/initrd-2.6.32.12-0.7-default

以上menu.lst文件中,列出了kernel和initrd镜像的路径

  ● GRUB的最后一步就是加载kernel和initrd镜像

Kernel/initrd

接下来kernel镜像被解压并执行,kernel完成初始化硬件、进程调度、内存管理等任务。

  ● kernel对硬件进行再次检测

  ● 加载必要的模块和驱动程序,其他驱动程序和模块组件(如USB、SATA等设备模块)由后续initrd提供

因其他模块由initrd提供,kernel得以成功“瘦身”:

linux-q62c:~ # ll /boot/vmlinuz- root root  May    /boot/vmlinuz-2.6.32.12-0.7-default 
linux-q62c:~ # ll /boot/initrd- root root  Mar   : /boot/initrd-2.6.32.12-0.7-default

  ● 加载initrd(initial RAM disk,虚拟文件系统),在内存中展开得到虚拟根分区

此时initrd被展开,真正的磁盘还没有被挂载,通过以下命令可以手工展开initrd:

linux-q62c:/boot # mkdir initrd.dlinux-q62c:/boot # cd initrd.d/linux-q62c:/boot/initrd.d # cp ../initrd-2.6.32.12-0.7-default initrd.gzlinux-q62c:/boot/initrd.d # gzip -d initrd.gz linux-q62c:/boot/initrd.d # cpio -i < initrd 

展开initrd后,我们可以看到其内容与真正根目录所包含的内容大致相同:

linux-q62c:/boot/initrd.d # lsbin         dev                           lib              root        tmpboot        etc                           lib64            run_all.sh  usrbootsplash  init                          mkinitrd.config  sbin        varconfig      initrd-2.6.32.12-0.7-default  proc             sys

  ● 执行initrd中的init脚本,完成加载模块、检查磁盘(fsck)等任务

  ● 挂载真正的根文件系统,之后执行/sbin/init程序

/sbin/init

/sbin/init是Linux启动后第一个用户态下的进程(PID为1),根据/etc/inittab配置文件,/sbin/init完成系统软件环境的设定,比如主机名、网络设定以及其他启动服务。

  ● 进行系统初始化

  ● 根据开机运行级别,启动相应级别的服务

如下/etc/inittab文件中,默认的运行级别为5:

# The :initdefault:

l0::wait:/etc/init.d/rc l1::wait:/etc/init.d/rc l2::wait:/etc/init.d/rc l3::wait:/etc/init.d/rc #l4::wait:/etc/init.d/rc l5::wait:/etc/init.d/rc l6::wait:/etc/init.d/rc 

之后根据该级别,调用/etc/init.d/rc脚本,启动/etc/init.d/rc5.d/目录下的服务:

linux-q62c:~ # ll /etc/init.d/rc5.d/……lrwxrwxrwx  root root   Mar   :  root root  Mar   :  root root  Mar   :  root root  Mar   :  root root   Mar   :  root root  Mar   :  root root   Mar   :  root root   Mar   : S01dbus -> ../dbus……

以上所列文件中,以"S"开头的项为开机时启动的服务,以"K"开头的项为关机或重启时关闭的服务项。

  ● 根据运行级别,执行相应getty,进入登陆界面

# getty-programs ::respawn:/sbin/mingetty --noclear tty1::respawn:/sbin/mingetty tty2::respawn:/sbin/mingetty tty3::respawn:/sbin/mingetty tty4::respawn:/sbin/mingetty tty5::respawn:/sbin/mingetty tty6

至此,系统启动过程完成,界面提示输入用户名和密码。

小结

Linux启动过程如下:

BIOS   --->   MBR   --->   GRUB   --->   kernel/initrd   --->   init

在GRUB阶段,可以通过命令与系统交互,自行加载kernel和initrd,亦可修改kernel加载参数;

在initrd阶段,我们可以加载自定义的initrd文件,使其加载更多模块,亦可在此阶段拉起bash,进行修复文件系统、修改root密码等工作;

我们还可以修改/etc/inittab等启动配置文件,自行设定启动环境、按需要增删启动服务项;

⋯⋯

总之,Linux的启动过程可以被灵活的定制。是否已经跃跃欲试了?尝试一下吧,Just for fun!

------------------------------------------------------------

本文基于Suse11sp1(x86_64),该发行版可从这里下载。

linux-q62c:~ # cat /etc/SuSE-release;uname -rSUSE Linux Enterprise Desktop 11 (x86_64)VERSION = 11PATCHLEVEL = 12.6.32.12-0.7-default

Reference:  6 Stages of Linux Boot Process (Startup Sequence)

      Inside the Linux boot process

Linux启动之旅的更多相关文章

  1. linux启动的过程

    总结一下,linux的开机整个流程. · 1: 启动电源后,主机第一步先做的就是查询BIOS(全称:basic input/output system 基本输入输出系统)信息.了解整个系统的硬件状态, ...

  2. Linux体验之旅(一)——制作U启,安装rhel-server-6.3

    U启制作: 双击UltraISO: 点击文件→打开: 选择rhel-server6.3 点击启动→选择写入硬盘映像 最后选择格式化优盘→写入→完毕 注意:启动盘制作完毕后一定记得将rhel-serve ...

  3. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  4. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  5. Linux启动过程详述

    http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...

  6. linux启动流程及自定义gurb

    linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...

  7. Linux启动与登陆环境

    linux启动流程 参考:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 加载内核,首先读入/boot 目录下的内核文件. ...

  8. linux启动流程

    看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...

  9. Linux 启动过程分析

    本文仅简单介绍Linux的启动过程,在此基础上做简要的分析.对于Linux启动过程中内部详细的函数调用不做介绍,只是希望本文能给新手起到一个抛砖引玉的作用,以便深入研究Linux的启动过程.下图基本展 ...

随机推荐

  1. 数字IC前后端设计中的时序收敛(三)--Hold违反的修复方法

    本文转自:自己的微信公众号<数字集成电路设计及EDA教程>(二维码见博文底部) 里面主要讲解数字IC前端.后端.DFT.低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教 ...

  2. 《深入浅出MFC》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...

  3. MyBatis从入门到精通(十一):MyBatis高级结果映射之一对多映射

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解MyBatis中如何使 ...

  4. mybatis基础配置

    我这个写的比较简略,是自己短时间记录的可能只适合自己看,新手或者不懂的建议看看下面大神这篇: https://www.cnblogs.com/homejim/p/9613205.html 1.MyBa ...

  5. 齐治运维堡垒机后台存在命令执行漏洞(CNVD-2019-17294)分析

    基本信息 引用:https://www.cnvd.org.cn/flaw/show/CNVD-2019-17294 补丁信息:该漏洞的修复补丁已于2019年6月25日发布.如果客户尚未修复该补丁,可联 ...

  6. dbo是默认用户也是架构

    dbo是默认用户也是架构 dbo作为架构是为了更好的与2000兼容, 在2000中DataBaseName.dbo.TableName解释为:数据库名.用户名.表名, 在2005中DataBaseNa ...

  7. xss magic_quotes_gpc

    ---恢复内容开始--- magic_quotes_gpc函数,在php5.4以上移除了, 但是很奇怪的是  我的5.6版本这边  是可以找到这个选项的. 在php.ini文件里面,默认关闭,如果将此 ...

  8. MYSQL数据库数据类型

    07.14自我总结 MYSQL数据库数据类型 一.整数类型和浮点数典型 1.有符号/没符号 对于整数和负整数来说,默认情况下是有符号范围的 默认是有符号 有符号和没符号其实就是有没有包括负数,有符号是 ...

  9. [Spring-Cloud-Alibaba] Sentinel 规则持久化

    在之前的练习中,只要应用重启,就需要重新配置,这样在我们实际的项目是非常不实用的,那么有没有办法把我们配置的规则保存下来呢?答案是YES,那么接下来,给大家来介绍如何将Sentinel规则持久化. D ...

  10. 今天来聊Java ClassLoader

    背景 类加载机制作为一个高频的面试题经常会在面试中被问到,前几天一个电话面试就问到,之前有了解过,但是没有梳理成自己的体系,所以说的有点凌乱,今天花点时间整理一下,分享给大家同时自己也好好梳理一下,顺 ...