RHCE(服务管理和系统启动流程)

qm77 / 2024-03-04 / 原文

一:系统的简介

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就进入里面了

下次重启后,还是会会回复到原来的地方

三:系统启动的流程和查看内核

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:修改默认的内核

1)grubby --set-default 内核路径  也就是/boot下面的内核文件

2)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:/etc/default/grub和/boot/loader/entries/下面的内核是/boot/grub/grub.cfg的2个变量文件,修改这2个变量文件,就是在修改这个grub.cfg,唯一的区别就是,/etc/default/grub写死了,改变里面的变量后,要执行命令重新生成/boot/grub/grub.cfg这个配置文件;/boot/loader/entries/下面的内核是实时更新的,也就是在里面修改了内容后,会同步上去,所以不需要重新生成配置文件;另外这些都是内核的组成之一

 

2:修改启动目标

使用grubby修改启动目标,实际上就是将内容添加到配置文件里面去,