Linux 内核及系统启动流程
Posted cook
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核及系统启动流程相关的知识,希望对你有一定的参考价值。
kernel的功能:
进程管理
文件系统
硬件驱动
内存管理
安全功能:SELinux
网络子系统
标准库:glibc
调用:返回
利用别的组件的功能,完成某特定事务
返回值
内核设计流派:
单内核体系:
Linux
支持模块化
模块还可以动态装载或卸载
Linux内核:核心 + 外围模块
核心:/boot/vmlinux-VERSION-release
模块:/lib/modules/VERSION-release
.ko: kernel object
ramdisk: /boot/initramfs-VERSION-release.img
在内核启动过程中装载根文件系统时有用;
微内核体系:
Windows
Solaris
Linux系统启动流程:X86(PC)
POST:加电自检
ROM+RAM
ROM:CMOS (Bios)
RAM:
EFI()
引导次序:按次序找引导设备,第一个有引导程序的设备即为启动PC server所用到的设备;
1st boot:
2nd boot:
3rd boot:
MBR:Master Boot Record
1st sector:512bytes
446: bootloader
64: partation table
2: 5A
bootloader: 选择要启动的内核(在当前磁盘的某或某些分区上)
LILO: LInux LOader
0-1023范围内的柱面构成的分区的内核文件
GRUB: GRand Unified Bootloader
CentOS 5,6 Grub 0.97
CentOS 7, Grub2 1.96
kernel:
自身初始化
探测所有能识别的硬件
装载驱动程序
以只读方式装载根文件系统(rootfs)
/sbin/init
CentOS 5: SysV, init
CentOS 6: upstart, init
CentOS 7: systemd, init
CentOS 5 SysV, init, /etc/inittab --> /etc/rc.d/rc.sysinit
CentOS 6 Upstart, /etc/init/*.conf (/etc/inittab)--> /etc/rc.d/rc.sysinit
chkconfig
CentOS 7 Systemd,
/usr/lib/systemd/system/
CentOS 5: init
kernel ==> /sbin/init (/etc/inittab)
设定系统默认运行级别
0-6: 7个级别
0:关机
1: single user mode, s, S, single
2: multi user mode, 不支持NFS功能
3:完全多用户模式,文本接口
4:未使用,预留级别
5:完全多用户械,图形接口
6: 重启
切换级别:init #
进一步初始化系统
/etc/rc.d/rc.sysinit
启动指定的默认级别的默认为启动的服务,停止指定的级别下默认为关闭的服务;
/etc/rc.d/rc#.d
S##: 启动的服务
K##:停止的服务
##:01-99,数字越小,越优先启动或关闭;
脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行
# chkconfig: - 85 15
-:当此脚本由chkconfig控制时,默认哪些级别就是开启的,
85:启动优先级
15: 关闭优先级
# chkconfig --add SRV_SCRIPT
# chkconfig --del SRV_SCRIPT
# chkconfig SRV_SCRIPT {on|off}
默认为2345级别;
--level ######
/etc/rc.d/rc.local (/etc/rc.local): 是一个脚本,通常为系统启动完成的最后运行一个脚本;
定义一些组合键的功能:通常是Ctrl+Alt+Delete
初始化字符终端
如果有需要,启动图形终端
CentOS 5: /etc/inittab
每一行定义一种action和对应的程序;
id:runlevels:action:process
例如
si::sysinit:/etc/rc.d/rc.sysinit
action: respwan, wait, initdefault
l3:3:wait:/etc/rc.d/rc 3
CentOS 6: /etc/inittab
由/etc/init/*.conf 一类的配置文件定义init的初始化动作
由upstart调用,程序为/sbin/init
/etc/rc.d/rc.sysinit: 系统初始化脚本
设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名
打印文本欢迎信息
激活SELinux和udev
挂载/etc/fstab文件中定义的其它文件系统
激活swap
检测根文件系统,并以读写方式重新挂载;
设置系统时钟
根据/etc/sysctl.conf设置内核参数
激活LVM和RAID设备;
加载额外设备的驱动程序;
清理操作
初始化流程:POST --> (BIOS)boot sequence --> MBR(bootloader) --> kernel + ramdisk(initrd, initramfs) --> mount rootfs (ro) --> /sbin/init (CentOS 5: /etc/inittab, CentOS6 /etc/init/*.conf)
设定默认运行级别 --> 使用/etc/rc.d/rc.sysinit初始化系统 --> 分别启动并关闭指定服务 --> Ctrl+Alt+Delete组合键 --> 启动字符终端 --> 启动图形终端
GRUB: GRand Unified Bootloader
grub程序由两段组成:
stage1: MBR (0柱面 0磁道 1扇区)
stage1_5: MBR随后的扇区
stage2: 读取grub.conf配置文件,并实现引导功能的扩展
grub的功能:
1、提供菜单,并提供交互式接口
e: 进入编辑模式
2、选择要启动的内核或系统
允许传递引导参数给内核
选择界面可隐藏
3、为编辑功能提供保护机制
启用内核文件:
选择运行指定的内核得先输入密码
传递参数:
使用e命令得先输入密码
grub命令行接口:
root:指定哪个分区为接下来要启动的系统或内核文件所在的分区
root (DEVICE)
所有硬盘都识别为hd
不同的硬盘基于数字标识:如hd0, hd1等
同一个硬盘上的不同分区,也使用数字标识,如hd0,0 hd1,5
root (hd0,0)
find (DEVICE)/path/to/file
kernel: 指定要运行的内核文件
initrd: 为要运行的内核指定其可用的ramdisk文件
boot: 启动此前配置好的内核或系统
grub.conf:
参数:
default=: 选择第几个title配置的内核或系统,各title从0开始编号
timeout=#: 菜单显示的超时时长;
splashimage=/path/to/some_image_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩;
hiddenmenu: 隐藏菜单
title TILTE STRING:显示于菜单中的标题
root
kernel
initrd
grub保护机制:
1、生成密码:
# grub-md5-crypt
2、保护编辑功能,则需要title之外的添加
password --md5 密码串
3、保护使用某内核,则需要内核对应的title之下添加
password --md5 密码串
安装grub的方式:
1、使用grub-install命令
# grub-install [--root-directory=/path/to/somewhere] DEVICE
--root-directory=/path/to/somewhere
/path/to/somewhere:内核及initrd文件所在的分区的挂载点的父目录,且此挂载点必须叫boot
例如:/dev/sdb1: /mnt/boot
# grub-install --root-directory=/mnt /dev/sdb
总结:
系统启动流程
POST --> 引导次序(BIOS)--> BootLoader(MBR) --> kernel + ramdisk (临时根) --> 根切换 (rootfs) --> /sbin/init (配置文件)
配置文件:设置默认运行级别 --> 指定系统初始化脚本进行系统初始化 --> 启动服务(关闭服务)(/etc/rc.d/rc#.d, /etc/rc.d/init.d/) --> /etc/rc.d/rc.local -> 设置CtrlAltDel组合的功用 --> 启动终端(mingetty),并在终端附加登录程序(login) --> 如果级别为5, 则要启动 X server
login: root
password: mageedu
nsswitch: 检查用户帐是否存在,并且如果存在,还能将其解析为UID;
库(API),而非服务
/usr/lib64/libnss*
/lib64/libnss*
pam: pluggable authentication module, 做用户认证
库 (API)
/lib64/security/*
ramdisk
centos5: initrd
ram disk: 块设备
centos6: initramfs
ram fs:
配置文件:
c5: sysv init, /etc/inittab
c6: upstart, /etc/inittab + /etc/init/*.conf
chkconfig --add, --del, --list, --level
c7: systemd, /usr/lib/systemd/
X-Window: Client --> Server
X protocol
twm
Desktop: GNome, KDE, Xfce
GRUB: GRand Unified Bootloader
stage1
stage1_5
stage2
命令行接口:
grub>
配置文件:
/boot/grub/grub.conf
编辑模式:
Linux内核:单内核,模块化
内核的某些功能:
编译进内核本体 [*]
编译成内核模块 [M]
不选择使用 [ ]
内核的组成部分:
/boot/vmlinuz-VERSION
/lib/modules/VERSION/
*.ko: kernel object
模块间有可能存在依赖关系
内核的模块管理
lsmod: 显示内核已装载模块
动态装卸载模块:
卸载:modprobe -r MOD_NAME
装载:modprobe MOD_NAME
装载:insmod /path/to/module_file
卸载:rmmod MOD_NAME
查看某模块的详细信息:
modinfo MOD_NAME
检查并生成模块间依赖关系的命令:
depmod
以上是关于Linux 内核及系统启动流程的主要内容,如果未能解决你的问题,请参考以下文章