您的位置:首页 > 运维架构 > Linux

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

2020-07-14 05:04 288 查看

系统启动与服务管理


系统启动

1.BIOS(Basic Input Output System基本输入输出系统)加电自检、检测硬件、决定启动介质、找到引导扇区。
2.读取并且执行第一个开机设备中的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命令查看虚拟文件系统。

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

4.内核启动init进程

5.系统初始化

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

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

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

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

如果是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需要的服务

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.service。那么我们的systemctl就会开启httpd.service配置里面指向的/usr/sbin/httpd可执行文件。

如果我们想让该程序开机启动,我们可以执行命令systemctl enable httpd,这个命令相当于在/etc/systemd/system目录添加一个软链接,指向/usr/lib/systemd/system目录下的httpd.service文件。这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。

配置文件的区别:
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/init:tty终端的配置文件

/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/

运行级别和说明

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

查看运行级别:

runlevel:显示切换前的运行级别和当前运行级别(6/7)

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

永久设置开机模式:

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

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

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

systemd服务管理

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

Service unit:系统服务,最常见的类型

Target unit:多个Unit构成的一个组,执行环境类型

Device Unit:硬件设备

Mount Unit:文件系统的挂载点

Automount Unit:自动挂载点

Path Unit:侦测特定文件或目录类型的

Scope Unit:不是由Systemd启动的外部进程

Slice Unit:进程组

Snapshot Unit:Systemd快照,可以切回某个快照

Socket Unit:进程间通信的socket服务

Swap Unit:swap文件

Timer Unit:循环执行的服务

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

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目录下。每一个服务以.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的元数据以及配置与其他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]部分是服务的关键,是服务的一些具体运行参数的设置,只有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:重启当前服务时执行的命令

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

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

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

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

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

Environment:指定环境变量

[Install]
[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段落,一般意味着应该通过其它服务自动调用它们。

Target
简单来说,Target就是一个Unit组,包含许多相关的Unit。启动某个Target的时候,Systemd就会启动里面所有的Unit。从这个意义上说,Target这个概念类似于"状态点",启动某个Target就好比启动到某种状态。
传统的init启动模式里面有RunLevel的概念,跟Target的作用很类似。
不同的是,RunLevel是互斥的,不可能多个RunLevel同时启动,但是多个Target可以同时启动。

//查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

// 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

//查看启动时的默认 Target
$ systemctl get-default

//设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target

//切换 Target 时,默认不关闭前一个 Target 启动的进程,
$ systemctl isolate 命令改变这种行为,

//关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: