1. 简介
在 centos5 中生成和管理用户空间中的进程以及完成系统的初始化使用的是 init, 并且是依次启动. 在 centos6 中则是使用的 upstart, 在一定程度上实现了并行启动, 但是仍然存在依赖关系, 到了 centos7 中开始使用 systemd, 真正的实现并行启动, 延时按需启动.
2.systemd 的特性
1 启动系统的过程中实现了并行启动
2 由 systemd 所管理的服务可以实现按需激活
3 支持系统服务状态快照
4 可以定义程序之间依赖关系
3.unit 介绍
unit 的配置文件是 uit 的核心, 在配置文件中主要包含一下
1. 需要管理服务或者程序
2. 服务或者程序需要监听的套接字
3. 保存的系统快照 (就是制作快照的时候, 系统中各个服务的状态)
4. 其他和 init 相关的配置
unit 配置文件的位置
/lib/systemd/system 本地配置的系统单元
/run/systemd/system 运行时配置的系统单元
/usr/lib/systemd/system 第三方软件的系统单元 (sshd,nginx..)
注意: unit(单元) 和 init 中的服务脚本类似, 但是不相同
4.unit 的多种类别
类型 1:service unit, 这是服务类型的 unit, 该类 unit 后缀是 .service, 比如 nginx.service, 通过这个 nuit 可以实现启动, 关闭, 查看状态等
该类 unit 位于 /usr/lib/systemd/system
注意: unit 本质上来说并不是脚本, 而仅仅是 systemd 一个配置文件, 因此这个 unit 文件不具有执行权限, 而且也无法执行
启动服务的方式: 通过让 systemd 去读取配置文件中的内容, 完成 nginx 进程的启动
类型 2:device unit, 这是设备 unit, 该类 unit 的后缀是. device, 这类 unit 的作用是用来识别设备文件
类型 3:mount unit, 后缀 .mount, 用来实现挂载文件系统到指定的挂载点
类型 4:socket unit, 后缀. socket, 用来表示进程间通信的 socket 文件
类型 5:snapshot nuit: 快照 unit, 后缀. snapshot, 用来管理快照
类型 6:target unit: 目标 unit, 后缀是 .target, 模拟 centos5,6 上的运行级别 (主要是为了向后兼容)
类型 7:swap unit
类型 8:path unit
5.systemd 的特性
特性 1. 基于 socket 的激活机制
在启动系统的时候, systemd 会将所有要启动的服务都标记已经启动, 标记的方式就是将所有要启动的服务的套接字都监听起来, 但是是由 systemd 自己来监听, 而不是让具体的服务自己来监听, 这样就解决了进程之间的依赖关系.
当某个套接第一次被用户的访问的时候, systemd 会立刻启动这个套接字所对应的进程, 然后将这个套接字和这个启动的服务做绑定
特性 2: 基于 bus 机制激活
特性 3: 基于 device 机制激活
特性 4: 基于 path 机制激活
可以让 systemd 监控某个某个目录, 当目录中的文件发生更改的时候, 立刻激活某个服务
特性 5: 支持快照机制
特性 6: 支持域兼容 sysV 风格的服务管理脚本
6systemctl 使用举例
1. 查看激活的服务
查看当前系统中全部已经被激活的 unit:systemctl list-units --type service
查看当前系统中全部的 unit(包括未激活的):systemctl list-units --type service --all
2. 开机自启动关闭
设置某个服务开机自启动: systemctl enable nginx.service
禁止某个服务开机自启动: systemctl disable nginx.service
[设置开机自启动, 其实就是在 / etc/systemd/system/multi-user.target.wants / 下创建执行 / usr/lib/systemd/system / 下的配置文件的软连接]
查看当前系统中的全部 unit 的自动启动情况: systemctl list-unit-files
state
disabled: 禁止开机自动启动
enabled: 开机自动启动
static: 该 unit 不能独立运行, 是其他 unit 所依赖的
3. 查看是否自启动
查看指定的服务是否开机自动启动
- systemctl list-unit-files | grep nginx.service
- systemctl list-unit-files nginx.service
- systemctl is-enabled nginx.service
查看一个 unit 的依赖关系: systemctl list-dependencies nginx.service
优先用 reload, 如果无法让修改生效, 才执行 restart:systemctl reload-or-restart nginx.service
4. 禁止使用 enable
禁止用 enable 让某服务开机自启动: systemctl mask nginx.service
解除禁止 mask 功能: systemctl unmask nginx.service
注意: 所有的. service 可以省略
5. 切换级别
systemctl 使用举例 - 2
切换级别: systemctl isolate name.target
切换到的救援模式 (级别):systemctl rescure.tartet <<< 切换到救援模式不需要用 isolate
6. 查看默认级别
查看系统默认的运行级别: systemctl get-default
查看当前系统可用的 target:systemctl list-units --type target
修改系统默认运行级别: systemctl set-default name.target
7.unit 的文件的基本构成
第一部分: unit, 用于记录该 unit 文件的一些通用信息
第二部分: service, 记录 service 具体信息 (如何启动, 配置文件位置...)
第三部分: install, 记录安装信息 (运行级别)
第一部分: Unit 部分
1)Description: 对该服务的一个简要说明
2)Before: 定义启动顺序, 例子: Before=nginx.service, 表示该服务需要在 nginx 启动之前启动
3)After: 定义启动顺序, 同上
4)Documentation: 帮助文档
5)Wants: 建议同时启动某服务, 比如: Wants=nginx.service 表示系统中最好启动 nginx 服务, 但是即使不启动 nginx, 当前这个服务也没啥影响
6)Require: 当前服务是需要哪个特定的服务的, 比如: Require=nginx.service, 这就表示当前服务是需要 nginx 服务, 那么在启动当前这个服务的时候, 会自动将 nginx 也启动起来; 而且一旦发现 nginx 服务停止了, 那么当前这个服务也就会自动停止
[require 无法指定启动次序, 需要结合 Before After 来用, 否则经常出现各种问题]
7)Conflicis: 当一个服务启动的时候, 会立刻停止与之相冲突的服务
第二部分: Service 部分
1)Type: 指定 service 的类型
类型 1:oneshot: 程序执行完成就自动结束了, 没有后台进程, 比如执行一个 shell
类型 2:forking: 需要一个后台守护进程一直在运行, 比如运行 nginx,apache,sshd
2)ExecStart: 指定如何启动服务 (指定启动服务要执行的命令)
如果服务类型是 oneshot 类型, 那么可以直接写上他要执行命令即可, 通常不能添加参数和选项
如果服务类型不是 oneshot 类型, 那么在写要执行的命令的时候, 可以添加一些参数, 比如指定选项, 配置文件, 用户
[如果要执行多个命令, 那么多个命令之间用; 分割, 如果需要换行可以用 \ 来续行]
3)ExecStartPre, ExecStartPost: 指定在执行启动服务之前, 之后要执行什么命令
4)ExecStop: 停止服务
5)Restart:
6)PIDFile: 指定 pid 文件的路径
第三部分: install 部分
WantedBy: 指定运行级别, WantedBy=multi-user.target
8. 案例: 编写 unit 文件, 并注册到 systemd 服务中
第一步: 准备一个 shell 脚本
- # VIM /root/name.sh
- #!/bin/bash
- echo `hostname`>/tmp/name.log
第二步: 创建 unit 文件
- # VIM my.service
- [Unit]
- Description=this is my first unit file
- [Service]
- Type=oneshot
- ExecStart=/bin/bash /root/name.sh
- [Install]
- WantedBy=multi-user.target
- # mv my.service /usr/lib/systemd/system
第三步: 将我的 unit 文件注册到 systemd 中
- # systemctl enable my.service
第四步: 查看该服务的状态
# systemctl status my.service
9. 扩展
1.grub2 的配置文件 -/etc/default/grub
- # 指定用户选择菜单超时时间
- GRUB_TIMEOUT=5
- # 指定菜单中的描述名称
- GRUB_DISTRIBUTOR="$(sed's, release .*$,,g'/etc/system-release)"
- # GRUB 指定哪个是默认的 title
- # save 表示会保存当前的配置, 需要结合一个内置变量来使用
- GRUB_DEFAULT=saved
- # 禁用子菜单
- GRUB_DISABLE_SUBMENU=true
- # 指定将启动过程中的信息输出到终端
- GRUB_TERMINAL_OUTPUT="console"
- # 在启动系统的时候, 以命令行的方式向内核传递参数
- GRUB_CMDLINE_LINUX="crashkernel=auto rhgb"
- # 指定是否显示启动过程信息
- GRUB_DISABLE_RECOVERY="true"
2. 定制 grub2 的配置文件
第一步: 备份原有的 grub.cfg
- # cp /boot/grub2/grub.cfg{
- ,.bak
- }
第二步: 修改 / etc/default/grub
第三步: 重新生成 grub.cfg
# grub2-mkconfig>/boot/grub2/grub.cfg
3.CentOS7 忘记密码解决方法
进入紧急救援模式
进入方式: 在启动系统的时候, 编辑内核选项, 添加 rd.break, 然后按 ctrl+x
进入救援模式后:
1. 根在 sysroot 下
2. 当前是只读权限
操作:
- # mount -o remount,rw /sysroot
- # chroot /sysroot
- # passwd
- xxx
- xxx
- # exit
- # reboot
10. 进入救援模式方法
1 概述
要使得 Linux 进入救援模式, 原则其实就是一个, 通过光盘启动模式进入, 所以, 就要想办法让机器能从光盘启动.
本文主要模拟了 Vmware 下的操作. 如果是真实机器, 操作前将光盘插入机器里即可
2 CentOS6
首先在重新开机时当出现下面这个接界面时按 esc 进入到 Boot Menu.(ps: 如果是虚拟机, 要提前按一下鼠标, 按鼠标模式是在虚拟机内操作, 不是本地机器的操作, 然后, 手速要快, 在进度条满之前按, 只能按一下, 按多了也进不去)
备注: 这里如果按 F2 进入 BIOS 然后在设置光盘启动项为第一项也是可以, 但是不推荐, 因为还要改回来, 要不然每次都是光盘第一启动, 很麻烦
上下键选择第三项 CD-ROM Drive, 光盘启动
再选择第三项救援模式
选择语言, 默认 English 就行
选择 No 跳过网口检测
点击继续
这里提示我们, 救援模式下的根目录不是我们以前的根目录, 而 / mnt.sysimage 这个目录才是我没以前的根目录, 如果想要变回以前的根目录需要执行 chroot /mnt/sysimage 命令
再一次提示我们根目录的问题
这时候选择开启 shell 进程, 这样我们就可以使用命令了.
3 CentOS7
centOS7 进入图一 troubleshooting 有两个方法
方法一
首先在重新开机时当出现下面这个接界面时按 esc 进入到 Boot Menu.(ps: 如果是虚拟机, 要提前按一下鼠标, 按鼠标模式是在虚拟机内操作, 不是本地机器的操作, 然后, 手速要快, 在进度条满之前按, 只能按一下, 按多了也进不去)
上下键选择第三项 CD-ROM Drive, 光盘启动
方法二
虚拟机开机按 F12--》c--> 输入 exit --》
以上两个方法都可以进入 troubleshooting 页面, 接下来步骤一样
图一 选择 troubleshooting --> 图二 选择 Rescue, 等待加载 --》选择 选项 1, 等待一会儿, 按 enter, 就可以进入救援模式
图一 选择 troubleshooting
图二 选择 Rescue
来源: https://www.cnblogs.com/kenken2018/p/9762823.html