Linux启动之旅
引言
某出租房内,某台电脑的电源键被按下,于是开启了一段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)
Linux启动之旅的更多相关文章
- linux启动的过程
总结一下,linux的开机整个流程. · 1: 启动电源后,主机第一步先做的就是查询BIOS(全称:basic input/output system 基本输入输出系统)信息.了解整个系统的硬件状态, ...
- Linux体验之旅(一)——制作U启,安装rhel-server-6.3
U启制作: 双击UltraISO: 点击文件→打开: 选择rhel-server6.3 点击启动→选择写入硬盘映像 最后选择格式化优盘→写入→完毕 注意:启动盘制作完毕后一定记得将rhel-serve ...
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...
- Linux启动过程详解
Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
- Linux启动过程详述
http://www.ibm.com/developerworks/cn/linux/kernel/startup/index.html Linux启动第1步:引导内核 Linux启动第2步:内核部分 ...
- linux启动流程及自定义gurb
linux 启动流程 POST BIOS(boot sequence) 所选择的启动设备次序的MBR中是否有引导程序, ----> MBR(bootloader) 提供内核列表 -------& ...
- Linux启动与登陆环境
linux启动流程 参考:http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html 加载内核,首先读入/boot 目录下的内核文件. ...
- linux启动流程
看了深入理解linux内核一书的最后对linux启动流程的介绍,下面就把我能理解的写一下吧: bios(硬件加电自检POST,寻找第一个启动设备) the boot loader(可以从硬盘启动也可以 ...
- Linux 启动过程分析
本文仅简单介绍Linux的启动过程,在此基础上做简要的分析.对于Linux启动过程中内部详细的函数调用不做介绍,只是希望本文能给新手起到一个抛砖引玉的作用,以便深入研究Linux的启动过程.下图基本展 ...
随机推荐
- HttpUtility.UrlEncode讲解
hello 大家好,今天讲讲HttpUtility.UrlEncode编码 HttpUtility.UrlEncode方法有4个重载分别如下 我们有这么一个字符串 string str = " ...
- MySQL 8.0 information_schema系统库的改进
目录 information_schema有何用? mysql8.0 之前的查询方式 mysql8.0 开始的查询方式 测试5.7和8.0不同版本访问I_S库的性能 结论 information_sc ...
- 基于SpringCloud的Microservices架构实战案例-配置文件属性内容加解密
使用过SpringBoot配置文件的朋友都知道,资源文件中的内容通常情况下是明文显示,安全性就比较低一些.打开application.properties或application.yml,比如mysq ...
- 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!
网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...
- golang开发:类库篇(四)配置文件解析器goconfig的使用
为什么要使用goconfig解析配置文件 目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量.例如,生产环境跟测试环 ...
- Spring Cloud 之 Zuul基础.
一.概述 API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤 ...
- 网页学习:day1
初始准备: Write some function Write a titie Write a article Write some button Button function写法: functio ...
- 前端html+css+JavaScript 需要掌握的单词
前端html+css+JavaScript 需要掌握的单词 broswer 浏览器(客户端) html 超文本标记语言 css 层叠样式表 javascript 语言名字(类似python/php ...
- nl2br()处理字符串中的换行符
nl2br() 函数 在字符串中包含换行符时,需要对其进行转换,php 中有str_replace()函数,可以直接对字符串进行替换处理.但php中还有nl2br()函数可以直接处理. 1.在字符串中 ...
- swift对象存储
swift对象存储 简介 OpenStack Object Storage(Swift)是OpenStack开源云计算项目的子项目之一,被称为对象存储,提供了强大的扩展性.冗余和持久性.对象存储,用于 ...