当前位置:首页>Linux>Linux内核启动

Linux内核启动

  • 2026-09-08 16:57:30
Linux内核启动

Linux启动过程

1.BIOS或者启动固件加载并运行引导装载程序。

1)读入引导块:BISO从硬盘(CD,软盘)地址0xFFFF0开始读入引导块。
2)对本地设备枚举和初始化
当POST结束,BIOS关于自检的代码从内存释放,BIOS的关于运行服务的代码会依旧在内存来继续引导内核。

2.提取MBR,启动GRUB,引导装载程序在磁盘上找到内核映像,将其载入内存并启动。

MBR是512字节的扇区(位于磁盘的第一块扇区(第0道第0柱面第1扇区)),当MBR加载到内存,BIOS完成使命

1)读入引导块:BISO从硬盘(CD,软盘)地址0xFFFF0开始读入引导块。

//查看#> dd if=/dev/sda of=mbr.bin bs=512 count=1#> od -xa mbr.bin //以16进制和ASCII格式打印二进制文件内容

GRUB是用来引导加载程序,简单地说就是开始引导操作系统,操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

3.内核初始化设备及其驱动程序。

4.内核挂载root文件系统。

5.内核使用PID 1来运行一个叫init的程序,用户空间在此时开始启动。

6.init启动其他的系统进程。

7.init还会启动一个进程,通常发生在整个过程的尾声,负责用户登录。

启动日志

查看内核系统日志文件。

1.在/var/log/message中

2.dmesg命令

内核初始化

在启动时,Linux内核的初始化过程如下:

1.检查CPU;

2.检查内存;

3.检测设备总线;

4.检测设备;

5.设置附加内核子系统(如网络等);

6.挂载root目录;

7.启动用户空间。

设备相关的步骤则涉及一些依赖性问题。例如磁盘设备驱动程序可能需要依赖于总线和SCSI子系统的支持。

内核参数

运行Linux内核的时候,引导装载程序会向内核传递一系列文本形式的内核参数来设定内核的启动方式。这些参数设定了很多不同的行为方式,比如内核显示的诊断信息的多少、设备驱动程序相关参数等。

root参数很重要,它是root文件系统存放的位置,如果没有这个参数,内核将无法完成初始化工作,从而也就无法启动用户空间。

如何启动内核

一、引导装载程序

在启动过程的最开始,引导装载程序启动内核,然后内核和init启动。

引导装载程序的工作看似很简单:将内核加载到内存,然后使用一系列内核参数启动内核。

内核在哪里?

内核启动时需要传递哪些参数?

内核及其参数(通常是)在root文件系统中。因为内核此时还没有开始运行,无法遍历文件系统,所以内核参数需要被放到一个容易存取的地方。并且此时用于访问磁盘的内核设备驱动还没有准备好,这听起来有点像“鸡生蛋,蛋生鸡”。

1.Linux引导装载程序核心功能

1)从多个内核中选择一个使用;

2)从多个内核参数集中选择一个使用;

3)允许用户手动更改内核映像名和参数(例如使用单用户模式);

4)支持其他操作系统的启动。

2.引导装载程序

1)GRUB:近乎于Linux系统标准。

2)LILO:最早期的Linux引导装载程序之一,是UEFI的一个版本。

3)SYSLINUX:能够在很多不同的文件系统上配置和启动。

4)LOADLIN:能够从MS-DOS上启动内核。

5)efilinux:UEFI引导装载程序的一种,作为其他UEFI引导装载程序的模块和引用。

6)coreboot(以前又叫作LinuxBIOS):PC BIOS的高性能替代品,并且能够包含内核。

7)Linux Kernel EFISTUB:能够从EFI/UEFI系统分区(ESP)加载内核的一个内核插件。

种类很多,最常用就是grub。

二、GRUB

1.Grand UnifiedBoot Loader

开机e进入。

如果你从来没有见过这些配置信息,可能会觉得比较糊涂。你可能会问为什么会有这么多地方涉及root?它们有什么区别?为什么这里会出现insmod?Linux内核不是通常由udevd运行吗?

因为GRUB仅仅是启动内核,而不是使用它。你看到的这些配置信息都由GRUB的内部命令构成,GRUB自身另成一个体系。GRUB有自己的“内核”和insmod命令来动态加载GRUB模块,这和Linux内核没有任何关系。很多GRUB命令和Unix shell命令很类似,GRUB也有一个ls命令来显示文件列表。

由图可知,GRUB root一开始被设置为GRUB相关设备(hd0,msdos1)。在随后的命令中,GRUB查找一个特定分区的UUID,如果找到的话就将该分区设置为GRUB root。linux命令的第一个参数( /vmlinuz-3.10.0-957.el7.x86_64)是Linux内核映像文件的位置。GRUB从GRUB root上加载此文件。类似地,initrd命令指定初始的RAM文件系统文件。

2.GRUB工作原理

1)BIOS或者固件初始化硬件,在启动存储设备上寻找启动代码。
2)BIOS和固件运行找到的启动代码,开始GRUB。
3)加载GRUB核心。
4)初始化GRUB核心,此时GRUB可以读取磁盘和文件系统。
5)GRUB识别启动分区,在那里加载配置信息。
6)GRUB为用户提供一个更改配置的机会。
7)超时或者用户完成操作以后,GRUB执行配置文件/boot/grub2/*。
8)执行过程当中,GRUB可能会在启动分区中加载额外的代码(模块)。
9)GRUB执行boot命令,以加载和执行配置信息中linux命令指定的内核。

3.使用

1)ls——输出结果是GRUB能够识别的所有设备的列表

本例中有一个名为hd0的主磁盘设备和分区(hd0,msdos2)及(hd0,msdos1)。前缀msdos表示磁盘包含MBR分区表。如果包含的是GPT分区表,则前缀就是gpt。(还可能会有第三个标识符来表示更多可能的组合,如分区包含BSD磁盘标签映射,不过你通常不需要太关注,除非你在一台机器上运行多个操作系统。)

(1) -l

如上所示,磁盘在第一个MBR分区上有一个Linux xfs文件系统,在分区2上有一个Linux交换区签名,这样的配置很常见。(从输出中可以看到(hd0,msdos5)是交换分区。)

(2)加上/来显示root文件系统下的文件和目录:

2)echo $root——文件导航

使用echo命令来查看GRUB root文件系统(这是GRUB寻找内核的地方):

3)set——GRUB变量

4.配置信息

1)GRUB配置目录包含核心配置文件(grub.cfg)和一些可加载模块,以.mod为后缀。(随着GRUB版本的演进,这些模块被逐渐移到像i386-pc这样的子目录中。)配置目录通常是/boot/grub或者/boot/grub2。我们不直接编辑grub.cfg文件,而是使用grub2-mkconfig命令(Ubuntu上的grub-mkconfig命令)

[root@localhost boot]# cat grub2/grub.cfg 

2)更改

想要更改GRUB配置,我们不会直接编辑grub.cfg文件,因为它是由系统自动生成和更新的。你可以将新的配置信息放到其他地方,然后运行grub2-mkconfig来生成新的配置文件。

在grub.cfg文件的最开头应该有一行注释

你会发现,/etc/grub.d中的文件都是shell脚本,它们各自生成grub.cfg文件的某个部分。

grub-mkconfig命令本身也是一个shell脚本文件,负责运行/etc/grub.d中的所有脚本文件。

3)安装GRUB

安装引导装载程序需要你或者安装程序决定以下几方面。

(1)你的运行系统的目标GRUB目录。通常是/boot/grub,不过如果你在不同的系统和磁盘上安装的话,目录位置可能会不一样。
(2)GRUB目标磁盘对应的设备。

(3)如果是UEFI启动的话,考虑UEFI启动分区的挂载点。

5.加载内核

内核一般是一个压缩文件bImage(好像还有zImage)

//grub记不住tab补齐grub> kernel /bzImage-3.10.0-957.el7.x86_64grub> initrd /initramfs-3.10.0-957.el7.x86_64.imggrub> boot

用户空间的启动——init

一、用户空间启动顺序

内核启动以后第一个用户空间进程是由init开始的。

1.启动顺序

1)init;

2)基础的底层服务,如udevd和syslogd;

3)网络配置;

4)中高层服务,如cron和打印服务等;

5)登录提示符、GUI及其他应用程序。

二、init介绍

init是Linux上的一个用户空间程序。和其他系统程序一样,可以在/sbin目录下找到它。

它主要负责启动和终止系统中的基础服务进程,但其较新的版本功能更多一些。

三、init种类

1)System V init:传统的顺序init(Sys V,读作“sys-five”),为CentOS 5之前版本的Linux发行版使用。

2)systemd:新出现的init。

3)Upstart:Ubuntu上的init。Ubuntu也已经计划转向systemd。

配置文件:/etc/inittab, /etc/init/*.conf。

还有一些其他版本的init,特别是在嵌入式系统中。例如,Android就有它自己的init。BSD系统也有它们自己的init,不过在目前的Linux系统中很少见到了(一些Linux发行版通过修改System Vinit配置来遵循BSD样式)。

识别自己的init

如果系统中有目录/usr/lib/systemd和/etc/systemd,说明你有systemd如果系统中有目录/etc/init,其中包含.conf文件,说明你的系统很可能是Upstart如果以上都不是,且你的系统有/etc/inittab文件,说明你可能使用的是System V init

或

$> man init

四、运行级别

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别" (runlevel),也就是说,启动时根据"运行级别",确定要运行哪些程序。

Linux系统有7个运行级别(runlevel):  运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动  systemctl poweroff  运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆  systemctl isolate resuce.target  运行级别2:多用户状态(没有NFS)  运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式  systemctl isolate multi-user.target  运行级别4:系统未使用,保留  运行级别5:X11控制台,登陆后进入图形GUI模式  systemctl isolate graphical.target  运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动  systemctl reboot  //查看#> runlevel N 5#> init 3 //切换3

Sysvinit 运行级别Systemd 目标备注
0runlevel0.target, poweroff.target关闭系统。
1,s, singlerunlevel1.target, rescue.target单用户模式。
2, 4runlevel2.target, runlevel4.target, multi-user.target用户定义/域特定运行级别。默认等同于 3。
3runlevel3.target, multi-user.target多用户,非图形化。用户可以通过多个控制台或网络登录。
5runlevel5.target, graphical.target多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。
6runlevel6.target, reboot.target重启
emergencyemergency.target紧急 Shell 
Sysvinit 运行级别和 systemd 目标的对应表

systemd

一、介绍

systemd init是Linux上新出现的init实现之一。除了负责常规的启动过程,systemd还包含了一系列的Unix标准服务,如cron和inetd。它借鉴了Apple公司的启动程序。这个init的一个重要特性是:它可以延迟一些服务和操作系统功能的开启,直到需要它们时再开启。

二、启动流程

1.systemd加载配置信息;

2.systemd判定启动目标,通常是default.target;

3.systemd判定启动目标的所有依赖关系;

4.systemd激活依赖的组件并启动目标;

5.启动之后,systemd开始响应系统消息(诸如uevent),并且激活其他组件。

三、配置文件
/usr/lib/systemd/system、/etc/systemd/system。
基于Socket通信,高效并行。
  • init,upstart,systemd区别

四、单元和单元类型

systemd最有特色的地方是它不仅仅负责处理进程和服务,还可以挂载文件系统、监控网络套接字和运行时系统等。这些功能我们称之为单元,它们的类别称为单元类型,开启一个单元称为激活。

Unix系统启动时需要使用到的单元类型。
1.服务单元:控制Unix上的传统服务守护进程。
2.挂载单元:控制文件系统的挂载。
3.目标单元:控制其余的单元,通常是通过将它们分组的方式。

单元依赖关系树形图

CentOS7启动级别更改

一、命令行启动

#>  systemctl set-default multi-user.target 

二、图形启动

#> systemctl set-default graphical.target

Linux系统启动与关机

本文是我根据在自学过程中的经验总结出来的,如果有建议和看法,可以在文末留言,谢谢。

最新文章

随机文章