Linux之引导和服务篇

系统引导是操作系统运行的开始,在用户能够正常登录之前,Linux的引导过程完成了一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备。

一. 引导过程

开机自检--->MBR引导--->GRUB菜单--->加载Linux内核--->init进程初始化

详解:

开机自检:服务器主机开机之后,将根据主板BIOS(基本输入输出系统)中的设置对CPU,内存,显卡,键盘等设备进行初步检测,检测成功后根据预设的启动程序移交系统控制权,大多数的时候会移交给本地硬盘。

MBR引导:当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)的位置,将系统的控制权传递给包含操作系统引导文件的分区,或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB)。

GRUB菜单:对于Linux系统而言,GRUB算是使用最广泛的多系统引导程序了。系统控制权传递给GRUB之后,将会显示启动菜单提供给用户选择,并根据所选项(或者采用默认值)加载Linux内核文件,然后将系统的控制权转交给内核。

加载Linux内核:Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配和调度。内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程。

init进程初始化:为了完成进一步的系统引导过程,Linux内核首先将系统中的 “/sbin/init” 程序加载到内存中运行(运行中的程序称为进程),init进程负责完成一系列的系统初始化过程,最后等待用户进行登录。

1.2 init进程

       Linux系统中的进程(运行中的程序)使用数字进行标记,每个进程的身份标记号称为PID。在引导Linux系统过程中,“/sbin/init” 是内核第一个加载的程序,因此 init 进程对应的PID号总是“1”。

       init进程运行以后将陆续执行系统中的其他程序,不断生成新的进程,这些进程称为init进程的子进程,反过来说,init进程是这些进程的父进程。当然,这些子进程也可以进一步生成各自的子进程,依次不断的繁衍下去,最终构成一棵枝繁叶茂的进程树,共同为用户提供服务。

        由此可见,init进程是维持整个Linux系统运行的所有进程的始祖,它不可以轻易被终止。需要切换不通过的系统运行状态时,可以向 init 进程发送正确的执行参数,由init自身完成相关的操作。

二. 服务

传统init依赖于串行执行Shell 脚本启动服务,导致效率低下,系统启动速度较慢    排队
systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度。

Linux 启动阶段始于内核加载了 init 或 systemd(取决于具体发行版使用的是旧的方式还是还是新的方式)之后。init  和 systemd 程序启动并管理所有其它进程,它们在各自的系统上都被称为“所有进程之母”。从Centos7版本开始,系统启动和服务管理都交给了systemed进行管理。

systemd进程

1.特性:

  • 系统引导时实现服务并行启动;

  • 按需启动守护进程;

  • 自动化的服务依赖关系管理

  • 同时采用socket式与D-Bus总线式激活服务;

  • socket与服务程序分离;

  • 向后兼容sysv init脚本;

  • 使用systemctl 命令管理,systemctl命令固定不变,不可扩展,非由systemd启动的服务;

  • systemctl无法与之通信和控制;

  • 系统状态快照;

2. systemd 单元

        unit(单元)表示示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息等。

        在systemd中不同类型的systemd对象被统一称为单元,是让系统知道该如何进行操作和管理资源的主要对象,所以systemd有许多单元类型。
       systemd单元文件最初默认存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件。其实Unit 按照systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用。

/etc/systemd/system:系统或用户自定义的配置文件

/run/systemd/system:软件运行时生成的配置文件

/usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件。

Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在指向的目录中。

        而 systemd 通过不同的文件后缀来区分这些配置文件。systemctl 命令用于管理各种类型的systemd单元,可以使用“systemctl -t help”命令来查询systemd支持的单元类型。

部分具体如下图:

Linux之引导和服务篇_第1张图片

详解:

