前言:
了解系统内核基本知识
-
内核功能:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能等
-
用户空间:应用程序其中有进程或者线程
-
运行中的系统可分为两层:
内核空间
、用户空间
-
内核设计流派:
-
单内核设计:把每种功能集成于一个程序中;例如:
linux
-
微内核设计:每种功能使用一个单独的子系统实现;例如:
Windows
,Solaris
linux内核的特点:
支持模块化:.ko
(kernel object)
支持模块运行时动态装载和卸载;其中linux内核的组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:
centos5:/boot/initrd-VERSION-release.img
centos6和7:/boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
系统启动流程
-
简单描述:
系统初始化流程:
内核级别: POST–>Bootsequence(BIOS)
–>Bootloader(MBR)–>kernel(ramdisk)
–>rootfs(readonly)
–>/sbin/init(/etc/inittab)
用户级别: 设置默认运行级别–>运行系统初始化脚本,完成系统初始化rc.sysinit
–>关闭对应级别下面要停止的服务,启动对应级别下面要开启的服务–>设置登录终端–>[]启动图像终端] -
详细介绍:
POST:开机自检<加电自检>完成对硬件的检测;是BIOS功能的一个主要部分,负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测;如某些硬件出现错误无法通过检测就导致系统无法启动,POST完成之后将被清出内存;
Bootsequence(BIOS):按次序查找引导设备,第一个有引导程序的设备就是本次启动用到的设备。进行设备的枚举和初始化,按CMOS的设置所有处于活动状态并且可引导的设备
(floppy、CD-ROM、USB、DISK、NFS)
,加载主引导记录(MBR)
到内存中,然后BIOS将控制权给下一步BOOTLOADER
;BOOTLOADER(MBR):引导加载器,程序;MBR
前446bytes;
功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开;而后把系统控制权移交给内核;kernel 内核自身初始化
启动
init
进程init 以守护进程方式存在,是所有其他进程的祖先(PID=1),init 进程非常独特,能够完成其他进程无法完成的任务。
程序类型:CentOS5-
:sysv init
配置文件:/etc/inittab
CentOS6
:upstart(并发启动)
配置文件:/etc/inittab
、/etc/init/*.conf
CentOS7
:systemd
配置文件:/usr/lib/systemd/system/
/etc/systemd/system/*
-
系统进入
runlevel
-
运行系统初始化脚本
/etc/rc.d/rc.sysinit
-
运行指定运行级别对应的目录下的脚本,
/etc/rc.d/rc#.d/
目录下的服务脚本 -
捕获组合键的定义
-
定义电源
fail/restore
脚本 -
启动 getty 和虚拟控制台
-
用户级别:
init
通过读取/etc/inittab
文件来完成系统初始化过程: -
探测可识别到的所有硬件设备;
-
加载设备驱动程序(有可能会借助ramdisk加载驱动);
-
以只读方式挂载根文件系统;
-
运行用户空间的第一个应用程序:/sbin/init
-
LILO
:LInux LOader (无法支持大硬盘分区) -
GRUB 0.X
:[centos5,6] grub legacy (经典),各种安卓手机使用 ; -
GRUB 1.X
:[centos7] grub2 -
Windows:
ntloader
,仅是启动OS -
Linux:
-
linux内核特征之一:使用缓冲和缓存来加速对磁盘上的文件进行访问;
-
ramdisk
-(磁盘)转换成ramfs
(文件系统),提高速度; -
centos5
:initrd
,工具程序:mkinitrd
-
centos6,7
:initramfs
,工具程序:dracut
,mkinitrd
工作原理介绍:
MBR(master boot record)主引导记录
MBR
共有512bytes
,其中446bytes
为主引导记录bootloader
,另外的64bytes
为分区表fat
,其中包含4
个分区表记录,以16bytes
为一个分区划分记录,最后2bytes
为MBR
的有效性检测55AA
;
GRUB(bootloader)
grub:
Grub unified bootloader
,grub
向用户提供了更好的开机体验,加入了开机的菜单、开机图片等更多的功能,而这种功能bootloader
不能提供,grub
分为三个阶段(grub legacy):
一阶段:
primary boot loader
:1st stage
分区引导加载
功能:此阶段在bootloader
中,bootloader
不在直接加载内核,而是加载grub
的第二阶段;bootloader
备份在了/boot/grub/stage1
中二阶段:
parition
:filesystem driver
:1.5stage
文件系统接口。功用:提供文件系统驱动,方便虚拟系统的生成,让stage1
中的bootloader
能识别stage2
所在分区上的文件系统;三阶段:
partition /boot/grub
:2nd stage
,分区文件,不支持复杂逻辑软raid等,仅支持基本分区(内核文件只能放在基本磁盘分区上),通过读取/etc/grub.conf
文件,显示出内核列表,指定了内核镜像和initrd
所在的分区为root
,设定内核参数,并加载vmlinuz
和initramfs
这两个文件到内存中。在这一阶段可以编辑启动项目。如指定根分区root
,内核kernel
,initrd
镜像等;也可以进入grub command line
手动写启动信息。
功用:1、提供菜单、并提供交互式接口;[e
:编辑模式,用于编辑菜单;c
:命令接口];2、加载用户选择的内核或操作系统允许传递参数给内核,可隐藏此菜单;3、为菜单提供保护机制,为编辑菜单进行认证,为启动内核或操作系统进行认证;
GRUB
管理开机启动的过程分成了三个阶段.。tage1
主要负责BIOS
和GRUB
之间的交接。这部分才是真正放在MBR
中的bootloader
。而后stage1.5
是连接stage1
和stage2
之间的通道,起着过渡的作用。最后才是GRUB
中真正核心的部分stage2
,它可以让用户以选项的方式将操作系统加载、修改选项和内核参数。
kernel工作方式:
工作原理:当内核映像被加载到内存中,并且stage2 的引导加载程序释放控制权之后,内核阶段就开始了,内核在完成自身的初始化之后进行探测可识别的所有硬件设备,由于内核中只包含了少量的硬件驱动,此时会借助内存中的
initrd
根文件系统加载相关驱动程序。当内核具备访问根文件系统功能时(rootfs
),initrd
根文件系统将被卸载,并挂载真正的根文件系统。这就是内核的初始化过程,系统已经脱离了/boot
分区,独立存活在内存中。
vmlinuz-xxx
内核镜像是一个zImage
(压缩映像,小于512KB
)或一个bzImage
(较大的压缩映像,大于512KB
),它是使用zlib
进行压缩过的内核文件。
initramfs-xxx.img
是由stage2
引导加载程序加载到内存中的,它会被复制到RAM
中并挂载到系统上。这个initrd
会作为RAM
中的临时根文件系统使用,并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。initrd
文件包括可加载模块的驱动程序,为内核提供可访问磁盘和磁盘上的文件系统的接口,并为其他硬件提供了驱动程序。由于根文件系统是磁盘上的一个文件系统,因此内核通过initrd
取得根分区的访问,并挂载真正的根文件系统。这是一个解包的initramfs
镜像文件。
用户级别启动
-
首先系统通过读取
/etc/inittab
文件来完成系统的初始化过程; -
inittab文件
inittab
文件表示的为系统init
初始化程序用到的配置文件。这个文件负责设置init
初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。inittab
文件中,每一行定义一种action
以及与之对应的process
.
基本格式:
id
:runlevels
:action
:process
ID:一个任务的标识符;
runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
action:在什么条件下启动此任务;
process:执行的任务;
runlevel
:Sysvinit
读取/etc/inittab
文件中是否含有initdefault’
项,有则init
将启动默认运行的模式。如果没有默认的运行模式,将进入系统控制台,手动决定进入何种运行模式。
一共有7个(0-6)运行级别:
0
:关机,shutdown
;1
:单用户模式(singler user
),root
用户无须认证,此为维护模式;2
:多用户模式(multi user
),会启动网络功能,但不会启动NFS
,维护模式;3
:多用户模式(Full multiuser mode
),完全功能模式,文本界面;4
:预留级别:目前无特别适合目的,但习惯以同3级别功能使用;5
:多用户模式(multi user
),完全功能,图形界面;6
:重启,reboot
;
其中默认级别:3
和5
级别切换:init
命令
级别查看:who -r
、runlevel
其中
ACTION
常见的有4中动作:
1、wait:
等待切换至此任务所在的级别时执行一次;
2、respawn:
一旦此任务终止,就自动重新启动之;
3、initdefault:
设定默认运行级别;
4、sysinit:
设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit
系统初始化脚本:/etc/rc.d/rc.sysinit
此文件初始化过程中主要功用:
-
设置主机名
-
设置欢迎信息
-
激活
UDEV
和SELINUX
-
挂载
/etc/fstab
文件中定义的所有文件系统 -
检测根文件系统,并以读写方式重新挂载根文件系统
-
设置系统时钟
-
根据
/etc/sysctl.conf
文件的设置,来设置内核参数 -
激活
lvm
及软raid
设备 -
激活
swap
设备(此操作在fstab
中以执行) -
加载额外设备的驱动文件
-
清理操作(过去的
lock
和pid
文件)
/etc/rc.d/rc 和/etc/rc.d/rc#.d/ 介绍
rc
是个脚本,后面接参数。如:l5:5:wait:/etc/rc.d/rc 5
wait
意味着init
系统将等待rc
启动服务脚本i0:0:wait:/etc/rc.d/rc3
意味着去启动或关闭/etc/rc.d/rc3.d/
目录下的服务脚本所控制服务
rc
根据runlevel
执行rc#.d
目录下启动脚本。每个runlevel
都有一个对应的rc#.d
目录;
其中在这些目录下存放着很多不同的脚本,文件名以S
开头的脚本表示在当前runlevel
中启动,K开头的脚本表示不在当前runlevel中启动;
K*:要启动的服务;K##*
,优先级,数字越小,越先关闭;依赖的服务先关闭,而后关闭被依赖的;
S*:要启动的服务;S##*
,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
在
/etc/rc.d/rc#.d
目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d
目录下,也就是说在/etc/init.d
目录下的文件会自动以S##script
或K##script
的软链接存在于各 runlevel 的目录下
/etc/rc.d/rc.local
正常级别下,最后启动的一个服务S99local
没有链接至/etc/init.d
下的某脚本,而是链接至了/etc/rc.d/rc.local
(/etc/rc.local
)脚本;因此,不便或不需为服务脚本的程序期望能开机自动运行时,直接放置此脚本文件中即可;
init在等待/etc/rc.d/rc执行完毕之后,将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。 至此,Linux的启动完成
-
tty1:2345:respawn:/usr/sbin/mingetty tty1
…tty6:2345:respawn:/usr/sbin/mingetty tty6
注意:
1、mingetty
调用login
程序;
2、打开虚拟终端的程序出了mingetty
之外,还有诸多getty
等;
命令行中的操作:
gurb的命令行接口操作
help
:获取帮助列表help KEYWORD
:获取详细帮助信息find (hd#,#) /path/to/somefile
root (hd#,#)
kernel /path/to/kernel_file
:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数
例如:init=/path/toinit
,selinux=0
initrd:/path/to/initramfs_file
:设定为选定的内核提供额外文件的ramdisk
;boot
:引导启动选定的内核;
-
如何识别设备:
(hd#,#)
hd#
:磁盘编号,用数字标示:从0
开始编号#
:分区编号,用数字标示;从0
开始编号
手动在grub命令行接口启动系统:
grub> root(hd#,#)
grub> kernel /vmlinuxz-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/XPAM_PIX_FILE
:指明菜单背景图片文件路径;hiddenmenu
:隐藏菜单;password [--md5] STRING
:菜单编辑认证;title TITLE
:定义菜单项”标题”,可出现多次;root(hd#,#)
:grub查找stage2
及kernel
文件所在设备分区;为grub
的”根
”kernel /PATH/TOVMLINUZ_FILE [PARAMETERS]
:启动的内核initrd /PATH/TO/INITRAMFS_FILE
:内核匹配的ramfs
文件;password [--md5] STRING
:启动选定的内核或操作系统时进行认证;(grub-md5-crypt)
进入单用户模式:
-
编辑
grub
菜单(选定要编辑的title
,而后使用e
命令); -
在选定的
kernel
后附加 -
s
,S
或single
都可以 -
在
kernel
所在行,键入b
命令
安装grub
:
-
在系统中安装:
grub-install
grub-install --root-directory=ROOT /dev/DISK
-
在grub表中安装:
grub
grub> root (hd#,#)
grub> setup (hd#)
原创文章,作者:N22-白蚁,如若转载,请注明出处:http://www.178linux.com/47130