centOS7服务管理与启动流程


 

systemd简介

POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) -->rootfs --> /sbin/init

init:

CentOS : SysV init
CentOS : Upstart
CentOS : Systemd

Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程

Systemd新特性

  • 系统引导时实现服务并行启动
  • 按需启动守护进程
  • 自动化的服务依赖关系管理
  • 同时采用socket式与D-Bus总线式激活服务
  • 系统状态快照

unit对象

核心概念unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
配置文件

  • /usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
  • /run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
  • /etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
 

unit类型

Systemctl –t help 查看unit类型

  • Service unit: 文件扩展名为.service, 用于定义系统服务
  • Target unit: 文件扩展名为.target,用于模拟实现运行级别
  • Device unit: .device, 用于定义内核识别的设备
  • Mount unit: .mount, 定义文件系统挂载点
  • Socket unit: .socket, 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
  • Snapshot unit: .snapshot, 管理系统快照
  • Swap unit: .swap, 用于标识swap设备
  • Automount unit: .automount,文件系统的自动挂载点
  • Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

特性

关键特性

  • 基于socket的激活机制:socket与服务程序分离
  • 基于d-bus的激活机制:
  • 基于device的激活机制:
  • 基于path的激活机制:
  • 系统快照:保存各unit的当前状态信息于持久存储设备中向后兼容sysv init脚本

不兼容

  • systemctl命令固定不变,不可扩展
  • 非由systemd启动的服务,systemctl无法与之通信和控制
 

service unit文件格式

在/etc/systemd/system下的unit文件是系统管理员和用户使用
在/usr/lib/systemd/system下的供发行版打包者使用

