1、systemd
启动流程:POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs--> /sbin/init
init:CentOS 5: SysVinit
CentOS 6: Upstart
CentOS 7: Systemd
Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
Systemd新特性:
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
系统状态快照
核心概念:unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
配置文件:
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
2、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 目录
3、管理服务
管理系统服务:
CentOS 7: service unit
注意:能兼容早期的服务脚本
命令格式:systemctl COMMAND name.service
启动:service name start ==> systemctlstart name.service
停止:service name stop ==> systemctlstop name.service
重启:service name restart ==> systemctlrestart name.service
状态:service name status ==> systemctlstatus 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
总结:systemctl比service管理服务的优势是可以一次性启动或者关闭、查看多个服务。
3、服务查看
查看某服务当前激活与否的状态:
systemctl is-active name.service ---可以用于脚本中判断服务是否启动,启动时echo $?=0,未启动echo $?不等于0
查看所有已经激活的服务:
systemctl list-units --type service
查看所有服务:
systemctl list-units --type service --all|-a
chkconfig命令的对应关系:
设定某服务开机自启:
chkconfig name on ==> systemctl enable name.service
设定某服务开机禁止启动:
chkconfig name off ==> systemctl disable name.service
查看服务单元的启用和禁用状态
systemctl list-unit-files --type=service
用来列出该服务在哪些运行级别下启用和禁用
chkconfig sshd–list ==>
ls /etc/systemd/system/*.wants/sshd.service
查看服务是否开机自启:
systemct lis-enabled name.service
其它命令:
查看服务的依赖关系:
systemctl list-dependencies name.service
杀掉进程:
systemctl kill unitname
列出失败的服务
systemctl --failed --type service
systemctl reload name.service ---服务已经启动,重新加载服务
systemcl daemon-reload ----服务已经启动,修改了配置文件,让文件生效
4、运行级别
target units:
unit配置文件:.target
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target -a 查看运行状态
运行级别:
0 ==> runlevel 0.target, poweroff.target
1 ==> runlevel 1.target, rescue.target ---单用户
2 ==> runlevel 2.target, multi-user.target
3 ==> runlevel 3.target, multi-user.target ---字符界面
4 ==> runlevel 4.target, multi-user.target
5 ==> runlevel 5.target, graphical.target ---图形
6 ==> runlevel 6.target, reboot.target
查看依赖性:
systemctl list-dependencies graphical.target
级别切换:initN ==> systemctl isolate name.target
systemctl isolate multi-user.target
注:只有/usr/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload才能生效)
查看target:
runlevel; who -r
systemctl list-units --type target
获取开机默认运行级别:
/etc/inittab==> systemctl get-default
修改开机默认级别:
/etc/inittab==> systemctl set-default name.target
systemct lset-default multi-user.target
ls –l /etc/systemd/system/default.target
切换至紧急救援模式:
systemctl rescue
切换至emergency模式:
systemctl emergency
其它常用命令:
传统命令init,poweroff,halt,reboot都成为systemctl的软链接
关机:systemct lhalt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
休眠:systemctl hibernate
休眠并挂起:systemctl hybrid-sleep
5、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执行默认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需要的服务
6、service unit文件格式
/etc/systemd/system:系统管理员和用户使用,运行级别要比下面的配置文件运行级别要高,把写好的unit文件放到这个目录下,就可以用systemctl命令来管理这个服务,相当于centos6中的/etc/init.d目录,不同是centos6中使用service来管理服务,并且/etc/init.d目录下全是有执行权限的服务脚本,而这个目录下的格式和centos6中完全不同。
/usr/lib/systemd/system:发行版打包者使用,用户也可以将写好的unit文件放到这个目录下,就可以用systemctl命令来管理服务,但这个目录下的文件太多,不好管理。
服务Unit文件示例
vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /app/bak.sh|at now" ---表示立刻执行
一个计划任务,为执行/app/bak.sh这个脚本
[Install]
WantedBy=multi-user.target
chmod a+x bak.service ---别忘记加执行权限
[root@redhat7 app]#cat bak.sh ---要执行的脚本的内容
cp -a /etc/ /app/`date "+%F-%T"`/
systemctl daemon-reload ---重新加载一下配置文件,让文件生效
systemctl start bak ---就可以用这个命令来管理这个服务
总结:将这个unit文件放到/etc/systemd/system/下,或者放到/usr/lib/systemd/system目录下都可以,就可以额用systemctl命令来管理这个服务。
7、设置内核参数
设置内核参数,只影响当次启动。
启动时,在启动菜单下面按e进入编辑内核参数,在linux16行后添加如下命令,可以实现临时禁用selinux和开机后进入各种运行模式,最后按ctrl+x进行启动。
selinux=0 ---表示启动时临时禁用selinux
systemd.unit=multi-user.target ---表示启动后进入字符运行模式
systemd.unit=emergency.target ---启动后进入更低级的模式
systemd.unit=rescue.target ---相当于centos6里的1模式,启动后进入该模式
rescue.target 比emergency 支持更多的功能,例如日志等
8、centos7中服务和socket是分离的
socket是ip地址加上tcp或者udp的端口号
[root@redhat7 app]#systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
Active: inactive (dead) ---此时服务是不活动的状态
[root@redhat7 app]#systemctl status rpcbind.socket
● rpcbind.socket - RPCbind Server Activation Socket
Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled)
Active: active (listening) since Thu 2017-09-07 21:56:03 CST; 25s ago
Listen: /var/run/rpcbind.sock (Stream)
[::]:111 (Stream) ---可看到正处于监听状态,并且监听的端口是111
0.0.0.0:111 (Stream)
Sep 07 21:56:03 redhat7.4.magedu.com systemd[1]: Stopping RPCbind Server Ac...
Sep 07 21:56:03 redhat7.4.magedu.com systemd[1]: Listening on RPCbind Serve...
Sep 07 21:56:03 redhat7.4.magedu.com systemd[1]: Starting RPCbind Server Ac...
Hint: Some lines were ellipsized, use -l to show in full.
[root@redhat7 app]#ss -nat
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 172.18.21.7:22 172.18.252.32:52370
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
我们发现rpcbind.service 和rpcbind.socket是分离的,因为此时服务并没有开启,是socket帮着监听的,当有人访问时,会激活服务,/usr/lib/systemd/system/rpcbind.socket文件是用来帮着服务监听端口用的。