单元类型 后缀名 作用
Service .service 封装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件
Socket .socket 描述一个进程间通信的套接字
Device .device 描述一个内核识别的设备文件
Mount .mount 描述一个文件系统的挂载点
Automoun  .automount 描述一个文件系统的自动挂载点
Swap .swap 描述一个内存交换设备或目录
Timer .timer 描述一个定时器(用于实现类似cron的调度任务)
Path .path 描述一个文件系统中文件或目录(path 路径)
Snapshot .snapshot 用于保存一个systemd的状态(snapshot 快照)
Scope .scope 使用systemd的总线接口以编程的方式创建外部进程
Slice .slice 描述居于Cgroup的一组通过层次组织的管理系统进程
Target .target 描述一组systemd的单元(target 目标)。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式
Target类型单元

Centos7抛弃了之前版本运行级别的概念,引入target类型单元来将系统启动时需要启动的大量systemd单元进行分类。简而言之,target就是一个单元组,通过一连串的依赖关系将许多相关的systemd单元组织在一起。

Linux之引导和服务篇_第2张图片

常见的target说明如下:

target 说明
default.target 默认启动的target
graphical.target 图形界面的target
multi-user.target 多用户字符界面的target
系统运行级别
Centos7(init进程)之前运行级别 Centos7开始(systemd进程) 说明
0 poweroff.target 关机
1 rescue.target 单用户模式(root自动登录), single, 维护模式
2 multi-user.target 多用户模式,启动网络功能,但不会启动NFS;维护模式
3 multi-user.target 多用户模式,正常模式;文本界面
4 预留级别;可同3级别
5 graphical.target 多用户模式,正常模式;图形界面
6 reboot.target 重启
emergency/emergency.target 急救模式

不同的运行级别代表了不同的运行状态,所启用的服务或程序也不一样。

systemctl get-default 这个命令可以查看当前系统的默认启动的target(等同于当前所处的运行级别)。

systemctl set-default 这个命令则可以设置默认启动的target,而使用 systemctl  isolate 命令则可以在不同的target 之间切换。

 runlevel命令    这个命令可以查看当前所处的运行级别。

Linux之引导和服务篇_第3张图片

init程序可以将当前用户的系统的运行级别切换为其他的运行级别,只要使用与运行级别相对应的数字(0-6)作为命令的参数就可以。

Linux之引导和服务篇_第4张图片Linux之引导和服务篇_第5张图片

3. 服务配置文件组成格式

