第十五章 系统服务管理

第十五章 系统服务管理

15.1 系统服务管理

服务是什么?先来看一下服务的定义:一台主机上提供的、运行的各种功能统称为服务。有本机内服务,如:at,cron,有对外的网络服务,如:web、ftp等,又称为业务、应用。下面我们来分析一下Linux中服务的具体管理。

15.1.1 RHEL7.X服务管理

之前讲过,RHEL7.X(即redhat、centos)的版本中,系统内核使用的是3.X.X版本的,即第三个大版本,它与之前的2版本发生的很大的变化,很多配置、有其是服务、shell、内核等方面都有了很大的提升。上章讲过,RHEL7.X的根进程是systemd,也就是说RHEL7.X是以systemd进程管理系统的所有进程及服务的。相关操作命令是systemctl。

例如,我们要查看系统中所有的服务,可用如下命令:

systemctl list-unit-files ---查看本机内的所有服务

注:显示结果为两列:服务名、开机状态,其中static表示系统的必备服务,disabled表示开机处于关闭状态,enabled表示开机自动启动。

命令显示的服务很多,所以我们可以使用grep抓取要查看的服务。

systemctllist-unit-files | grep crond ---抓取显示指定服务的开机状态。

那么,要想更改某个服务的开机状态,可以用如下命令:

systemctl enable crond.service ---设定指定服务,开机自动启动

systemctl disable crond ---设定指定服务,开机后处于关闭状态

systemctl list-unit-files| grep crond ---可查看到效果

注:指定服务时,标准写法:crond.service 但systemctl命令支持服务只写进程名的模式,如:crond。

tips:设置服务的开机装填,也可以使用chkconfig命令,这个命令是RHEL7.0之前版本所使用的,7.X中仍然兼容,例如:chkconfig crond on 表示开机自启动,或者off表示开机自关闭。

Linux中,对于服务、进程命名也有自己的习惯:服务名代表某项功能,服务的运行程序,即进程名一般命名为 “服务d”的格式,如:cron服务的进程是crond。所以使用systemctl配置服务状态时,使用的都是进程名,即“服务d”的名字。

刚才设置了服务开机状态,但是,当前服务的状态该如何配置呢?使用的是服务的启停参数:

systemctl stop crond ---当前立即关闭指定服务

systemctl start crond ---启动服务

syetemctl restart crond ---重启,更改了服务的配置文件后,会做重启

systemctl status crond ---查看服务的当前状态:active激活态

inactive非激活态,即关闭状态

另外,既然系统中有这么多的服务,按照Linux的一贯习惯,每个服务一定都会有其对应的服务文件,这些文件统一都存放在/usr/lib/systemd/system/目录下,并大多以.service后缀,大家可以自行cd进去,查看一下,这个位置十分重要,希望大家可以记住。

tips:RHEL7.0之前的6.X、5.X的系统,由于内核使用的是2.X.X的版本,原理与7.X差别比较大,使用的是ntsysv命令查看并配置服务开机状态的。

15.2 系统启动级别管理

15.2.1 开机级别

我们已经知道,Linux中共有7中运行级别,分别是0-6级,那么这些级别的启动原理是什么呢?下面我们来详细分析一下。

首先,我们之前已经学过,查看开机级别的命令是:systemctlget-default,设置开机级别的命令是:systemctl set-default multi-user.target。除了我们已经学过的multi-user.target和graphical.target两种对应字符(3级别)、图形(5级别)外,其他几种级别的对应是什么呢?这就要去查看Linux的级别文件了。

其实,系统的开机级别文件,与服务文件存放位置相同,也存放在/usr/lib/systemd/system/目录下,后缀大多以.target结尾。我们同样可以cd进去查看一下,会发现里面有很多.target结尾的文件,为什么会有这么多呢?其实Linux本身的启动级别只有0-6级,共7个级别,但有这么多级别文件的原因是可以让同级别下有多种启动状态,尤其是针对3和5级别,可以让同一级别在开机时启动不同的服务或功能,以便使用者有多种备用方案。

另外,目录中还会看到有runlevel0.target到runlevel6.target七个级别的启动文件,但是这七个都是软链接,ll查看可见到它们真实指向的级别文件,如下图:

上图中可见,每个级别文件对应的各个级别的功能,但是会发现2-4级别其实指向的是同一个级别文件,都是字符界面,只是启动时开启的服务不同,如:2级别是不启动网络通信服务的,具体原理将放到下一节介绍。

