LinuxDay16——启动流程和内核管理
CentOS 5和6的启动流程
Linux: kernel+rootfs
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:
glibc
库:函数集合,function,调用接口
过程调用:procedure(没有任何返回值即结果)
函数调用:function(必有返回值即结果)
程序
内核设计流派:
单内核设计:集中管理,linux
把所有功能集成于同一个程序;
微内核设计:分散管理,Windows,solaris
每个功能使用一个单独子系统实现;
Linux内和特点:
支持模块化:.ko
支持模块的动态装载和卸载;
组成部分:
核心文件:/boot/vmlinuz-VERSION-release(压缩格式)
ramdisk:
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6:/boot/initrmfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
CentOS 系统启动流程:
I POST:加电自检;
ROM:CMOS
BIOS:Basic Input&Output System
ROM+RAM
II BOOT Sequence:引导加载次序
按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备;
bootloader:引导加载器,程序
windows:ntloader
Linux:
LILO:lInux LOader(早期or安卓手机中)
GRUB:GRand Uniform Bootloader
GRUB 0.X:GRUB Legac
GRUB 1.X:GRUB2
功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权交给内核;
MBR:主引导记录 (0磁道0扇区)
446:bootloader
64:fat 磁盘分区表 (文件系统分配表)
2:55AA
GRUB:
bootloader:1st stage 位于MBR(主要目的是找到硬盘上的第二阶段)
1.5stage(帮助GRUB识别分区文件系统)(安装时匹配好文件系统 放置在MBR之后的扇区)
disk:2nd stage
III kernel:
自身初始化:
探测可识别到的所有硬件设备;
加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统;
运行用户控件的第一个应用程序:/sbin/init
init程序的类型:
sysV:init,CentOS 5
配置文件:/etc/inittab
Upstart:init,CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd,CentOS 7
配置文件:/usr/lib/systemd/system,/etc/systemd/system
ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;
ramdisk --> ramfs
CentOS 5:initrd,工具程序:mkinitrd
CentOS 6:initramfs,工具程序:mkinitrd,dracut
系统初始化(前半段):
POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init(取决于配置文件)
IV /sbin/init
CentOS 5:
运行级别:为例系统的运行或维护等应用目的而设定:
0~6:7个级别
0:关机
1:单用户模式(root,无需登录),single,维护模式;
2:多用户模式,会启动网络功能,但不会启动NFS;维护模式;
3:多用户模式,正常模式;文本界面;
4:预留级别;可同3级别;
5:多用户模式,正常模式;图形界面
6:重启
默认级别:
3,5
切换级别
init 0
查看级别
runlevel
who -r
V 配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait:切换至此级别运行一次;
respawn:此process终止,就重新气动之;
initdefault:设定默认运行界别:process省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;
...
id:3:initdefaule:设定默认级别3
si: :sysinit:/etc/rc.d/rc.sysinit
l0:0wait:/etc/rc.d/rc 0
l1:1wait:/etc/rc.d/rc 1
...
l6:6wait:/etc/rc.d/rc 6
说明 rc 0 --> 意味着读取/etc/rc.d/rc0.d
K*:K##* 运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;
S*:S##* 运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖别的服务;
for srv in /etc/rc.d/rc0.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*;do
$srv star
done
chkconfig命令
查看服务在所有级别的启动或甘比设定情况;
chkconfig --list name
添加:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig --add name
#!/bin/bash
#
# chkconfig: LLLL(0~6)级别 nn(S#) mm(K#)
删除:
chkconfig --del name
修改指定的链接类型
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要设置的级别;省略默认表示2345
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此不便或不需写为服务脚本放置位于/etc/rc.d/rc.local文件中/etc/rc.d/rc.local在指定运行级别脚本后运行;可以根据情况,进行自定义修改;
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
...
tty6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会自动调用login程序
x:5:respawn:/etc/X11/prefdm -nodaemon
VI /etc/rc.d/rc.sysinit: 系统初始化脚本
(1)设计主机名;
(2)设置还原信息;
(3)激活udev和SELinux
(4)挂载/etc/fstab文件中定义的文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动的服务 --> 设置登录终端
CentOS 6:
init程序为:start其配置文件:
/etc/inittab, /etc/init/*.conf,
注意:/etc/init/*.conf配置文件的语法 遵循 upstart配置文件语法格式,和CentOS5不同
启动系统时,设置其运行级别1;
进入单用户模式:
(1) 编辑grub菜单(选定要编辑的title,而后使用e命令)
(2) 在选定的kernel后附加
1, s, S或single都可以
(3) 在kernel所在行,键入“b”命令
(4)passwd
GRUB(Boot Loader):
GRUB:GRand Uniform Bootloader
GRUB 0.X:GRUB Legac
GRUB 1.X:GRUB2
grub Legacy
stagel:mbr
stage1_5:mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
sstage2:磁盘分区(/boot/grub)
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
功能
(1)提供菜单、并提供交互式接口
a:编辑模式,用于编辑菜单;
c:命令模式,交互式接口;
(2)加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3)为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
注意* 若/boot未独立分区(即boot在根下): grub寻找文件路径为 /boot/grub/grub.conf
若/boot独立分区:grub寻找文件路径为(即绕过boot) /grub/grub.conf
如何识别设备:
(hd#,#)
hd#:硬盘编号,用数字表示;从0开始编号
#:分区编号,用数字表示;从0开始编号
(hd0,0)第一块硬盘第一分区
grubd命令行接口
help:获取帮助列表
help KEYWORD :详细列出信息
find (hd#,#)/PATH/TO/SOMEFILE查找某个文件
root(hd#,#)
kernel /PATH/TO/KERNEL_FILE:设定本次启动时间用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
;
例如:init=/path/to/init,selinux=0
initrd /PATH/TO/KERNEL_FILE:设定为选定的内核提供额外文件的ramdisk
boot:引导启动选定的内核;
手动在grub命令行接口启动程序;
grub > root(hd#,#)
grub > kernel /vmlinuz-VERSION-release ro root=/dev/DEVICE
grub > initrd /initramfs-VERSION-release.img
grub > boot
配置文件:/boot/grub/grub.conf
配置项
default=#:指定默认启动的菜单项;菜单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE;指明菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [--md5] STRING;菜单编辑认证
title TITLE:定义菜单项“标题”。可出现多次
root (hd#,#),grub查找stage2及kernel文件所在设备分区,为grub的“根”
kernel /PATH/TO/VMLUNZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
password [--md5] STRING;启动选定的内核或操作系统时进行认证;
grub-md5-crypt(openssl) 命令
进入单用户模式:
(1)编辑grub菜单(选定要编辑的title,而后使用e命令);
(2)在选定的kernel后附加
1,s,S,或single都可以
(3)在kernel所在行,键入“b”命令;
CentOS7系列启动流程
CentOS7与6版本的不同之处:
6 : grub0.9和upstart
7 : grub2和systemd
主要介绍一下grub2和systemd吧,其他的启动流程几乎一样
grub2
/etc/default/grub
/boot/grub2/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub2的配置文件
*在救援模式下修复grub
# chroot /mnt/sysimage
# grub2-install /dev/sda
# grub2-mkconfig -o /boot/grub2/grub.cfg
在grub命令行启动系统
> insmod xfs
> set root=(hd0,1)
> linux16 /vmlinux-... root=/dev/sda2 selinux=0
> initrd16 /initramfs-...
systemd
系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
Systemd新特性:
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
系统状态快照
unit:表示不同类型的systemd对象
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于6系列的/etc/init.d/目录的功能
/run/systemd/system:系统执行过程中所产生的服务脚本
/etc/systemd/system:管理员建立的执行脚本,功能类似于6系列中/etc/rc.d/rcN.d/Sxx目录的功能
类型:
Service unit: (.service),用于定义系统服务
Target unit: (.target),用于模拟实现运行级别
Device unit: (.device),用于定义内核识别的设备
Mount unit: (.mount),定义文件系统挂载点
Socket unit: (.socket), 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
Snapshot unit: (.snapshot),管理系统快照
Swap unit: (.swap), 用于标识swap设备
Automount unit:(.automount),文件系统的自动挂载点
Path unit:(.path),用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务
systemctl命令
相关管理工具:
sysctl:修改内核参数的工具
-p 重新读入/etc/sysctl.conf
-a 列出当前生效的内核参数
-w net.ipv4.ip_forward = 1 即时生效
uname
-r:显示内核版本号
-a:显示全部信息
-n:显示主机名
lsmod:显示已经装载的模块
modinfo:显示模块的详细信息
-n:显示模块路径
-p:显示模块参数
-a:显示模块作者
-d:显示模块描述信息
-l:显示模块的遵循的协议
modprobe:装载模块
-r:卸载模块
depmod:内核模块依赖关系文件及系统信息映射文件的生成工具
insmod:指定装载模块文件,但不自动解决依赖模块
rmmod:卸载模块
time cmd 检测命令执行花的时间
lscpu:查看CPU信息
lspci:查看pci相关信息
lsusb:查看usb相关信息
lsblk:查看块设备相关信息
hal-device:查看所有硬件信息(CentOS6.x)