linux系统之【开机启动程序】和【systemd进程】

259 阅读9分钟

主要分为两部分:一是引导过程,二是服务进程。其中服务进程主要指的是启动、停止、重启、查看服务状态等。

  • 程序:执行特定任务的一串代码,是静态的,存在硬盘中
  • 进程:运行中的程序叫进程,是动态的,存在 内存中。并且进程是有生命周期的,生命周期就是指程序从开始到结束的过程。

一、Linux操作系统引导过程(开机启动程序)

  • bios 开机自检
  • mbr
  • grub
  • kernel 加载内核
  • init 启动程序

image.png

1.1 bios 开机自检

bios小程序 集中在主板上。

  • 开机检测硬件是否有故障
  • 指引硬件去哪里找操作系统(根据bios中设置的启动顺序去找 操作系统 1是本地硬盘 2是移动外接设备 3是网卡)

开机启动项

  1. 首选 硬盘
  2. 再就是 移动设备 (U盘、光驱、外接硬盘)
  3. 最后 网卡

bios 软件先 检测硬件,然后指引硬件 去找操作系统。

1.2 mbr

mbr的作用是二进制,是不需要转义的。

mbr 一共512字节

  • 开机引导程序 446字节,主要作用是指引 硬件找到grub
  • 分区表 64字节
  • 磁盘标识 2字节

1.3 grub

grub的作用:根据grub.cfg 配置文件,找到内核文件,并加载到内存中。

centos7 以后使用的是grub2版本,grub2是grub的升级版本。

  • 交互
  • 设置密码
  • 修复

grub的启动过程:

分为主引导记录和1阶段、1.5阶段、2阶段,其中,1.5阶段是1阶段和2阶段的桥梁。

  • primary boot loader(主引号记录)

  • 1st stage:MBR的前446个字节 不是文件是二进制 引导 硬件去找 操作系统

    • 1.5 stage:MBR 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
  • secondary boot loader:2nd stage,分区文件/boot/grub2/grub.cfg 表现为文件

查看配置文件:

类型grub配置文件
centos 6vim grub.conf
centos 7vim grub.cfg

1.4 内核 kernel

所谓加载内核,就是把内核放入内存中运行。

升级内核的两种方式:

  • 编译 ,但比较复杂
  • yum

1.5 启动程序

类型启动的第一个程序备注
centos7systemd守护进程
centos6init进程初始化

// systemd 是保姆级程序,功能比 init 大。

小拓展:

为什么读取/etc/passwd文件?

因为要读取用户名和密码。

二、运行级别

运行级别分为0-6,共7个运行级别。

// 0是关机;1是急救模式;2、3、4是字符界面;5是图形界面;6是重启。最常用的级别是3和5,3是完整多用户模式。2和3基本一样,2可以在没有网络的环境下运行。注意,运行级别尽量不要设置0和6。

运行级别名称说明
0target关机状态,使用该级别时 将会关闭主机
1rescue.target 急救/修复模式单用户模式,不需要密码验证 即可登录系统,多用于系统维护,不能远程登录
2基本一样,但没有3功能多用户定义/域特定运行级别。默认等同于3
3完整多用户模式字符界面的完整多用户模式,大多数服务器主机运行在此级别
4测试版,但没有3功能多,基本不用!用户定义/域特定运行级别。默认等同于3
5graphical.target经常用!图形界面的多用户模式,提供了图形桌面操作环境
6reboot.target重新启动,使用该级别时将会重启主机

怎么切换用户级别?

 runlevel   可以查看当前的运行级别
     N      代表没有切换过运行级别
 init 3     可以切换到级别3
 get-default :取得当前的target
 set-default :设置指定的target为默认的运行级别  3  5
 isolate     :切换到指定的运行级别
 unit.target :上面列出的运行级别

三、systemd 和 init

类型启动的第一个程序备注
centos7systemd守护进程
centos6init进程初始化

3.1 systemd进程

  • Systemd是Linux操作系统的一种init软件
  • CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit
  • CentOS6中运行的第一个init进程是/lib/systemd/system,在CentOS6中进行系统管理时,可以用chkconfig命令。

// init和systemd是守护进程,先启动systemd或init ,再启动其他程序。

3.2 init进程

  • 由 Linux 内核加载运行 /sbin/init 程序
  • init 进程是系统中第一个进程
  • init 进程的PID(进程标记) 号永远为1

3.3 init和systemd进程最大的区别:

init:启动其他程序时,是串行,就是按照顺序一个一个启动 123456789…

systemd:启动程序时是并行,也就是123456789可以同时启动。

四、systemd进程

systemd是保姆级程序,可以取代上面的运行级别。

系统的两种程序:

  • 一次性程序 比如ls
  • 服务性程序 比如:systemd

4.1 服务程序的特点:

  • 一直运行
  • 后台运行

// 注意: 服务程序在/usr/lib/systemd/system路径下面 必须要有同名的.service文件。

4.1 Systemd 单元类型

单元类型扩展名说明
Service.service描述一个系统服务软件
Socket.socket描述一个进程间通信的套接字
Device.device描述一个内核识别的设备文件
Mount.mount描述一个文件系统的挂载点
Automount.automount描述一个文件系统的自动挂载点
Swap.swap描述一个内存交换设备或交换文件
Path.path描述一个文件系统中文件或目录
Timer.timer描述一个定时器(用于实现类似cron的调度任务)
Snapshot.snapshot用于保存一个systemd的状态
Scope.scope使用systemd的总线接口以编程的方式创建外部进程
Slice.slice描述居于Cgroup的一组通过层次组织的管理系统进程
Target.target描述一组systemd的单元

//如果是多元的属性,就属于target ;如果是单一的属性,就属于service

五、服务程序

  • 本地服务程序,管理本机;也就是对内服务。

    • stystemd:叫醒服务,管家式的程序,管理系统中其他程序。
    • init (不推荐使用)
  • 网络服务程序,接待网络上的客户;属于对外服务。

 telnet 192.168.125.100 111
 #telnet  ip地址  端口号
 ​
 rpcbind   #过程调用

systemd 程序管理主要是下面三类:

  1. 系统必要的程序;
  2. yum rpm 安装的程序;
  3. 编译安装的程序,需要手写配置文件后才可以

/usr/lib/systemd/system/服务名+.service的文件

  • yum rpm 会自动生成,所以天生可以被systemd 管理;
  • 编译需要手写 .service文件,所以需要学会手写 服务名.service的文件。

5.1 systemctl 命令

用于centos 7

命令功能描述
systemctl start 服务名开启服务
systemctl stop 服务名停止服务
systemctl status 服务名查看服务状态
systemctl restart 服务名重启服务
systemctl reload 服务名重新加载服务,不影响客户使用
systemctl enable 服务名开机自启
systemctl disable 服务名关闭开机自启
systemctl enable - -now 服务名开机自启,并立即启动
systemctl disable - -now 服务名关闭开机自启,并立即关闭
systemctl daemon-reload重新加载systemd文件
systemctl is-enable 服务名是否开机自启

// 注意:加粗部分 比较重要

5.2 chkconfig 命令

用于centos 6

 chkconfig : 2345 10 90   #2345 指的是运行级别; 10代表第10个启动; 90代表第90个结束。
 ​
 chkconfig : - 99 20      # -代表全部运行级别,也就是1-5,0和6除外(因为0是关机,6是重启)
 ​
 chkconfig --level 35 nginx on    #只开启运行级别为3和5的,关闭的话就是把on改成off
 ​
 PROG="/usr/local/nginx/sbin/nginx"   #这是主程序的路径
 ​
 PIDF="/usr/local/nginx/logs/nginx.pid"     #这是安装好nginx软件   并且启动后,会自动将自己的pid号存到该文件中。   nginx.pid 是自动生成的,这是程序的特性。
 ​
 // 在脚本里面怎么调用?就是在前面加$ ,也就是$PROG$PIDF,相当于是后面的路径。
 $是调用命令执行的结果:
 假设,cat123 文件里面的内容是 45678
 那么  kill $(cat 123)=kill 45678
 ​
 kill -l 可以查询信号,不写的话就默认9,也就是杀死信号。

小拓展:
1、以httpd为例
centos6 :service httpd restart
centos7 :systemctl restart httpd
// 上面两种语法,7的更好。因为6的如果有三个程序启动,需要输三条命令;而7的只需要一条命令就可以全部启动。

2、判断一个文件是否存在?
[-f /etc/passwd] :判断这个文件是否存在

  • [ ]代表判断;
  • -f 代表判断是否存在
  • -d 代表判断目录是否存在

用 echo $? 可以查询,0是有,1是没有。

3、pid号的作用:

  • 一是表示程序正在进行,因为只有正在执行的程序,才有pid号
  • pid号在同一时间是唯一的,所以可以知道程序对应的唯一值,从而更好的管理程序。

5.3 编译nginx实验

/usr/local/nginx/sbin/nginx

image.png

5.3.1 unit

作用: 用来描述软件的功能 man帮助 依赖关系等等。

选项功能描述
description描述信息
after定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
requires(强依赖)依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
wants(弱依赖)依赖到的其它units,弱依赖
conflicts定义units间的冲突关系

5.3.2 service

作用: systemd 程序怎么具体管理该程序,比如启动、关闭、优化等。

  • Type: 定义影响ExecStart及相关参数的功能的unit进程启动类型

    • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    • forking: 用的比较多的就是forking,就是用主进程去拖子进程。
  • EnvironmentFile:环境配置文件

  • ExecStart:怎么启动服务 指明启动unit要运行命令或脚本的绝对路径,里面尽量不要加注释。

    • -u 指定用户
    • -p 指定端口
    • -m 指定缓存
    • -c 指定连接处
    • options 选项
  • ExecStartPre: ExecStart前运行

  • ExecStartPost: ExecStart后运行

  • ExecStop:怎么关闭服务 指明停止unit要运行的命令或脚本,同样也是绝对路径

  • Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

 nginx -t    #检查语法
 nginx -v    #可以查看nginx的版本

5.3.3 install

在哪个运行级别启动。

  • Alias:别名,可使用systemctl command Alias.service
  • RequiredBy:被哪些units所依赖,强依赖
  • WantedBy: 被哪些units所依赖,弱依赖
WantedBy=multi-user.target    #依赖于混合模式 3 ,也就是字符界面。
  • Also:安装本服务的时候还要安装别的相关服务

小拓展:

1、usr/lib 和 lib 是软链接关系

2、编译nginx报错时如何修改?

 1、systemctl status nginx   #启动服务时,起不来,可以根据提示敲上述命令。后面其实还有.service,是默认的,可以不敲
 2、systemctl status nginx > 1    #如果报错信息太长,屏幕显示不出来,可以放到一个指定的文件内
 3、cat 1   #查看指定文件,就可以看到报错信息。
 最后,再根据报错信息 进行修改。

3、uint、service、install对应的内容,可以从别的地方复制,复制时可使用以下命令:

vim /usr/lib/systemd/system/nginx.service