Linux操作系统启动流程、daemon与服务(service)、systemctl管理服务

一般来说,所有的操作系统的启动流程基本就是:
在这里插入图片描述
Linux启动时我们会看到许多启动信息。
Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:
■内核的引导。
■运行init.
■系统初始化。
■建立终端。
■用户登录系统。

在这里插入图片描述
内核引导
当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设(通常是硬盘)来启动。
操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
在这里插入图片描述
示例
在这里插入图片描述
运行init
init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
init 程序首先是需要读取配置文件 /etc/inittab。
在这里插入图片描述
运行级别
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
在这里插入图片描述
Linux系统有7个运行级别(runlevel):
●运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
●运行级别1:单用户工作状态,root权限, 用于系统维护,禁止远程登陆.
●运行级别2:多用户状态(没有NFS)
●运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
●运行级别4:系统未使用,保留
●运行级别5: X11控制台,登陆后进入图形GUI模式
●运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

系统初始化
在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
在这里插入图片描述
/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以 S 开头的启动脚本,将以start参数来运行。
而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。
这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的"System Services"来自行设定。
在这里插入图片描述
建立终端
rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

用户登录系统
一般来说,用户的登录方式有三种:

(1)命令行登录
(2)ssh登录
(3)图形界面登录
在这里插入图片描述
对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入 KDE、Gnome 等窗口管理器。

而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。

Linux 的账号验证程序是 login,login 会接收 mingetty 传来的用户名作为用户名参数。

然后 login 会对用户名进行分析:如果用户名不是 root,且存在 /etc/nologin 文件,login 将输出 nologin 文件的内容,然后退出。

这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 用户可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

图形模式与文字模式的切换方式
Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。

如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。

当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。

如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。
在这里插入图片描述
Linux 关机

■sync                    >将数据由内存同步到硬盘中
■shutdown                >关机指令
■shutdown-h now          >立马关机
■shudown h 20.25         >系统会在今天20:25关机
■shutdown -h+10          >是分钟后关机
■shutdown -r now         >系统立马重启
■shutdown -r +10         >系统十分钟后重启
■reboot                  >重启== shutdown -rnow
■halt                    >关闭系统

正确的关机流程为: sync > shutdown > reboot > halt
不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。
关机的命令有shutdown -h now poweroff和init 0
重启系统的命令有shutdown -r now reboot init 6

daemony与服务(service)
系统为了某些功能必须要提供一些服务 (不论是系统本身还是网络方面),这个服务就称为 service 。 但是 service 的提供总是需要程序的运行吧!否则如何运行呢?所以达成这个 service 的程序我们就称呼他为 daemon 啰! 举例来说,达成循环型例行性工作排程服务 (service) 的程序为 crond 这个 daemon

依据daemon的启动与管理方式来区分,基本上,可以将daemon分为可独立启动的stand alone,与通过一个super daemon(早期是inetd,后来被xinetd替代)来统一管理的服务这两大类。

stand alone:daemon启动并加载到内存后一直占用内存和系统资源。响应速度较快。

super daemon统一管理的服务:有来自客户端的请求时,super daemon才唤醒相应的服务,当客户端请求结束后,被唤醒的这个服务也会关闭并释放系统资源。反应慢一些。

◆服务的启动、 关闭与观察等方式:
启动: /t/init.d/daemon start
关闭: /tinit.d/daemon stop
重新启动: /etinitd/daemon restart
状态观察: /etinit.dldaemon status
◆服务启动的分类:
服务的相依性问题:
执行等级的分类:
制定执行等级默认要启动的服务:
默认要启动: chkconfig daemon on
默认不启动: chkconfig daemon off
观察默认为启动否: chkconfig -list daemon
◆执行等级的切换行为: int? >int 5 (纯切换到图形界面)

systemd 的配置文件放置目录
/us/ib/systemd/system/:每个服务最主要的启动脚本设置,有点类似以前的/etc/init.d 下面的文件;
/run/systemd/system/: 系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usrlib/systemnd/system/高!
/etc/systemd/system/: 管理员依据主机系统的需求所创建的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5. d/Sxx之类的功能!执行优先序又比/run/systemd/system/高喔!