在unit文件中,以“#” 开头的行后面的内容会被认为是注释,相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭,时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit file文件通常由三部分组成

  • [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
  • [Service]:与特定类型相关的专用选项;此处为Service类型
  • [Install]:定义由“systemctlenable”以及"systemctldisable“命令在实现服务启用或禁用时用到的一些选项

unit段的常用选项

  • Description:描述信息
  • After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
  • Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
  • Wants:依赖到的其它units,弱依赖
  • Conflicts:定义units间的冲突关系

Service段的常用选项

  • Type:定义影响ExecStart及相关参数的功能的unit进程启动类型

    • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    • forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
    • oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
    • dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
    • notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess 来让Systemd 接收消息
    • idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
  • EnvironmentFile:环境配置文件
  • ExecStart:指明启动unit要运行命令或脚本的绝对路径
  • ExecStartPre:ExecStart前运行
  • ExecStartPost:ExecStart后运行
  • ExecStop:指明停止unit要运行的命令或脚本
  • Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

Install段的常用选项

  • Alias:别名,可使用systemctlcommand Alias.service
  • RequiredBy:被哪些units所依赖,强依赖
  • WantedBy:被哪些units所依赖,弱依赖
  • Also:安装本服务的时候还要安装别的相关服务

注意:
对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启
systemctldaemon-reload

管理服务

管理系统服务

CentOS 7: service unit
注意:能兼容早期的服务脚本
命令
systemctl COMMAND name.service

- centOS6 CentOS7
启动 service name start systemctl start name.service
停止 service name stop systemctl stop name.service
重启 service name restart systemctl restart name.service
状态 service name status systemctl status name.service
条件式重启(已启动才重启,否则不做操作) service name condrestart systemctl try-restart name.service
重载或重启服务(先加载,再启动) - systemctl reload-or-restart name.service
重载或条件式重启服务 - systemctl reload-or-try-restart name.service
禁止自动和手动启动 - systemctl mask name.service
取消禁止 - systemctl unmask name.service
 

服务查看

- centOS6 CentOS7
查看某服务当前激活与否的状态 - systemctl is-active name.service
查看所有已经激活的服务 - systemctl list-units --type
查看所有服务 - systemctl list-units --type service --all
 

chkconfig命令的对应关系

- centOS6 CentOS7
设定某服务开机自启 chkconfig name on systemctl enable name.service
设定某服务开机禁止启动 chkconfig name off systemctl disable name.service
查看所有服务的开机自启状态 chkconfig --list systemctl list-unit-files --type service
用来列出该服务在哪些运行级别下启用和禁用 chkconfig sshd –list ls /etc/systemd/system/*.wants/sshd.service
查看服务是否开机自启 - systemctl is-enabled name.service
 

其他命令

- centOS6 CentOS7
查看服务的依赖关系 - systemctl list-dependencies name.service
杀掉进程 - systemctl kill unitname
切换至紧急救援模式 - systemctl rescue
切换至emergency模式 - systemctl emergency
关机 - systemctlhalt、systemctlpoweroff
重启 - systemctl reboot
挂起 - systemctl suspend
休眠 - systemctl hibernate
休眠并挂起 - systemctlhybrid-sleep
 

服务状态

systemctl list-unit-files --type service --all #显示状态
  • loaded:Unit配置文件已处理
  • active(running):一次或多次持续处理的运行
  • active(exited):成功完成一次性的配置
  • active(waiting):运行中,等待一个事件
  • inactive:不运行
  • enabled:开机启动
  • disabled:开机不启动
  • static:开机不启动,但可被另一个启用的服务激活
 

systemctl示例

显示所有单元状态

systemctl 或systemctl list-units

只显示服务单元的状态

systemctl --type=service

显示sshd服务单元

systemctl –l status sshd.service

验证sshd服务当前是否活动

systemctl is-active sshd

启动,停止和重启sshd服务

systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service

重新加载配置

systemctl reload sshd.service

列出活动状态的所有服务单元

systemctl list-units --type=service

列出所有服务单元

systemctl list-units --type=service --all

查看服务单元的启用和禁用状态

systemctl list-unit-files --type=service

列出失败的服务

systemctl --failed --type=service

列出依赖的单元

systemctl list-dependencies sshd

验证sshd服务是否开机启动

systemctl is-enabled sshd

禁用network,使之不能自动启动,但手动可以

systemctl disable network

启用network

systemctl enable network

禁用network,使之不能手动或自动启动

systemctl mask network

启用network

systemctl unmask network
 

运行级别

在centOS7上运行级别的含义已经和之前不同了,运行级别就是通过开启关闭不同的服务产生的效果,在从netOS7上,已然由.target来代替运行级别,我们可以称target为目标态,我们可以通过target定制更符合我们工作运行环境。
我们可以通过命令:ls /usr/lib/systemd/system/*.target查看我们的机器上有多少个target

"grub.cfg"140L,4397C written
[root@CT731 grub2]#ls /usr/lib/systemd/system/*.target
/usr/lib/systemd/system/anaconda.target
/usr/lib/systemd/system/basic.target
/usr/lib/systemd/system/bluetooth.target
/usr/lib/systemd/system/printer.target
...
/usr/lib/systemd/system/reboot.target
/usr/lib/systemd/system/rescue.target
/usr/lib/systemd/system/rpcbind.target
/usr/lib/systemd/system/runlevel0.target
/usr/lib/systemd/system/runlevel1.target
/usr/lib/systemd/system/runlevel2.target
...
/usr/lib/systemd/system/sleep.target
...

使用systemctl list-unit-files --type target --all可以查看所有目标态的状态,或者systemctl list-dependencies xxx.target命令查看目标态的依赖性。

在centOS7上所谓的目标态,其实就是由各种指定的服务和基础target组合而成的。

 

运行级别与target的对照

0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target

 

运行级别的切换

在centOS6上,我们切换级别使用init,在centOS7上虽然也能使用,但是已经不再是原来的程序了,现在我们使用systemctlisolate name.target来切换target。

比如,我们想切换到字符界面,我们就可以使用systemctlisolate multi-user.target来进行切换。要想切换运行级别,在/lib/systemd/system/*.target文件中AllowIsolate=yes才可以。(修改文件需执行systemctldaemon-reload才能生效)

在centOS7上如何查看运行的目标态呢,使用命令systemctl get-default
使用命令systemctl set-default name.target来修改我们的目标态。

我们看一下我们的默认目标态究竟为何物。

[root@CT731 ~]#locate default.target
/etc/systemd/system/default.target
[root@CT731 ~]#ll /etc/systemd/system/default.target
lrwxrwxrwx. root root 36Aug2507:/etc/systemd/system/default.target ->/lib/systemd/system/runlevel3.target

它其实就是创建了一个软链接到指定的target上去了

CentOS7引导顺序

  1. UEFi或BIOS初始化,运行POST开机自检
  2. 选择启动设备
  3. 引导装载程序, centos7是grub2
  4. 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  5. 加载initramfs驱动模块
  6. 加载内核选项
  7. 内核初始化,centos7使用systemd代替init
  8. 执行initrd.target所有单元,包括挂载/etc/fstab
  9. 从initramfs根文件系统切换到磁盘根目录
  10. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
  11. systemd执行sysinit.target初始化系统及basic.target准备操作系统
  12. systemd启动multi-user.target下的本机与服务器服务
  13. systemd执行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd执行multi-user.target下的getty.target及登录服务
  15. systemd执行graphical需要的服务
 

设置简单的内核参数

设置内核参数,只影响当次启动

  • 启动时,在linux16行后添加systemd.unit=desired.target

    • systemd.unit=emergency.target
    • systemd.unit=rescue.target
  • rescue.target 比emergency 支持更多的功能,例如日志等
  • systemctl default 进入默认target
 

简单的启动排错

在centOS7中,文件系统损坏,先尝试自动修复,失败则进入emergency shell,提示用户修复

  • 在/etc/fstab不存在对应的设备和UUID等一段时间,如不可用,进入emergency shell
  • 在/etc/fstab不存在对应挂载点,systemd尝试创建挂载点,否则提示进入emergency shell.
  • 在/etc/fstab不正确的挂载选项,提示进入emergency shell
 

虚拟机环境下破解centOS7root的口令

 

方法一

启动时任意键暂停启动

按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
 
按ctrl-x启动,然后:
mount –o remount,rw /sysroot

 
chroot /sysroot
passwd root
 
touch /.autorelabel
exit
reboot
 
然后可以使用设置的密码登录root

 

方法二

启动时任意键暂停启动(同方法1)
按e键进入编辑模式(同方法1)
将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
 
按ctrl-x启动
chroot /sysroot
 
passwd root
touch /.autorelabel

exit
reboot
最后,用新密码登录root

 

centOS7 grub2

在centOS6上,我们的grub文件是/boot/grub/grub.conf
在centOS7上,文件改成/boot/grub2/grub.cfg了,但是功能还是大致一样的都是用于加载内核的,不过在centOS7上设置默认启动项发生了一些变化,假如我们现在有两个内核,我们需要改变默认启动应该如何做到呢?

首先,vim /etc/default/grub打开如下文件:

GRUB_TIMEOUT=
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
~

打开文件后,我们修改GRUB_DEFAULT的值,和centOS一样,0代表第一个内核,1代表第二个,以此类推。
我们在修改完成后,并没有立即生效,使用grub2-mkconfig -o /boot/grub2/grub.cfg命令来生成grub2.cfg文件,我们在下次启动的时候就会默认选择新的默认内核。

 

实验:在centOS7下破坏前446字节并修复

第一步:破坏硬盘的前446字节:
dd if=/dev/zero of=/dev/sda bs=1 count=446

[root@CT731 ~]#dd if=/dev/zero of=/dev/sda bs= count=
+ records in
+ records out
bytes ( B) copied,0.000758682 s, kB/s
[root@CT731 ~]#hexdump -C -n /dev/sda
|................|
*
000001b000000000000000000000000000008020|...............|
000001c021008335700500080000000040000035|!..5p.......@..|
000001d0710583 fe ff ff fe |q.......@...@...|
000001e0 ff ff fe ff ff fe |............@...|
000001f0 ff ff fe ff ff c0 0c00 f8 3f0c55 aa |............?.U.|

第二步:重启计算机
由于我的虚拟机挂载了光盘,所以一重启就进入光盘启动的界面
 
上面有三项,我们选择第三项进入troubleshooting
进入第三项后,点击第二项,进入救援模式的centos的系统
 
然后我们进入如下模式:
选择1,继续进行:
 
接下来,我们就会进入到一个shell模式中,不需要切根,进行系统修复:

修复过程:
grub2-install --root-directory=/mnt/sysimage/ /dev/sda

我们来查看一下:
hexdump -C -n 512 /dev/sda

重启,修复完成。

 

实验:在centOS7下删除grub2下文件,并修复

第一步:删除grub2
rm -rf grub2

[root@CT731 boot]#rm -rf grub2
[root@CT731 boot]#ls
config-3.10.-.el7.x86_64
grub
initramfs--rescue-618d3baeb5754f7092242f811c7aa740.img
initramfs-3.10.-.el7.x86_64.img
initramfs-3.10.-.el7.x86_64kdump.img
initrd-plymouth.img
symvers-3.10.-.el7.x86_64.gz
System.map-3.10.-.el7.x86_64
vmlinuz--rescue-618d3baeb5754f7092242f811c7aa740
vmlinuz-3.10.-.el7.x86_64

第二步,重启计算机
进入如下界面:

接下来,我们重启系统,按Esc,进入光盘救援模式:
选择第三项,进入光盘救援(前提是挂载光盘)
以下步骤到进入shell同实验一相同,不在过多演示;

进入救援模式后:
第一步:切根
 
然后执行命令
grub2-install
 
下图中,我们可以看到在grub2文件夹中,还没有grub.cfg文件,接下来,我们需要生成:
 
生成配置文件:
进入到grub2下,
grub2-mkconfig -o grub.cfg
 
exit然后,
重启电脑:

完成!

centOS7服务管理与启动流程的更多相关文章

  1. netty服务端客户端启动流程分析

    服务端启动流程 我们回顾前面讲解的netty启动流程,服务端这边有两个EventLoopGroup,一个专门用来处理连接,一个用来处理后续的io事件 服务端启动还是跟nio一样,绑定端口进行监听,我们 ...

  2. CentOS7服务管理

    1.在/usr/lib/systemd/system目录下建立服务启动文件,文件格式:[root@Centos7 ]# cat /usr/lib/systemd/system/nginx.servic ...

  3. Centos7系统详细的启动流程

    熟悉系统启动流程对于我们学习Linux系统是非常有帮助的,虽然基础,但能帮助我们更加理解Linux系统的工作机制.以下将以CentOS发行版为例来介绍Linux系统的启动流程,因为在CentOS 5. ...

  4. CentOS7服务管理(重启,停止,自动启动命令)

    我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...

  5. centos7 服务管理

    服务脚本位置: /usr/lib/systemd/system  (开机不登录就能够运行的服务) /usr/lib/systemd/user      (用户登录后才能运行的服务) 服务脚本示例: [ ...

  6. 源码分析Dubbo服务消费端启动流程

    通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生 ...

  7. linux的服务管理(centos6和Centos7)和网络管理(网卡配置),计划服务cron

    服务和网络 管理 init  ifcfg ens33 1.服务: Linux系统中提供的功能,统称为服务,如:at服务.cron服务.web服务.FTP服务.sshd服务等. 服务是由已经在运行的进程 ...

  8. 玩转Windows服务系列——服务运行、停止流程浅析

    通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大家可要睁大眼睛看清楚了. 接下来研究一下Windows服务的 ...

  9. 玩转Windows服务系列——服务运行、停止流程浅析

    原文:玩转Windows服务系列——服务运行.停止流程浅析 通过研究Windows服务注册卸载的原理,感觉它并没有什么特别复杂的东西,Windows服务正在一步步退去它那神秘的面纱,至于是不是美女,大 ...

随机推荐

  1. sweetalert------一个非常萌的alert!

    今天逛github的时候发现一个非常萌的alert,比IE和各大浏览器的原alert美多惹. github项目地址:https://github.com/t4t5/sweetalert 通过git c ...

  2. 数据结构-二叉树 C和C++实现

    二叉树,指针域具有两个下一节点的特殊链表结构. 先来看看它的结构 (此处补图) 来看程序中需要使用到的概念: 树根:二叉树的第一个节点 子树:对于某一个节点指针域指向的节点,左指针指向的节点为左子节点 ...

  3. python+selenium自动化软件测试(第5章):Selenium Gird

    5.1 分布式(Grid) Selenium grid是用来分布式执行测试用例脚本的工具,比如测试人员经常要测试多浏览器的兼容性,那就可以用到grid了.下面就来介绍如何在多个浏览器上运行同一份脚本. ...

  4. STM32经典概述(干货 )

    STM32经典概述(干货 ) 首先,在学习Cortex-M3时,我们必须要知道必要的缩略语.  在网上看的,觉得挺好的,分享过来了 整理如下: AMBA:先进单片机总线架构   ADK:AMBA设计套 ...

  5. CSS边框外的小三角形+阴影效果的实现。

    ...虽然是一个很小的问题,但其实还是挺实用的. 实现一个边框外的角. 用纯CSS来写. 一开始实现的效果是这个样子的. 但是这个效果没有办法给他附带阴影,所以换了一种写法.实现成了这个样子 想要实现 ...

  6. spring-session 共享

    Spring session 共享 一.引入依赖 <dependency> <groupId>redis.clients</groupId> <artifac ...

  7. Centos 6 PXE安装

    author:JevonWei 版权声明:原创作品 192.168.198.134作为安装服务器,由httpd服务共享安装程序 192.168.198.134作为dhcp服务器,客户机获取IP 一.安 ...

  8. 移动webapp的那些bug

    bug持续更新中... 测试浏览器 Chrome: 61.0.3163.73 Safari: 10.0(IOS 10.3.3) Github: webapp-bugs 1. IOS overflow: ...

  9. chrome开发工具指南(一)

    注意:如果你是一个网页开发者同时想要获得最新版本的开发工具,那么你应该使用谷歌浏览器(金丝雀)Canary 版. Chrome 开发者工具 打开Chrome 开发者工具 选择浏览器位于浏览器窗口右上方 ...

  10. Redis在java中的使用

    1.首先安装Redis环境.可以在Windows.linux.别的服务器上搭建Redis环境 2.在java工程中导入必须的jar包 如maven上导入两个jar] <!-- Redis必须包 ...