主要分为两部分:一是引导过程,二是服务进程。其中服务进程主要指的是启动、停止、重启、查看服务状态等。
- 程序:执行特定任务的一串代码,是静态的,存在硬盘中
- 进程:运行中的程序叫进程,是动态的,存在 内存中。并且进程是有生命周期的,生命周期就是指程序从开始到结束的过程。
一、Linux操作系统引导过程(开机启动程序)
- bios 开机自检
- mbr
- grub
- kernel 加载内核
- init 启动程序
1.1 bios 开机自检
bios小程序 集中在主板上。
- 开机检测硬件是否有故障
- 指引硬件去哪里找操作系统(根据bios中设置的启动顺序去找 操作系统 1是本地硬盘 2是移动外接设备 3是网卡)
开机启动项
- 首选 硬盘
- 再就是 移动设备 (U盘、光驱、外接硬盘)
- 最后 网卡
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 6 | vim grub.conf |
| centos 7 | vim grub.cfg |
1.4 内核 kernel
所谓加载内核,就是把内核放入内存中运行。
升级内核的两种方式:
- 编译 ,但比较复杂
- yum
1.5 启动程序
| 类型 | 启动的第一个程序 | 备注 |
|---|---|---|
| centos7 | systemd | 守护进程 |
| centos6 | init | 进程初始化 |
// systemd 是保姆级程序,功能比 init 大。
小拓展:
为什么读取/etc/passwd文件?
因为要读取用户名和密码。
二、运行级别
运行级别分为0-6,共7个运行级别。
// 0是关机;1是急救模式;2、3、4是字符界面;5是图形界面;6是重启。最常用的级别是3和5,3是完整多用户模式。2和3基本一样,2可以在没有网络的环境下运行。注意,运行级别尽量不要设置0和6。
| 运行级别 | 名称 | 说明 |
|---|---|---|
| 0 | target | 关机状态,使用该级别时 将会关闭主机 |
| 1 | rescue.target 急救/修复模式 | 单用户模式,不需要密码验证 即可登录系统,多用于系统维护,不能远程登录 |
| 2 | 基本一样,但没有3功能多 | 用户定义/域特定运行级别。默认等同于3 |
| 3 | 完整多用户模式 | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
| 4 | 测试版,但没有3功能多,基本不用! | 用户定义/域特定运行级别。默认等同于3 |
| 5 | graphical.target经常用! | 图形界面的多用户模式,提供了图形桌面操作环境 |
| 6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
怎么切换用户级别?
runlevel 可以查看当前的运行级别
N 代表没有切换过运行级别
init 3 可以切换到级别3
get-default :取得当前的target
set-default :设置指定的target为默认的运行级别 3 5
isolate :切换到指定的运行级别
unit.target :上面列出的运行级别
三、systemd 和 init
| 类型 | 启动的第一个程序 | 备注 |
|---|---|---|
| centos7 | systemd | 守护进程 |
| centos6 | init | 进程初始化 |
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 程序管理主要是下面三类:
- 系统必要的程序;
- yum rpm 安装的程序;
- 编译安装的程序,需要手写配置文件后才可以
/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
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