19.服务管理和系统启动流程
一、systemctl管理服务service在Linux系统上我们所说的服务其实就是后台进程。当我们运行某个服务的时候这个程序对应的进程会在后台持续运行所以我们又叫他叫做后台服务/后台进程/守护进程对于超管来说你执行systemctl命令实际上是管理对应的服务systemctl命令是系统中systemd的管理工具系统上所有的服务和进程都是systemd接管的systemdd daemon守护进程守护进程是在系统后台持续运行的进程因为这些守护进程需要和用户对接和程序对接。持续监听..比如sshd.service服务守护进程后台进程。我们每一次使用ssh命令连接的时候都是和sshd服务建立连接对于Linux系统启动来说也有systemd的身影。从7版本开始是systemd7之前的版本是initd无论是systemd还是initd都是pid为1的进程都是属于系统的守护进程一对比systemd和initd1. initd启动的时候属于串行启动systemd启动的时候属于并行启动2. systemd启动服务的时候属于按需启动而initd启动服务的时候 有什么脚本就启动什么3. initd根据脚本启动systemd自动解决依赖二、systemd通过不同单元对象进行管理我们说的服务service其实就是systemd的其中一个单元对象[rootrhel9 ~]# systemctl -tautomount mount scope slice swap timerdevice path service socket target只需要关注service和targettarget 启动目标/运行级别决定系统开机会获得什么样的操作环境。是图形化环境呢还是命令行环境呢如果系统想要使用图形化选择和安装一个图形化桌面软件 GNOME UKUI然后选择对应的target graphical.target 开机会获取图形化操作环境三、systemctl管理服务[rootrhel9 ~]# systemctl list-unit-files --type service[rootrhel9 ~]# systemctl list-units --type serviceUNIT LOAD ACTIVE SUB DESCRIPTION accounts-daemon.service loaded active running Accounts ServiceLOADloaded正确加载的服务单元配置文件 /usr/lib/systemd/system/ACTIVE服务的高级状态SUB服务的低级状态对于管理员来说只关注高级状态DESCRIPTION服务的描述信息四、查看服务的状态1[rootrhel9 ~]#systemctl status sshd● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; preset: enabled)Active: active (running) since Sun 2026-03-22 09:33:12 CST; 31min agoDocs: man:sshd(8)man:sshd_config(5)Main PID: 13133 (sshd)Tasks: 7 (limit: 24400)Memory: 16.7MCPU: 2.817sCGroup: /system.slice/sshd.service├─12982 sshd-session: root [priv]├─12984 sshd-session: rootpts/2,pts/3├─12985 -bash├─13133 sshd: /usr/local/sshd/sbin/sshd -f /etc/ssh/sshd_config [listener] 0 of 10-10├─16838 -bash├─16866 systemctl status sshd└─16867 lessMar 22 09:33:12 rhel9.exampel.com systemd[1]: Starting OpenSSH server daemon...Mar 22 09:33:12 rhel9.exampel.com sshd[13133]: Server listening on 0.0.0.0 port 22.2查看是否开机自启动[rootrhel9 ~]#systemctlis-enabledatdenabled[rootrhel9 ~]# systemctl is-enabled sshddisabled五、启动/关闭/重启服务[rootrhel9 ~]# systemctl start sshd##打开服务[rootrhel9 ~]# systemctl stop sshd##关闭服务[rootrhel9 ~]# systemctl restart sshd##重启服务[rootrhel9 ~]# systemctl reload sshd#可以不重启也能够读到最新的配置。而且pid是不会变化的#不是所有的服务都支持reload六、设置开机自启动一开启开机自启动[rootrhel9 ~]#systemctl enable sshdCreated symlink /etc/systemd/system/multi-user.target.wants/sshd.service → /usr/lib/systemd/system/sshd.service.二关闭开机自启动[rootrhel9 ~]#systemctl disable sshdRemoved /etc/systemd/system/multi-user.target.wants/sshd.service.##所谓的开机自启动就是在/etc/systemd/system/multi-user.target.wants目录下创建了一个指向/usr/lib/systemd/system目录下的软连接文件而已七、修改服务的服务单元配置文件问题一查看sshd的服务单元配置文件[rootlab2 ~]# systemctl status sshd● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; preset: enabled)##使用systemctl status sshd查看到服务配置文件的路径Active: active (running) since Tue 2026-03-24 10:21:08 CST; 16min ago[rootlab2 ~]# vim /usr/lib/systemd/system/sshd.service服务的单元配置文件/usr/lib/systemd/system目录我们执行的所有的systemctl start/stop/restart等操作都是执行的这个目录下的服务单元配置文件中的内容如果你手动修改了这个服务单元配置文件必须要执行systemctl daemon-reload才会生效八、 systemctl mask/umask 屏蔽服务服务之间是可以彼此拉活的比如nfs-server服务和rpcbind.socket一mask锁定[rootlab1 ~]# systemctl mask rpcbind.socket二umask解锁[rootlab1 ~]# systemctl unmask rpcbind.socket如果屏蔽了rpcbind.socket那么nfs-server启动的时候是无法拉活rpcbind.socket此时nfs-server会启动失败[rootrhel9 ~]# systemctl list-dependencies nfs-servernfs-server.service○ ├─auth-rpcgss-module.service○ ├─nfs-idmapd.service○ ├─nfs-mountd.service● ├─nfsdcld.service● ├─proc-fs-nfsd.mount● ├─rpc-statd-notify.service● ├─rpc-statd.service● ├─rpcbind.socket● ├─system.slice● ├─network-online.target● │ └─NetworkManager-wait-online.service● └─network.targetmask的存在是为了解决服务之间的冲突问题比如系统的网络服务NetworkManager和network如果系统同时存在俩个服务的话可能会造成网络问题网络无法正常使用。即使你手动关闭其中一个服务也作用不大因为这个服务很有可能可以被其他的服务拉活为了防止这类问题的发生所以通过mask来屏蔽服务被mask掉的服务无法手动启动也无法被其他服务拉活九、systemd管理服务命令和initd管理服务命令区别一initd管理服务的命令##老版本是没有systemctl命令的service 服务名 start/stop/restart/status##本质就是进入到/etc/initd目录下执行脚本文件chkconfig 服务名 on/off##在/etc/initd目录下实现开机自启和关闭功能。二 systemctl管理启动目标target启动目标/运行级别—系统开机之后获取到的操作环境老版本习惯叫做运行级别当前版本习惯叫做启动目标三运行级别有自己一套命令5图形化桌面前提是系统安装了桌面软件3命令行页面0关机 poweroff6重启 restart[rootrhel9 ~]# runlevelN 5[rootrhel9 ~]# init 3四启动目标有自己一套命令[rootrhel9 ~]# systemctl get-default##查看默认是什么页面graphical.target##图形页面[rootrhel9 ~]# systemctl set-default multi-user.target##永久设置开机启动为命令行页面[rootrhel9 ~]# systemctl isolate graphical.target##立刻切换为图形页面[rootrhel9 ~]# cat /etc/inittab ##帮助手册# inittab is no longer used.## ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.#十、Linux开机故障处理一引导配置文件丢失/boot/grub2/grub.cfg配置文件丢失开机无法被grub2引导程序加载则无法看到内核菜单页面1.系统还没有关机是可以通过命令重新生成grub.cfg配置文件的[rootrhel9 ~]#grub2-mkconfig-o/boot/grub2/grub.cfgGenerating grub configuration file ...Adding boot menu entry for UEFI Firmware Settings ...done2.系统已经关机再开机会看见下面的情况内核菜单没有了之所以无法启动完全是因为grub2引导程序不知道内核文件、initramfs文件、真正的根文件系统解在哪儿—在grub2引导程序下通过命令的方式临时告诉grub2内核文件的路径、initramf文件路径、真正的根系统路径问题1内核文件路径、initramfs文件路径是在/boot分区下的。在grub2引导程序中你是需要指定这个/boot分区的那么/boot分区是磁盘的第几个分区呢hd0第一个磁盘hd0msdos1 第一个磁盘的第一个分区MBR分区。如果是GPT分区hd0msdos2 第一个磁盘的第二个分区hd0msdos3 第一个磁盘的第三个分区hd1 第二个磁盘问题2根文件系统怎么找根文件系统和磁盘的类型相关1如果安装系统的时候分区分区的时候选择的类型是LVM做的话那么根文件系统的路径非常明显RHEL/dev/mapper/rhel-rootCentOS/dev/mapper/cs-root/dev/mapper/centos-root2如果安装系统的时候分区的时候选择的是标准分区的话根文件系统路径就和磁盘类型相关了如果系统盘是scsi这种类型/dev/sda2 /dev/sda3 都有可能如果系统盘是nvme这种类型/dev/nvme0n1p2 /dev/nvme0n1p2 都有可能第一步指定boot分区set root(hd0,msods1)#做的时候不要直接抄 因为我的boot分区是 hd0,msdos1.你的不一定##指定后输入ls / 看信息是否有这些有就是对的。第二步指定linux和initrd路径linux /vmlinuz-5.14.0-362xxxxx root/dev/nvme0n1p3 ro##root是正真根的位置initrd /initramfs-5.14.0-362xxxx.img bootboot二grub2引导程序故障开机是无法加载引导程序的无法加载引导程序就无法读取到grub.cfg引导配置文件开机时系统会读取磁盘的前446位来获取开机引导现在将前446位代码覆盖掉 重启之后如果看到的是安装系统页面或者是那个网卡加载的页面都是正常的。因为磁盘的引导程序读不到了系统开机的时候认为磁盘里面没有东西于是延顺继续读取光盘如果光盘里面没有东西最后就读网卡修复故障在bios模式下安装引导程序grub2-install /dev/nvme0n1在UEFI模式下安装引导程序yum install shim-x64 / grub2-efi-x64上面的命令应该去哪里执行到救援模式光盘自带一个小型文件系统在这个模式下我们可以执行命令来修复系统第一步先判断该系统采用的是什么启动。通过vmware虚拟机即可查看到是什么方式启动此时此刻这是光盘里面的根不是真正的根真正的根在上面提示你了在/mnt/sysroot第二步输入lsblk命令查看块设备。我们可以清晰的看见根在什么地方磁盘在什么地方boot在什么地方。为引导配置文件做准备的。第三步输入chroot /mnt/sysroot切换到真根下。第四步如果是bios模式则输入grub2-install /dev/nvme0n1 。再执行exit退出真根再执行exit退出假根并重新启动主机。修护成功第四步如果是UEFI模式则需要先将磁盘挂载到目录下。找到磁盘并挂载第五步配置yum仓库在/etc/yum.repos.d/下创建一个以.repo结尾的文件第六步输入yum install shim-x64 再输入exit退出并重启你会发现还是进不去。出现了这些日志这个是因为在/boot/efi/目录下很多文件有大部分文件是来自于shim-x64。但是还有很多文件不是来自于这个包的。通过命令yum provides找到包第七步重新进入救援模式光盘挂载在1.0中这个你可以通过虚拟机的设置看见。并将光盘再次挂载设置yum仓库第八步使用yum provides来安装剩余的包。结合第六步的日志输入yum provides */grubx64.efi第九步安装grub2-efi-x64输入yum reinstall grub2-efi-x64 exit退出并重启第十步临时指引引导配置文件第一个修护的步骤参考上面三重置root密码##考试会考特别重要root密码的重置前提1. 系统是需要重启的2. 需要看到系统的启动页面必须要看到内核菜单第一步开机选择救援内核第二步按e编辑内核参数找到linux这一行然后删除字符一直到ro的后面添加内核参数rd.break最后按ctrl x继续引导启动第三步重新挂载根并且要以读写的方式挂载mount -o remount,rw/sysroot手动执行chroot/sysroot命令把当前的根切换到真正的根中第四步passwd root 修改root密码第五步selinux是开启的状态enabled那么你必须要多做一步操作touch /.autorelabel##可以使用 man selinux /auto 筛选出/.autorelabel