1、centos系列的系统启动流程(内核级别的启动流程):
POST(加电自检)---> Boot Sequence(BIOS)---> Boot loader (MBR)---> Kernel(ramdisk) ---> rootfs(加载真正的根文件系统)---> /sbin/init
init:
centos5:SysV init
centos6:updstart 借鉴ubuntu
centos7:systemd 借鉴MAC
2、systemd的新特性:
1、系统引导时实现服务并行启动:服务间无依赖关系会并行启动
2、按需激活进程:若服务非立刻使用,不会立刻激活,处于半活动状态,占用端口,用时启动服务
3、系统状态快照:回滚到过去某一状态。
4、基于依赖关系定义服务控制逻辑。
3、核心概念:unit
unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其他与init相关的信息;这些配置文件主要保存在:
/usr/lib/systemd/system/ ---------------> 主要是多种unit构成
/etc/systemd/systemd/ ------------------>主要是一些配置、管理unit的文件
/run/systemd/system/
常见的unit有哪些呢?(这里是参考了/usr/lib/systemd/system/目录下的units)
Service unit:文件扩展名为.service,用于定义系统服务。
Target unit:文件扩展名为.target,用于模拟实现“运行级别”。同时多个unit的组合
Device unit:文件扩展名为.device,用于定义内核识别的设备。systemd与udev共同实现。
Mount unit:文件扩展名为.mount,用于实现文件系统挂载点。
Socket unit:文件扩展名为.socket,用于标识进程间通信用到的socket文件。
Snapshot unit:文件扩展名为.snapshot,管理系统快照。
Swap unit:文件扩展名为.swap,用于标识swap设备。
Automount unit:文件扩展名为.automount,文件系统自动挂载设备。
Path unit:文件扩展名为.path,用于定义文件系统中的一个文件或目录。
scope unit:不是由systemd启动的外部进程
slice unit:进程组
4、关键特性:
1、基于socket的激活机制:socket与程序分离,将套接字先分配但是程序本身未启动。
2、基于bus的激活机制;基于总线的请求来激活设备。
3、基于device的激活机制;设备插入时自动挂载激活设备,挂载点不存在自动创建。
4、基于path的激活机制;监控目录文件是否存在来激活服务或者进程。
5、系统快照:保存各unit的当前状态信息于持久存储设备中。
6、向后兼容sysv init脚本 /etc/init.d
注意:存在一些与systemd不兼容的情况:
1)systemctl的命令是固定不变的。
2)非由systemd启动的服务,systemctl无法与之通信。此时自己可以编写unit来实现被systemd管理。
5、管理系统服务:主要命令systemctl
Centos7:service类型的unit文件; systemctl命令: -Control the systemd system and service manager
启动:service NAME start ===> systemctl start NAME.service
停止:service NAME stpo ===> systemctl stop NAME.service
重启:service NAME restart ===> systemctl restart NAME.service
状态:service NAME status ===> systemctl status NAME.service
条件式重启:service NAME condrestart ===> systemctl try-restart NAME.service
重载或重启服务:systemctl reload-or-restart NAME.service (会判断此服务是否可以像nginx -s一样重载功能,如果不能,就重启)
重载或条件式重启服务:systemctl reload-or-try-restart NAME.service
查看某服务当前激活与否的状态(shell脚本中常用):systemctl is-active NAME.service
- 注意:这个结果有三种状态:active、unknown、failed三种,只有active才表示服务启动成功并正常运行,剩下的两个都表示服务未正常运行。unknown表示服务是正常关闭后的状态,failed则表示服务异常终止出现的状态。
查看所有已激活的服务:systemctl list-units --type service (就是说查看服务在当前时刻下为”active“的所有服务)
查看所有服务(已激活和未激活):systemctl list-units -t service --all (查看服务在当前时刻下为”active“以及”inactive“的所有服务)
设置服务开机自启:chkconfig NAME ON ===> systemctl enable NAME.service
禁止服务开机自启:chkconfig NAME off ===> systemctl disable NAME.service
查看某服务是否开机自启:chkconfig --list NAME ===> systemctl is-enabled NAME.service
禁止某服务设定位开机自启:systemctl mask NAME.service
取消此禁止:systemctl unmask NAME.service
查看此服务的依赖关系:systemctl list-dependencies NAME.service
管理target units:
运行级别: 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
注意:在上面的这些中,每个runlevel[1-6].target都是做了一个软链接指向这些poweroff.target、multi-user.target等target。
切换运行级别:init N ---> systemctl isolate NAME.target
查看当前运行环境下的运行级别: runlevel ===> systemctl list-units --type target
查看系统中所有的运行级别:systemctl list-untis -t target --all
获取系统默认的运行级别:systemctl get-default
修改系统默认的运行级别:systemctl set-default NAME.target
切换至紧急救援模式:systemctl rescue
切换至emergency模式:systemctl emergency
两者区别:紧急救援模式下Linux还是会使用脚本/etc/rc.d/rc.sysinit进行系统初始化,然后加载驱动程序等。但是在emergency模式下不会执行初始化脚本对系统进行初始化。所以emergency多用于驱动安装失败需要救援的情况下。
我们可以看一下:
centos7系统的启动流程:
6、service unit file:
文件通常由三部分组成:
[Unit]:定义与unit类型无关的通用选项;用于提供unit的描述信息,unit行为以及依赖关系等。
[Service]:与特定类型相关的专用选项,此处为Service类型。
[Install]:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启用或禁用时用到的一些选项。
[Unit]段的常用选项:
Description:描述信息,意义性描述;
After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;
Requies:依赖到的其他units,强依赖,被依赖的unit无法激活时,当前unit无法激活。
Wants:依赖到的其他units,弱依赖,被依赖的unit无法激活时,不影响当前unit的激活。
Conflicts:定义units间的冲突关系。
[Service]段的常用选项:
Type:用于定义影响Execstart及相关参数的功能的unit进程启动类型。
类型:
simple:默认。由Execstart指明的进程所启动起来的进程为主进程。
forking:由Execstart所启动的进程生成的一个子进程为主,父进程退出。
oneshot:一次性的启动,后续的unit进程启动后,该进程退出。
dbus:仅仅在得到dbus之后才启动。
notify:发送通知以后才能运行。
idle:类似于simple
EnvironmentFile:环境配置文件,一般给Execstart等使用其值。
ExecStart:指明启动unit要运行命令或脚本;
ExecStop:指明停止unit要运行的命令或脚本;
Restart:
[Install]段的常用选项:
Alias:当前unit的别名。
RequiredBy:被哪些units所依赖。
WantedBy:被哪些units所依赖。
注意:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件。
systemctl daemon-reload