Linux系统启动流程和内核优化(一)
# **CentOS 6** **的启动管理**
~~~sh
bootload 是分散在磁盘的很多位置的一个软件
grub存在正在两个位置:mbr的前446字节存放grub的第一部分,且是二进制。 其他的部分放在/boot/grub 里面
~~~
# ext4 文件系统的驱动
![](D:\云计算\21.系统启动流程和内核管理\06.jpg)
**Linux** **组成**
~~~sh
kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能
rootfs 包括程序和 glibc 库
程序:二进制执行文件
库:函数集合, function, 调用接口(头文件负责描述)
~~~
**内核设计流派**
~~~sh
宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux
把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,
Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点
微内核(micro kernel):Windows,Solaris,HarmonyOS
简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每
种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差
~~~
**CentOS 6** **启动流程**
![](D:\云计算\21.系统启动流程和内核管理\1.jpg)
~~~sh
\1. 加载BIOS的硬件信息,获取第一个启动设备
\2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
\3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
\4. 核心执行init程序,并获取默认的运行信息
\5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
\6. 启动核心的外挂模块
\7. init执行运行的各个批处理文件(scripts)
\8. init执行/etc/rc.d/rc.local
\9. 执行/bin/login程序,等待用户登录
\10. 登录之后开始以Shell控制主机
~~~
**硬件启动****POST**
~~~sh
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内
存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测
主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出
程序,系统信息设置、开机加电自检程序和系统启动自举程序等
主板的RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引
导程序的设备为本次启动设备
~~~
**启动加载器** **bootloader**
~~~sh
CPU未开启虚拟化,要在bios里面设置
#内核的功能:进程管理 文件系统管理 驱动程序 网咯管理 安全功能 内存管理
#bootloade 是硬件和操作系统之间的桥梁
~~~
**grub** **功能和组成**
~~~sh
bootloader: 引导加载器,引导程序。( Linux内核和硬件之间的桥梁 )
windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装
载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
Linux的bootloader
LILO:LInux LOader,早期的bootloader,功能单一
GRUB: GRand Unifified Bootloader, CentOS 6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用
GRUB 2.02
GRUB 启动阶段
primary boot loader :
1st stage:MBR的前446个字节
1.5 stage: mbr 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
secondary boot loader :2nd stage,分区文件/boot/grub/
~~~
~~~sh
前446字节是grub
中间64是分区
后2位校验
~~~
**CentOS 6 grub** **安装**
安装grub:
(1) grub-install 安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到 DIR/boot
目录下
~~~sh
grub-install --root-directory=DIR /dev/DISK
~~~
~~~sh
(2) grub
grub> root (hd#,#)
grub> setup (hd#)
~~~
# 修复grub的第1阶段故障
~~~sh
[root@centos6 grub]#hexdump -C -n 512 /dev/sda
00000000 eb 48 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.H..............|
00000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00 |...|.........!..|
00000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75 |....8.u........u|
00000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 03 02 |.........|...t..|
00000040 80 00 00 80 b0 0c 05 00 00 08 fa 90 90 f6 c2 80 |................|
00000050 75 02 b2 80 ea 59 7c 00 00 31 c0 8e d8 8e d0 bc |u....Y|..1......|
00000060 00 20 fb a0 40 7c 3c ff 74 02 88 c2 52 f6 c2 80 |. ..@|<.t...R...|
00000070 74 54 b4 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 |tT.A..U..ZRrI..U|
00000080 aa 75 43 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 |.uC.A|..u....t7f|
00000090 8b 4c 10 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 |.L...|.D..f..D|.|
000000a0 04 10 00 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 |....D...f.\..D..|
000000b0 70 66 31 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 |pf1..D.f.D..B..r|
000000c0 05 bb 00 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f |...p.}....s.....|
000000d0 84 f0 00 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 |........|.D..f1.|
000000e0 88 f0 40 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 |..@f.D.1........|
000000f0 88 f4 40 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 |..@.D.1......f..|
00000100 66 a1 44 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 |f.D|f1.f.4.T.f1.|
00000110 66 f7 74 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a |f.t..T..D.;D.}<.|
00000120 54 0d c0 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a |T.....L......l.Z|
00000130 8a 74 0b bb 00 70 8e c3 31 db b8 01 02 cd 13 72 |.t...p..1......r|
00000140 2a 8c c3 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 |*....H|`......1.|
00000150 31 ff fc f3 a5 1f 61 ff 26 42 7c be 7f 7d e8 40 |1.....a.&B|..}.@|
00000160 00 eb 0e be 84 7d e8 38 00 eb 06 be 8e 7d e8 30 |.....}.8.....}.0|
00000170 00 be 93 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 |...}.*...GRUB .G|
00000180 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 |eom.Hard Disk.Re|
00000190 61 64 00 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd |ad. Error.......|
000001a0 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 00 00 00 |..<.u...........|
000001b0 00 00 00 00 00 00 00 00 e0 96 01 00 00 00 80 20 |............... |
000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...|
000001d0 29 82 83 fe ff ff 00 08 20 00 00 80 1a 06 00 fe |)....... .......|
000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...|
000001f0 ff ff 05 fe ff ff 00 88 ab 08 00 78 54 10 55 aa |...........xT.U.|
00000200
#破坏grub第1阶段
[root@centos6 grub]#dd if=/dev/zero of=/dev/sda bs=1 count=446
446+0 records in
446+0 records out
446 bytes (446 B) copied, 0.000871905 s, 512 kB/s
[root@centos6 grub]#hexdump -C -n 512 /dev/sda
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 20 |............... |
000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...|
000001d0 29 82 83 fe ff ff 00 08 20 00 00 80 1a 06 00 fe |)....... .......|
000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...|
000001f0 ff ff 05 fe ff ff 00 88 ab 08 00 78 54 10 55 aa |...........xT.U.|
00000200
[root@centos6 grub]#hexdump -C -n 512 /dev/sda -v
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 20 |............... |
000001c0 21 00 83 aa 28 82 00 08 00 00 00 00 20 00 00 aa |!...(....... ...|
000001d0 29 82 83 fe ff ff 00 08 20 00 00 80 1a 06 00 fe |)....... .......|
000001e0 ff ff 83 fe ff ff 00 88 3a 06 00 00 71 02 00 fe |........:...q...|
000001f0 ff ff 05 fe ff ff 00 88 ab 08 00 78 54 10 55 aa |...........xT.U.|
00000200
# 446字节被破坏,无法引导 ,无法进入硬盘,要修复
~~~
![](D:\Time\linux文档\assets\系统启动流程\1.jpg)
![](D:\云计算\21.系统启动流程和内核管理\02.jpg)
![](D:\云计算\21.系统启动流程和内核管理\03.jpg)
此时的根被挂载到了/mnt/sysimage 下了
修复办法:
方法一
~~~sh
插上光盘
切换根 chroot /mnt/sysimage
centos6 安装 grub-install /dev/sda
centos7 安装 grub2-install /dev/sda
sync 同步到磁盘
ctrl alt delete 三建按重启
~~~
# 修复grub的第1.5 阶段故障
![](D:\云计算\21.系统启动流程和内核管理\04.jpg)
~~~sh
[root09:07 PMcentos7 ~]#dd if=/dev/zero of=/dev/sda bs=512 count=25 seek=1
跳过目标的512字节,这里是以512为单位,破坏后续的二十五个扇区
1阶段完好,1.5阶段被破坏
修复方法一样
或者下面的方法grub交互式修改:
#第二种修复的方法:
[root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded. #1.5阶段的27个扇区
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
~~~
![](D:\云计算\21.系统启动流程和内核管理\05.jpg)
* 分区表是数据,无法修复 ,数据和程序是不一样的,大不了重装,数据是无法的
* 第二阶段才识别/boot文件系统,文件系统是属于内核的管理的范畴了。第一阶段MBR的446字节不是文件,是grub的一部分
* 第一阶段和第1.5阶段报错的情况不一样同上的万能修复修复方法:第1阶段和第1.5阶段的修复方法一样,就是报错菜单不一样,因为第一阶段是还没有进入系统,第1.5阶段是进入了系统,认为上了贼船,进入硬盘了却无法后面的操作。
* 第1.5阶段就是为了加载第二阶段文件所在的分区的文件系统,因为只有内核才能识别文件系统,让他能识别二阶段的文件系统
### 系统各个阶段的错误信息:
第1阶段:DHCP
第1.5阶段: — 不停的闪烁
第2阶段:出现菜单无法加载内核
![](D:\云计算\21.系统启动流程和内核管理\07.jpg)
![](D:\云计算\21.系统启动流程和内核管理\08.jpg)
![](D:\云计算\21.系统启动流程和内核管理\09.jpg)
### grub legacy 管理
~~~sh
配置文件:/boot/grub/grub.conf <-- /etc/grub.conf
stage2及内核等通常放置于一个基本磁盘分区
grub legacy 功用:
(1) 提供启动菜单、并提供交互式接口
a:内核参数
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3) 为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
~~~
### grub.conf 文件
~~~sh
[root@localhost grub]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda (水蟒)
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #默认是菜单里面的第一条
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz #背景图片
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0) #0分区0扇区
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img #此文件很重要,因为grub菜单的作用要找到内核,让内核加载根,挂载根要识别文件系统的。此文件就是初始化虚拟文件系统
title CentOS 6 (2.6.32-754.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-754.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-754.el6.x86_64.img #grub菜单菜单认为/boot是根,因为内核还没有加载
[root@centos6 ~]# rpm -qf /boot/grub/
grub-0.97-99.el6.x86_64
[root@centos6 ~]# rpm -qf /boot/grub/grub.conf #该文件不属于任何包
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
示例:
(hd0,0) 第一块硬盘,第一个分区
root=/dev/mapper/VolGroup-lv_root grub程序认为 /dev/mapper/VolGroup-lv_root他才是根,grub的启动优先于内核,grub加载内核
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动的内核文件;额外还可添加许多内核支持使用的
cmdline参数
例如:max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
boot: 引导启动选定的内核
~~~
### initramfs-2.6.32-754.el6.x86_64.img 文件
~~~sh
[root@centos6 boot]# file initramfs-2.6.32-754.el6.x86_64.img
initramfs-2.6.32-754.el6.x86_64.img: gzip compressed data, from Unix, last modified: Sat May 8 22:31:42 2021, max compression
#改名
[root@centos6 data]# mv initramfs-2.6.32-754.el6.x86_64.img initramfs-2.6.32-754.el6.x86_64.img.gz
#解压
[root@centos6 data]# gunzip initramfs-2.6.32-754.el6.x86_64.img.gz
#预览
[root@centos6 data]# cpio -tv BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) -->
init(systemd)
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
~~~
### centos6 运行级别
~~~sh
[root03:42 PMcentos6 ~]#cat /etc/inittab |tail -1
id:3:initdefault: #如果设置0就不开机 设置6就不断重启
[root03:36 PMcentos6 ~]#rpm -qf /sbin/init
upstart-0.6.5-17.el6.x86_64
0:关机
1:单用户模式(root自动登录), single, 维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
id:runlevel:action:process
id:是惟一标识该项的字符序列
runlevels: 定义了操作所使用的运行级别
action: 指定了要执行的特定操作
wait: 切换至此级别运行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式
process:定义了要执行的进程
~~~
**遇到运行模式6,不断重启的事情就像修改单用户模式破密码那样,改为3**
![](D:\云计算\21.系统启动流程和内核管理\22.jpg)
### ![](D:\云计算\21.系统启动流程和内核管理\23.jpg)
![](D:\云计算\21.系统启动流程和内核管理\24.jpg)
![](D:\云计算\21.系统启动流程和内核管理\25.jpg)
![](D:\云计算\21.系统启动流程和内核管理\25.jpg)
说明:rc N --> 意味着读取/etc/rc.d/rcN.d/
K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
![](D:\云计算\21.系统启动流程和内核管理\26.jpg)
![](D:\云计算\21.系统启动流程和内核管理\31.png)
* 都是互为软连接和硬链接
![](D:\云计算\21.系统启动流程和内核管理\27.jpg)
### 切换级别:
~~~sh
init #
~~~
### 查看级别:
~~~sh
runlevel
who -r
~~~
### 定义运行级别
~~~sh
/etc/inittab
~~~
### **初始化脚本** **sysinit**
~~~sh
/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)清理操作
~~~
### /etc/rc.d/rc3.d/
~~~sh
K 关闭
S 启动
说明:rc N --> 意味着读取/etc/rc.d/rcN.d/
K: K##:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S: S##:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
[root@localhost init]# ll /etc/rc3.d/
总用量 0
lrwxrwxrwx. 1 root root 19 5月 19 05:35 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 5月 19 05:36 K61nfs-rdma -> ../init.d/nfs-rdma
lrwxrwxrwx. 1 root root 21 5月 19 05:35 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 20 5月 19 05:35 K89netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 5月 19 05:35 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 22 5月 19 05:36 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 14 5月 19 05:36 S05rdma -> ../init.d/rdma
lrwxrwxrwx. 1 root root 19 5月 19 05:36 S08ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 5月 19 05:35 S08iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 17 5月 19 05:35 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 16 5月 19 05:36 S11auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 17 5月 19 05:35 S12rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 19 5月 19 05:35 S15mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 20 5月 19 05:35 S22messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 26 5月 19 05:35 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 5月 19 05:35 S25netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 5月 19 05:35 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 5月 19 05:36 S50kdump -> ../init.d/kdump
lrwxrwxrwx. 1 root root 14 5月 19 05:36 S55sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 5月 19 05:35 S80postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 15 5月 19 05:35 S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 11 5月 19 05:35 S99local -> ../rc.local
~~~
~~~sh
/etc/init.d/
/etc/init/
=========================================================================
/etc/rc.d/rc 控制服务脚本的开机自动运行
for srv in /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
$srv start
done
==========================================================================
/etc/init/rc.conf
[root@centos6 ~]#cat /etc/init/rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts. It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.
start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
task
export RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL
/etc/rc.d/rcN.d/
=========================================================================
ls /etc/rc0.d 全部是关机模式
[root@localhost init]# ls /etc/rc0.d
K10saslauthd K50kdump K75blk-availability K85mdmonitor K88auditd K89rdisc K92iptables S00killall
K25sshd K60crond K75netfs K85messagebus K88rsyslog K90network K95rdma S01halt
K30postfix K61nfs-rdma K75udev-post K87restorecond K89netconsole K92ip6tables K99lvm2-monitor
~~~
ntsysv命令
chkconfifig 命令管理服务
~~~sh
#查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
#添加服务
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
#!/bin/bash
chkconfig: LLLL nn nn #LLLL 表示初始在哪个级别下启动,-表示都不启动
description : 描述信息
chkconfig --add name
#删除服务
chkconfig --del name
#修改指定的运行级别
chkconfig [--level levels] name <on|off|reset>
说明:--level LLLL: 指定要设置的级别;省略时表示2345
~~~
# centos6 设置开机启动与否
![](D:\云计算\21.系统启动流程和内核管理\28.jpg)
![](D:\云计算\21.系统启动流程和内核管理\29.jpg)
### 写一个开机启动的脚本
~~~sh
[root@localhost init]# cat /etc/init.d/testsrv
#!/bin/bash
#chkconfig: - 96 3
#description: test serivce script
. /etc/init.d/functions
start(){
touch /var/lock/subsys/testsrv
action "Starting testsrv"
sleep 3
}
stop() {
rm -f /var/lock/subsys/testsrv
action "Shutting down testsrv"
}
restart(){
stop
start
}
status(){
if [ -e /var/lock/subsys/testsrv ] ;then
echo "testsrv is running..."
else
echo "testsrv is stopped"
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage: /etc/init.d/testsrv {start|stop|restart|status}"
;;
esac
[root@centos6 ~]#chmod +x /etc/init.d/testsrv
[root@centos6 ~]#chkconfig --add testsrv
[root@centos6 ~]#chkconfig --list testsrv
testsrv 0:off 1:off 2:off 3:off 4:off 5:off 6:off
chkconfig testsrv on
[root@centos6 ~]#chkconfig --del testsrv
~~~
**这步骤以后就自动开启软链接**
chkconfig --add testsrv
![](D:\云计算\21.系统启动流程和内核管理\35.jpg)
# 故障:一个服务起不来
![](D:\云计算\21.系统启动流程和内核管理\33.jpg)
![](D:\云计算\21.系统启动流程和内核管理\34.jpg)
模拟服务起不来的情况:
这一个服务起不来导致后面的也起不来了
![](D:\云计算\21.系统启动流程和内核管理\36.jpg)
![](D:\云计算\21.系统启动流程和内核管理\37.jpg)
# 开机就自动启动服务 的2种方法
### chkconfig testsrv on 开机就启动
### /etc/rc.d/rc.local 开机启动
* 缺点:无法用service 控制
* ***service 命令控制的是 /etc/init.d/目录里面的脚本***
~~~sh
文件写好了直接放里面就好,开机自动运行
[root@localhost init.d]# ll /etc/rc.d/rc.local #该文件在centos7上默认无执行权限
-rwxr-xr-x. 1 root root 220 6月 20 2018 /etc/rc.d/rc.local
[root@localhost ~]# cat /etc/rc.d/rc.local
touch /var/lock/subsys/local
/etc/init.d/testsrv start
~~~
![](D:\云计算\21.系统启动流程和内核管理\38.jpg)
### 独立服务和非独立服务
**[root@init.d]#yum install telnet-server -y**
服务分为独立服务和非独立服务
瞬态(Transient)服务被超级守护进程 xinetd 进程所管理,也称为非独立服务
进入的请求首先被xinetd代理
配置文件:
~~~sh
/etc/xinetd.conf
/etc/xinetd.d/
~~~
用chkconfifig控制非独立服务开机启动
示例:chkconfifig tftp on
注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向
了/etc/rc.d/rc.local脚本
不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置
于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定运行级别脚本后运行
**CentOS** **启动过程总结**
/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本/etc/rc.d/rc.sysinit、完成系统
初始化 --> (关闭对应下需要关闭的服务)启动需要启动服务/etc/rc#.d/Sxxxx,/etc/rc.d/rc.local--> 设置登
录终端
参看:http://www.icode9.com/i/li/?n=4&i=wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
![](D:\云计算\21.系统启动流程和内核管理\39.jpg)
![](D:\云计算\21.系统启动流程和内核管理\40.jpg)
![](D:\云计算\21.系统启动流程和内核管理\41.jpg)
### 自制linux依赖于现有的LINUX
**分区并创建文件系统**
~~~sh
#分两个必要的分区,/dev/sdb1对应/boot /dev/sdb2对应根 /
[root@centos6 ~]#echo -e 'n\np\n1\n\n+1G\nw\n' | fdisk /dev/sdb
[root@centos6 ~]#echo -e 'n\np\n2\n\n\n\nw\n' | fdisk /dev/sdb
[root@centos6 ~]#mkfs.ext4 /dev/sdb1
[root@centos6 ~]#mkfs.ext4 /dev/sdb2
~~~
**挂载****boot**
~~~sh
#子目录必须为boot
[root@centos6 ~]#mkdir /mnt/boot
[root@centos6 ~]#mount /dev/sdb1 /mnt/boot
~~~
**安装****grub**
~~~sh
[root@centos6 ~]#grub-install --root-directory=/mnt/ /dev/sdb
~~~
**准备内核和****initramfs****文件**
~~~sh
[root@centos6 ~]#cp /boot/vmlinuz-2.6.32-754.el6.x86_64 /mnt/boot/vmlinuz
[root@centos6 ~]#cp /boot/initramfs-2.6.32-754.el6.x86_64.img
/mnt/boot/initramfs.img
~~~
**建立****grub.conf**
~~~sh
[root@centos6 ~]#cat /mnt/boot/grub/grub.conf
default=0
timeout=6
title wang linux
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 selinux=0 init=/bin/bash 【bash作为第一个进程】
initrd /initramfs.img
[root@centos6 ~]#tree /mnt/boot
/mnt/boot
├── grub
│ ├── device.map
│ ├── e2fs_stage1_5
│ ├── fat_stage1_5
│ ├── ffs_stage1_5
│ ├── grub.conf
│ ├── iso9660_stage1_5
│ ├── jfs_stage1_5
│ ├── minix_stage1_5
│ ├── reiserfs_stage1_5
│ ├── stage1
│ ├── stage2
│ ├── ufs2_stage1_5
│ ├── vstafs_stage1_5
│ └── xfs_stage1_5
├── initramfs.img
├── lost+found
└── vmlinuz
2 directories, 16 files
[root@centos6 ~]#
~~~
**准备根下面相关程序和库**
~~~sh
[root@centos6 ~]#mkdir /mnt/sysroot
[root@centos6 ~]#mount /dev/sdb2 /mnt/sysroot
[root@centos6 ~]#mkdir –pv
/mnt/sysroot/{boot,dev,sys,proc,etc,lib,lib64,bin,sbin,tmp,var,usr,opt,home,root
,mnt,media}
#复制bash等命令和相关库文件,如:
bash,ifconfig,insmod,ping,mount,ls,cat,df,lsblk,blkid,tree,fdisk
[root@centos6 ~]#mkdir /mnt/sysroot/{dev,proc,etc,sys,lib,home,root}
#准备网卡驱动
[root@centos6 ~]#ethtool -i eth0
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version:
bus-info: 0000:02:01.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
[root@centos6 ~]#modinfo -n e1000
/lib/modules/2.6.32-754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
[root@centos6 ~]#cp /lib/modules/2.6.32-
754.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib/
[root@centos6 ~]#chroot /mnt/sysroot
~~~