深入浅析centos7中的systemd

系统启动流程

 POST --> Boot Sequence --> Bootloader --> kernel+initramfs(initrd) --> rootfs --> /sbin/init
 init:
  CentOS 5: SysV init
  CentOS 6: Upstart
  CentOS 7: Systemd

systemd

系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程。
 新特性:
  系统引导时实现服务并行启动
  按需启动守护进程
  自动化的服务依赖关系管理
  同时采用socket式与D-Bus总线式激活服务
  系统状态快照
 核心概念:unit
  unit 表示不同类型的systemd对象,通过配置文件进行标识和配置。
  文件中主要包含了系统服务、监听socket 、保存的系统快照以及其它与init 相关的信息。
 配置文件:
  /usr/lib/systemd/system:
   每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
  /run/systemd/system:
   系统执行过程中所产生的服务脚本,比/usr/lib/systemd/system目录优先运行
  /etc/systemd/system:
   管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx 类的功能,比/run/systemd/system目录优先运行
 关键特性:
  基于socket 的激活机制: socket 与服务程序分离
  基于d-bus 的激活机制:
  基于device 的激活机制:
  基于path 的激活机制:
  系统快照: 保存各unit的当前状态信息于持久存储设备中,向后兼容sysv init 脚本
 不兼容:
  systemctl 命令固定不变,不可扩展
  非由systemd 启动的服务,systemctl无法与之通信和控制

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 目录

服务管理

`centos7几乎一切服务都是由systemctl来管理service unit,centos7之前的service同时仍然兼容。

运行级别

 target units:
  unit 配置文件:
   .target,用于模拟实现运行级别
  ls /usr/lib/systemd/system/*.target
  systemctl list-unit-files --type target --all
 运行级别:
  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
 查看依赖性:
  systemctl list-dependencies graphical.target

 级别切换:
  init N ==> systemctl isolate name.target
  systemctl isolate multi-user.target
  注意:只有/lib/systemd/system/*.target 文件中AllowIsolate=yes才能切换,修改文件需执行systemctl daemon-reload 才能生效
 查看target:
  systemctl list-units --type target
 获取默认运行级别:
  /etc/inittab ==> systemctl get-default
  runlevel
  who -r
 修改默认级别:
  /etc/inittab ==> systemctl set-default name.target
  systemctl set-default multi-user.target
  ls –l /etc/systemd/system/default.target
 切换至紧急救援模式:
  相当于init 1
  systemctl rescue
 切换至emergency 模式:
  systemctl emergency
 其它常用命令:
  传统命令init ,poweroff ,halt ,reboot 都成为 systemctl 的软链接
  关机:systemctl halt 、systemctl poweroff
  重启:systemctl reboot
  挂起:systemctl suspend
  休眠: :systemctl hibernate
  休眠并挂起:systemctl hybrid-sleep

CentOS7 引导启动顺序

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

service unit 文件格式

 /etc/systemd/system :
  系统管理员和用户使用
 /usr/lib/systemd/system :
  发行版打包者使用
 相关布尔值
  1 、yes 、on 、true 都是开启
  0 、no 、off、false 都是关闭
 时间单位
  默认是秒,所以要用毫秒(ms )分钟(m )等须显式说明
 service unit file 文件通常由三部分组成:
  [Unit] : 定义与Unit 类型无关的通用选项;用于提供unit 的描述信息、unit 行为及依赖关系等
  [Service] : 与特定类型相关的专用选项;此处为Service 类型
  [Install] : 定义由“systemctl enable” 以及"systemctl disable“ 命令在实现服务启用或禁用时用到的一些选项
 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 : 别名,可使用systemctl command Alias.service
  RequiredBy : 被哪些units所依赖,强依赖
  WantedBy : 被哪些units所依赖,弱依赖
  Also : 安装本服务的时候还要安装别的相关服务
 注意:
  对于新创建的unit文件,或者修改了的unit文件,要通知systemd 重载此配置文件, 可以选择重启
  systemctl daemon-reload
 示例:
  vim /etc/systemd/system/bak.service
   [Unit]
   Description=backup /etc
   Requires=atd.service
   [Service]
   Type=simple
   ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
   [Install]
   WantedBy=multi-user.target
  systemctl daemon-reload
  systemctl start bak

设置内核参数

只影响当次启动
 启动时,在linux16 行后添加
 systemd.unit=desired.target
 systemd.unit=emergency.target
 systemd.unit=recure.target
 recure.target比emergency支持更多的功能,例如日志等

启动排错

 文件系统损坏,先尝试自动修复,失败则进入emergency shell,提示用户修复
 在/etc/fstab 不存在对应的设备和UUID等一段时间,如不可用,进入emergency shell
 在/etc/fstab 不存在对应挂载点systemd尝试创建挂载点,否则提示进入emergency shell.
 在/etc/fstab 不正确的挂载选项提示进入emergency shell

破解CentOS7 的root 口令

方法一
  启动时任意键暂停启动
  按e 键进入编辑模式
  将光标移动linux16 开始的行,添加内核参数rd.break
  按ctrl-x 启动
  mount –o remount,rw /sysroot
  chroot /sysroot
  passwd root
  touch /.autorelabel
  exit
  reboot
 方法二
  启动时任意键暂停启动
  按e 键进入编辑模式
  将光标移动linux16 开始的行,改为rw init=/sysroot/bin/sh
  按ctrl-x 启动
  chroot /sysroot
  passwd root
  touch /.autorelabel
  exit
  reboot

       修复GRUB2

 GRUB “the Grand Unified Bootloader” ”
  引导提示时可以使用命令行界面
  可从文件系统引导
 主要配置文件 /boot/grub2/grub.cfg
 修复配置文件
  grub2-mkconfig > /boot/grub2/grub.cfg
  grub2-mkconfig -o /boot/grub2/grub.cfg
 修复grub
  grub2-install /dev/sda (BIOS 环境)
  grub2-install (UEFI 环境)
 调整默认启动内核
  vim /etc/default/grub
  GRUB_DEFAULT=0

总结

以上所述是小编给大家介绍的centos7中的systemd,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • 深入浅析centos7中的systemd

    系统启动流程 POST --> Boot Sequence --> Bootloader --> kernel+initramfs(initrd) --> rootfs --> /sbin/init init: CentOS 5: SysV init CentOS 6: Upstart CentOS 7: Systemd systemd 系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程. 新特性: 系统引导时实现服务并行启动 按需启动

  • 在Centos7 中更改Docker默认镜像和容器的位置

    一.Why? 通常,当你开始使用docker时,我们并不太关心Docker 用于存储镜像和容器的默认目录.当使用Docker进行更多实验时,Docker开始占用大量的空间时,你不得不按下紧急按钮.所以现在是时候把故障排除放在如何改变docker的默认存储位置了.费了很大力浏览了许多网站和论坛后,我无法确定在Centos7主机上更改Docker镜像和容器的默认目录的步骤.这篇文章提供了特定于Centos7的说明(它也适用于RHEL7).对于Debian,我可以找到很多文档和"如何"在互联

  • 浅析Linux中使用nohup及screen运行后台任务的示例和区别

    使用SSH终端(比如putty,xshell)连接Linux服务器上运行比较耗时任务,可能需要几个小时甚至几天才能完成,这时候终端被占据,我们还要做其他的任务呢,所以需要将这一类耗时任务放到后台来跑,只需要记录好日志就行了,有下面这些常用方法来实现这个需求. command & 在终端输入command &运行,这时候使用Ctrl + C中止命令将会失效,因为对&后台运行SIGINT1信号免疫,程序会继续运行. 但如果你直接关掉终端, 进程将跟着中止. 可见,使用&后台运行

  • 浅析angularJS中的ui-router和ng-grid模块

    在家里闲着无聊,正好在网上找到了一个关于angular的教程,学习了一下angular的ui-router和ng-grid这两个模块,顺便模仿着做了一个小小的东西. 代码已经上传到github上,地址在这里哟https://github.com/wwervin72/Angular. 有兴趣的小伙伴可以看看.那么然后这里我们就先来了解一下这两个模块的用法. 我们先来说说ui-router这个模块,这个模块主要是用来实现深层次的路由的.其实angular有个内置的指令ng-route,如果在项目中没

  • 浅析Python中的for 循环

    Python for 和其他语言一样,也可以用来循环遍历对象,本文章向大家介绍Python for 循环的使用方法和实例,需要的朋友可与参考一下. 一个循环是一个结构,导致第一个程序要重复一定次数.重复不断循环的条件仍是如此.当条件变为假,循环结束和程序的控制传递给后面的语句循环. for循环: 在Python for循环遍历序列的任何物品,如一个列表或一个字符串,有能力. for循环语法是: for iterating_var in sequence: statements(s) 如果一个序列

  • 浅析JavaScript中var that=this

    在阅读别人的代码时,发现别人写的代码中有这么一句:var that = this;,这代表什么意思呢?经过一番查阅,才明白是这么回事. 在JavaScript中,this代表的是当前对象. var that=this就是将当前的this对象复制一份到that变量中.这样做有什么意义呢? $('#conten').click(function(){ //this是被点击的#conten var that = this; $('.conten').each(function(){ //this是.c

  • 浅析正则表达式中的lastIndex以及预查

    依次写出下列输出内容. var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg2.test('abcabc')); //

  • 详解Centos7中Nginx开机自启动的解决办法

    关于在centos7中设置Nginx开机自启动,我们可以通过编写开机自启动shell脚本来解决. 测试环境 操作系统:centos7 64位 1611 Nginx版本: 1.11.10 本机Nginx安装时的配置参数 ./configure \ --prefix=/usr/local/nginx \ --pid-path=/usr/local/nginx/logs/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/v

  • 浅析JS中常用类型转换及运算符表达式

    JS中的常用类型转换(一般用强制转换): 1.强制转为整数:parseInt:写法:x = parseInt(x); 2.强制转换位小为:parseFloat:写法:x = parseFloat(x); 3.检测类型:x = parseInt(x);       alert(typeof(true)); JS中常用的运算符表达式: 1.逻辑运算符(布尔型):&& 并 :|| 或 :! 非 : 2.比较运算符:==(等于) :!=(不等于) : > :< :>=(大于等于)

  • 浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结

    1.map 有返回值,返回一个新的数组,每个元素为调用func的结果. let list = [1, 2, 3, 4, 5]; let other = list.map((d, i) => { return d * 2; }); console.log(other); // print: [2, 4, 6, 8, 10] 2.filter 有返回值,返回一个符合func条件的元素数组 let list = [1, 2, 3, 4, 5]; let other = list.filter((d,

随机推荐