上一期说明了linux的总体概况,这一期说明一下Linux内核的系统是如何完成启动的。
预启动过程
常规的计算机启动过程包括了:通电->BIOS->主引导记录->操作系统。
- 通电:就是通电;
- BIOS:是英文”Basic Input Output System”的缩略词,也就是“基本输入输出系统”。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制;
- 主引导记录(MBR),也被称为主引导扇区,是计算机开机以后访问硬盘时所必须要读取的第一个扇区。其中引导代码用来告诉计算机如何处理分区表,如何定位操作系统等;
- 操作系统:操作系统不仅仅是Windows或者Ubuntu这样狭义,而是更广的代表了系统软件架构与硬件底层的调度。
加载内核
接下来,操作系统就完成了对计算机的接管。首先读入/boot目录下的内核文件。包含以下:
$ ls /boot
config-3.2.0-3-amd64
config-3.2.0-4-amd64
grub
initrd.img-3.2.0-3-amd64
initrd.img-3.2.0-4-amd64
System.map-3.2.0-3-amd64
System.map-3.2.0-4-amd64
vmlinuz-3.2.0-3-amd64
vmlinuz-3.2.0-4-amd64
初始化进程
接着就是运行一个初始化程序/sbin/init,来初始化系统环境,其余的进程都是该进程的子进程。这些子进程很多都是那些“开机自启动项”,在Linux就叫做”守护进程”(daemon)。
daemon可以理解为一个进程或者应用程序运行所需要的后台支持进程,其实就和进程是一致的,可以理解为Windows的“service”。
加载自启动项
在不同的Linux内核系统中,如何使用的场景不一样,那么开启引导的自启动项也是不同的,而这些自启动项都是在/etc/init.d中完成的,这个文件夹建立了对于所有自启动项的专属软连接(引用而已,并不是硬拷贝),这样把需要的启动项放在了/etc/init.d即可,方便了系统管理和用户使用。
用户登录系统
(1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(linux还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
(2)ssh登录:这时系统调用sshd程序(linux还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
(3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。
其中说明一下登录shell的加载过程,首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。
以上就是整个Linux系统的加载过程了,通过了解这些,可以很方便的完成引导项和自启动项的配置,手动关闭或者重启某个进程,
参考链接:
https://www.linuxprobe.com/linux-boot-process-steps.html
https://www.runoob.com/linux/linux-system-boot.html