Linux 开机流程

阅读更多
Linux开机流程:

1. 加载 BIOS(Basic Input Output System),并透过 BIOS 程序去加载 CMOS 的信息,并且藉由 CMOS 内的设定值取得主机的各项硬件配置信息,进行开机自我测试(POST:Power-on Self Test),然后开始执行硬件侦测的初始化,并设定 PnP(Plug and Play) 装置,之后再定义出可开机的装置顺序,并依据设定取得 第一个可开机装置,接下来就会开始进行开机装置的数据读取了 (MBR 相关的仸务开始)。


2. 读取并执行第一个开机装置内 MBR(Master Boot Record,, 主要启动记录区) 的 Boot Loader (亦即是 grub 或 lilo 或 spfdisk 等程序),Boot Loader 的最主要功能是要认识操作系统的文件格式并据以 加载核心到主存储器中去执行


3. 依据 Boot Loader 的设定加载 Kernel(/boot/vmlinuz) ,Kernel 会开始侦测硬件与加载驱动程序
(boot loader 可以加载 kernel 与 initrd ,然后在内存中让 initrd 解压缩成为根目录, kernel 就能够藉此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统, 就能够开始后续的正常开机流程
initrd( /boot/initrd )虚拟文件系统 (Initial RAM Disk) ,这个档案的特色是,他也能够透过 boot loader 来加载到内存中, 然后这个档案会被解压缩并且在内存当中仿真成一个根目录,且此仿真在内存当中的文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所最需要的核心模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动程序啦!等载入完成后, 会帮助核心重新呼叫 /sbin/init 来开始后续的正常开机流程)。


4. 在硬件驱动成功后,Kernel 会主动呼叫 init(/sbin/init,PID=1) 程序,而 init 会取得(/etc/inittab)runlevel 信息
(/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语系处理、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init 的配置文件,亦即是 /etc/inittab 来规划,而 inittab 内还有一个很重要的设定项目,那就是默认的 runlevel,开机执行等级 )


5. init 执行 /etc/rc.d/rc.sysinit 档案来准备软件执行的作业环境 (如网络、时区等)


6. init 执行 /etc/modules.conf内部的额外kernel模块

7. init 执行 run-level对应的/etc/rc.d[1-6].d下的各个服务之启动 (script 方式)


8. init 执行 /etc/rc.d/rc.local 档案


9. init 执行终端机仿真程序 mingetty 来启动 login 程序,最后就等待用户登入啦



runlevel(运行级别):0-6
0:halt
1:single user mode
2:multi user mode,without NFS
3:multi user mode,text mode
4:reserved
5:multi user mode,graphic mode
6:reboot


init 的处理流程:

1.设定默认的运行级别
2.运行系统初始化脚本(/etc/rc.d/rc.sysinit)
3.运行指定运行级别对应目录下的脚本(/etc/rc.d/rc[runlevel].d/)
4.设定Ctrl+Alt+Del组合键的操作
5.定义UPS电源在电源故障/恢复时执行的操作
6.启动 mingetty 的六个虚拟终端 (tty1-tty6)
7.启动图形终端


init 处理系统初始化流程 (/etc/rc.d/rc.sysinit)

1. 取得网络环境与主机类型
   读取网络配置文件 /etc/sysconfig/network ,取得主机名与默认通讯闸 (gateway) 等网络环境。

2. 测试与挂载内存装置 /proc 及 USB 装置 /sys
   除挂载内存装置 /proc 之外,还会主动侦测系统上是否具有 usb 的装置, 若有则会主动加载 usb 的驱动并且程序,尝试挂载 usb 的文件系统。

3. 决定是否启动 SELinux

4. 启动系统的随机数生成器
   随机数生成器可以帮助系统进行一些密码加密演算的功能,在此需要启动两次随机数生成器。

5. 设定终端机 (console) 字形

6. 设定显示于开机过程中的欢迎画面 (text banner);

7. 设定系统时间 (clock) 与时区设定
   需读入 /etc/sysconfig/clock 设定值

8. 接口设备的侦测与 Plug and Play (PnP) 参数的测试
   根据核心在开机时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等接口设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试

9. 用户自定义模块的加载
   使用者可以在 /etc/sysconfig/modules/*.modules 加入自定义的模块,则此时会被加载到系统当中

10.加载核心的相关设定
   系统会主动去读取 /etc/sysctl.conf 这个档案的设定值,使核心功能成为我们想要的样子

11.设定主机名与初始化电源管理模块 (ACPI)

12.初始化软件磁盘阵列
   主要是通过 /etc/mdadm.conf 来设定好的

13.初始化 LVM 的文件系统功能

14.以 fsck 检验磁盘文件系统
   会进行 filesystem check

15.进行磁盘配额 quota 的转换 (非必要)

16.重新以可擦写模式挂载系统磁盘

17.启动 quota 功能
   所以我们不需要自定义 quotaon 的动作

18.启动系统虚拟随机数生成器 (pseudo-random)

19.清除开机过程当中的临时文件

20.将开机相关信息加载 /var/log/dmesg 档案中


# dmesg         #显示开机过程的信息


启动系统服务与相关启动配置文件 (/etc/rc.d/rc N & /etc/sysconfig)

加载核心让整个系统准备接受指令来工作,再经过 /etc/rc.d/rc.sysinit 的系统模块与相关硬件信息的初始化后,你的 CentOS 系统应该已经顺利工作了。 叧是,我们还得要启动系统所需要的各项『服务』,这样主机才能提供我们相关的网络或者是主机功能嘛! 这个时候,依据我们在 /etc/inittab 里面提到的 run level 设定值,就可以来决定启动的服务项目了。

各个 run level 要执行的各项脚本放置处主要是通过 /etc/rc.d/rc 这个指令来处理相关任务。

/etc/rc.d/rc 指令说明:
 1.透过外部第一号参数 ($1) 来取得想要执行的脚本目录。亦即由 /etc/rc.d/rc 5 可以取得 /etc/rc5.d/ 这个目录来准备处理相关的脚本程序
 2.找到 /etc/rc5.d/K??* 开头的档案,并进行『 /etc/rc5.d/K??* stop 』的动作
     (关闭以K开头的服务)
 3.找到 /etc/rc5.d/S??* 开头的档案,并进行『 /etc/rc5.d/S??* start 』的动作
     (启动以S开头的服务)

注: /etc/rc5.d/下的文档全部是连接文档,连结到服务启动的目录 /etc/init.d/

# runlevel      # 查看当前的运行级别
N 3            
# init 5        # 切换运行级别为5
# runlevel
3 5             # 3:上次运行级别,5:当前运行级别


核心与核心模块:

在整个开机的过程当中,是否能够成功的驱动我们主机的硬件配备,是核心 (kernel) 的工作。

核心与核心模块位置:

核心(Kernel): /boot/vmlinuz 或 /boot/vmlinuz-version
核心解压缩所需 RAM Disk: /boot/initrd (/boot/initrd-version)
核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel
核心原始码: /usr/src/linux (要安装才会有!否则预设不安装的!)

如果该核心被顺利的加载系统当中了,那么就会有几个信息记录下来:
核心版本: /proc/version
系统核心功能: /proc/sys/kernel/

# lsmod                         # (lsmod: list modules)查看核心已加载的核心模块

# modinfo [-adhpV][模块文件]    # 显示核心模块的信息

boot loader 的两个 stage:

boot loader 是载入核心(Kernel)的重要工具

在 BIOS 读完信息后,接下来就是会到第一个开机装置的 MBR 去读取 boot loader 了。这个 boot loader 可以具有选单功能、直接加载核心档案以及控制权移交的功能等, 系统必须要有 boot loader 才有办法加载该操作系统的核心就是了。但是我们都知道, MBR 是整个硬盘的第一个 sector 内的一个区块,充其量整个大小也才 446 bytes 而已,为了解决这个问题,所以 Linux 将 boot loader 的程序代码执行与设定值加载分成两个阶段 (stage) 来执行:

Stage 1:执行 boot loader 主程序:
第一阶段为执行 boot loader 的主程序,这个主程序必须要被安装在开机区,亦即是 MBR 或者是 boot sector 。但如前所述,因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置文件

Stage 2:主程序加载配置文件:
第二阶段为透过 boot loader 加载所有配置文件与相关的环境参数档案 (包括文件系统定义与主要配置文件 menu.lst-->grub.conf ), 一般来说,配置文件都在 /boot 底下












你可能感兴趣的:(Linux)