我们先来继续介绍开机级别,既然系统中有这么多的级别,开机时是如何设定的呢?其实这是很简单的,因为RHEL7.X中有一个专门表示开机级别的配置文件,这个文件就是/etc/system/system/default.target。这个文件是一个软链接文件,它指向哪个级别文件,谁就是开机级别。如下图:

当我们更改开机级别时,实质上就是更改的这个文件的指向,可以用如下实验证明:

如上图可见,当更改了软链接指向后,再查看开机级别就是软链接新设置的目录文件了。而用systemctl set-default设置开机级别时,提示信息显示的也是先删除的软链接,又重建的软链接。

15.2.2 级别启动服务

上节还提到了每个级别的开机自启服务,这里就来介绍下它的原理。其实在我们设置某个服务开机自启或关闭时,Linux会有很明确的提示,如下图:

通过上图可知,当我们设置crond服务开机关闭时,提示告诉我们删除了某个文件,当又设置crond服务开机自启时,系统又创建了某个文件。那么,原理显而易见了。其实无论图形或字符界面,它的开机服务管理都统一在/etc/systemd/system/multi-user.target.wants/目录中做设置,该目录中也都是一些软链接,指向/usr/lib/systemd/system/目录下的各个服务文件,即只要是有软链接指向的服务,就是开机自启服务,没有软链接指向的服务,开机就会关闭。以atd为例,大家可参看下图:

图中可见软链接atd.service的指向,正是指向的atd的服务文件,当我们把atd设置为开机关闭状态时,再查看目录下就没有atd的软链接了。

图形和字符界面都是用/etc/systemd/system/multi-user.target.wants/目录的原因是:因为图形也是完全功能模式的,只是在3级别基础上又增加了图形化管理界面,所以二者从根本上上来讲是一样的。即开机时先开启3级别后,又开启的5级别的图形界面。

tips:

RHEL6.X及之前版本简介:

vi /etc/inittab ---编辑开机级别文件,

注:文件中的 id:3:initdefault 行文字,表示开机级别,数字代表级别,可人为更改

开机服务原理

cd /etc/rc.d/init.d ---进入存放系统所有服务文件的目录

cd /etc/rc.d

ls ---可见名叫rcX.d的6个目录,X表示级别0-6,即是0-6个级别对应的专用目录

cd rc3.d ---进入3级别的专用目录

ll ---可看到多个软链接,都指向/etc/rc.d/init.d/ 中的进程文件

即:有软链接的开机自启,没有软链接的开机关闭

注:ll后可见到软链接名有两类,一类是以K开头,一类是以S开头

K开头的是系统关机时运行的软链接,S开头的是系统开机时运行的软链接,会按后面的数字排序先后执行。

15.3 引导程序

15.3.1 引导程序原理

说道引导程序,就又要提到MBR了。之前讲过,在磁盘的首扇区MBR中,存放着分区表与引导程序。其实,真正存放的并不是引导程序本身,而是引导程序所在磁盘的位置,因为每块磁盘的最开头的一段区间并不会给分区使用,而是独立于各分区之外,存放磁盘管理属性、引导程序等信息,这就是为什么我们在fdisk –l时发现sda1的开始扇区并不是0或1,而是2048的原因了(tips:还记得否?可自行再次查看一下)。而开机时,主板通过磁盘的MBR,就可以找到并激活引导程序了。再通过引导程序,找到磁盘分区内存放的操作系统启动程序。在Linux中,系统的启动程序统一存放于/boot/目录中,所以为了安全和稳定,我们在安装系统时/boot/做了独立分区的挂载。

我们知道,不同操作系统启动原理也不尽相同,所以Linux在安装时会把自己的引导程序写入到磁盘的引导,Linux的引导程序名是grub程序(老版的还有lilo程序,较为少用)。

而在这里,值得解释的是,windows也有自己的引导程序,但是并不兼容Linux,即不能识别、引导Linux系统,反而,Linux的grub程序是兼容、识别windows的,所以在一台双系统的电脑上,若要想让windows和Linux并存,必须先装windows后装Linux,这样后装的引导程序会覆盖先装的,则grub仍可引导其windows来。若反过来,windows是引导不了Linux的。我们在Linux开机时见到的选择界面即是grub引导界面,如下图:

那么,grub的大体原理、它又是如何查找到系统启动程序的呢?带着这些问题,我们来学习以下内容。

15.3.2 Linux开机顺序

从点开计算机的电源开始,Linux的开机顺序与windows的前几步都类似,只是后面加载内核之后各自步骤不同了。下面,我们来看一下Linux的启动顺序:

点击电源开关后:主板bios加电自检=>=>激活磁盘,读取磁盘的MBR(首扇区)=>激活磁盘上的引导程序,grub=>加载、激活内核(初始化硬件,启动systemd根进程)=>读取/etc/fstab,挂载各文件系统=>读取开机级别文件=>启动相应的级别,及其各个服务=>login登录=>启动shell

逐步分析:

主板加电自检就是检测主板上个硬件的型号、是否正常工作等,如有故障硬件,则会报警或无法开机,如:内存故障会黑屏或有滴滴的响叫。

读取MBR就是获取分区表信息,并要查找到引导程序位置,启动引导程序grub。

之后,通过在grub界面的选择,或者不做选择等倒计时完毕,自动进入默认的第一个系统中,则会加载系统内核kernel,而内核kernel就会扫描所有硬件,初始化硬件管理(系统内核主要功能就是管理硬件,调度各硬件传输数据,管理CPU各队列的),并启动系统的根进程systemd。PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统,读取配置文件/boot/grub2/grub.cfg。

内核启动成功后,就开始读取/etc/fstab文件系统配置文件,挂载各文件系统,此时,就会把/boot/中的各系统启动程序运行起来了。如此Linux的核心程序启动完毕。

系统核心启动之后,就会读取启动级别文件,启动相应的级别,并启动各自启的服务。

指定的级别启动后,就可以login登录验证了,登录成功后,根据/etc/passwd中用户的设置,启动相应的shell。

15.3.3 grub简介

从以上启动顺序来看,最关键的一环还是grub引导程序。那么grub的程序、信息是如何记录的呢?其实很简单,它还是以配置文件的形式存在的。

grub配置文件是:/etc/grub2.cfg,该文件其实是一个软链接,指向真正的grub配置文件:/boot/grub2/grub.cfg。可以vi编辑一下看看它的内容:

vi /etc/grub2.cfg ---其中各项功能如下:

timeout ---设置grub界面的倒计时时间,默认5秒,若倒计时结束,未做选择,则直接进入默认选中项,即第一项

menuentry .... ---设置grub界面的一个供选项(即15.3.1节图中显示有两项,所以该配置文件中会有menuentry的两个模块),后面的''中是显示在grub界面的文字,下面{}中是该项对应的执行代码。{}中的insmod 指定加载进来的支持的文件系统类型,如:

insmod ntfs ---即支持windows的文件系统

setroot='hd0,msdos1' ---是定本项的操作系统,所在的磁盘和分区

注:此项最为关键,root表示系统的启动路径在哪,hd0表示本机的第一块磁盘,即sda,msdos1表示dos分区表中的第一个分区,即sda1,也就是/boot/目录挂载的分区。

其他内容的代码,是以shell编程的方式编写的,读者可以在学习完shell编程后,再回顾此文件的内容。另,初学者对此文件会比较难以理解,可以暂时滞后,在入行的初期,使用较少,可以等有了一定的工作经验,并对Linux系统、内核、shell编程等方面有了一定的理解后再做研究,在此也不介绍太多,以免扰乱大家的思路。

15.4 Trouble Shooting

所谓Trouble Shooting,就是系统的一些故障解决,当然硬件故障需要更换硬件,但系统一般性问题,我们还是可以通过启动顺序的分析、grub程序来解决的,这里,我们主要介绍三个常见问题的解决方式。

15.4.1 grub.cfg文件丢失

若在正常使用过程中,不慎将/boot/grub2/grub.cfg删除了,则当重启系统时,由于grub引导程序丢失,则无法开机启动了,系统会自动进入grub启动界面,如下图:

则此时,需要按照如下步骤恢复:

解决思路:开机时由于grub.cfg丢失,所以无法正常启用grub引导程序,

所以开机会进入grub管理界面,人为用命令帮助grub指定系统的各个启动项,如:启动程序,根目录,内核等的位置。让grub能够引导开机进入系统,进入后重建grub.cfg

命令如下:

