Linux systemd管理
本章内容:
centos7启动
unit介绍
服务管理和查看
启动排错
破解口令
恢复grub2
systemd:
系统启动和服务守护进程管理器,为系统的第一个进程,负责在系统启动或运行时,激活系统资源,服务进程和其它进程。
systemd新特性:
系统引导时实现服务并行启动;
按需启动守护进程;
自动化的服务依赖关系管理;
同时采用socket式和D-Bus(desktop-Bus)总线式激活服务;
socket:监听服务端口,服务并未启动,当有进程访问这个端口的服务时,socket采取激活端口对应的服务,相当于,centos6上的xinetd服务。
D-Bus总线:系统中的图形工具都是基于D-Bus总线激活的。
系统状态快照;
核心概念:unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务、监听socket、保护的系统快照以及其它与init相关的信息。
centos7:系统服务脚本文件路径:
centos7的系统服务脚本文件的存放路径为/usr/lib/systemd/system,相当于centos6系统中的/etc/rc.d/init.d目录下的系统服务脚本文件。
示例:
[root@centos7 system]# cd /usr/lib/systemd/system
centos7:系统运行自产生的服务脚本存放路径:/run/systemd/system
示例:
root@centos7 system]# cd /run/systemd/system/
centos7:系统管理员自建立的系统服务执行脚本建议存放到:/etc/systemd/system目录下,此目录下的优先级要高于/usr/lib/systemd/system目录的优先级。
示例:
[root@centos7 system]# cd /etc/systemd/system/
unit类型:
查看unit类型:
systemctl -t (–type) help
示例:
[root@centos7 cd]# systemctl -t help
Available unit types:
service
socket
target
device
mount
automount
snapshot
timer
swap
path
slice
scope
[root@centos7 cd]#
service unit:文件扩展名 .service,用于定义系统服务。
target unit:文件扩展名 .target ,用于模拟实现“运行级别”。
device unit:用于定义内核识别的设备。
mount unit:.mount,定义文件系统挂载点。
socket unit:.socket,用于标识进程间通信用的socket文件,也可以在系统启动时,延时启动服务,实现按需启动。
snapshot unit:.snapshot,管理系统快照。
swap unit:.swap,用于标识swap设备。
automount unit:.automount,文件系统的自动挂载点。
path unit :.path,用于定义文件系统中的一个文件或目录使用,长用于当文件系统变化时,延迟激活服务,如spool目录。
systemd关键特性:
基于socket的激活机制:socket与服务程序分离;
基于D-Bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存个unit的当前状态信息于持久存储设备中向后兼容sysv init 脚本。
systemctl命令固定不变,不可扩展,systemctl是一个二进制程序,后跟的参数都是固定好的。
管理系统服务:
命令:systemctl COMMAND name.service
启动服务:systemctl start name.service
停止服务:systemctl stop name.service
重启服务:systemctl restart name.service
查看状态:systemctl status name.service
条件式重启:已启动才重启,否则不做任何操作。
systemctl try-restart name.service
重载或重启服务:先加载,在重启:
systemctl reload-or-restart name.service
重载或条件式重启服务:
systemctl reload-or-try-restart name.service
禁止自动和手动启动:
systemctl mask name.service
示例:
[root@centos7 init.d]# systemctl mask httpd
ln -s '/dev/null' '/etc/systemd/system/httpd.service'
[root@centos7 init.d]# ll /etc/systemd/system/httpd.service
lrwxrwxrwx. 1 root root 9 sep 27 05:02 /etc/systemd/system/httpd.service -> /dev/null
取消禁止自动和手动启动:
systemctl unmask name.service
示例:
[root@centos7 init.d]# systemctl unmask httpd
rm '/etc/systemd/system/httpd.service'
[root@centos7 init.d]#
查看某服务当前激活与否的状态:
systemctl is-active name.service
示例:
[root@centos7 system]# systemctl is-active httpd
active
[root@centos7 system]#
查看所有已激活的服务:
systemctl list-units -t | –type service
示例:
[root@centos7 system]# systemctl list-units -t service | wc -l
74
[root@centos7 system]#
查看所有服务:
systemct list-units -t service -a|-all
查看服务是否开机自启动:
systemctl is-enabled name.service
示例:
[root@centos7 system]# systemctl is-enabled httpd
disabled
[root@centos7 system]#
设定某服务开机自启动:
systemctl enable name.servcie
示例:
[root@centos7 system]# systemctl enable httpd
ln-s'/usr/lib/systemd/system/httpd.service'
'/etc/systemd/system/multi-user.target.wants/httpd.service'
[root@centos7 system]#
设定某服务开机禁止自启动:
systemctl disable name.service
示例:
[root@centos7 system]# systemctl disable httpd.service
rm '/etc/systemd/system/multi-user.target.wants/httpd.service'
[root@centos7 system]#
查看所有服务的开机自启状态:
systemctl list-unit-files -type service
用来列出该服务在那些运行级别下启用和禁用:
ls /etc/systemd/system/*.wants/name.service
示例:
[root@centos7 system]# ls /etc/systemd/system/*.wants/httpd.service
/etc/systemd/system/multi-user.target.wants/httpd.service
[root@centos7 system]#
杀掉进程:
systemctl kill
服务状态:
systemctl list-units-files –type service -all
loaded :unit配置文件已经被加载过了;
active(running):一次或多次持续处理的运行;
action(exited):成功完成一次性的配置;
active(waiting):运行中等待一个事件;
inactive:不运行;
enabled:开机自动;
disabled:开机不启动;
static:开机不启动,但可被另一个启用的服务激活;
运行级别:
target units:
unit配置文件:/usr/lib/systemd/system/*.target
centos 6 centos7
runlevel0.target poweroff.target
runlevel1.target rescue.target
runlevel2.target multi-user.target
runlevel3.target multi-user.target
runlevel4.target multi-user.target
runlevel5.target graphical.target
runlevel6.target reboot.target
切换运行级别:
init # ——–> systemctl isolate name.target
注意:只有/usr/lib/systemd/system/*.target文件中allowisolate=yes才可以切换运行级别(修改文件需执行 systemctl daemon-reload 才可以生效)
示例:
[root@centos7 system]# systemctl isolate multi-user.target
查看target:
runlevel who -r
systemctl list-units -t target
查看系统的默认运行级别:
systemctl get-default
示例:
[root@centos7 Desktop]# systemctl get-default
graphical.target
[root@centos7 Desktop]#
修改默认运行级别:
systemctl set-default name.target
示例:
[root@centos7 Desktop]# systemctl set-default graphical.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/graphical.target' '/etc/systemd/system/default.target'
[root@centos7 Desktop]#
[root@centos7 Desktop]# ls -l /etc/systemd/system/default.target
切换至紧急救援模式:
systemctl rescue
切换至emergency模式:
systemctl emergency
其他常用命令: init 、poweroff、 reboot都成为systemctl的软链接
关机:systemctl halt systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
休眠:systemctl hibernate
休眠并挂起:systemctl hybrid-sleep
centos7启动引导顺序:
UEFI或Bios初始化,运行POST开机自检。
选择启动设备。
引导装载程序,centos7是使用grub2。
加载程序的配置文件:/etc/grub2.cfg /etc/default/grub /boot/grub2/grub2/cfg。
加载initramfs驱动模块。
加载内核选项。
内核初始化,centos7使用systemd代替init。
执行initrd.target所有的单元,包括/etc/fstab。
从initramfs根文件系统切换到磁盘根目录。
systemd执行默认target配置,配置文件/etc/systemd/default.target /etc/systemd/system。
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]:定义有“system enable”以及“systemctl disable”命令在实现服务启用或禁用时用到的一些选项。
Unit段的常用选项:
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于那些unit启动,其功能与Before相反。
Requires:依赖到的其他unit,强依赖,被依赖的units无法激活时,当前unit即无法激活。
Wants:依赖到的其他units,弱依赖。
Centos:定义units间的冲突关系。
Service段的常用选项:
Type:定义影响execstart及相关参数的功能的unit进程启动类型。
simple:默认值,这个daemon主要由execstart接的指令串来启动,启动后常驻于内存中。
forking:由execstart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止。
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作,因此通常也要同时设定busname=才行。
notify:在启动完成后会发送一个通知消息。还需要配合notifyaccess来让systemd接受消息。
idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务。
Environmentfile:环境配置文件。
Execstart:指明启动unit要运动命令或脚本的绝对路径。
Execstartpre:Execstart前运行。
Execstartpost:Execstart后运行。
Restart:当设定Restart=1时,则当次daemon服务以外终止后,会再次自动启动此服务。
Install段的常用选项:
Alias:别名,可使用systemctl command alias.service
Requiredby:被哪些units所依赖,强依赖。
Wantdby:被哪些units所依赖,弱依赖。
Also:安装本服务的时候还要安装别的相关服务。
注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载配置文件,而后可以选择重启
执行 systemctl daemon-reload
设置内核参数:
设置内核参数,只影响当次启动。
启动时,在Linux16行后添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target比emergency支持更多的功能,例如日志。
示例:
在Linux16行最后添加:systemd-unit=multi-user.target,系统启动后进入到字符界面。
文件系统损坏:
先尝试自动修复,失败则进入emergency shell,提示用户修复。
在/etc/fstab不存在对应的设备和UUID等一段时间,如不可用,进入emergency shell。
在/etc/fstab不存在对应挂载点,systemd尝试创建挂载点,否则提示进入emergency shell 。
在/etc/fstab不正确的挂载选项,提示进入emergency shell。
破解root口令:
(1)启动时在看到grub启动菜单时,按任意键暂停启动;
(2)按“e”键进入编辑模式;
(3)将光标移动到Linux16开始的行,在行尾添加内核参数:rd.break
(4)按ctrl-x启动,进入到类似于单用户的shell中。
(5)进来之后执行mount命令查看系统根所挂载的目录
(6)执行mount -o remount,rw /sysroot以读写方式冲洗挂载系统根“/sysroot”
(7)执行chroot /sysroot
(8)执行passwd root
(9)执行 touch /.autolabel重新给/etc/shadow文件打标签,不然selinux策略会阻止启动,造成启动故障。
修该grub2配置文件:
centos7中的grub主配置文件/boot/grub2/grub.cfg
grub.cfg文件的配置模板:/etc/default/grub
修改好的模板文件参数使用 grub2-mkconfig -o /boot/grub2/grub.cfg重定向到grub主配置文件中。
修复grub:
BIOS环境:grub2-install /dev/sda
UEFI环境:grub2-install
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/49570