以 “#” 开头的行后面的内容会被认为是注释
相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit file文件通常由三部分组成:
[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等。
[Service]:与特定类型相关的专用选项;此处为Service类型。
[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到
的一些选项。

这三段下的常用选项详解:

Unit段的常用选项:
Description:描述信息
After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants:依赖到的其它units,弱依赖
Conflicts:定义units间的冲突关系

Service段的常用选项:
Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
EnvironmentFile:环境配置文件
ExecStart:指明启动unit要运行命令或脚本的绝对路径
ExecStartPre: ExecStart前运行
ExecStartPost: ExecStart后运行
ExecStop:指明停止unit要运行的命令或脚本
Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
RestartSec: 设置在重启服务( Restart= )前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指
定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。
PrivateTmp:设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录

Install段的常用选项:
Alias:别名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依赖,强依赖
WantedBy:被哪些units所依赖,弱依赖
Also:安装本服务的时候还要安装别的相关服务


注:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启systemctl daemon-reload

自制systemctl来管理文件,具体如下图:

Linux之引导和服务篇_第6张图片

Linux之引导和服务篇_第7张图片

4. systemd服务管理

systemctl命令可以控制系统服务,此命令涵盖了之前版本的service命令和chkconfig命令两者的功能,在使用systemctl命令时,可以省略服务单元名称的标识 ".service"。也就是说如果输入的资源没有后缀标识,systemctl会默认把后缀标识当作 ".service" 来处理。

语法格式:systemctl  [OPTIONS...]  {COMMAND}...

服务状态的关键字

关键字 说明
loaded 配置文件被处理
active(running) 一个或者多个进程在持续进行
active(exited) 成功完成一个"一次性"配置
active(waiting) 运行但等待"事件"
inactive 未运行
enabled 开机自动启动
disablec 不随开机启动
static 不能自动启动,只能随其他单元启动而启动
启动和停止服务

语法格式:systemctl  start|stop|restart|reload  name.service

注:restart命令会先停止再启动服务,这时候服务的PID值会发生改变,reload是让服务读取和重新加载此服务的配置文件,不会完全停止和启动服务,服务的PID因此不会改变。生产环境中建议使用reload命令重新加载服务。

设置开机启动

语法格式:systemctl  enable|disable  name.service

查看依赖关系

systemd单元之间存在依赖关系,启动某个服务的时候可能会同时启动另外一个服务,可以使用

systemctl  list-dependencies 命令来列出这些依赖关系。

屏蔽服务

有时候系统存在安装了相互冲突的服务的情况,为了防止管理员意外启动这些相互冲突的服务,systemd提供了屏蔽服务的命令,使得屏蔽的服务不会在系统启动时启动,也不会被其他的systemd单元启动。

屏蔽服务命令:systemctl  mask  name.service

取消屏蔽使用命令:systemctl unmask  name.service

5. systemd 其他命令

systemd处理控制与管理系统的systemctl命令之外,还有一些其他的系统设置命令。

1)更改系统主机名

hostname命令      ---->可以显示和临时修改主机名

在Centos7中主机名配置文件为/etc/hostname文件,systemd的命令hostnamectl用于修改此文件的信息,还可以查看主机名的状态。

修改永久使用的主机名:

查看主机名的状态:

Linux之引导和服务篇_第8张图片

2)日志系统

systemd提供了自己的日志系统journal,不需要安装额外的日志服务(rsyslog),可以使用journalctl命令读取日志信息。

journalctl  -b    --->  输出本次启动后的所有日志信息 

Linux之引导和服务篇_第9张图片

journalctl  --since="2024-1-17 13:00:00"   ---> 显示固定时间段的日志信息

Linux之引导和服务篇_第10张图片

journalctl  --xe  --no-pager  --->日志默认分页输出,--no-pager 改为正常的标准输出

journalctl _PID=888    --->查看指定进程的日志

journalctl /usr/bin/bash   ---> 查看某个路径的脚本的日志

journalctl UID=5246 --since today  --->查看指定用户的日志

journalctl -u nginx.service   --->查看某个 Unit 的日志

journalctl -u nginx.service --since today         --->查看某个 Unit 的日志

journalctl -u nginx.service -f   --->实时滚动显示某个 Unit 的最新日志

$ journalctl -u nginx.service -u php-fpm.service --since today  --->合并显示多个 Unit 的日志

.......

3)语言设置

systemd的命令localectl可以用来查看与设置系统的语言,也可以显示当前系统使用的语言。

Linux之引导和服务篇_第11张图片

localectl  set-locale  LANG=en_US.UTF-8          --->设置语言为英文

4)时间设置

Centos7中除了保留之前版本用的关于时间的命令date等命令外,还增加了timedatectl命令。可以用来查看当前时间相关的设置。

Linux之引导和服务篇_第12张图片

timedatectl  set-time  YYYY-MM-DD       - - - ->设置系统日期

timedatectl  set-time  HH-MM-SS            - - - ->设置系统时间

timedatectl  set-timezone  time_zone       - - - ->设置系统时区

5)登录系统的用户信息

systemd提供了查看登录系统用户信息的loginctl命令。可以查看当前登录用户的会话。

Linux之引导和服务篇_第13张图片

loginctl  list-users    ------>列出当前登录系统的用户

6)启动耗时

systemd最大的改进在于可以并行的启动系统服务进程,极大减少了系统引导时间,我们可以用systemd-analyze查看系统启动耗时。

你可能感兴趣的:(linux,服务器,运维)