Linux系统启动流程及服务管理控制

系统启动与服务管理

一、系统启动

1.开机自检BIOS
(Basic Input Output System基本输入输出系统)
加电自检、检测硬件、决定启动介质、找到引导扇区。
2.MBR引导
读取并且执行第一个开机设备中的MBR(Master Boot Record主引导记录)的bootloader(grub程序:Grand unified bootloader大统一启动加载器)。
3.加载内核
依据bootloader设置去加载内核,内核开始侦测硬件并加载驱动程序。
boot loader主要功能

提供选单:用户可以选择不同的开机项目

载入核心文件:直接指向可开机的程序区域来开始操作系统

转交其他loader:将开机管理功能转交给其他Loader负责

内核在Linux中的存放位置为/boot分区下,主要有2个文件要被加载。

vmlinuz-3.10.0-514.el7.x86_64  内核文件

initramfs-3.10.0-514.el7.x86_64.img  虚拟文件系统

使用lsinitrd命令查看虚拟文件系统。

[root@localhost ~]# lsinitrd
Image: /boot/initramfs-3.10.0-1160.6.1.el7.x86_64.img: 21M
========================================================================
Early CPIO image
========================================================================
drwxr-xr-x   3 root     root            0 Nov 19 13:50 .
-rw-r--r--   1 root     root            2 Nov 19 13:50 early_cpio
drwxr-xr-x   3 root     root            0 Nov 19 13:50 kernel
drwxr-xr-x   3 root     root            0 Nov 19 13:50 kernel/x86
drwxr-xr-x   2 root     root            0 Nov 19 13:50 kernel/x86/microcode
-rw-r--r--   1 root     root        25600 Nov 19 13:50 kernel/x86/microcode/GenuineIntel.bin
========================================================================
Version: dracut-033-564.el7
...

GRUB2相较于GRUB一代的提升:更健壮、可移植、更强大。支持BIOS、EFI和OpenFirmware,支持GPT和MBR分区表。支持非Linux系统,如苹果HFS文件系统和Windows的NTFS文件系统。
4.如果是sysvinit启动程序(linux6版本)
在这里插入图片描述

4.内核启动init进程

5.系统初始化

6.init找到/etc/inittab文件,决定系统的运行级别(X)

7.触发相应的运行级别的事件,运行/etc/rcX.d下的脚本

8.执行/etc/rc.local文件来到登录界面

9.输入用户名密码进入到系统中

5.如果是systemd启动程序(Linux7版本)
在这里插入图片描述

4.在硬件驱动加载成功后,内核会主动呼叫systemd程序,并以default.target流程开机

5.systemd执行sysinit.target初始化系统及basic.target准备操作系统

6.systemd启动multi-user.target下的本机与服务器服务

7.systemd执行multi-user.target下的/etc/rc.d/rc.local文件

8.systemd执行multi-user.target下的getty.target及登录服务

9.systemd执行graphical需要的服务

6.Init和Systemd的区别
systemd是linux系统中最新的初始化系统(init),它主要的设计目标是克服sysvinit固有的缺点,提高系统的启动速度。
Init

(1)启动时间长
init是串行启动,只有前一个进程启动完才会启动下一个进程;

(2)启动脚本复杂
init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长;

(3)由Linux内核加载运行
位于/sbin/init,是系统中第一个进程,PID永远为1;

对于支持service的程序,安装时会自动在/etc/init.d目录添加一个配置文件。当使用service控制程序时,比如执行开启httpd服务:service httpd start。那么service就会开启/etc/init.d/httpd配置文件里面指向的/usr/sbin/httpd可执行文件。
systemd

(1)按需启动服务,减少系统资源消耗;

(2)尽可能并行启动进程,减少系统启动等待时间;

(3)由Linx内核加载运行
位于/usr/lib/systemd/systemd,是系统中第一个进程,PID永远为1。

对于支持systemd的程序,安装时会自动在/usr/lib/systemd/system目录添加一个配置文件。当使用systemctl控制该程序时,比如执行开启httpd服务:systemctl start httpd。那么systemctl就会开启httpd.service配置里面指向的/usr/sbin/httpd可执行文件。
如果想让该程序开机启动,可以执行命令systemctl enable httpd,这个命令相当于在/etc/systemd/system目录添加一个软链接,指向/usr/lib/systemd/system目录下的httpd.service文件。这是因为开机时,systemd只执行/etc/systemd/system目录里面的配置文件。
7.配置文件的区别
init进程的配置文件

