系统启动流程以及内核管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统启动流程以及内核管理相关的知识,希望对你有一定的参考价值。
linux的组成:
linux是单内核的系统,而windows是多个微内核的组成的操作系统
linux内核的作用:进程管理,内存管理,设备管理,网络管理,硬件驱动,安全机制
启动流程:
1,POST加电自检
作用:对电脑的各种硬件进行检测,看是否正常
ROM(主要):加载Bios保存电脑的输出程序,但是它是保存在内存之中
RAM:保存电脑的各种参数设置,不然BIOS设置存不住,比如时间。并且指定对应的启
动项,如从光盘还是硬盘启动
bootloader:引导加载器,负责引导程序。解压,展开内核,并且把控制权交给内核。如
用GRUB启动,在6,7版本上不一样
2,MBR引导
1,前446个字节放的是bootloader,中间64个字节存放磁盘的分区表,最后两个字节是55AA
3,grub
1,加载grub文件夹中的内容
4,kernel进行初始化
1,以只读的方式挂载根
2,运行系统的第一个程序/sbin/init
3,探测所有的硬件设备
4,加载各种硬件的驱动程序
在centos7中硬件的驱动程序是按照需求加载的,如果开机启动时没有检测到硬件,那么就
不会加载相对应的驱动程序,用来节省启动时间,让启动的更加迅速
vmlinuz放着最核心的驱动文件,这个文件在光盘中存在,是红帽公司出厂的时候打包到光
盘中。如果丢失可以进行复制。在编译内核或内核文件丢失时候可以用到此文件,后缀要
加上内核的版本号(name -r)
注:硬件的驱动程序存放在/lib/modules/kernel` uname -r `/中,如果需要则加载,不需要不
加载
辅助的文件系统存放在greb下的initramfs.img文件中
注:在6,7上放的虚拟的文件系统,在跟早的系统上放的是虚拟的光盘,然而光盘占用的磁盘
空间非常的大,从而导致启动的时长更加长
用modeinfo 可以看到驱动模块的详细信息,以及驱动模块的存放目录
综上所述:在系统中特定的文件系统的根放在grub下的initramfs中,可以看到文件系统的驱
动不是放在boot目录中,而是放在其他目录中。那么在系统启动时,并不会加载文件系统驱
动所在的目录。但是如果不加载文件系统驱动,则无法挂载根目录,导致系统无法启动。
因此在centos中,会在grub下这个文件中会做一个这个伪根目录,以便于启动的时候运行
注:查看initramfs.img文件,不过要改文件名,改成GZ后缀的文件名,改成之后在进行解
压缩。就可以看到操作系统的根的驱动。只有在启动过程中有这个驱动,那么才可以加载
文件系统的根
常见问题:
1,没有initramfs.img文件
解决:
切换根目录
用mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)来进行修复
2,在centos7上没有boot目录的内容
解决:
拷贝光盘里的vmlinuz文件,加上版本号
重启系统即可
内核的特点:
在官网下载内核,下载之后解压后的init目录下存放着内核的源码,可以查看,并修改源码,
并且修改启动的第一个进程
在centos6和7上对应的init文件不属于一个包,可以用rpm来查看,因为在这两个系统上并不
是由一个应用程序启动的
早期centos的加载是等待执行,可以理解成当一个进程启动完成之后,才会启动另一个进
程。这样很多缺点,如系统启动时间过长,或者某一个应用程序无法启动,从而导致整个系
统都无法启动。所以在centos后期的版本中进程之间是并行执行启动,这样可以大大的节省
启动时间,也可以在启动时排除一些进程不必要的干扰
默认启动模式:在centos6上可以改动/etc/inittab中改开机启动的模式,在centos7也有此
文件,但是centos7上无法再此文件中定义启动的模式,需要通过调用系统命令来修改系
统的默认启动模式,且在centos7系统中定义的只有两种启动模式,分别是图形和命令行
centos6:
查看:runlevel
修改:在配置文件中修改id:3:initdefault:
注:
0,关机模式
1,单用户模式(系统进行维护,破解root口令)
3,多用户模式
5,图形界面
6,重启
如在配置文件中误修改成重启模式,可在开机界面进入单用户模式修改
centos7:
查看:systemctl get-default
修改:
systemctl set-default graphical.target
systemctl set-default multi-user.target
系统的启动流程:
系统启动的第一个程序:/sbin/init
init读取其初始化文件:
centos6:/etc/inittab
centos7:systemctl set-default name.target(只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换)
/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) 清理操作
rc N --> 意味着读取/etc/rc.d/rcN.d/(进行系统初始化)
作用:在其中有很多的K开头的文件和S开头的文件,其中K代表是关闭,S代表是启动,其
中的数字代表启动的顺序
注:
1,在切换模式的时候/etc/rc.d/rcN.d/里面的服务也会重新启动一遍
2,自己编写的脚本在启动时尽量往后放,因为自己编写的脚本需要依赖很多其他程序才
能够运行,当然关闭的时候要首先关闭自己编写的脚本
调整服务的启动次序:
chkconfig可以查看到当前的各个服务的启动级别,也可以进行设置
例:chkconfig --level 345 atd off 改这个级别下的自启动,如果不带任何选项,那么则代
表的是2-5模式之中关闭
源码包安装的服务在书写启动脚本的格式(尽量用case语句):
必须加上的行:
chkconfig 2345(-) (S)96 (K)06 (设置启动的等级,启动和关闭的顺序)
description: test service (在centos6上加不加都可以,在5版本上必须得加上这一行,才
能启动对应的服务)
美化启动脚本,引用相应的functions文件中的action函数:
source /etc/init.d/function
action "xxx is stop"
将启动脚本通过chkconfig命令加入到启动项里,如果删除可以用这个命令删除,不然会有
相应的缓存文件
chkconfig add :添加服务
chkconfig del :删除服务
注:在linux运行的过程中可能一些服务由于种种原因导致无法启动,那么切换开机启动模式,然后在对相关进行改动即可
如果不想用chkconfig加入到自启动中,可以加入到rc.local中,注意这个脚本中的服务是最
后启动的服务
xinetd(超级守护进程)管理的服务:
作用:
centos6系统中一些服务的代理服务,在centos7中交由systemd代理。在centos6中的某
些服务会依赖于这个服务的启动而启动,从而来减少系统的压力比如已经淘汰的Telnet
服务,就是依赖于xinted服务的启动而启动
对象:
一些访问量不多的服务,当有人访问这个服务时才会启动对应的服务,可以节约一些启
动的资源
启动:
要修改要启动服务对应的配置文件,把disabled这一项改成no
在生产中要注释掉的快捷键,避免误操作:ctrl alt delete 三键连按是重启
centos6:
注释/etc/init/control-alt-delete.conf的start on control-alt-delete这一行
centos7:
删除/usr/lib/systemd/system/ctrl-alt-del.target
grub:
配置文件:
default=#: 设定默认启动的哪一个内核;落单项(title)编号从0开始,
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径(可以自定义启动图片,
但是图片的像素是640*480,后缀是xpm.gz)
title TITLE:定义菜单项“标题”
hiddenmenu:隐藏菜单(如果没有,那么不按e就可以看到启动项)
password [--md5] STRING: 可以为启动项增加密码
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件
注: initrd必须在kernel下面,因为要先加载文件系统
grub分区启动的常见问题:
1,缺少前446个字节的bookloader(一阶段,进入救援模式)
解决:
进入救援模式下
1:
grub-install --root-directory=DIR(挂载的目录) /dev/DISK(对应的分区)——————挂载对应的磁盘
2(boot下的备份文件必须要存在):
#] grub
grub>root (hd0,0)—————挂载根分区
grub>setup (hd0)—————生成对应的MBR分区表
2,没有grub配置文件(二阶段错误,出现grub提示符)
解决:
手动写grub.conf配置文件
3,没有grub目录和前446个字节
解决:
1,切换根目录
2,grub-install /dev/sda
3,写grub.conf文件
default=0
timeout=3
title my linux
kernel /vmlinuz ro root=/dev/sda1 selinux=0
initrd /initramfs.img
注:root (hd0,0)可写可不写,默认根分区是第一个分区
4,重启系统
4,boot分区全部删除
解决:
1,进入救援模式,开启一个shell,切换根目录
2,挂载光盘,拷贝内核文件(vmlinuz),mkinitrd /boot initramfs.img `uname -r`(可以直接装内核,不过要强制安装内核)
3,grub-install /dev/sda(重做MBR分区)
4,写grub.conf文件
5,重启系统
5,删除boot分区,删除fstab文件(基于逻辑卷安装的系统)
解决:
centos6:
1,用fdisk命令先找到根分区的属于哪个分区,然后用blkid命令查看当前分区有没有逻
辑卷,并找到对应的挂载目录
2,用lvdisplay可以看到逻辑卷是否处于启用状态,如果没有启用,可以用vgchange -ay可以启用逻辑卷
3,启用之后编辑/etc/fstab(要在对应的根目录下)
4,重启系统
5,切换根目录
6,生成grub-install /dev/sda(重做MBR分区)
7,写grub.conf文件
centos7:
1,进入BIOS界面,设置光盘启动,进入救援模式
2,挂载光盘,并强制安装内核
3,安装完成之后,制作grub配置文件grub2-install /dev/sda(重做MBR分区)
4,用 grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub.cfg文件
5,重启电脑
grub加密(6,7上的加密方式不一样)
6上加密:
在grub.conf的配置文件中加入password这一行,后面跟上对应的密码
明文:
直接输入密码
密文:
grub-md5-crypt生成密码串
加入配置文件password --md5 密码串(输入a进入单用户模式改密码)
7上加密:
明文:
在/etc/grub.d/00_header中加入如下几行
cat << EOF
set superusers=‘admin‘
password admin qwe123
E0F
密文:
用grub2-mkpasswd-pbkdf2生成密文
把密文写入到配置文件之中
g重新生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg
制作小型的linux系统:
必须要有的分区:boot分区,根分区
拿到独立的磁盘,进行分区,分区之后创建文件系统
把创建分系统挂载到系统的目录上,并用相应的命令用grub-install生成boot下必须要的文
件(生成完成后需要检查一下boot下的文件是否存在)
书写grub.conf配置文件在centos6上要手动输入,在centos7上可以用grub2-mkconfig生成对
应的文件
把根目录挂载对应的目录下,并创建常用文件夹,并且复制一些常用命令对应的动态链接库
文件,并复制网卡的驱动模块(modeinfo查看驱动的位置,ethtool -i 查看网卡驱动insmod可
以加载网卡模块)
切换根目录,检查是否成功,成功后即可移植此磁盘到别的电脑中
创建一台新的虚拟机把对应的磁盘加入到虚拟机之中,然后开启虚拟机,并加载网卡驱动
注:
使新制作的系统有网络功能:
查看网卡的驱动模块:ethtool -i ech0
查看网卡驱动模块的所在位置,并拷贝到新的磁盘中:modinfo e1000
启动新的虚拟机,添加网卡驱动模块:insmod e1000
添加成功后用ifconfig添加网址即可通讯
proc文件夹:
作用:内存中加载的文件吧·
配置文件:/etc/sysctl 配置文件的格式中.代表目录中的/(如路由转发等,以及禁止ping的
功能,在centos6上是写好的文件,在centos7上是空白,需要手动添加)
写完配置文件后,可以用sysctl -p选项可以让配置立即生效,可以用sysctl -a查看当前内存中
生效的配置文件(如果该文件中没有内容,那么需要手动添加)
清除缓存(man proc):
echo 3 > /proc/sys/vm/drop_caches
内核编译(通常在/boot目录下):
编译方法:和大部分软件的源代码编译的方式差不多,但是内核中有很多的功能,要在生产
中判断有些功能是否启用(内核裁剪),从而加快系统的运行效率
编译过程:
准备好安装编译环境,以及10G以上内存空间,查看主机的CPU架构,下载好对应的内核
源码包(www.kernel.org)
.config:准备文本配置文件
make menuconfig:配置内核选项(看哪些功能需要,哪些功能不需要)
make && make install (生成的内核在/lib/modules/生成对应的文件,名字就是内核的版本)
查看当前生效的内核模块:
lsmod显示由核心已经装载的内核模块(其实是查看/proc/modules文件)
modinfo可以显示所有模块的信息,即使是没有装载的模块都会显示出来
modprobe可以加载相应的模块(模块的配置文件在/etc/modprobe.d/中)
注:insmod也可以加载和卸载模块,不过此命令会有依赖性,所有不常用类似于rpm装软件包。
modprobe在加载和卸载内核模块的时候,不会检查驱动的依赖性,类似于装软件的yum
Busybox:
作用:可以用来定制小型的Linux操作系统,比如手机系统,到各种智能的终端设备,它占用
的空间十分小,只需要一个小型的内核和Busybox就可以运行
原理:每个命令都有相应的动态链接库文件,但是这些库文件中有些库文件是相同的,所以
可以利用这个软件对一些启动的动态链接库进行优化,排除掉冗余的库文件,从而来简化系
统的各项功能
编译:
装一些依赖的软件包
装完之后下载busybox,解压后进入其中
make menuconfig 选一些特定的功能
make && make install 如果出错,执行make clean后,重新执行上面命令
mkdir /mnt/sysroot/
cp -a _install/* /mnt/sysroot/
检查:切换根目录,看命令是否执行,如果制作小型的linux系统,那么则需要对应的boot分区,以及相应的文件
注:busybox仅支持sh,ash,不支持bash。如果想切换根目录致_install下,需要切换shell,或者把bash命令,以及相关的库文件拷贝到该目录下,即可切换
systemd:
管理启动的软件:可以并行启动一些程序(取出一些程序的依耐性,在Ubantu上也有使用)
systemd启动机制:
基于socket的激活机制:socket与服务程序分离(有些程序是基于套接字文件启动的程序,
比如mysql,这个服务启动的时候会打开相应的3306端口,在本地打开MySQL是按照套接
字文件进行启动,而远程打开则是通过3306端口进行访问)
基于d-bus的激活机制
基于device的激活机制
基于path的激活机制
优点:可以同时启动多个应用服务,启动成功没有任何提示,启动不成功会报错
缺点:不止任何的扩展,但是在6上面可以支持定义的一些启动项
以上是关于系统启动流程以及内核管理的主要内容,如果未能解决你的问题,请参考以下文章