RHCE(服务管理和系统启动流程)
一:系统的简介
1:基础
系统启动的时候会运行什么样的程序,什么样的进程什么样的服务,以及得到什么样的桌面,系统开机运行的第一个程序,pid为1,系统的守护进程目的是初始化系统
在rhel7之前,使用init初始化系统
在rhle7之后,使用systemd初始化系统
系统中,如果是d结尾的,那么就表明这是守护进程,在后台一直运行的进程
2:init和systemd区别
1)init属于串行启动,systemd属于并行启动
a:init从上到下一次启动,如果中间出现了问题,则系统无法启动
b:systemd按需启动服务,可以一次性同步启动多个服务
2)systemd自动解决服务依赖问题
a:如果要启动nfs服务,需要先启动rpc-bind mountd,这样就解决了依赖的问题
二:系统的管理(systemctl和systemd)
1:系统单元的管理
在系统中,systemd通过单元来管理不同类型的对象
1)查看系统的服务单元:
也可查看到服务的运行状态,
[root@node1 ~]# systemctl list-units --type service | head -n 5 UNIT LOAD ACTIVE SUB DESCRIPTION accounts-daemon.service loaded active running Accounts Service atd.service loaded active running Deferred execution scheduler auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
参数的介绍:
UNIT:服务名
LOAD:是否正确的载入配置文件
ACTIVE:服务的高级状态,一系列进程的状态,服务的最终状态就是他
sub:服务的低级状态,服务进程的状态,exited表示进程已经经历了一次正确的配置载入,等待下一次的运行后,就会变成running
description:服务的描述信息
2)查看系统开机自启的服务
查看服务是否是开机自启的,还有就是服务的默认状态
[root@node1 ~]# systemctl list-unit-files --type automount mount scope slice swap timer device path service socket target [root@node1 ~]# systemctl list-unit-files --type service | head -n 4 UNIT FILE STATE VENDOR PRESET accounts-daemon.service enabled enabled alsa-restore.service static - alsa-state.service static -
服务的状态:
enabled:表示开机自启
disabled:表示开机不会自启
static:服务不能自己启动,只能被其他的服务激活启动,nfs服务
mask:锁定服务,服务不能自己启动,其他服务也不能对其激活启动,mask是为了防止服务之间发生冲突,使用mask对一个服务进行锁定
3)管理服务
rhel7之前管理服务与rhel7之后,命令非常不一样
systemctl 动作 服务名称
动作:start,stop,restart,status,reload,enabled,disabled,reload-or-restart(2者之一任选一个),mask(锁定服务),unmask(解锁服务),is-active(服务是否启动的),is-enabled(服务是否开机自启),list-dependencied(查看服务的依赖)
案例:
#查看服务的依赖性 [root@node1 ~]# systemctl list-dependencies httpd | head -n 10 httpd.service ● ├─-.mount ○ ├─httpd-init.service ● ├─system.slice ● └─sysinit.target ● ├─dev-hugepages.mount ● ├─dev-mqueue.mount ● ├─dracut-shutdown.service ○ ├─iscsi-onboot.service #查看服务是否启动的 [root@node1 ~]# systemctl is-active httpd active #查看服务是否开机自启 [root@node1 ~]# systemctl is-enabled httpd enabled
2:系统启动目标管理
1:系统启动目标
系统启动目标就是,系统启动的时候获取什么样的操作界面,也是一种状态,一共0到6个级别,0关机,6重启,5图形化,3是带网络字符页面
系统目标的划分:
graphical.target | 图形化的页面 |
multi-user.target |
字符页面 |
rescue.target |
修复系统页面 |
emergency.targe
|
修复系统故障的页面 |
2:查看系统启动目标
1)第一种方式,使用runlevel来查看
runlevel可以看到上一次的启动目标和当前的启动目标
[root@node1 ~]# runlevel N 5
2)第二种方式使用systemctl get-default查看
[root@node1 ~]# systemctl get-default graphical.target
3:修改系统的启动目标
1)永久修改
systemctl set-default 启动目标
systemctl set-default multi-user.target reboot
即可,这个就是永久的修改
2)临时修改
init 5 切换到图形页面
systemctl isolate multi-user.target
在菜单页面选择第一个按e,在linux这一行,ctlrl+e到末尾,然后输入systemd.uni=图形化类型,ctrl+x就进入里面了
下次重启后,还是会会回复到原来的地方
三:系统启动的流程和查看内核
管理工具:grubby是管理内核的工具
1:系统启动的流程
BIOS:最小化输入输出系统
流程:
1:上电开机
2:BIOS开始自检并且加载硬件
3:BIOS根据启动的顺序选择对应的启动设备
a:硬盘的,cdrom,网络
4:从硬盘去加载引导代码(引导程序)
a:引导代码---->>>引导程序--->>>grub2
b:存放在硬盘的前446个字节(mbr分区的最前面)
5:引导程序加载启动引导分区中配置文件(引导配置文件)
/boot/grub2/grub.cfg
6:grub2会加载内核和initramfs--->>>要挂载根文件系统,然后执行systemd来初始化(启动服务,根据启动目标获取操作页面)
a:内核不能挂载文件系统,想要挂载文件系统,需要对应的文件系统驱动,需要xfs系列,ext系列
b:initramfs目的就是为了帮助内核挂载根文件系统,提供文件系统的驱动以及硬件驱动
7:initramfs会执行自己的systemd并且将磁盘上的根文件系统挂载到/sysroot(真正根文件系统挂载到/sysroot)
8:内核就会将initramfs的假根切换为/sysroot(真正的根),然后执行systemd进行初始化系统
9:systemd通过启动目标来得到操作页面(字符页面,图形化页面等)
总结(理解的步骤):
1:MBR前面的446个字节是引导代码也叫做引导程序(grub2),他会去加载initramfs和内核
2:因为,内核(没有驱动程序等)无法真正的挂载文件系统,initramfs(就相当于是一个微型的操作系统),他会去挂载/(也就是假的根),加载一些驱动程序,然后卸掉自己,让内核挂载到真正的根文件系统上面(/sysroot)
3:内核一旦挂上去了,就会使用systemd来初始化系统,加载一些操作系统的界面(图形化,命令行界面等)
2:内核参数
1:查看系统的内核
grubby --info=ALL
[root@node1 entries]# grubby --info=ALL index=0 kernel="/boot/vmlinuz-5.14.0-70.22.1.el9_0.x86_64" args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet" root="/dev/mapper/rhel-root" initrd="/boot/initramfs-5.14.0-70.22.1.el9_0.x86_64.img" title="Red Hat Enterprise Linux (5.14.0-70.22.1.el9_0.x86_64) 9.0 (Plow)" id="ec4c8aea8e734d88b03b86d6af1d1fe5-5.14.0-70.22.1.el9_0.x86_64" index=1 kernel="/boot/vmlinuz-0-rescue-ec4c8aea8e734d88b03b86d6af1d1fe5" args="ro resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet" root="/dev/mapper/rhel-root" initrd="/boot/initramfs-0-rescue-ec4c8aea8e734d88b03b86d6af1d1fe5.img" title="Red Hat Enterprise Linux (0-rescue-ec4c8aea8e734d88b03b86d6af1d1fe5) 9.0 (Plow)" id="ec4c8aea8e734d88b03b86d6af1d1fe5-0-rescue"
index=0代表着为第一个内核,=1代表着第二个内核参数
查看的就是/boot/loader/entries下面的内核文件
2:查看系统默认内核
grubby --default-kernel
[root@node1 entries]# grubby --default-kernel /boot/vmlinuz-5.14.0-70.22.1.el9_0.x86_64
3:修改默认的内核
第一种:
grubby --set-default 内核路径 也就是/boot下面的内核文件
第二种:
grubby --set-default-index x(这个x就是grubby --info=ALL显示的index等于几)
内核修改了,对应的标题也就会被修改
4:查看内核标题以及修改
1:查看内核标题
grubby --default-title
查看就是/boot/loader/entries这个文件中的标题内容
2:修改内核的标题
一种方法就是:因为查看的就是/boot下面的文件,所以修改下面的文件即可,
修改后,然后重启即可
5:修改内核启动的参数
第一种方法:对配置文件进行修改(永久的修改)
修改/etc/default/grub里面的timeout这个参数,就是设置超时的时间
修改完成后,输入grub2-mkconfig -o /boot/grub2/grub.cfg,重新生成gruub.cfg配置文件
但是把下面有出现了一个新的文件(一致都有的文件)
第二种方法:通过grub添加内核的参数(永久修改的)
grubby --args= " systemd.unit=系统的启动目标" --update-kernel /boot/内核文件
也就是写入到了这个内核文件里面去了(/boot/loder/entries下面了)
但是没有写到/etc/default/grub里面去
第三种方法:系统启动的时候修改内核参数(临时修改,用的较为多)
1)在启动的界面是按e键,然后在linux末尾添加内核参数,比如systemd.unit=multi-user.target
2)然后按ctrl+x继续启动
常见的内核参数
1:systemd.unit=multi-user.target
2:init=/bin/bash
3:rd.break
四:系统故障的管理
1:忘记root密码
就是在真正的时候,如果忘记了密码,就要选择救援内核,8之前的话选择正常的内核即可(也就是第一项)
1)重启操作系统,选择救援内核,按e键
2)在linux这一行,按ctrl+e到末尾,然后的话,在ro后面输入rd.break,可以删除也可以不删除后面的参数,然后按下ctrl+x进入到initramfs这个微型的操作系统中去
3)把/sysroot重新以读写的方式进行挂载,然后切换到真正的根文件系统
mount -o remount,rw /sysroot
chroot /sysroot
4)修改root密码
passwd root
5)打上标签
创建autorelabel文件告诉selinux放行此次操作,否则操作被阻挡
touch /.autorelabel
6)退出
2次exit退出去,然后输入密码进行登录
2:grub.cfg引导配置文件丢失
每次会去问客户这个是什么类型的硬盘(scis或者nvme0n1等)
现象:就是进入系统后,直接就是grub这个界面,就可能是grub.cfg这个配置文件丢失
图片:
思路:要进入这个操作系统中,才能使用生成grub.cfg的配置文件才行
解决方法:
1)指定系统上的boot分区,如果有多个硬盘的话,系统磁盘的第一个分区永远是boot分区
a:set root='hd0,msdos1',选择第一个分区
2)指定内核文件以及真正的根文件系统,根据硬盘的类型来判断真正的根文件系统是什么
a:列如:系统盘是nvme的,/dev/nvme0n1p2 可能是根文件系统
b:如果是scsi的,/dev/sd2可能是根文件系统
c:系统盘是逻辑卷,/dev/mapper/rhel-root是根文件系统,centos的就是centos-root
linux /内核版本 root(真正的根文件系统)=/dev/nvme0n1p2 ro 以只读的方式挂载
3)指定内核配对的initramfs
a:initrd /initramfs(跟内核版本保持一致)
4)boot引导启动进入系统(上面的操作都完成了即可,在根文件系统下,指定了内核和initramfs后,就能进行到这个操作系统中了)
5)执行grub2-mkconfig -o /boot/grub2/grub.cfg 生成引导配置文件
3:fstab文件系统类型故障
使用mount -a能排查很多的错误点出来
1)挂载点写错了(红帽8之前的话,挂载点写错了会导致系统起不来,8之后,会自动的创建不存在的挂载点)
编写/ets/fstab这个永久挂载的配置文件时,写错了挂载点,会自动创建
2)文件系统的类型写错了(会导致系统起不来,出现故障)
造成的现象:就是系统会进入内核模式中,要求输入root密码才行才能进行入到下一步的操作,执行mount -a就知道什么问题了
xfs,ext系列,iso9660然后写错了
/dev/cdrom /mnt/ iso960 defaults 0 0
进入紧急救援模式,输入mount -a 就能察觉到哪里写错了,最后进行排查,reboot即可
3)挂载的设备名称写错了
跟文件系统类型写错了一样的方法
4:引导程序故障
模拟:dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1 reboot
现象: 看不到菜单页面,
思路:就是安装引导程序(就是这个系统盘)
解决步骤:
1)通过光盘进行启动,进入救援模式
2)扫描硬盘的文件系统,并且挂载到/mnt/sysroot
3)切换到真正的根下,执行grub2-install /dev/系统盘nvme0n1 安装引导程序
4)exit
5)exit
注意的就是:救援模式的光盘最好和系统保持一致,一个系统版本的,这样就不会出现安装一些包的问题了
5:内核文件丢失,innitramfs文件丢书,引导分区文件丢失
模拟:删除/boot分区后面的所有文件,
现象:导致了进入不了系统,出现了grub rescue,没有菜单页面,说明了引导程序还在,但是/boot分区下面的文件可能丢失了
图片:
思路:因为文件没有了,所以的话,就是安装软件包达到释放的文件的目的,然后安装系统盘,释放grub2目录
解决步骤:
先要重启,按esc键选择光盘
1)通过光盘进行启动,系统中有三种方式启动的(硬盘,光盘,网络),进入救援模式里面
2)进入的是光盘的微型操作系统,切换到真正的根文件系统里面,chroot /mnt/sysroot
3)配置yum仓库,安装所有的内核软件包,dnf -y install kernel*
4)ll /boot 发现没有grub2这个目录,所以的话,安装释放grub2目录,grub2-install 系统盘
执行grub2-mkconfig -o /boot/grub2/grub.cfg来安装grub.cfg这个配置文件
5)exit
6)exit
完成即可
五:系统中难以理解的文件和操作
1:内核配置文件详解
/etc/default/grub和/boot/loader/entries/下面文件是/boot/grub/grub.cfg的2个变量文件,修改这2个变量文件,就是在修改这个grub.cfg,唯一的区别就是,/etc/default/grub写死了,改变里面的变量后,要执行命令重新生成/boot/grub/grub.cfg这个配置文件;/boot/loader/entries/下面的内核是实时更新的,也就是在里面修改了内容后,会同步上去,所以不需要重新生成配置文件;另外这些都是内核的组成之一
还有就是/boot下面的文件是内核文件,而/boot/grub2/grub.cfg只是包含了内核的路径,以及加载内核文件相关的事情,也就是如何选择内核,只是一个引导配置文件
2:修改启动目标
使用grubby修改启动目标,实际上就是将内容添加到配置文件里面去,虽然使用systemctl get-default查看还是没有修改之前的,但是以内核里面的参数为主,所以的话使用systemctl set-default修改启动目标没有用,因为优先级的问题,想要回复原样的话,就要修改配置文件
3:/sysroot文件
这个目录下面是根文件系统的内容
系统在启动的时候,会先让initramfs(假根)的根文件系统挂载到/sysroot目录下面,有了驱动之后,就会让真正的根文件系统挂在到/sysroot,systemd初始化系统,开机
六:系统调优和内核模块
1)虚拟文件系统/proc
显示信息:
进程信息:/proc/PID
cpu信息:/proc/cpuinfo
内存资源:/proc/meminfo
磁盘信息:/proc/partition
2)sysctl配置内核参数
当前生效的内核参数在/proc/sys下
内核参数配置文件/etc/sysctl.conf和/etc/sysctl.d/*conf系统启动时读取
命令使用:
sysctl -a 列出当前生效的内核参数
临时修改内核参数:sysctl -w 内核参数=1
列如:
[root@cleint yum.repos.d]# sysctl -a | grep swap vm.swappiness = 60 [root@cleint yum.repos.d]# sysctl -w vm.swappiness=20 vm.swappiness = 20 [root@cleint yum.repos.d]# sysctl -p [root@cleint yum.repos.d]# sysctl -a | grep swap vm.swappiness = 20
这个数字越大,证明这个参数占的权重越大,反之,则小
使配置文件生效:sysctl -p
3)性能调优的思路
从架构上--->>>硬件升级---->>>>代码优化---->>>>配置优化
图解
4)调整调优的配置文件
[root@cleint yum.repos.d]# tuned-adm list Available profiles: - accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states - balanced - General non-specialized tuned profile - desktop - Optimize for the desktop use-case - hpc-compute - Optimize for HPC compute workloads - intel-sst - Configure for Intel Speed Select Base Frequency - latency-performance - Optimize for deterministic performance at the cost of increased power consumption - network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance - network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks - optimize-serial-console - Optimize for serial console use. - powersave - Optimize for low power consumption - throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads - virtual-guest - Optimize for running inside a virtual guest - virtual-host - Optimize for running KVM guests Current active profile: virtual-guest
上面的都是调优的参数,就是将系统最适合的,下次开机的时候,就能实现自动调优
配置目录:/usr/lib/tuned
查看系统推荐的调优配置级;
tuned-adm recommend
设置调优的优先级
tuned-adm profile 参数
这个目录下都是调优的文件/usr/lib/tuned
5)系统的设备文件
/dev/下面设备,并不是真正的设备,都是访问这些设备的接口
lsblk 下面的 maj:主版本号,确定设备类型
min:次版本号,就是一个编号
创建出一个设备文件
第一种方法:
dd 这个命令生成一个有大小的文件
losesetup /dev/设备文件 /dd生成文件的路径,其实就是做了一个映射
设备文件不存在的话,会自动的创建的
第二种方法:
mknod 设备 类型 主版本号 次版本号
6)内核模块
内核模块:实现一个特定的功能
内核模块的路径
/lib/modules/下面
内核模块相关的命令:
1、查看系统以加载的内核模块
lsmod
条目:
[root@cleint /]# lsmod | head -n 10 Module Size Used by loop 32768 1 binfmt_misc 28672 1 uinput 20480 1
module:模块名
size:大小
used:被使用了几次
by:依赖模块
2、加载内核模块
modprobe 模块名
3、卸载内核模块
modprobe -r 模块名