Linux系统开机原理
开机是指将电脑从关闭状态转换为可运行状态的一系列过程。Linux系统作为一种比较流行的操作系统,在开机过程中也有自己的一套原理。
Linux系统的开机过程可以分为两个阶段:BIOS阶段和操作系统内核阶段。
BIOS阶段
当我们按下电源键时,电脑首先进入BIOS阶段。BIOS是一种固化在计算机主板上的程序,负责启动计算机并初始化硬件设备。其主要工作包括执行自检程序、初始化硬件设备、找到操作系统,并将操作权交给操作系统内核。BIOS会从计算机硬件中读取信息,比如硬盘、光驱等信息,然后将这些信息加载到内存中,并开始执行引导设备的引导程序。
BIOS引导程序位于计算机硬盘或光盘的引导扇区,而引导扇区则是磁盘中的第一个扇区。BIOS完成自检程序后,会在磁盘上查找引导扇区并将其加载进内存中,然后跳转到引导扇区的代码执行。引导扇区中包含了一个bootloader程序,它的主要作用是启动操作系统内核。
操作系统内核阶段
在BIOS将控制权交给bootloader之后,bootloader会加载一部分内核代码进入内存中并启动内核。Linux内核一般被存放在/boot目录下的vmlinuz文件中。bootloader会通过解析vmlinuz文件中的内核映像,将其加载进内存,并启动内核。内核启动时,它首先要初始化内存,建立页表,然后开启中断并初始化系统调用接口,最终引导init进程来进行系统的初始化。
init进程是系统启动时第一个被执行的进程,它的PID是1。init进程先解压缩根文件系统,然后启动各个子系统。子系统包括网络、文件系统、硬件驱动等。初始化完成后,init进程会从配置文件/etc/inittab中读取需要启动的服务,并启动它们。不同的Linux发行版所使用的init进程不同,比如Ubuntu使用的是upstart,而CentOS使用的是systemd。
Linux系统开机流程详解
BIOS阶段详解
在BIOS阶段,计算机硬件会先进行一系列自检程序,主要是验证硬件的状态是否正常,确认CPU、内存、硬盘等硬件设备是否能够正常工作。
自检程序执行完成后,BIOS会查找硬盘上的引导扇区并加载其代码进入内存。引导扇区一般是磁盘的第一个扇区,而且其大小限制为512字节。这里的512字节只是一个约定,实际上也可以通过修改硬盘分区表来破除这一限制。
BIOS通过查找分区表来确定引导扇区所在的分区。分区表是硬盘的最后一个扇区,其大小为4KB。分区表描述了硬盘的所有分区信息。每个分区的起始地址和结束地址都保存在分区表中。
BIOS在查找到引导扇区后,会将其加载进内存并跳转到该扇区的代码执行。此时控制权已经转交给了bootloader。
操作系统内核阶段详解
在经过BIOS阶段后,控制权转交给了bootloader。bootloader通常有两个主要部分,第一个部分是放在引导扇区中的,用来找到并加载第二个部分;第二个部分包含操作系统的内核和其它相关程序。当bootloader启动后,它会加载内核映像并将控制权转交给内核。
操作系统内核启动后,会进行一系列的初始化工作。这些工作包括构建内存映射、建立页表、初始化中断控制器等。其中,初始化页表是最重要的部分之一。页表是将虚拟内存映射到物理内存的重要数据结构,负责实现内核的内存管理和保护机制。
初始化页表后,内核开始进入初始化过程。此时,它会运行第一个用户空间进程init,并读取配置文件/etc/inittab。init进程是系统启动中第一个被执行的进程,它的PID是1。init进程的主要作用是启动其它系统进程,完成系统的初始化。
在启动服务的过程中,init进程会fork出一系列子进程来并运行相应的系统服务。在传统的Linux系统中,这些服务都是通过脚本来启动的。而在较新的Linux系统中,比如Ubuntu 16.04,就使用了systemd来管理服务。systemd虽然和传统的脚本管理工具不同,但其实现的服务管理功能更加强大。
Linux系统开机优化措施
在Linux系统开机时,有时候我们会发现开机速度比较慢。这时,我们可以通过一些优化措施来优化开机速度。
删除无用服务
Linux系统启动时会加载一些服务,而有些服务可能我们并不需要。比如,对于一台没有网络访问需求的服务器,我们可以关闭网络服务。
要删除无用服务,可以先查看当前系统中有哪些服务:
sudo service --status-all
然后,可以使用chkconfig或update-rc.d命令来禁用服务:
sudo chkconfig httpd off
sudo update-rc.d -f httpd remove
其中,httpd是服务名。
优化启动脚本
Linux系统启动时会执行一些启动脚本,所以可以优化这些启动脚本来提高启动速度。
可以通过chkconfig、update-rc.d或systemd来管理启动脚本。这些工具都可以让我们指定要启动哪些服务/脚本,并指定启动的顺序等。比如,我们可以使用systemd的systemctl命令来启用/禁用服务:
sudo systemctl disable httpd.service
其中,httpd.service是服务名。
加载时延迟启动
Linux系统启动时会同时启动多个服务,这会导致CPU占用过高和内存紧张。可以通过将一些服务设置为延迟启动来解决这个问题。
在系统启动后,是可以手动启动/停止服务的。因此,我们可以将某些服务设置为延迟启动,让这些服务在系统启动后再启动。这样,就可以避免一些启动时的开销。
要设置延迟启动,可以使用systemd的systemctl命令:
sudo systemctl start cockroachdb.service
sudo systemctl enable cockroachdb.service
其中,cockroachdb.service是服务名。
总结
Linux系统的开机过程是一个非常复杂的过程,它包括BIOS阶段和操作系统内核阶段两个部分。BIOS主要是完成硬件的初始化和启动bootloader程序,而操作系统内核则负责完成内存的初始化、页表的建立以及启动服务等工作。
在开机过程中,我们可以通过删除无用服务、优化启动脚本和延迟启动等措施来优化开机速度。