前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第十五章 系统服务管理

第十五章 系统服务管理

作者头像
晓天
发布2019-07-04 14:21:11
1.8K0
发布2019-07-04 14:21:11
举报

第十五章 系统服务管理

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:以上过程可能和很多网络教程、书籍步骤不同,但更为实用、通用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 教主小筑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档