一、CentOS 6的启动管理

1.1 linux组成:

kernel:内核实现进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能等功能。

rootfs:文件系统。包含了程序和glibc库

程序:二进制执行文件

库:函数集合,function,调用接口(头文件负责描述)

1.2 内核设计流派

宏内核:

又称单内核和强内核,Unix,Linux。把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能。系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点。

微内核:

Windows, Solaris, HarmonyOS。简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。


1.3 CentOS 6 启动流程

1.3.1 CentOS6 启动流程

linux系统的启动和内核管理_文件系统


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控制主机
1.3.2 硬件启动POST

不止centos6 ,其实其他系统也都有POST流程

POST:Power-On-Self-Test 加电自检,是由主板里的BIOS程序完成的,每一台计算机主板都有BIOS程序,这个程序带有自检功能,只要接通电源,打开电源加电,就会激活主板上的BIOS程序,自检程序负责完成对CPU, 主板,内存,硬盘子系统,显示子系统,单并行串口,键盘等硬件情况的检测。看看硬件是否满足启动的要求,如果有问题就告警,比如发出didididi的声音。

主板的ROM中,存储了BIOS程序,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置,开机加电自检程序和系统启动自举程序等。以前叫BIOS,现在叫UEFI

如果启动POST程序之后,发现你的硬件都符合要求,他就开始寻找启动的一个程序,这个程序就叫做,启动加载器bootloader


1.3.3 启动加载器bootloader

他是引导操作系统之前的一段程序。

在一台电脑上,我们可能安装linux,可能安装windows,也可能安装多系统。

选择启动的时候,可以选择。

这个bootloader 在我们安装操作系统的时候,系统会自动安装。

我们安装windows,他会自动安装一个启动windows的 Windows: ntloader,windows的bootloader只能启动OS, 功能有限。

linux系统在安装的时候,也会安装一个bootloader,它的功能丰富,比较强大。提供菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装载到内存中的特定空间中,解压,展开,并把系统控制权移交给内核。

Linux的bootloader:

早期的时候,有一个程序叫做

LILO: linux Loader, 早期的bootloader,功能单一。

GRUB:GRand Unified Bootloader, CentOS5.6 GRUB0.97;GRUB Legacy. CentOS7以后,使用GRUB2.02

GRUB启动流程:

在启动操作系统前,先要加载grub。

post加电自检,grub是从哪里找到呢?

grub安装位置是有一个固定位置的,如果没有固定位置。这时候,加电自检完毕之后,是无法找到grub位置的。计算机会在固定位置,找到grub,然后加载进内存,运行。grub可以定义,操作系统放在哪个地方。通过grub找到操作系统位置。

GRUB启动阶段:分为两个阶段。

primary boot loader: 

1st stage: MBR的前446 个字节。 固定位置。在第一个扇区中的。

1.5 stage: MBR之后的扇区,让stage中的bootloader能识别stage2所在的分区上的文件系统。


secondary boot loader:2nd stage, 分区文件 /boot/grub/

第二个阶段是在文件系统中的。

eg:我们看一下,a硬盘的前512字节。