grub>ls --- 查看当前磁盘及磁盘分区,命名按 hd0,msdos1 格式标识的各分区,一般/boot/都在第一个分区上,即hd0,msdos1

grub>ls (hd0,msdos1)/ ---查看指定分区内的文件,以确定msdos1 就是/boot/分区,可见原/boot/下的各文件

grub>insmod/grub2/i386-pc/linux.mod --- 加载linux的grub2模块

grub>setroot=(hd0,msdos1) --- 指定/boot/所在的分区

grub>linux16 /vmlinuz-内核版本号 root=/dev/sda3

--- 加载内核,同时设定系统根分区(/)

grub>initrd16 /initramfs-内核版本号.img --- 加载initramfs

注:内核版本号可由另一台同系统的主机上用uname –a得到,或者在本机正常时提前做好内核版本备份,如:3.10.0-693.el7.x86_64

grub>boot ---启动系统

启动成功后,会正常进入系统,然后输入如下命令:

grub2-mkconfig-o /boot/grub2/grub.cfg --- 重新生成grub.cfg文件

注:其实若/boot/grub2/grub.cfg文件丢失,只要发现的早,在还未关闭系统时,直接输入本命令,即可恢复了。

15.4.2 默认启动级别修复

若Linux系统备份恶意更改,改开机级别为reboot.target或hat.target,则开机后会立即重启或关闭,则无法正常启动系统。此时,我们需要在系统读取完grub,但并未读取开机级别文件(/etc/systemd/system/default.target)时,手动介入,让系统进入单用户模式下,即1级别,进程开机级别修复。具体过程如下:

1)开机的grub界面中,点上、下键,取消倒计时

2)选中正常启动项,即第一项,点e键,进入该项的代码编辑界面,显示的即是/etc/grub2.cfg中该项的{}中的代码

3)找到Linux 16 行(注:有回行),最后追加:systemd.unit=rescue.target ,指定启动进入单用户模式

注:该操作,仅是临时更改了代码,并未真正的写入到/etc/grub2.cfg配置文件中

4)ctrl+x组合键,启动配置,进入到单用户模式

5)直接输入root密码登录

6)systemctl set-default multi-user.target ---恢复成正常级别

7)reboot ---重启后即可恢复正常了。

15.4.3 默认启动级别修复

若是普通用户密码丢失,大可以使用root登录系统后,重新设置用户的密码,但当root密码丢失后,则比较麻烦,需要再grub引导程序中做多步操作。

操作思路:

按Linux的启动顺序,在加载完内核后,会读取/etc/fstab挂载各文件系统,则/etc/passwd和/etc/shadow便可读取并做验证了,我们需要做的是,在Linux加载完内核后,立即停止/etc/fstab的读取,即停止挂载文件系统,而让系统转入到内核中的精简shell,即sh中(因为正常的shell,即/bin/bash是在验证登录成功后才可启用),这样就无法读取/etc/passwd和/etc/shadow,也就躲避了身份验证。进入sh后,再手动挂载各文件系统,并转回/bin/bash,此时已经进入到shell中,就越过的身份验证环节,再passwd命令设置新的密码即可。

具体操作:

开机的grub界面中,点上、下键,取消倒计时

选中正常启动项,点e键,进入该项的代码编辑界面

找到Linux 16 行,改ro为:rw init=/sysroot/bin/sh

---让引导程序躲避磁盘挂载,直接进入sh

ctrl+x组合键,启动配置,进入了sh 界面

tips:sh是最精简、最原始的shell。sh界面下无家目录,默认进入/,且只是用内部命令,很多命令会不可用,如:clear。

mount -o rw,remount /sysroot ---重新加载磁盘,挂载分区

chroot /sysroot /bin/bash ---切换回磁盘分区中,且切换到bash状态

unsetLANG ---清语言,回到英文状态

passwd ---更改root密码

touch /.autorelabel ---创建selinux使用的自动标签文件,若selinux默认已关闭,则可不用创建

注:selinux是Linux系统中一个保护程序,会保护系统安全,及各服务、进程不受攻击,所以grub中更改密码需要selinux的通过

exit ---退回到sh

reboot

重启后,稍等片刻,即可用root用户及新密码登录了。

tips:以上过程可能和很多网络教程、书籍步骤不同,但更为实用、通用。

原文发布于微信公众号 - 教主小筑(gh_e0879483602d)

原文发表时间:2019-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券