系统启动与服务管理
一、系统启动
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/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/ |
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 Unit | Systemd快照,可以切回某个快照 |
Socket Unit | 进程间通信的socket服务 |
Swap Unit | swap文件 |
Timer Unit | 循环执行的服务 |
2.Target和运行级别
systemd用target替代了运行级别的概念,提供了更大的灵活性。比如你可以继承一个已有的目标,并添加其它服务来创建自己的目标。
下表列举了systemd下的目标和常见runlevel的对应关系。
sysvinit运行级别 | systemd目标 | 备注 |
---|---|---|
0 | runlevel0.target,poweroff.target | 关闭系统 |
1,s,single | runlevel1.target,rescue.target | 单用户模式 |
2,4 | runlevel2.target,runlevel4.target,multi-user.target | 用户定义/域特定运行级别。默认等同于3。 |
3 | runlevel3.target,multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
5 | runlevel5.target,graphical.target | 多用户,图形化。通常为所有运行级别3的服务外加图形化登录。 |
6 | runlevel6.target,reboot.target | 重启 |
emergency | emergency.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