systemd也是有些地方无法完全取代init的
1、 在runlevel的对应上,大概仅有 runlevel 1, 3, 5有对应到 systemd的
些target类型吧,没有全部对应;
2、全部的systemd都用systemct这个管理程序管理,而systemctl支持的语法有限制,不像/etc/init./daemon就是纯脚本可以自订参数,systemct!可自订参数。
3、 如果某个服务启动是管理员自己手动执行启动, 不是使用systemctl启动的(例如你自己手动输入 crond以启动crond服务) ,那么systemd将无法侦测到该服务,而法进一步管理。
4、 systemd.启动过程中,无法与管理员通过standard input传入讯息!因此,自行撰写systemd的启动设置时,务必要取消互动机制~ (连通过启动时传进的标准输入讯息也要避免! )

systemd有什么好处呢?
➢平行处理所有服务,加速开机流程:
➢一经要求就回应的 on- demand启动方式(systemct)
➢服务相依性的自我检查:
➢依daemon功能分类: unit (服务单位)
➢将多个daemons集合成为一个群组:
➢向下相容旧有的init服务脚本:

systemd的unit类型说明
那/us/ib/systemd/system/以下的数据如何区分上述所谓的不
同的类型(type) 呢?很简单!看扩展名!
在这里插入图片描述
所以我们可以知道vsftpd与crond其实算是系统服务(service) , 而multi-user要算是执行环境相关的类型(target type)
在这里插入图片描述

通过systemctl管理服务:
■通过systemctl管理单一服务(service unit) 的启动/开机启动与观察状态
在这里插入图片描述
在这里插入图片描述
#重点在第二、三行喔~
#Loaded; 这行在说明,开机的时候这个unit 会不会启动,enabled为开机启动,disabled 开机不会启动
#Active: 现在这个unit 的状态是正在执行(running) 或没有执行(dead)
#后面几行则是说明这个unit程序的PID状态以及最后一行显示这个服务的登录文件信息!
#登录文件信息格式为: “时间” “讯息发送主机” “哪一个服务的讯息” “实际讯息内容"
#所以上面的显示讯息是:这个atd默认开机就启动,而且现在正在运行的意思!

服务状态
■1、active (running) :正有一只或多只程序正在系统中执行的意思,举例来说,正在执行中的vsftpd就是这种模式。
.■2、active (exited) :仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。举例来说,开机或者是挂载时才会进行一次的guotaon功能,就是这种模式!quotaon不须-直执行~只.须执行一次之后,就交给文件系统去自行处理哕!通常用bashshell写的小型服务,大多是属于这种类型(无须常驻内存)。
■3、active (waiting) :正在执行当中,不过还再等待其他的事件才能继续处理。举例来说,打印的伫列相关服务就是这种状态!虽然正在启动中,不过,也需要真的有伫列进来(打印工作)这样他才会继续唤醒打印机服务来进行下一步打印的功能。
■4、inactive: 这个服务目前没有运行的意思。 既然daemon目前的状态就有这么多种了,那么daemon的默认状态有没有可能除了enable/disable之外,还有其他的情况呢?当然有!
■5、enabled: 这个daemon将在开机时被执行
■6、disabled: 这个daemon在开机时不会被执行
■7、static: 这个daemon不可以自己启动(enable不可),不.过可能会被其他的enabled的服务来唤醒(相依属性的服务)
■8、mask:这个daemon无论如何都无法被启动!因为已经被强制注销(非删除) 。可通过systemct! unmask方式改回原本状态

centos 7.1默认有26个target unit,主要的有以下几个:
在这里插入图片描述
正常的模式:graphical.target、multi-user.target
恢复方面的模式:rescue.target、emergency.target
如果想要修改tty的数量,可以修改getty.target

■那么我如何知道目前的模式是哪一种?又得要如何修改呢?
[root@study ~]# systemct1 [carmand] [unit. target]
选项与参数:
command:
get-default :取得目前的target
set -default :设置后面接的target 成为默认的操作模式
isolate:切换到后面接的模式

范例一:
我们的测试机器默认是图形界面,先观察是否真为图形模式
在这里插入图片描述
范例二
在不重新开机的情况下,将目前的操作环境改为纯文本模式,关掉图形界面
在这里插入图片描述
范例三:
重新取得图形界面
在这里插入图片描述
systemctl poweroff系统关机
systemct1 reboot重新开机
systemctl suspend进入暂停模式
systemctl hibernate 进入休眠模式
systemct1 rescue强制进入救援模式
systemctl energency强制进入紧急救援模式

Suspend暂停:会将系统的状态数据保存到内存中,然后关闭大部分的系统硬件,没有实际关机
Hibernate休眠:将系统状态保存到硬盘中,保存完整后,将计算机关机

发布了230 篇原创文章 · 获赞 208 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_44907813/article/details/103214601