sysVinit启动原理
在咱们打开Linux电脑的电源后第一个启动的进程就是init。分配给init进程的PID是1。它是系统其余全部进程的父进程。当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,以后BIOS会检测系统资源而后找到第一个引导设备,一般为硬盘,而后会查找硬盘的主引导记录(MBR),而后加载到内存中并把控制权交给它,之后的启动过程就由MBR控制。
主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序),这个时候GRUB或LILO会加载内核模块。内核会立刻查找/sbin下的“init”程序并执行它。从这里开始init成为了Linux系统的父进程。init读取的第一个文件是/etc/inittab,经过它init会肯定咱们Linux操做系统的运行级别。它会从文件/etc/fstab里查找分区表信息而后作相应的挂载。而后init会启动/etc/init.d里指定的默认启动级别的全部服务/脚本。全部服务在这里经过init一个一个被初始化。在这个过程里,init每次只启动一个服务,全部服务/守护进程都在后台执行并由init来管理。
关机过程差很少是相反的过程,首先init中止全部服务,最后阶段会卸载文件系统。linux
理解Systemd
开发Systemd的主要目的就是减小系统引导时间和计算开销。Systemd(系统管理守护进程),最开始以GNU GPL协议受权开发,如今已转为使用GNU LGPL协议,它是现在讨论最热烈的引导和服务管理程序。若是你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。shell
Systemd引入了并行启动的概念,它会为每一个须要启动的守护进程创建一个套接字,这些套接字对于使用它们的进程来讲是抽象的,这样它们能够容许不一样守护进程之间进行交互。Systemd会建立新进程并为每一个进程分配一个控制组(cgroup)。处于不一样控制组的进程之间能够经过内核来互相通讯。systemd处理开机启动进程的方式很是漂亮,和传统基于init的系统比起来优化了太多。让咱们看下Systemd的一些核心功能。bash
1 和init比起来引导过程简化了不少
2 Systemd支持并发引导过程从而能够更快启动
3 经过控制组来追踪进程,而不是PID
4 优化了处理引导过程和服务之间依赖的方式
5 支持系统快照和恢复
6 监控已启动的服务;也支持重启已崩溃服务
7 包含了systemd-login模块用于控制用户登陆
8 支持加载和卸载组件
9 低内存使用痕迹以及任务调度能力
10 记录事件的Journald模块和记录系统日志的syslogd模块
Systemd同时也清晰地处理了系统关机过程。它在/usr/lib/systemd/目录下有三个脚本,分别叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。这几个脚本会在用户选择关机,重启或待机时执行。在接收到关机事件时,systemd首先卸载全部文件系统并中止全部内存交换设备,断开存储设备,以后中止全部剩下的进程。session
Systemd是一种新的linux系统服务管理器,它替换了init系统,可以管理系统的启动过程和一些系统服务,一旦启动起来,就将监管整个系统。
为了减小系统启动时间,systemd 的目标是:
尽量启动更少的进程
尽量将更多进程并行启动并发
Systemd配置目录:
/usr/lib/systemd/
/etc/systemd/ssh
查看进程树:socket
[root@limt01 ~]# pstree systemd─┬─NetworkManager─┬─dhclient │ └─3*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─atd ├─auditd───{auditd} ├─avahi-daemon───avahi-daemon ├─chronyd ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─iprdump ├─iprinit ├─iprupdate ├─irqbalance ├─login───bash ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─smartd ├─sshd─┬─sshd───bash │ └─sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}]
查看系统服务启动时间:svg
[root@limt01 ~]# systemd-analyze Startup finished in 1.503s (kernel) + 3.193s (initrd) + 23.967s (userspace) = 28.664s [root@limt01 ~]# systemd-analyze blame 8.874s firewalld.service 7.682s tuned.service 4.308s avahi-daemon.service 4.001s systemd-logind.service 2.559s rsyslog.service 2.433s systemd-udev-settle.service 2.242s iprupdate.service 2.130s kdump.service 2.083s postfix.service 1.872s iprinit.service
systemctl 的基本用法:
systemctl - 列出全部单元(UNIT)以及它们的状态(这里的 UNIT 指的就是系统上的 job 和 service)
systemctl list-units - 列出全部 UNIT
systemctl start [NAME...] - 启动一项或多项 UNIT
systemctl stop [NAME...] - 中止一项或多项 UNIT
systemctl disable [NAME...] - 将 UNIT 设置为开机不启动
systemctl list-unit-files - 列出全部已安装的 UNIT,以及它们的状态
systemctl --failed - 列出开机启动失败的 UNIT
systemctl --type=mount - 列出某种类型的 UNIT,类型包含:service, mount, device, socket, target
systemctl enable debug-shell.service - 将一个 shell 脚本设置为开机启动,用于调试post
systemctl status httpd.service systemctl start httpd.service systemctl stop httpd.service systemctl restart httpd.service systemctl try-restart httpd.service systemctl reload httpd.service systemctl enable httpd.service systemctl disable httpd.service
systemctl 实现转换运行级别、重启系统和关闭系统的功能:优化
systemctl isolate graphical.target - 切换到运行级别5,就是有桌面的运行级别
systemctl isolate multi-user.target - 切换到运行级别3,没有桌面的运行级别
systemctl reboot - 重启系统
systemctl poweroff - 关机
全部命令,包括切换到其余运行级别的命令,均可以在普通用户的权限下执行。
systemctl日志:
journalctl --all - 显示系统上全部日志,以及它的用户
journalctl -f - 监视系统日志的变化(相似 tail -f /var/log/messages 的效果)
journalctl -b - 显示系统启动之后的日志
journalctl -k -b -1 - 显示上一次(-b -1)系统启动前产生的内核日志
journalctl -b -p err - 显示系统启动后产生的“ERROR”日志
journalctl --since=yesterday - 当系统不会常常重启的时候,这条命令能提供比 -b 更短的日志记录
journalctl -u cron.service --since='2014-07-06 07:00' --until='2014-07-06 08:23' - 显示 cron 服务在某个时间段内打印出来的日志
journalctl -p 2 --since=today - 显示优先级别为2之内的日志,包含 emerg、alert、crit三个级别。全部日志级别有: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7)
journalctl > yourlog.log - 将二进制日志文件复制成文本文件并保存到当前目录
[root@limt01 log]# journalctl -xn -- Logs begin at 四 2015-05-21 22:29:27 CST, end at 五 2015-05-22 00:01:04 CST. -- 5月 22 00:00:01 limt01 CROND[3894]: (root) CMD (/usr/lib64/sa/sa1 1 1) 5月 22 00:01:04 limt01 systemd[1]: Starting Session 19 of user root. -- Subject: Unit session-19.scope has begun with start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit session-19.scope has begun starting up. 5月 22 00:01:04 limt01 systemd[1]: Started Session 19 of user root. -- Subject: Unit session-19.scope has finished start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit session-19.scope has finished starting up.
利用 systemd 分析系统启动过程:
systemd-analyze - 显示本次启动系统过程当中用户态和内核态所花的时间
systemd-analyze blame - 显示每一个启动项所花费的时间明细
systemd-analyze critical-chain - 按时间顺序打印 UNIT 树
systemd-analyze dot | dot -Tsvg > systemd.svg - 为开机启动过程生成向量图(须要安装 graphviz 软件包)
systemd-analyze plot > bootplot.svg - 产生开机启动过程的时间图表
systemd 与 sysVinit 管理对比图: