一、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 启动流程
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 目录下。 第二个阶段定义了操作系统所在的路径。
其中 grub.conf 配置文件相当重要。
到这里产生了一个新的问题。1阶段是固定位置,1阶段进入到2阶段,会遇到一个问题。/boot/grub 文件夹,不是一个可以执行二进制文件。他是一个文件系统,需要先加载文件系统驱动后,才能进入文件系统。
从1阶段进入2阶段下。/boot 是一个 ext4 的分区
什么时候,加载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, 他是一个文件。
default=0:默认用哪个内核来引导,目前只有一个内核。事实上我们可以有多个内核。
上面这一段其实就是一个内核的启动菜单。
如果把这一段,复制一份。就有两个内核的。排在第一个的就是0
这两个菜单,0代表,默认第一个。
目前这两个选择使用的是同一个内核文件,你也可以改一下。
timeout=5
5秒钟不做选择,他就会选择默认的default=0 内核来引导操作系统。
splashimage=(hd0,0)/grub/splash.xpm.gz 是背景图片。
默认是一个压缩文件,他就是一个黑色的背景,你可以自己替换为一个想要的文件。
hiddenmenu 默认下面两个菜单是看不到的。如果把hiddenmenu删掉,就能看到了。否则 需要按esc键。
root(hd0,0)
root指的是boot所在的位置。他把boot当成root根 hd代表硬盘 hd0,0 就是第一个硬盘 0分区。
/boot == /
kernel /vmlinux-2.6.....x86_64 找到内核
再利用内核,加载文件系统的跟系统。
root=UUID=e76f2257.....
这个UUID 就是 / 的标识。
后续的是内核参数
initrd /initramfs .... 这个文件也很关键。
reboot 重启机器
重启机器,倒计时5s 按任意键盘
就可以看到菜单了。
选择启动就可以了。
如果你不做选择,就会选择默认 0
1.3.4 破坏grub并修复
把grub 前446个字节 清零
查看是否清零:
这时候,系统就起不来了。
怎么修复:
救援模式。拿光盘引导。
挂上光盘。
手疾眼快的。
当前的根,并不是我们硬盘真正的根。
真正的根是/mnt/sysimage 才是根。
我们可以把根切过来
用grub-install 进行修复破坏的grub
确认下,是否已经修好了
sync 写一下磁盘,立即写磁盘。不要放在缓冲区里。
然后重启一下
reboot。
就此,修复好了。
接下来破坏 2阶段:
reboot 给他修好。
拿救援光盘启动。
grub.conf 和图片丢了。
重启一下。
已经可以起来了。
grub其实是一个交互式的。
你是可以交互的。
e是编辑
a添加内核参数
c是命令行
输入e
修改。
quite rhgb 会把内核的 启动信息隐藏起来。
启动风格就调整了。
由此,即便我们 把conf文件破坏了,我们也可以在交互式 grub下,把系统启动起来。
reboot
boot 启动
也能起来。
完事你抓紧把 grub.conf 文件修复一下。
grub的功能还是很丰富的。
grub还有一个功能,设置密码。
1.3.5 grub设置密码
centos6 破解口令。ctrl + alt +insert键可以把机器重启。
破解口令必须重启系统坐在机器旁边操作。
输入a键
要想破解,我们要输入1
1代表着,单用户
也可以写 s S single
我们输入1,回车就可以进入单用户了。
单用户下。
passwd
重新设置一次密码。就相当于破解了。
一分钟破解口令。
破解口令我们必须在机器旁边,进行操作。你必须去机房,操作。一般人进不了机房。
万一有一个主机真是放在一个公共场合。
营业厅,放在公共场合。
对grub加密码。
建议用encrypt 加密sha512
编辑grub.conf文件
想破解密码需要知道grub指令。
密码不正确是进不去的。
我们利用光盘引导,也可以破解。
只要物理上能接触机器。就没有安全性,可言。
一般服务器,你也摸不到。
grub启动之后。就开始加载内核。
1.3.6 kernel加载
我们加载内核需要进入操作系统的根,那么就要识别ext4的驱动,
root=UUID=dfhsjfhsj
也是一个独立的硬盘,也有他自己的文件系统。
ext4的驱动在哪里放着呢?驱动的功能是内核提供的。
死循环,我要加载根分区,就要加载ext4的驱动,我的ext4驱动又放在根分区内。无解。蛋生鸡,鸡生蛋。
怎么解决?
1.3.7 init 初始化
靠 initrd /init...
这里边的内容就像一个小型的linux系统。根文件系统。
这个文件必须要存在的。靠他来加载根文件系统。
如果这个文件被破坏了,我们也是可以修复的。
内核加载之后。
我们就可以进入整个硬盘的根了。
他进入到根以后,第一件事,就是加载系统中的第一个进程。init进程
这个进程起来之后,会加载一个初始化文件。
1.3.7.1 运行级别
这个文件,记录了计算机启动之后,运行的模式。
id:3:initdefault 这一行决定了,计算机启动之后的运行模式。
总共有7中模式。
模式可以修改、只需要修改上面的文件就可以了。0,6不要这么设置。一个是关机,一个是重启。
linux你想怎么折腾都行。你可以多深入都行,源代码都是开源的。
如果不小心设置了 0,6运行模式。
我们可以临时进入3模式。
1.3.7.2 初始化脚本sysinit
除了运行模式。
他还进行了一个初始化,按照初始化脚本执行。
系统初始化,将执行以下文件, cat /etc/init/rcS.conf
这个脚本有691行
1.3.7.3 服务管理
这个脚本初始化完成之后,就要根据你刚才定义的默认运行模式。找到对应的脚本。
0-6
如果我们定义的开机模式是3模式。
就会运行rc3.d
S K 开头。
S开头的系统会自动执行,启动服务。
K开头的系统会自动执行,停止服务
具体脚本可以看,以上文件内容。
我们的计算机,启动关闭和K S 有关。
计划任务的状态是开机启动
http开机不启动
真正的执行脚本位置。
等价关系。
如果我希望,开机启动关闭。
怎么修改开机启动呢?
真的脚本 /etc/init.d/atd
95 5
95 表示S开头
5表示K开头。
这个 95和5 是脚本执行启动服务的次序,因为,服务之间可能是有依赖关系的。
启动和停止都有依赖关系。
1先执行
优先级。很巧妙。
比如:S10network S55sshd
先有网络,才有ssh
service atd start
start作为一个参数传到脚本里。执行相应的指令。
你自己也可以写一个服务脚本。
你自己写的服务通常往后写。
生产中,你可能自己写一个生产脚本。
当前服务还不在服务列表里,把当前服务加到服务列表里。
加进去之后,他会自动的把0-6的七个运行模式的软连接的文件夹生成。
你会发现所有的都是K开头的。
因为我们刚才 脚本里是 -
-代表所有的运行模式。任何模式下都是关闭的。
如果你写35 96 3
就代表3和5模式下是 开启的,也就是S开头
这样,服务已经可以开机启动了。
可以看到 testsrv已经开机启动了。
如果我们的服务卡着不动了,我们系统起不来了。怎么办?
万一生产中,我们的一个服务出现了问题,导致我们的服务起不来。怎么处理?
方法是,重新启动,进入gurb 敲a键,用1 ,单用户模式
因为1模式,off的,所以testsrc不会卡主系统启动。
我们在1模式下,把testsrc的3模式 设置off就可以了
这样就临时解决了问题。
如果我们不想要开机自启动了,就可以从服务列表里删除。
删除默认会自动把软连接也删除。
实际上,testsrv是没有删除的,你还是可以用的。
以后你可以把你自己编译的服务
设置成开机自启动。
1.3.7.4 开机启动文件 rc.local
如果我们只是想,开机自动运行一个程序。
我们可以利用rc.local 脚本,我们发现 2345都有local
99 排名最后。
他不属于正常的服务脚本。
rc.local是什么格式呢?
我们加了一个 开机启动,不需要你登录,就会创建一个/data/rc.local 文件。
你可以把开机运行的程序,放到这个脚本里就行。
如果以后,你不想写开机启动服务脚本,你只想开机运行某个程序
你就可以,把启动的命令写到此脚本里。
centos6上 rc.local是直接可以运行的。
centos7 centos8上,rc.local也被支持,但是默认没有执行权限。
此文件是为了兼容模式留下来的。ubuntu1804也是这么干的。
需要你自己设置可执行权限
chmod +x /etc/rc.d/rc.local
1.3.7.5 非独立服务
我们在系统中,我们有一些服务,我们用的很少,但是不启动吧,有需要用。
不启动吧,偶尔还用一用,启动吧,会浪费资源。
xintd 总代理,这个服务,会激活你访问的服务,如果你不访问就停止。
非独立服务是依赖于xintd服务的。
yum -y install telnet-server
这个服务早期的时候,远程登录服务。
目前安全性很差,被取代了。
现在大多使用ssh
在安装telnet-server服务的时候,也会安装xinetd服务。因为telnet-server是依赖xinetd服务的。
多了很多服务。
非独立服务。
如何激活非独立服务?
on之后就托管给 xinetd服务了。
23端口是不是已经打开了.
telnet 端口是23
现在23端口的监听是xinetd帮忙代理的。
xinetd服务替telnet的 端口
telnet并没有启动起来。
当我们去访问了telnet
他才会被激活启动起来。
telnet 不安全。账号密码都是明文的。已经淘汰了。
1.3.8 CentOS 启动过程总结
1.4 启动过程的故障排错
故障:rm -rf /boot/* 和 /etc/fstab 进行恢复
系统重启起不来了,怎么修复?
救援模式
我们要先修复fstab文件,修复完了,再修复boot
上一步和之前不一样了,他找不到分区了,以前是找到/mnt/...作为根
硬盘真正的根是没有挂载的。
跟在哪我都不知道。
怎么找根?
sda1 2 3 可能是根
临时建个文件夹,挂载一下。
我们可以看到 ,sda2 是真正的根。
我们找到之后 取消挂载。
我们修复了fstab文件。
再重新启动,重新进救援模式。
由于我们把boot目录整个干掉了。
我们接着修复。
- 挂载光盘,把内核包装一下。
- 修复 grub
- 接下来写一个grub.conf文件。
ctrl alt insert 键盘,重启。
就能起来了。
二、/proc目录和内核参数管理
/proc目录:内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出帮助 man proc
我们曾经在这里配置过路由。
这个文件夹大小为0
因为他根本不是硬盘上的文件,他里边的东西都是来自内存。
内核参数:只读:只用于输出信息。可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
/proc/sys 设置
sysctl是一个允许改变正在运行中的Linux系统的接口,修改的是针对整个系统的内核参数。sysctl的修改
是立即且临时的(重启后失效)。也可以通过修改sysctl.conf配置文件,达到永久生效。
改为1,开启
sysctl -a 是列出目前所有正在生效的设置。
net.ipv4.icmp_echo_ignore_all 禁用别人ping通我。
写到配置文件里 设置为1 就不能ping通了。
如果你把 net.ipv4.icmp_echo_ignore_all=1 删除的话。
是不能立即起效果的。因为
sysctl -p 是读取配置文件。覆盖内存中的设置,使其生效。
你删除了,是没办法覆盖内存的。
你可以直接该内存
systemctl -w 是临时修改。
默认打开的文件个数大小。太小了,你要重新设置下。
我的物理内存剩下还有30%的时候,就可以使用swap了,这个值,有点大。你可以把这个值适当变小。
你可以干脆禁用 swap
这些内核参数,有时候,我们是要做优化的。
这里有一个生产案例:
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 和硬件相关,对应的是一些硬件信息。 固件啊,文件系统啊,设备啊。总线,块设备。
这个都是内核来管的,我们一般不用动。
这个文件夹也是一个虚拟文件夹,不是一个真正的硬盘上的文件夹,它占用的空间也是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 的文件。
我们不要手写,我们直接找一个当前内核的一个配置文件,当做模板文件。
这个文件有7千多行
我们找一下 ntfs在linux中是不支持的不开启的。
根本就没有编译进去。
我们先把ntfs分区给他加上。看一下linux是不是真的不支持。
我们找一个windows硬盘进行分区。
格式化成ntfs
把这个分区让linux识别
加块硬盘
我们看看linux是否识别出来
磁盘上面有没有文件系统呐?
有文件系统
有文件系统,但当前linux内核不支持。
挂载不上去。
现在我们要重新编译内核。要让他支持ntfs
如果是m是代表他把ntfs功能以模块形式提供了。
如果是y是代表集成在内核文件中。
就是把功能放在内核文件里。
如果是y就代表打包到这个文件中去了。
如果是y,就是以独立模块形式提供。
稍后,我们编译ntfs的时候,也可以提供一个ntfs的ko,ko就是内核对象文件,也就是驱动文件。
我们修改编译文件7千多行太麻烦了。我们通过菜单文件定制。
make menuconfig: 基于curses的文件窗口界面,我们把我们要开启的选项勾选上就可以了。省的你去修改文件了。
编译内核实战:
官网下载linux内核源码
下载完毕传给linux。
解压缩
编译耗性能,我们把内存核数调大。
把这一行注释掉
把里边的证书文件删掉
把这一行注释掉
进入通用设置
local version
这一串是你自己加的 -240.。。。
改完之后我们先退出
我们要调整文件系统
一直退出
退到最后,我们选择保存。
我们发现我们的文件变了。
用16个cpu编译
开始时间
结束时间
完成之后,发出一个声音。
让他自己编译,会比较耗时。
终于编译好了,接下来我们
vmlinux就是新生成内核文件
只不过还没有拷贝到boot下文件夹已经生成了
这一步生产最后的内核文件。把内核考过去。
已经有了新的内核。
reboot 重启选择新内核启动
到目前我们就可以支持 ntfs文件系统 了。我们可以看到成功挂载。
在现有内核上定制特性。偏硬件的公司会定制内核的情况 会多一些。
五、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
systemctl可以同时启动多个服务
在systemd中他把各种资源 全笼统 叫做 unit
unit特别多,
有多少种unit呢?
查看他支持的unit类型。
对我们来讲用的最多的就是 service socket target
这些资源都在那放着呢?
这里面有大量的文件。
不同后缀代表不同资源。
现在这些都是unit
target 就类似于 centos6 的runlevel
实际上我们现在用的服务是叫service结尾
有大量的sevice 类似于centos6上的服务。
以上都是临时性启动命令。
如果我们希望下次开机自动启动。用以下命令,
enabled就是开机自启动
也可以设置为开机不启动。
效果等价:
一般我们装好一个服务之后,紧接着就设置成开机启动,以防止下次机器启动,服务启动不起来。
有些场景,有些服务,暂时不想让他启动我们可以。
用mask
你手工启动 自动启动都起不来。
unmask 之后,就又可以启动了。
mask可以防止误启动,centos6没有类似的功能。
目前我们常用的功能也就是上面的几个。
设置nginx为开启启动,并且现在也立即启动。
ubuntu 有些区别,Ubuntu是安装之后,自己就会把nginx启动起来。
ubuntu 不够靠谱,装上就起来了,不安全。
centos8之后 inittab 不再使用了。
socket = ip + port/tcp
早期 service和socket 是一个整体。service开启 端口就打开,service关闭,端口也就关闭了。
centos7以后的,service socket可以没有关系。
service和socket是分开的。独立的就相当于两个资源,各自启动各自的。
我们安装一个rpcbind 这个软件也是做网络通信的。
以前服务和端口是一起的。
现在服务和端口是分离
即使我的服务不启动,我的端口也是可以打开的。
端口打开了就可以接收远程访问了。
看一下 service和socket 启动状态
端口已经打开了。服务还没有启动。
以前的话,服务不启动端口是不可能打开的。
验证一下 111 端口真的打开了。
有些奇怪,我的服务还没有启动,我的端口号怎么就打开了呢?
端口号肯定是有一个服务在监听,既然我服务都没起来,是谁帮我监听的呢?
闹了半天是 systemd 帮我监听的
这个和xinetd很像。
这个有什么好处,你不用启动,我帮你监听端口,如果有人访问你了,我叫你起来干活就可以了。相当于前台的代理。接待。
systemd接待了用户的访问。节省了资源。
测试一下。有人访问 111端口了。
我们看rpcbind 服务起来了。
systemd 把他叫起来了。
总的来说,这种方式节省资源了。
之前service和socket不分离的时候,资源消耗大。
service文件和socket的格式我们要了解下。
ExecStart 运行时真正运行程序和参数
install 运行在哪个模式下。
早期centos6我们需要写 脚本。
centos7上我们不用写脚本了。写service文件了。
接下来我们看一下,service文件的具体意思。
以后我们自己写service文件,就是把 yum 包 rpm 安装生成的 service文件拿过来,改一改。
应用在我们编译安装的 服务上。
我们可以看到 service是依赖socket的,如果我们把socket关闭了,
service是不是也起不来了。
111 已经看不到了。
我们看一下,service也已经关掉了。
用户再访问 111 端口,就连不上了。
你要访问服务的话,socket得先起来,socket起不来,那service也起不来。
变相的就是依赖关系。
Reqiures 是强依赖
Wants 是弱依赖
我们看一下 memcached的 环境变量文件内容
Install
范例:
service文件一定要放在 /lib/systemd/system 文件夹下
写完之后,让他加载。
看一下是否启动
把这个服务启动并且设置为开机启动。
这些输出是后台执行的,你屏幕上是看不到的。
那他放哪里去了呢?
那我们看一下。
他写入到我们系统日志里去了。
service文件是可以做到后台执行,自动启动的。
如果我们重启,reboot, 这个也是会自动启动的
可停可起
如果你不想写 service ,你也可以写一个开机自启动
利用rc.local
在早期版本中,我们使用这个脚本,在centos7 以后咱们不再使用了。
runlevel 的 运行模式 0-6 到底有什么区别?
区别就在于 /etc/rc*.d/
所谓的运行模式,就是不同模式下,启动的服务不同。本质上就是这些区别
我们工作中常用的是3
centos之后 取消了 0-6
他用target代替了。
target units:相当于Centos 6之前的runlevel.unit配置文件:.target
这些target就是不同服务的组合。
突破了0-6只有七种的组合。
为了兼容,仍然还可以用0-6,只不过他们是这样的。
如何查看target之间的相互依赖;
target 是资源的组合。
如果你想开机进入到某种target下:
实际上的设置,就是创建软连接,用软连接实现。
Centos 7 之后版本启动
centos7 centos8的grub 启动配置问价位置,内容相当多。
这个文件坏了, 相当麻烦
不过我们可以直接生成
用以下命令生成。
通过systemd-analyze 工具可以了解启动的详细过程
破解CentOS 7和8 的root密码
设置grub2密码
centos7之后 用的 grub2
修复 GRUB-2
修改默认启动内核
此命令,能列出 当前内核支持的列表
救援模式
当前内核
新的内核
修改默认内核。
reboot,看默认菜单已经变了。
编译安装的内核删的时候,比较麻烦。不像yum安装那样。
新内核在哪里哪?
重新生成一下grub配置文件
故障恢复:
强行安装。