文件位置意义
/etc/init.d/服务启动脚本配置文件存放目录
/etc/inittab默认运行级别配置文件
/etc/init/rcS.conf系统初始化配置文件
/etc/init/rc.conf各运行级别初始化的配置文件
/etc/init/rcS-sulogin.conf单用户模式启动/sbin/sushell环境的配置文件
/etc/init/control-altdelete.conf终端下的ctrl+alt+del热键操作的配置文件
/etc/sysconfig/inittty终端的配置文件
/etc/init/start-ttys.conf配置tty终端的开启数量、设备文件
/etc/init/tty.conf或/etc/init/serial.conf控制tty终端的开启

systemd进程的配置文件

文件位置意义
/etc/systemd/system/default.target取代/etc/inittab文件配置,通常符号链接到/lib/systemd/system/graphical.target
/run/systemd/system/系统执行过程中所产生的服务脚本所在目录
/etc/systemd/system/里面存放着不同级别的开机自启服务
/usr/lib/systemd/system/和/lib/systemd/system/两个文件完全一样,因为/lib是/usr/lib的软链接。每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/

8.运行级别和说明

级别意义命令
0关机状态,使用该级别将会关机rehl6/7命令:init 0----rhel命令:poweroff
1系统救援模式,多用于系统维护rehl6/7命令:init 1----rhel命令:systemctl isolate rescue.target
2字符界面的多用户模式(不可访问网络)rehl6/7命令:init 2----rhel命令:systemctl isolate mutil-user.target
3字符界面的完整多用户模式,大多数服务器主机运行此级别rehl6/7命令:init 3----rhel命令:systemctl isolate mutil-user.target
4未分配使用rehl6/7命令:init 4----rhel命令:systemctl isolate mutil-user.target
5图形界面的多用户模式,提供了图形桌面操作环境rehl6/7命令:init 5----rhel命令:systemctl isolate graphical.target
6重新启动主机rehl6/7命令:init 6----rhel命令:reboot

9.查看运行级别
(1)runlevel
显示切换前的运行级别和当前运行级别(6/7)。

[root@localhost ~]# runlevel 
N 3

(2)systemctl get-default
显示当前运行级别(7)

[root@localhost ~]# systemctl get-default 
multi-user.target

10.永久设置开机模式

systemctl set-default multi-user.target  #开机默认为文本模式

systemctl set-default graphical.target  #开机默认为图形模式

修改/etc/inittab默认运行级别配置文件

二、systemd服务管理

1.单元(unit)的概念
系统初始化需要做的事情非常多。需要启动后台服务,比如启动SSHD服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被systemd抽象为一个配置单元。可以认为一个服务是一个配置单元;一个挂载点是一个配置单元;一个交换分区的配置是一个配置单元等。

单元意义
Service unit系统服务,最常见的类型
Target unit多个Unit构成的一个组,执行环境类型
Device Unit硬件设备
Mount Unit文件系统的挂载点
Automount Unit自动挂载点
Path Unit侦测特定文件或目录类型的
Scope Unit不是由Systemd启动的外部进程
Slice Unit进程组
Snapshot UnitSystemd快照,可以切回某个快照
Socket Unit进程间通信的socket服务
Swap Unitswap文件
Timer Unit循环执行的服务

2.Target和运行级别
systemd用target替代了运行级别的概念,提供了更大的灵活性。比如你可以继承一个已有的目标,并添加其它服务来创建自己的目标。
下表列举了systemd下的目标和常见runlevel的对应关系。

sysvinit运行级别systemd目标备注
0runlevel0.target,poweroff.target关闭系统
1,s,singlerunlevel1.target,rescue.target单用户模式
2,4runlevel2.target,runlevel4.target,multi-user.target用户定义/域特定运行级别。默认等同于3。
3runlevel3.target,multi-user.target多用户,非图形化。用户可以通过多个控制台或网络登录。
5runlevel5.target,graphical.target多用户,图形化。通常为所有运行级别3的服务外加图形化登录。
6runlevel6.target,reboot.target重启
emergencyemergency.target紧急shell

3.systemctl管理服务
RHEL7监视和控制systemd的主要命令是systemctl,该命令可以用于查看系统状态和管理系统及服务。