[root@VM-16-11-centos ~]# hexdump -C -n 512 /dev/sda
00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............|
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 01 8b |.........|...t..|
00000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00 |L.....|.........|
00000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00 |................|
00000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70 |...........t...p|
00000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc |t....y|..1......|
00000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 05 7c |. ..d|<.t...R..||
00000090 b4 41 bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 |.A..U..ZRr=..U.u|
000000a0 37 83 e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 |7...t21..D.@.D..|
000000b0 44 02 c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 |D.....f..\|f.\.f|
000000c0 8b 1e 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd |..`|f.\..D..p.B.|
000000d0 13 72 05 bb 00 70 eb 76 b4 08 cd 13 73 0d 5a 84 |.r...p.v....s.Z.|
000000e0 d2 0f 83 de 00 be 85 7d e9 82 00 66 0f b6 c6 88 |.......}...f....|
000000f0 64 ff 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 |d.@f.D..........|
00000100 f4 40 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 |.@.D.......f..f.|
00000110 60 7c 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 |`|f..uNf.\|f1.f.|
00000120 34 88 d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 |4..1.f.t.;D.}7..|
00000130 88 c5 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 |..0........Z....|
00000140 70 8e c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e |p..1......r...`.|
00000150 b9 00 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f |.....1..........|
00000160 61 ff 26 5a 7c be 80 7d eb 03 be 8f 7d e8 34 00 |a.&Z|..}....}.4.|
00000170 be 94 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 |..}.......GRUB .|
00000180 47 65 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 |Geom.Hard Disk.R|
00000190 65 61 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 |ead. Error......|
000001a0 b4 0e cd 10 ac 3c 00 75 f4 c3 00 00 00 00 00 00 |.....<.u........|
000001b0 00 00 00 00 00 00 00 00 07 06 ee 89 00 00 80 00 |................|
000001c0 21 02 83 09 a8 28 00 08 00 00 df f7 ff 09 00 00 |!....(..........|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.|
00000200
[root@VM-16-11-centos ~]#

前446个grub的程序 第一阶段,就放在这里。这个是固定位置。从而引导操作系统。

第二个阶段是放在 /boot/grub  目录下。 第二个阶段定义了操作系统所在的路径。

linux系统的启动和内核管理_centos_02

其中 grub.conf 配置文件相当重要。

linux系统的启动和内核管理_centos_03

到这里产生了一个新的问题。1阶段是固定位置,1阶段进入到2阶段,会遇到一个问题。/boot/grub 文件夹,不是一个可以执行二进制文件。他是一个文件系统,需要先加载文件系统驱动后,才能进入文件系统。

从1阶段进入2阶段下。/boot 是一个 ext4 的分区

linux系统的启动和内核管理_文件系统_04

什么时候,加载ext4 的驱动。

1阶段不能放下 ext4 的驱动。从1阶段进2阶段,出现问题。

那么,存在一个所谓的1.5阶段。 446字节放不下,没关系,mbr后续的扇区可以存放 ext4驱动的数据的。

1.5 stage:MBR之后的扇区,让stage中的bootloader 能识别stage2 所在的分区上的文件系统。

grub 所谓的bootloader 就是让硬件能找到操作系统的桥梁。

操作系统的位置是很灵活的,我可以装在c盘,也可以装在d盘。

通过grub定位 操作系统的位置。

grub如果破坏了,操作系统也就起不来了。

1阶段 1.5阶段,直接以二进制存储。

2阶段是文件。需要文件系统。


grub如果被损坏了,可以修复:

grub-install 安装grub stage1 和 stage1.5 到 /dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下。

grub-install  --root-directory=DIR  /dev/DISK

grub-install 只能修复 1阶段 1.5阶段

不能修复2阶段的 grub.conf, 他是一个文件。

linux系统的启动和内核管理_文件系统_05


default=0:默认用哪个内核来引导,目前只有一个内核。事实上我们可以有多个内核。

linux系统的启动和内核管理_centos_06

上面这一段其实就是一个内核的启动菜单。

如果把这一段,复制一份。就有两个内核的。排在第一个的就是0

linux系统的启动和内核管理_centos_07

这两个菜单,0代表,默认第一个。

目前这两个选择使用的是同一个内核文件,你也可以改一下。

timeout=5 

5秒钟不做选择,他就会选择默认的default=0 内核来引导操作系统。

splashimage=(hd0,0)/grub/splash.xpm.gz  是背景图片。

默认是一个压缩文件,他就是一个黑色的背景,你可以自己替换为一个想要的文件。

linux系统的启动和内核管理_加载_08

hiddenmenu 默认下面两个菜单是看不到的。如果把hiddenmenu删掉,就能看到了。否则 需要按esc键。

root(hd0,0)

root指的是boot所在的位置。他把boot当成root根  hd代表硬盘   hd0,0 就是第一个硬盘 0分区。

linux系统的启动和内核管理_文件系统_09

linux系统的启动和内核管理_加载_10

/boot == /

kernel  /vmlinux-2.6.....x86_64 找到内核

再利用内核,加载文件系统的跟系统。

root=UUID=e76f2257.....

linux系统的启动和内核管理_加载_11

这个UUID 就是 / 的标识。

linux系统的启动和内核管理_加载_12

linux系统的启动和内核管理_centos_13

后续的是内核参数

linux系统的启动和内核管理_文件系统_14

initrd /initramfs .... 这个文件也很关键。

reboot 重启机器

重启机器,倒计时5s 按任意键盘

linux系统的启动和内核管理_文件系统_15

就可以看到菜单了。

选择启动就可以了。

如果你不做选择,就会选择默认 0 

1.3.4 破坏grub并修复

把grub 前446个字节 清零

linux系统的启动和内核管理_加载_16

查看是否清零:

linux系统的启动和内核管理_centos_17

这时候,系统就起不来了。

怎么修复:

救援模式。拿光盘引导。

挂上光盘。

手疾眼快的。

linux系统的启动和内核管理_centos_18


linux系统的启动和内核管理_centos_19

linux系统的启动和内核管理_加载_20

linux系统的启动和内核管理_centos_21

linux系统的启动和内核管理_centos_22

linux系统的启动和内核管理_加载_23

linux系统的启动和内核管理_centos_24

linux系统的启动和内核管理_文件系统_25

linux系统的启动和内核管理_文件系统_26

linux系统的启动和内核管理_加载_27


当前的根,并不是我们硬盘真正的根。


真正的根是/mnt/sysimage 才是根。

linux系统的启动和内核管理_centos_28

linux系统的启动和内核管理_加载_29

我们可以把根切过来

linux系统的启动和内核管理_centos_30

linux系统的启动和内核管理_加载_31

用grub-install  进行修复破坏的grub

确认下,是否已经修好了

linux系统的启动和内核管理_加载_32

sync 写一下磁盘,立即写磁盘。不要放在缓冲区里。

然后重启一下 

reboot。

就此,修复好了。

接下来破坏 2阶段:

linux系统的启动和内核管理_加载_33

reboot 给他修好。

拿救援光盘启动。

linux系统的启动和内核管理_文件系统_34

linux系统的启动和内核管理_centos_35

grub.conf 和图片丢了。

linux系统的启动和内核管理_加载_36

linux系统的启动和内核管理_centos_37


linux系统的启动和内核管理_加载_38

重启一下。

已经可以起来了。

grub其实是一个交互式的。

你是可以交互的。

linux系统的启动和内核管理_文件系统_39

e是编辑

a添加内核参数

c是命令行

输入e

linux系统的启动和内核管理_文件系统_40

修改。

quite rhgb 会把内核的 启动信息隐藏起来。

linux系统的启动和内核管理_加载_41

启动风格就调整了。

由此,即便我们 把conf文件破坏了,我们也可以在交互式 grub下,把系统启动起来。

linux系统的启动和内核管理_加载_42

reboot

linux系统的启动和内核管理_centos_43


linux系统的启动和内核管理_文件系统_44

linux系统的启动和内核管理_文件系统_45


linux系统的启动和内核管理_centos_46

linux系统的启动和内核管理_文件系统_47

boot 启动

也能起来。

完事你抓紧把 grub.conf 文件修复一下。

linux系统的启动和内核管理_文件系统_48


linux系统的启动和内核管理_文件系统_49

grub的功能还是很丰富的。

grub还有一个功能,设置密码。

1.3.5 grub设置密码

centos6 破解口令。ctrl + alt +insert键可以把机器重启。

破解口令必须重启系统坐在机器旁边操作。

linux系统的启动和内核管理_文件系统_50

输入a键

linux系统的启动和内核管理_加载_51

要想破解,我们要输入1

1代表着,单用户

也可以写 s  S single

linux系统的启动和内核管理_加载_52

linux系统的启动和内核管理_centos_53


我们输入1,回车就可以进入单用户了。

单用户下。

passwd

重新设置一次密码。就相当于破解了。

一分钟破解口令。

破解口令我们必须在机器旁边,进行操作。你必须去机房,操作。一般人进不了机房。

万一有一个主机真是放在一个公共场合。

营业厅,放在公共场合。

对grub加密码。

linux系统的启动和内核管理_文件系统_54

建议用encrypt 加密sha512

linux系统的启动和内核管理_加载_55

编辑grub.conf文件

linux系统的启动和内核管理_加载_56

想破解密码需要知道grub指令。

linux系统的启动和内核管理_文件系统_57

密码不正确是进不去的。

我们利用光盘引导,也可以破解。

只要物理上能接触机器。就没有安全性,可言。

一般服务器,你也摸不到。

grub启动之后。就开始加载内核。


1.3.6 kernel加载

我们加载内核需要进入操作系统的根,那么就要识别ext4的驱动,


root=UUID=dfhsjfhsj

也是一个独立的硬盘,也有他自己的文件系统。

linux系统的启动和内核管理_centos_58


ext4的驱动在哪里放着呢?驱动的功能是内核提供的。

linux系统的启动和内核管理_加载_59

死循环,我要加载根分区,就要加载ext4的驱动,我的ext4驱动又放在根分区内。无解。蛋生鸡,鸡生蛋。

怎么解决?

1.3.7 init 初始化

靠 initrd   /init...linux系统的启动和内核管理_文件系统_60

linux系统的启动和内核管理_centos_61

linux系统的启动和内核管理_文件系统_62

linux系统的启动和内核管理_centos_63

linux系统的启动和内核管理_文件系统_64

linux系统的启动和内核管理_文件系统_65

这里边的内容就像一个小型的linux系统。根文件系统。

linux系统的启动和内核管理_加载_66

这个文件必须要存在的。靠他来加载根文件系统。

如果这个文件被破坏了,我们也是可以修复的。

linux系统的启动和内核管理_centos_67

linux系统的启动和内核管理_加载_68

内核加载之后。

我们就可以进入整个硬盘的根了。

linux系统的启动和内核管理_centos_69

他进入到根以后,第一件事,就是加载系统中的第一个进程。init进程

linux系统的启动和内核管理_文件系统_70

这个进程起来之后,会加载一个初始化文件。

1.3.7.1 运行级别

linux系统的启动和内核管理_文件系统_71

这个文件,记录了计算机启动之后,运行的模式。

linux系统的启动和内核管理_文件系统_72

id:3:initdefault 这一行决定了,计算机启动之后的运行模式。

总共有7中模式。

模式可以修改、只需要修改上面的文件就可以了。0,6不要这么设置。一个是关机,一个是重启。

linux你想怎么折腾都行。你可以多深入都行,源代码都是开源的。

如果不小心设置了 0,6运行模式。

我们可以临时进入3模式。

1.3.7.2 初始化脚本sysinit

除了运行模式。

他还进行了一个初始化,按照初始化脚本执行。

系统初始化,将执行以下文件,  cat /etc/init/rcS.conf

linux系统的启动和内核管理_文件系统_73

linux系统的启动和内核管理_加载_74

这个脚本有691行linux系统的启动和内核管理_加载_75


linux系统的启动和内核管理_centos_76

1.3.7.3 服务管理

这个脚本初始化完成之后,就要根据你刚才定义的默认运行模式。找到对应的脚本。

linux系统的启动和内核管理_加载_77

linux系统的启动和内核管理_centos_78

linux系统的启动和内核管理_加载_79

0-6 

linux系统的启动和内核管理_centos_80


linux系统的启动和内核管理_文件系统_81

如果我们定义的开机模式是3模式。

就会运行rc3.d

linux系统的启动和内核管理_文件系统_82


linux系统的启动和内核管理_文件系统_83

S  K 开头。

linux系统的启动和内核管理_加载_84

S开头的系统会自动执行,启动服务。

K开头的系统会自动执行,停止服务

linux系统的启动和内核管理_文件系统_85

具体脚本可以看,以上文件内容。

我们的计算机,启动关闭和K  S 有关。

计划任务的状态是开机启动

linux系统的启动和内核管理_文件系统_86

http开机不启动

真正的执行脚本位置。

linux系统的启动和内核管理_加载_87


linux系统的启动和内核管理_文件系统_88

等价关系。

如果我希望,开机启动关闭。

怎么修改开机启动呢?

linux系统的启动和内核管理_centos_89

linux系统的启动和内核管理_文件系统_90

linux系统的启动和内核管理_加载_91

linux系统的启动和内核管理_centos_92

真的脚本  /etc/init.d/atd

linux系统的启动和内核管理_加载_93

95  5 

95 表示S开头

5表示K开头。

这个 95和5 是脚本执行启动服务的次序,因为,服务之间可能是有依赖关系的。

启动和停止都有依赖关系。

1先执行

优先级。很巧妙。

比如:S10network  S55sshd

先有网络,才有ssh

service atd start

start作为一个参数传到脚本里。执行相应的指令。

linux系统的启动和内核管理_文件系统_94


你自己也可以写一个服务脚本。

你自己写的服务通常往后写。

linux系统的启动和内核管理_加载_95

生产中,你可能自己写一个生产脚本。

linux系统的启动和内核管理_centos_96


当前服务还不在服务列表里,把当前服务加到服务列表里。

linux系统的启动和内核管理_加载_97

加进去之后,他会自动的把0-6的七个运行模式的软连接的文件夹生成。

linux系统的启动和内核管理_文件系统_98

你会发现所有的都是K开头的。

因为我们刚才 脚本里是 -

linux系统的启动和内核管理_centos_99

-代表所有的运行模式。任何模式下都是关闭的。

如果你写35  96 3

就代表3和5模式下是 开启的,也就是S开头

linux系统的启动和内核管理_centos_100

这样,服务已经可以开机启动了。

linux系统的启动和内核管理_centos_101

linux系统的启动和内核管理_centos_102

可以看到 testsrv已经开机启动了。

如果我们的服务卡着不动了,我们系统起不来了。怎么办?

万一生产中,我们的一个服务出现了问题,导致我们的服务起不来。怎么处理?

方法是,重新启动,进入gurb 敲a键,用1 ,单用户模式

linux系统的启动和内核管理_centos_103

因为1模式,off的,所以testsrc不会卡主系统启动。

我们在1模式下,把testsrc的3模式 设置off就可以了

这样就临时解决了问题。

如果我们不想要开机自启动了,就可以从服务列表里删除。

删除默认会自动把软连接也删除。

linux系统的启动和内核管理_centos_104

实际上,testsrv是没有删除的,你还是可以用的。

linux系统的启动和内核管理_加载_105

linux系统的启动和内核管理_文件系统_106

以后你可以把你自己编译的服务

设置成开机自启动。

1.3.7.4 开机启动文件 rc.local

如果我们只是想,开机自动运行一个程序。

我们可以利用rc.local 脚本,我们发现 2345都有local

99 排名最后。

linux系统的启动和内核管理_文件系统_107

linux系统的启动和内核管理_文件系统_108

他不属于正常的服务脚本。

rc.local是什么格式呢?

linux系统的启动和内核管理_centos_109

我们加了一个 开机启动,不需要你登录,就会创建一个/data/rc.local 文件。

你可以把开机运行的程序,放到这个脚本里就行。

如果以后,你不想写开机启动服务脚本,你只想开机运行某个程序

你就可以,把启动的命令写到此脚本里。


centos6上 rc.local是直接可以运行的。

centos7 centos8上,rc.local也被支持,但是默认没有执行权限。

linux系统的启动和内核管理_文件系统_110

此文件是为了兼容模式留下来的。ubuntu1804也是这么干的。

需要你自己设置可执行权限

chmod +x /etc/rc.d/rc.local
1.3.7.5 非独立服务

我们在系统中,我们有一些服务,我们用的很少,但是不启动吧,有需要用。

不启动吧,偶尔还用一用,启动吧,会浪费资源。

xintd 总代理,这个服务,会激活你访问的服务,如果你不访问就停止。

非独立服务是依赖于xintd服务的。

yum -y install telnet-server

这个服务早期的时候,远程登录服务。

目前安全性很差,被取代了。

现在大多使用ssh

linux系统的启动和内核管理_centos_111


在安装telnet-server服务的时候,也会安装xinetd服务。因为telnet-server是依赖xinetd服务的。

linux系统的启动和内核管理_centos_112

多了很多服务。

非独立服务。

如何激活非独立服务?

linux系统的启动和内核管理_centos_113

on之后就托管给 xinetd服务了。

linux系统的启动和内核管理_文件系统_114

23端口是不是已经打开了.

telnet 端口是23

现在23端口的监听是xinetd帮忙代理的。

linux系统的启动和内核管理_centos_115

xinetd服务替telnet的 端口

telnet并没有启动起来。

当我们去访问了telnetlinux系统的启动和内核管理_centos_116

他才会被激活启动起来。

linux系统的启动和内核管理_centos_117

 telnet 不安全。账号密码都是明文的。已经淘汰了。


1.3.8 CentOS 启动过程总结

linux系统的启动和内核管理_centos_118


1.4 启动过程的故障排错

故障:rm -rf /boot/* 和 /etc/fstab 进行恢复

linux系统的启动和内核管理_文件系统_119

系统重启起不来了,怎么修复?

救援模式

linux系统的启动和内核管理_加载_120   

linux系统的启动和内核管理_centos_121

我们要先修复fstab文件,修复完了,再修复boot

linux系统的启动和内核管理_文件系统_122

linux系统的启动和内核管理_加载_123

linux系统的启动和内核管理_centos_124

linux系统的启动和内核管理_加载_125

上一步和之前不一样了,他找不到分区了,以前是找到/mnt/...作为根

linux系统的启动和内核管理_加载_126

linux系统的启动和内核管理_centos_127

硬盘真正的根是没有挂载的。

跟在哪我都不知道。

怎么找根?

linux系统的启动和内核管理_centos_128

sda1 2 3 可能是根

linux系统的启动和内核管理_centos_129

临时建个文件夹,挂载一下。

linux系统的启动和内核管理_centos_130

 我们可以看到 ,sda2 是真正的根。

我们找到之后 取消挂载。

linux系统的启动和内核管理_文件系统_131

linux系统的启动和内核管理_centos_132

我们修复了fstab文件。

再重新启动,重新进救援模式。

linux系统的启动和内核管理_文件系统_133

linux系统的启动和内核管理_加载_134

由于我们把boot目录整个干掉了。

我们接着修复。

  1. 挂载光盘,把内核包装一下。linux系统的启动和内核管理_文件系统_135
  2. 修复 grub

linux系统的启动和内核管理_centos_136

linux系统的启动和内核管理_加载_137

  1. 接下来写一个grub.conf文件。

linux系统的启动和内核管理_加载_138

linux系统的启动和内核管理_centos_139


ctrl alt insert 键盘,重启。

就能起来了。


二、/proc目录和内核参数管理

/proc目录:内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出帮助 man proc

linux系统的启动和内核管理_centos_140

我们曾经在这里配置过路由。

linux系统的启动和内核管理_加载_141

这个文件夹大小为0

因为他根本不是硬盘上的文件,他里边的东西都是来自内存。

内核参数:只读:只用于输出信息。可写:可接受用户指定“新值”来实现对内核某功能或特性的配置

/proc/sys 设置

sysctl是一个允许改变正在运行中的Linux系统的接口,修改的是针对整个系统的内核参数。sysctl的修改
是立即且临时的(重启后失效)。也可以通过修改sysctl.conf配置文件,达到永久生效。

linux系统的启动和内核管理_centos_142

linux系统的启动和内核管理_centos_143

改为1,开启

linux系统的启动和内核管理_文件系统_144

sysctl -a 是列出目前所有正在生效的设置。

linux系统的启动和内核管理_文件系统_145

net.ipv4.icmp_echo_ignore_all 禁用别人ping通我。

写到配置文件里 设置为1 就不能ping通了。

如果你把 net.ipv4.icmp_echo_ignore_all=1 删除的话。

是不能立即起效果的。因为

sysctl -p 是读取配置文件。覆盖内存中的设置,使其生效。

你删除了,是没办法覆盖内存的。

你可以直接该内存

linux系统的启动和内核管理_centos_146

systemctl -w 是临时修改。

默认打开的文件个数大小。太小了,你要重新设置下。

linux系统的启动和内核管理_文件系统_147

我的物理内存剩下还有30%的时候,就可以使用swap了,这个值,有点大。你可以把这个值适当变小。

linux系统的启动和内核管理_centos_148

你可以干脆禁用 swap

这些内核参数,有时候,我们是要做优化的。

这里有一个生产案例:

linux系统的启动和内核管理_centos_149

todo: 把文件中的内容贴过来。。。。

尤其要知道proc ,sysctl.conf,  内存设置怎么设置,怎么保存。 

将来内核设置怎么优化。就得看情况了,有的和你的网络有关。

有的和你的内存管理有关。

你就要去添加对应的参数就可以了。

默认配置文件:/etc/sysctl.conf 及以下文件

/run/sysctl.d/*.conf
/etc/sysctl.d/*.conf
/usr/local/lib/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf

写在上面的这些文件中都行,但是我们一般只写在 /etc/sysctl.conf 中就行。


三、/sys目录

/sys 和硬件相关,对应的是一些硬件信息。 固件啊,文件系统啊,设备啊。总线,块设备。

linux系统的启动和内核管理_加载_150

这个都是内核来管的,我们一般不用动。

linux系统的启动和内核管理_centos_151

这个文件夹也是一个虚拟文件夹,不是一个真正的硬盘上的文件夹,它占用的空间也是0,对应的也是内存中的数据。

范例: 别名实现新添加硬盘的识别

[root@centos8 ~]#alias scandisk
alias scandisk='echo - - - > /sys/class/scsi_host/host0/scan;echo - - - >
/sys/class/scsi_host/host1/scan;echo - - - > /sys/class/scsi_host/host2/scan'


四、内核模块管理和编译

如何来管理linux中各种驱动,如何让他支持linux内核中的一些功能,比如文件系统。例如我们当前是不支持ntfs文件系统的。ntfs是windows里边的文件系统,linux中是不支持的。但并不是不是做不到。

我们只需要在linux中增加 ntfs 驱动模块。就可以支持了。

这就涉及到,内核的参数的编译。接下来我们来聊一聊。

linux内核编译,和一般的软件编译过程不一样。

一般的软件编译过程 三步

./configure
make
make install

内核编译过程

1.创建编译的配置文件。配置你要启用的功能

内核是非常复杂的,他的功能有几千个选项。你要启用哪些功能你要告诉他。

我们把我们要启用禁用的功能写到文件里。

这个文件是放在哪里呐?

放在内核里面,命名成 .config 的文件。

我们不要手写,我们直接找一个当前内核的一个配置文件,当做模板文件。

linux系统的启动和内核管理_加载_152

linux系统的启动和内核管理_centos_153 

这个文件有7千多行

我们找一下 ntfs在linux中是不支持的不开启的。

根本就没有编译进去。

linux系统的启动和内核管理_文件系统_154

我们先把ntfs分区给他加上。看一下linux是不是真的不支持。

我们找一个windows硬盘进行分区。

linux系统的启动和内核管理_文件系统_155


linux系统的启动和内核管理_centos_156

格式化成ntfs

把这个分区让linux识别

linux系统的启动和内核管理_加载_157

加块硬盘

linux系统的启动和内核管理_文件系统_158

linux系统的启动和内核管理_加载_159

 linux系统的启动和内核管理_加载_160

linux系统的启动和内核管理_centos_161

linux系统的启动和内核管理_加载_162

linux系统的启动和内核管理_加载_163

我们看看linux是否识别出来

linux系统的启动和内核管理_加载_164

磁盘上面有没有文件系统呐?

有文件系统

linux系统的启动和内核管理_文件系统_165

有文件系统,但当前linux内核不支持。

挂载不上去。

linux系统的启动和内核管理_加载_166

现在我们要重新编译内核。要让他支持ntfs


linux系统的启动和内核管理_文件系统_167

如果是m是代表他把ntfs功能以模块形式提供了。

如果是y是代表集成在内核文件中。

就是把功能放在内核文件里。

linux系统的启动和内核管理_centos_168

如果是y就代表打包到这个文件中去了。

如果是y,就是以独立模块形式提供。

linux系统的启动和内核管理_加载_169

稍后,我们编译ntfs的时候,也可以提供一个ntfs的ko,ko就是内核对象文件,也就是驱动文件。

我们修改编译文件7千多行太麻烦了。我们通过菜单文件定制。

make  menuconfig: 基于curses的文件窗口界面,我们把我们要开启的选项勾选上就可以了。省的你去修改文件了。

编译内核实战:

linux系统的启动和内核管理_centos_170

官网下载linux内核源码

linux系统的启动和内核管理_加载_171

linux系统的启动和内核管理_centos_172

下载完毕传给linux。

解压缩

linux系统的启动和内核管理_加载_173

linux系统的启动和内核管理_centos_174

编译耗性能,我们把内存核数调大。

linux系统的启动和内核管理_centos_175


linux系统的启动和内核管理_加载_176

linux系统的启动和内核管理_文件系统_177

把这一行注释掉

linux系统的启动和内核管理_文件系统_178

把里边的证书文件删掉

linux系统的启动和内核管理_加载_179

把这一行注释掉

linux系统的启动和内核管理_加载_180


linux系统的启动和内核管理_加载_181

linux系统的启动和内核管理_centos_182

linux系统的启动和内核管理_文件系统_183

进入通用设置

linux系统的启动和内核管理_加载_184 

local version

linux系统的启动和内核管理_加载_185

这一串是你自己加的  -240.。。。

linux系统的启动和内核管理_文件系统_186

linux系统的启动和内核管理_加载_187

linux系统的启动和内核管理_加载_188

改完之后我们先退出

linux系统的启动和内核管理_centos_189

我们要调整文件系统linux系统的启动和内核管理_centos_190

linux系统的启动和内核管理_文件系统_191

linux系统的启动和内核管理_加载_192

一直退出

linux系统的启动和内核管理_centos_193

退到最后,我们选择保存。



linux系统的启动和内核管理_centos_194


linux系统的启动和内核管理_centos_195

我们发现我们的文件变了。


linux系统的启动和内核管理_centos_196

用16个cpu编译

开始时间

结束时间

完成之后,发出一个声音。

让他自己编译,会比较耗时。

终于编译好了,接下来我们

linux系统的启动和内核管理_centos_197


linux系统的启动和内核管理_centos_198

vmlinux就是新生成内核文件

只不过还没有拷贝到boot下linux系统的启动和内核管理_文件系统_199文件夹已经生成了

linux系统的启动和内核管理_加载_200

linux系统的启动和内核管理_centos_201


linux系统的启动和内核管理_文件系统_202

这一步生产最后的内核文件。把内核考过去。

linux系统的启动和内核管理_文件系统_203


已经有了新的内核。

reboot 重启选择新内核启动

linux系统的启动和内核管理_文件系统_204


到目前我们就可以支持 ntfs文件系统 了。我们可以看到成功挂载。

linux系统的启动和内核管理_centos_205

在现有内核上定制特性。偏硬件的公司会定制内核的情况 会多一些。

五、systemd

这个是centos 7 上引入的新特性。

centos6第一个进程 是init

centos7 变成systemd

centos7 在同样硬件的情况下,比centos6快。

centos7 能并行运行

为什么7能并行呢?主要是访问才需要依赖。启动并不依赖。因此7可以做到并行启动。

centos7 按需启动。当某个服务需要的时候,就可以激活。用systemd激活

centos7之后,就用一个命令

早期的时候我们启动一个服务用

service atd restart

现在我们用

systemctl restart atd

其实 service atd restart也是重定向到systemctl

linux系统的启动和内核管理_加载_206

systemctl可以同时启动多个服务

linux系统的启动和内核管理_文件系统_207


在systemd中他把各种资源 全笼统 叫做 unit

unit特别多,

有多少种unit呢?

查看他支持的unit类型。

linux系统的启动和内核管理_centos_208


对我们来讲用的最多的就是 service  socket  target

这些资源都在那放着呢?

linux系统的启动和内核管理_centos_209


这里面有大量的文件。

不同后缀代表不同资源。

现在这些都是unit

target 就类似于 centos6 的runlevel

实际上我们现在用的服务是叫service结尾

linux系统的启动和内核管理_加载_210

有大量的sevice 类似于centos6上的服务。

linux系统的启动和内核管理_加载_211

以上都是临时性启动命令。

如果我们希望下次开机自动启动。用以下命令,

linux系统的启动和内核管理_centos_212

linux系统的启动和内核管理_文件系统_213

enabled就是开机自启动

也可以设置为开机不启动。

linux系统的启动和内核管理_文件系统_214

linux系统的启动和内核管理_加载_215


效果等价:

linux系统的启动和内核管理_加载_216


一般我们装好一个服务之后,紧接着就设置成开机启动,以防止下次机器启动,服务启动不起来。


有些场景,有些服务,暂时不想让他启动我们可以。

用mask

linux系统的启动和内核管理_文件系统_217

你手工启动 自动启动都起不来。

unmask 之后,就又可以启动了。

linux系统的启动和内核管理_文件系统_218

mask可以防止误启动,centos6没有类似的功能。

linux系统的启动和内核管理_centos_219

目前我们常用的功能也就是上面的几个。

设置nginx为开启启动,并且现在也立即启动。

linux系统的启动和内核管理_centos_220


linux系统的启动和内核管理_centos_221


ubuntu 有些区别,Ubuntu是安装之后,自己就会把nginx启动起来。

linux系统的启动和内核管理_文件系统_222

ubuntu 不够靠谱,装上就起来了,不安全。


centos8之后 inittab 不再使用了。

linux系统的启动和内核管理_文件系统_223


socket = ip + port/tcp

早期 service和socket 是一个整体。service开启 端口就打开,service关闭,端口也就关闭了。

centos7以后的,service socket可以没有关系。

linux系统的启动和内核管理_centos_224

linux系统的启动和内核管理_文件系统_225

linux系统的启动和内核管理_加载_226

linux系统的启动和内核管理_文件系统_227

service和socket是分开的。独立的就相当于两个资源,各自启动各自的。

我们安装一个rpcbind  这个软件也是做网络通信的。

linux系统的启动和内核管理_文件系统_228

以前服务和端口是一起的。

现在服务和端口是分离

即使我的服务不启动,我的端口也是可以打开的。

端口打开了就可以接收远程访问了。

linux系统的启动和内核管理_centos_229

看一下 service和socket 启动状态

linux系统的启动和内核管理_文件系统_230

端口已经打开了。服务还没有启动。

以前的话,服务不启动端口是不可能打开的。

linux系统的启动和内核管理_centos_231

验证一下 111 端口真的打开了。

有些奇怪,我的服务还没有启动,我的端口号怎么就打开了呢?

端口号肯定是有一个服务在监听,既然我服务都没起来,是谁帮我监听的呢?

linux系统的启动和内核管理_加载_232

闹了半天是 systemd 帮我监听的

这个和xinetd很像。

这个有什么好处,你不用启动,我帮你监听端口,如果有人访问你了,我叫你起来干活就可以了。相当于前台的代理。接待。

systemd接待了用户的访问。节省了资源。

测试一下。有人访问 111端口了。

linux系统的启动和内核管理_加载_233

我们看rpcbind 服务起来了。

linux系统的启动和内核管理_加载_234

systemd 把他叫起来了。

总的来说,这种方式节省资源了。

之前service和socket不分离的时候,资源消耗大。

linux系统的启动和内核管理_centos_235

service文件和socket的格式我们要了解下。

linux系统的启动和内核管理_文件系统_236


ExecStart 运行时真正运行程序和参数

install 运行在哪个模式下。

早期centos6我们需要写 脚本。

linux系统的启动和内核管理_加载_237

linux系统的启动和内核管理_centos_238


centos7上我们不用写脚本了。写service文件了。

linux系统的启动和内核管理_centos_239

接下来我们看一下,service文件的具体意思。

linux系统的启动和内核管理_加载_240

以后我们自己写service文件,就是把 yum 包 rpm 安装生成的 service文件拿过来,改一改。

应用在我们编译安装的 服务上。

我们可以看到 service是依赖socket的,如果我们把socket关闭了,

service是不是也起不来了。

linux系统的启动和内核管理_文件系统_241

linux系统的启动和内核管理_centos_242

111 已经看不到了。

我们看一下,service也已经关掉了。

linux系统的启动和内核管理_centos_243

linux系统的启动和内核管理_文件系统_244

用户再访问 111 端口,就连不上了。

你要访问服务的话,socket得先起来,socket起不来,那service也起不来。

变相的就是依赖关系。

Reqiures 是强依赖

Wants 是弱依赖

linux系统的启动和内核管理_文件系统_245

linux系统的启动和内核管理_文件系统_246

我们看一下 memcached的 环境变量文件内容

linux系统的启动和内核管理_加载_247

linux系统的启动和内核管理_加载_248

Install

linux系统的启动和内核管理_centos_249


linux系统的启动和内核管理_centos_250


linux系统的启动和内核管理_文件系统_251


范例:

service文件一定要放在 /lib/systemd/system 文件夹下

linux系统的启动和内核管理_文件系统_252


linux系统的启动和内核管理_加载_253

写完之后,让他加载。

linux系统的启动和内核管理_文件系统_254

看一下是否启动

linux系统的启动和内核管理_centos_255

把这个服务启动并且设置为开机启动。

linux系统的启动和内核管理_加载_256

linux系统的启动和内核管理_文件系统_257

这些输出是后台执行的,你屏幕上是看不到的。

那他放哪里去了呢?

那我们看一下。

linux系统的启动和内核管理_文件系统_258

linux系统的启动和内核管理_加载_259


linux系统的启动和内核管理_加载_260

他写入到我们系统日志里去了。

service文件是可以做到后台执行,自动启动的。

linux系统的启动和内核管理_文件系统_261

linux系统的启动和内核管理_加载_262


如果我们重启,reboot, 这个也是会自动启动的


linux系统的启动和内核管理_文件系统_263

可停可起

如果你不想写 service ,你也可以写一个开机自启动

利用rc.local

linux系统的启动和内核管理_文件系统_264


在早期版本中,我们使用这个脚本,在centos7 以后咱们不再使用了。

linux系统的启动和内核管理_加载_265


runlevel 的 运行模式 0-6 到底有什么区别?

区别就在于 /etc/rc*.d/ 

所谓的运行模式,就是不同模式下,启动的服务不同。本质上就是这些区别

linux系统的启动和内核管理_加载_266


我们工作中常用的是3

centos之后 取消了 0-6

他用target代替了。

  target units:相当于Centos 6之前的runlevel.unit配置文件:.target


linux系统的启动和内核管理_加载_267

这些target就是不同服务的组合。

突破了0-6只有七种的组合。

linux系统的启动和内核管理_文件系统_268

linux系统的启动和内核管理_加载_269

为了兼容,仍然还可以用0-6,只不过他们是这样的。

如何查看target之间的相互依赖;linux系统的启动和内核管理_文件系统_270

target 是资源的组合。

如果你想开机进入到某种target下:

linux系统的启动和内核管理_文件系统_271

linux系统的启动和内核管理_centos_272

linux系统的启动和内核管理_文件系统_273

实际上的设置,就是创建软连接,用软连接实现。

Centos 7 之后版本启动 

linux系统的启动和内核管理_文件系统_274

centos7  centos8的grub 启动配置问价位置,内容相当多。

linux系统的启动和内核管理_加载_275

这个文件坏了, 相当麻烦

不过我们可以直接生成

用以下命令生成。

linux系统的启动和内核管理_centos_276


通过systemd-analyze 工具可以了解启动的详细过程

linux系统的启动和内核管理_加载_277

linux系统的启动和内核管理_文件系统_278


破解CentOS 7和8 的root密码

linux系统的启动和内核管理_文件系统_279

设置grub2密码

linux系统的启动和内核管理_文件系统_280


linux系统的启动和内核管理_文件系统_281

centos7之后 用的 grub2

linux系统的启动和内核管理_加载_282

修复 GRUB-2

linux系统的启动和内核管理_文件系统_283

修改默认启动内核

linux系统的启动和内核管理_文件系统_284

linux系统的启动和内核管理_centos_285

此命令,能列出 当前内核支持的列表

linux系统的启动和内核管理_加载_286

救援模式

当前内核

新的内核

修改默认内核。

linux系统的启动和内核管理_文件系统_287


reboot,看默认菜单已经变了。

编译安装的内核删的时候,比较麻烦。不像yum安装那样。

新内核在哪里哪?

linux系统的启动和内核管理_centos_288

linux系统的启动和内核管理_文件系统_289

linux系统的启动和内核管理_centos_290


linux系统的启动和内核管理_加载_291


重新生成一下grub配置文件

linux系统的启动和内核管理_centos_292

故障恢复:

linux系统的启动和内核管理_文件系统_293

linux系统的启动和内核管理_加载_294

 linux系统的启动和内核管理_加载_295

强行安装。

linux系统的启动和内核管理_centos_296

linux系统的启动和内核管理_文件系统_297

linux系统的启动和内核管理_文件系统_298



知识点补充:进救援模式

linux系统的启动和内核管理_centos_299

linux系统的启动和内核管理_文件系统_300