`
maosheng
  • 浏览: 549962 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 底下












分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics