简述:
- 硬件主动读取BIOS. BIOS会检测硬件并做自我测试.
- BIOS根据配置获取第一个可以启动的装置, 并读取运行第一个气动装置内MBR的boot loader(即grub)
- bootloader会把kernel解压并加载到内存中. kernel会检测硬件并安装驱动程序.
- 硬件驱动成功之后, kernel主动call init进程, init会获取run level
- init运行
/etc/rc.d/rc.sysinit
文件准备软件运行的作业环境(网络/时区等) - init将run level的各个服务启动
- init运行
/etc/rc.d/rc.local
文件 - init运行终端模拟程序mingetty来启动login进程, 然后等待用户登陆.
BIOS:
- BIOS启动后, 会加载CMOS, 然后获取硬件配置. 例如: 硬盘的大小和类型, 系统时间, CPU与各硬件的沟通时脉等.
- 然后进行自我检测(POST), 并配置PnP(plug and play), 再定义出可启动的装置顺序.
- 开始启动装置的数据读取.
MBR:
- master boot record: 在可启动装置的第一个磁区.
- BIOS是通过硬件的INT 13中断功能来读取MBR的. 也就是说只要BIOS能侦测到你的硬件, 就有办法通过INT13来读取硬件的MBR.
bootloader:
- 核心功能:
- 提供菜单选择界面
- 加载kernel
- 转交给其他loader(MBR里的loader有可能转交给boot sector里的loader, 或直接启动linux)
- 操作系统决定将bootloader装到MBR还是boot sector. windows两个地方都会装, windows的boot loader不具备转交功能.
- 现在的boot loader都是用grub,grub的配置文件:
/etc/grub/menu.lst
加载kernel与initrd功能
- bootloader会把kernel加载到内存中, 然后kernel会再次检测各个硬件并加载各个硬件的驱动, 包括存储设备/CPU/网卡/声卡等.
- kernel的存放地址:
/boot/vmlinuz-$version
(/boot
在硬盘中, 建议单独分区) - kernel动态加载kernel module, 后者放在
/lib/molules/
./lib
与/
不能在不同分区下, 启动过程中kernel必须挂载根目录, 否则会无法加载模块. 系统启动过程中根目录是只读模式 - 如果kernel不能识别挂载根目录的文件系统, 就会用到initrd(init ram disk). 是一种伪文件系统, 实际上加载在内存中. 它也能被bootloader加载到内存中, 并解压然后在内存中模拟一个根目录, 用来加载启动过程中最需要的模块, 通常是文件系统和磁碟介面的驱动.
- 加载完成后会call
/sbin/init
开始后续启动流程.init以及
/etc/inittab
配置文件与run level /sbin/init
是为软件运行准备环境. 包括分配主机名/网络配置/语系处理/文件系统格式以及其他服务.runlevel分七个等级:
- 0 - halt(系统直接关机)
- 1 - single user mode(单人维护模式)
- 2 - multi-user without nfs
- 3 - full multi-user mode
- 4 - unused(系统保留功能)
- 5 - X11(与level3类似, 但加载使用X window)
- 6 - reboot
runlevel通过
/etc/inittab
来获取/etc/inittab
内容:- 默认runlevel配置
- 准备系统软件运行环境的脚本(
/etc/rc.d/rc.sysinit
) - 7个不同level所要启动服务的脚本放置路径
- 是否允许ctrlaltdel重新启动
- 不断电系统(UPS)的相关配置
- 默认启动的tty(respawn方式, 即关掉后会被立即重启)
- xwindow的启动相关
/etc/rc.d/rc.sysinit
:- 通过读取
/etc/sysconfig/network
获取网络环境配置以及主机名称 - 测试并且挂载内存装置
/proc
和/sys
. - 决定是否启动SELinux
- 启动系统的RANDOM程序. 后者可以帮助系统进行密码加密.
- 配备terminal的字体
- 配置欢迎页面
- 配置系统时间和时区
- 根据kernel在启动时的检测结果检测网络/ide/scsi/音效等设备
- 使用者自定义模块的加载. 使用者可以在
/etc/sysconfig/modules/*.modules
加入自定义的模块. - 加载kernel的相关配置. (
/etc/sysctl.conf
) - 重新以可读可写方式挂载各目录.
- 启动quota功能
- 清楚启动过程产生的缓存文件
- 将启动相关操作记录在
/var/log/dmesg
里.
- 通过读取
/etc/rc.d/rc n
和/etc/sysconfig
/etc/rc.d/rc $n
: 启动runlevel为n的各项服务- 找到
/etc/rc$n.d/K*
,并进行stop动作. - 找到
/etc/rc$n.d/S*
, 并进行start动作. /etc/rc$n.d/K*
和/etc/rc$n.d/S*
都是一些连接, 指向standalone的/etc/init.d/*
的各个shell脚本chkconfig
就是对这些shell脚本的控制- K和S后面的数字代表被执行的顺序, 最后一个是
/etc/init.d/rc.local
- 这个脚本可以执行用户自定义的一些行为, 如发email等.
- 找到
/etc/sysconfig/
存放这/etc/rc.d/sysinit
和/etc/rc.d/rc n
的配置文件- authconfig
- clock
- i18n
- keyboard & mouse
- network
run level
- 查看:
runlevel
- 修改:
init $n
- 会关闭多出来的
/etc/rc$n.d/K*
脚本 - 会启动多出来的
/etc/rc$n.d/S*
脚本
- 会关闭多出来的
- 查看:
kernel and kernel module
- kernel源码存放位置
/usr/src/kernels
- kernel版本:
/proc/version
- kernel module存放的位置:/lib/modules/`uname -r`/kernel
- 如果有本地module需要加直接copy到上述目录, 然后depmod添加依赖关系
lsmod
: 列出所有module,并显示依赖关系。- module文件都以
.ko
结尾。 - 查看module的详细信息:
modinfo
- 安装与删除module
insmod
&rmmod
:只是安装卸载,不解决模块依赖性, 并且需要完整的文件名。modprobe
&modprobe -r
: 推荐使用, 解决依赖性,并不需要完整的文件名
/etc/modprobe.conf
: 模块一些额外配置,比如网卡对各个网络的I/O和IRQ设置
- kernel源码存放位置
- initrd:
- 需要initrd的情况:
- 根目录挂载在特殊硬件上: 例如U盘等
- 特殊的文件系统
- 其他必须要在核心加载时提供的模块
mkinitrd
来创建initrd
- 需要initrd的情况: