CentOS7系统初始化systemctl详解
- CentOS7系统启动流程
- systemd的处理流程
- 根据 /etc/systemd/system/default.target的配置,执行systemd程序。
- 此文件软链接到/lib/systemd/system/multi-user.target文件
- 根据/lib/systemd/system/multi-user.target的配置进行
- systemd查找以下两个目录
- /etc/systemd/system/multi-user.target.wants/,此目录下放置用户本地设定载入的unit。
-
usr/lib/systemd/system/multi-user.target.wants/,此目录下放置系统初始化需要载入的unit。
- 然后根据 /usr/lib/systemd/system/multi-user.target配置文件中的设定,发现需要basic.target这个脚本先启动。
- 然后查看/usr/lib/systemd/system/basic.target配置文件的设定,发现需要sysinit.target脚本。
-
-
-
- /usr/lib/systemd/system/basic.target.wants/,系统初始化的脚本。
- /etc/systemd/system/multi-user.target.wants/,本地初始化的脚本。
- 由此可见basic.target的启动,又需要上述这些服务脚本的启动。
- 使用命令systemctl list-dependencies multi-user.target,可以查看multi-user.target相关的服务脚本。
- 这种层层嵌套,连锁启动的模式,就是sytemd初始化系统的流程。
- 如果我们分析完sysinit.target的相关启动脚本。可以大致列出centos7的systemd初始化流程:
- local-fs.target + swap.target:挂载本机/etc/fstab配置文件中所列的文件系统与挂载点。
- sysinit.target,侦测硬件,载入所需的核心模组。
- basic.target,载入周边硬件程序,启用防火墙。
- multi-user.target,一般系统的服务,网络服务的载入。
- 启动终端shell。
- systemd执行sysinit.target初始化系统
- 挂载设备
- 挂载文件系统
- 开机信息传递与动画执行
- 载入额外的核心模组 /etc/sysctl.conf
- 启动随机数生成器
- systemd执行basic.target
- 载入声卡驱动
- 载入 firewalld防火墙
- 载入cpu微指令功能
- 启用SElinux
- 把到目前的开机信息写入 /var/log/dmesg
- 载入管理员指定的模组 /etc/sysconfig/modules/*.modules
- systemd执行multi-user.target
- 启动网络服务
- 启动终端服务
- 启动登陆服务
- 启动以下文件夹中的服务脚本
- 用户自己定义的服务脚本/etc/systemd/system /multi-user.target.wants/
- 用于开机启动的脚本,只需要在此目录下创建软连接文件即可。
- 方法就是先自己编写服务脚本文件放在 /etc/systemd/system目录下
- 然后运行 systemctl enable srcname.service即可。
- 系统初始化脚本/usr/lib/systemd/system/multi-user.target.wants/
- 与旧版本系统 systemV 相容的rc-local.service
- Centos5系统对于放置在 /etc/rc.d/rc.local目录中的脚本,自动会开机启动。新版的ststemd也是支持这项功能的,rc-local.service服务脚本就是用于这个目的。这个服务不需要启动他,他会判断rc.local是否具有可执行权限来判断服务是否开启。
[root@bogon ~]# ll /etc/rc.d/rc.local -rw-r--r--. 1 root root 473 Apr 15 12:25 /etc/rc.d/rc.local [root@bogon ~]# systemctl status rc-local.service ● rc-local.service - /etc/rc.d/rc.local Compatibility Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled) Active: inactive (dead) [root@bogon ~]# systemctl list-dependencies multi-user.target | grep rc-local
- 直接修改rc.local目录的可执行权限
- 通过下面的方法,每次开机的时候,都会读取/etc/rc.d/rc.local目录中的文件了。
[root@bogon ~]# chmod a+x /etc/rc.d/rc.local; ll /etc/rc.d/rc.local -rwxr-xr-x. 1 root root 473 Apr 15 12:25 /etc/rc.d/rc.local [root@bogon ~]# systemctl daemon-reload [root@bogon ~]# systemctl list-dependencies multi-user.target | grep rc-local ● ├─rc-local.service
- systemd提供tty界面与登陆服务
- 启动getty.target提供操作界面
- 启动 systemd-logind.service, systemd-user-sessions.service提供登陆服务
- Systemd的新特性:
- 核心概念:unit
- unit的常见类型:
- unit的配置文件
- /etc/systemd/system/目录下的.wants结尾的目录文件
- syscemctl命令:
- systemctl service,控制系统服务
- 其它常用命令:
- 配置文件,service unit file:
vim /usr/lib/systemd/system/sshd.service [Unit] Description=OpenSSH server daemon Documentation=man:sshd(8) man:sshd_config(5) After=network.target sshd-keygen.service Wants=sshd-keygen.service [Service] Type=notify EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] #此处WantedBy,表明sshd服务被multi-user.target所需要。 WantedBy=multi-user.target
文件通常由三部分组成: [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等; [Service]:与特定类型相关的专用选项;此处为Service类型; [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项; Unit段的常用选项: Description:描述信息; 意义性描述; After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反; Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活; Wants:依赖到的其它units;弱依赖; Conflicts:定义units间的冲突关系; Service段的常用选项: Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型; 类型: simple:表示execstart启动的进程就是主进程 forking:表示execstart启动的进程生成的子进程就是主进程 oneshot: dbus: notify: idle: EnvironmentFile:环境配置文件;此文件在ExecStart之前读取,提供一些变量。 ExecStart:指明启动unit要运行命令或脚本; ExecStartPre:表示启动运行命令之前运行的命令或者脚本。 ExecStartPost:表示启动运行命令之后要运行的命令或者脚本。 ExecStop:指明停止unit要运行的命令或脚本; Restart: Install段的常用选项: Alias:当前unit的别名。 RequiredBy:被哪些units所依赖; WantedBy:被哪些units所依赖; 注意:对于新创建的unit文件或,修改了的unit文件,要通知systemd重载此配置文件; # systemctl daemon-reload 示例:自定义service文件 1.创建可运行的shell脚本,修改脚本文件的可执行权限。#!/bin/bash echo "hello world!!" ping 192.168.60.135
2.创建sevice文件 在/etc/systemd/system目录下,创建myunit.service文件。 输入文件代码[Unit] Description=print hello world After=sshd.service Requies=sshd.service [Service] #EnvironmentFile=-/etc/sysconfig/firewalld ExecStart=/tmp/test/hello.sh Type=simple [Install] WantedBy=multi-user.target
3.启用service文件 systemctl enable srcname.service 4.通知systemd重载此配置文件 # systemctl daemon-reload 5.查看服务是否添加成功。 systemctl list-dependencies multi-user.target |grep "myunit" 6.查看服务状态。 systemctl status myunit.service -
-