命令意义
systemctl start <单元>立即启动单元
systemctl stop <单元>立即停止单元
systemctl restart <单元>重启单元
systemctl reload <单元>重新读取单元配置
systemctl status <单元>输出单元运行状态
systemctl is-enabled <单元>检查单元是否配置为自动启动
systemctl enable <单元>开机自动启动单元
systemctl disable <单元>取消开机自动激活单元
systemctl is-active <单元>查看单元是不是正在运行
systemctl is-failed <单元>查看单元是否处于启动失败状态
systemctl kill <单元>杀死单元的所有子进程
systemctl daemon-reload重新载入systemd,扫描新的或有变动的单元

RHEL7的服务systemctl脚本存放在:/usr/lib/systemd/目录,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序存在系统服务里,即/usr/lib/systemd/system目录下。
4.服务组成介绍
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],每个部分内部是一些等号连接的键值对,注意键值对的等号两侧不能有空格。

[root@localhost ~]# cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

[Unit]
通常是配置文件的第一个区块,用来定义Unit的元数据以及配置与其他Unit的关系。
主要字段如下:

Description:简短描述

Documentation:文档地址

Requires:当前Unit依赖的其他Unit,如果它们没有运行,当前Unit会启动失败

Wants:与当前Unit配合的其他Unit,如果它们没有运行,当前Unit不会启动失败

BindsTo:与Requires类似,它指定的Unit如果退出,会导致当前Unit停止运行

Before:如果该字段指定的Unit也要启动,那么必须在当前Unit之后启动

After:如果该字段指定的Unit也要启动,那么必须在当前Unit之前启动

Conflicts:这里指定的Unit不能与当前Unit同时运行

Condition...:当前Unit运行必须满足的条件,否则不会运行

Assert...:当前Unit运行必须满足的条件,否则会报启动失败

[Service]
是服务的关键,是服务的一些具体运行参数的设置,只有Service类型的Unit才有这个区块。
它的主要字段如下:
Type:定义启动时的进程行为。
它有以下几种值:

Type=simple:默认值,执行ExecStart指定的命令,启动主进程

Type=forking:以fork方式从父进程创建子进程,创建后父进程会立即退出

Type=oneshot:一次性进程,Systemd会等当前服务退出再继续往下执行

Type=dbus:当前服务通过D-Bus启动

Type=notify:当前服务启动完毕会通知Systemd,再继续往下执行

Type=idle:若有其他任务执行完毕,当前服务才会运行

ExecStart:启动当前服务的命令

ExecStartPre:启动当前服务之前执行的命令

ExecStartPost:启动当前服务之后执行的命令

ExecReload:重启当前服务时执行的命令

KillMode
    control-group(默认值):当前控制组里面的所有子进程都会被杀掉
    process:只杀主进程
    mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号
    none:没有进程会被杀掉,只是执行服务的stop命令

ExecStop:停止当前服务时执行的命令

ExecStopPost:停止当前服务之后执行的命令

RestartSec:自动重启当前服务间隔的秒数

Restart:定义何种情况Systemd会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

TimeoutSec:定义Systemd停止当前服务之前等待的秒数

Environment:指定环境变量

[Install]
通常是配置文件的最后一个区块,用来定义如何启动以及是否开机启动。
它的主要字段如下:

WantedBy:它的值是一个或多个Target,当前Unit激活时(enable),符号链接会放入/etc/systemd/system目录下面以Target名+.wants后缀构成的子目录中

RequiredBy:它的值是一个或多个Target,当前Unit激活时,符号链接会放入/etc/systemd/system目录下面以Target名+.required后缀构成的子目录中

Alias:当前Unit可用于启动的别名

Also:当前Unit激活(enable)时,会被同时激活的其他Unit

注意:如果服务没有Install段落,一般意味着应该通过其它服务自动调用它们。
5.target简介
简单来说,Target就是一个Unit组,包含许多相关的Unit。启动某个Target时,Systemd就会启动里面所有的Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个Target就好比启动到某种状态。
传统的init启动模式里面有RunLevel的概念,跟Target的作用很类似。
不同的是,RunLevel是互斥的,不可能多个RunLevel同时启动,但是多个Target可以同时启动。
(1)查看当前系统的所有Target

$ systemctl list-unit-files --type=target

(2)查看一个Target包含的所有Unit

$ systemctl list-dependencies multi-user.target

(3)查看启动时的默认Target

$ systemctl get-default

(4)设置启动时的默认Target

$ sudo systemctl set-default multi-user.target

(5)切换Target时,默认不关闭前一个Target启动的进程

$ systemctl isolate 命令改变这种行为

(6)关闭前一个Target里面所有不属于后一个Target的进程

$ sudo systemctl isolate multi-user.target
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值