引导和服务

kernel 实现进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能等功能

内核设计流派

  • 宏内核(monolithic kernel):又称单内核和强内核,Unix,Linux把所有系统服务都放到内核里,所有功能集成于同一个程序,分层实现不同功能,系统庞大复杂,Linux其实在单内核内核实现了模块化,也就相当于吸收了微内核的优点。

  • 微内核(micro kernel):Windows,Solaris,HarmonyOS简化内核功能,在内核之外的用户态尽可能多地实现系统服务,同时加入相互之间的安全保护,每种功能使用一个单独子系统实现,将内核功能移到用户空间,性能差。

一、引导过程(开机启动过程)

1.1 bios 加电自检(开机自检)

服务器主机开机以后,bios会检测硬件是否正常,然后根据bios中的启动项设置,去找内核文件

硬件启动POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测

主板的ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等

boot 开机启动顺序: 你可以把内核文件放在何处?
1 . 硬盘
2 . 移动备,u盘 移动硬盘,光驱
3 . 网络启动

1.2 mbr 引导

mbr (二进制) : 因为 grub 太大   第一个扇区存不下 所有的 grub 程序,所以分为2部分

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

1.3 grub 菜单

系统类型双西雅图 内核文件 默认值

文件系统的驱动
grub : 根据 grub 配置文件(grub.cfg)中记录的位置, 去找到内核文件 (高级语言)

对于 Linux 操作系统来说,GRUB(GRand Unified Bootloader,统一启动加载器)是 使用最为广泛的多系统引导器程序。系统控制权传递给 GRUB 以后,将会显示启动菜单给 用户选择,并根据所选项(或采用默认值)准备加载 Linux 内核文件,然后将系统控制权转交给 内核。需要注意的是,CentOS 7 采用的是 GRUB2 启动引导器。

总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置

grub功能和组成

bootloader: 引导加载器,引导硬件去找到 内核(操作系统的核心)

  • Windows: ntloader,仅是启动OS

  • Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核

Linux的bootloader

  • LILO:LInux LOader,早期的bootloader,功能单一

  • GRUB: GRand Unified Bootloader, CentOS 5,6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使用GRUB 2.02

GRUB 启动阶段

  • primary boot loader :

    1st stage:MBR的前446个字节 引导 硬件去找 内核

    1.5 stage:MBR 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统

  • secondary boot loader :2nd stage,分区文件/boot/grub2/grub.cfg

1.4 加载内核

Linux 内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间, 负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个 Linux 操作系统的运行过 程。在 CentOS 系统中,默认的内核文件位于“/boot/vmlinuz-3.10.0-514.el7.x86_64”。

总结:把内核和镜像文件系统加载到内存中 可以使用

1.5 linux系统运行的第一个程序

centos 6:

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

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

centos7 :systemd

区别:
init     串行启动后续的程序    一个一个按顺序启动
systemd     是并行启动程序     全都一起启动

linux  操作系统有运行级别     init
0       关机
1       单用户 类似于 windows 的急模式
2       字符界面     少些功能
3       字符界面
4       字符界面     
5       图形界面
6       重启

runlevel   查看当前运行级别

systemctl   get-default   查看默认的运行级别
systemctl   set-default   设置默认的级别

1.6 开机启动的完整过程

bios加电自检  ----- mbr----- grub  ---- 加载内核文件 ------ 启动第一个进程

加电后bios程序会自检硬件,硬件无故障后,会根据第一启动项去找内核,一般来说第一启动项是硬盘,找到硬盘后,会根据mbr 的指引 找到完整的 grub 程序,再根据grub的配置文件(grub.cfg)找到内核文件的具体位置,然后将内核文件加载到内存中运行,内存加载好后会启动第一个程序。

二、服务

2.1 systemd 服务

systemd 服务的特点:

1.对比5 6 可以解决依赖关系并行启动

2.按需启动

3.自动解决依赖关系

负责在系统启动或运行时,激活系统资源,服务器进程和其它进程

Systemd新特性

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

  • 按需启动守护进程

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

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

  • socket与服务程序分离

  • 向后兼容sysv init脚本

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

  • systemctl无法与之通信和控制

  • 系统状态快照

systemd 核心概念:unit

unit 表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听

socket、保存的系统快照以及其它与init相关的信息

systemd   保姆级
yum 以及 rpm 安装的 软件可以直接使用 systemctl 去启动 关闭,重启 开机自启 等功能
编译安装  不可以直接使用 systemctl 命令去管理程序,需要手写一个配置文件

systemd     centos7
systemctl   start      服务名               开启服务
systemctl   stop       服务名              停止服务
systemctl   status     服务名             查看系统服务状态
systemctl   reload     服务名            重新加载服务
systemctl   restart     服务名             重新启动服务

开机自启
systemctl   enable   服务名

开机自启并立即启动
systemctl   enable  --now  服务名

开机不自启
systemctl   disable   服务名

开机不自启并立即关闭
systemctl   disable   --now  服务名

在systemd中不同类型的systemd对象被统一称为单元,是让系统知道该如何进行操作和管理资源的主要对象,所以systemd有许多单元类型。

systemd单元文件最初默认存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件。

systemctl 命令用于管理各种类型的systemd单元,可以使用“systemctl -t help”命令来查询systemd支持的单元类型。

单元类型 护展名 说明
Service .service 护展名
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 目标)

[root@localhost ~]#systemd-analyze blame
#启动过程   生成网页systemd-analyze plot > boot.html

ll /usr/lib/systemd/system
#查看system的文件位置



[root@localhost ~]# systemctl -t help
Available unit types:
service
socket
busname
target
snapshot
device
mount
automount
swap
timer
path
slice
scope
[root@localhost ~]# ls /usr/lib/systemd/system
abrt-ccpp.service                        plymouth-poweroff.service
abrtd.service                            plymouth-quit.service
abrt-oops.service                        plymouth-quit-wait.service



#########system#####################
############unit 格式说明:#################
以 “#” 开头的行后面的内容会被认为是注释
相关布尔值,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 管理文件
[root@localhost ~]#vim /lib/systemd/system/hello.service
[Unit]
Description=Hello World
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/bin/kill sh
[Install]
WantedBy=multi-user.target
[root@localhost ~]#systemctl daemon-reload
[root@localhost ~]#systemctl status hello.service 
● hello.service - Hello World
   Loaded: loaded (/usr/lib/systemd/system/hello.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2022-03-01 00:40:54 CST; 6s ago
 Main PID: 20993 (sh)
   CGroup: /system.slice/hello.service
           ├─20993 /bin/sh -c while true; do echo Hello World; sleep 1; done
           └─21005 sleep 1

3月 01 00:40:54 localhost.localdomain systemd[1]: Started Hello World.
service unit文件格式

unit 格式说明:

  • 以 “#” 开头的行后面的内容会被认为是注释

  • 相关布尔值,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进程启动类型

  1. simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中

  2. forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止

  3. oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中

  4. dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行

  5. notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息

  6. idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务

  • 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:安装本服务的时候还要安装别的相关服务

2.2 chkconfig

chkconfig工具:

格式: chkconfig --list [服务名称]

chkconfig --add 服务名称

chkconfig --level 级别列表服务名on/off

chkconfig --add httpd

chkconfig --level 35 httpd on

chkconfig     centos6
service    服务程序   start
service    服务程序   stop
service    服务程序   restart
service    服务程序   reload
service    服务程序   status
在/etc/init.d/写一个同名文件的脚本(必须要有 执行权限)
chkconfig   --add   服务名称
chkconfig  --level   35   服务程序  on  开机自启
chkconfig  --level   35  服务程序   off    关闭开机自启 

什么需要加入服务中  便于管理 习惯 写脚本
 编译安装,不会 生成脚本,单元文件,需要手动编写
 
写脚本,复制yum 单元
 





加到服务中?
yum -y install pcre-devel zlib-devel gcc gcc-c++ make 
#依赖包,编译软件
cd /opt
tar zxvf nginx-1.120.tar.gz -C /opt
cd nginx-1.120  
./configure \
--prefix=/usr/local/nginx \
#安装路径
--user=nginx \
#指定用户名  指定谁来管理他
--group=nginx \
#指定用户组
--with-http_stub_status_module
#启用此模块支持状态统计

./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

useradd -M  -s /sbin/nologin nginx
#创建管理用户

make && make install
#编译安装
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#这步可以不做,做软链接,让系统可以直接使用

cat /usr/local/nginx/logs/nginx.pid
#查看nginx进程号,便于停止
停止
kill  -3 进程号

vim /etc/init.d/nginx     #写一个脚本

#!/bin/bash 
#chkconfig: - 99 20 
#description:Nginx Service Control Script 
PROG="/usr/local/nginx/sbin/nginx" 
PIDF="/usr/local/nginx/logs/nginx.pid" 

case "$1" in
start) $PROG 
;; 
stop) 
kill -s QUIT $(cat $PIDF) 
;; 
restart) 
$0 stop $0 start
;; 
reload) 
kill -s HUP $(cat $PIDF) 
;;
*) echo "Usage: $0 {start|stop|restart|reload}" 
exit 1 
esac 
exit 0

chmod +x /etc/init.d/nginx 
#给脚本加上权限
ss -ntap |grep nginx
#查看服务有没有启动

chkconfig --add nginx
#将服务加入


chkconfig --list  nginx
#查看服务
chkconfig --level 35 nginx on
#开启3和5自动开启


vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx 
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target

systemctl daemon-reload 
#重新加载配置

localectl set-locale LANG=zh_CN.utf8
#设置系统语言为中文
localectl set-locale LANG=en_US.utf8
#设置系统语言为英文


localectl [status ]
#查看当前系统使用的语言

三、实验

3.1 模拟破坏 mbr 和 分区表 然后修复

第一步:新加一块盘,将 备份文件备份到 新盘

引导和服务_第1张图片

引导和服务_第2张图片

引导和服务_第3张图片

第二步:备份分区表以及 mbr

引导和服务_第4张图片

第三步:模拟破坏

引导和服务_第5张图片

可以看到无法正常开机启动了

第四步:进入到急救模式还原 sda 

引导和服务_第6张图片

引导和服务_第7张图片

引导和服务_第8张图片

引导和服务_第9张图片

然后就可以正常开机了。

1.新加一块盘,将 备份文件备份到 新盘
2.dd  if=/dev/sda  of=/mnt/mbr  count=1  bs=512 备份分区表以及 mbr
3.模拟破坏 dd if=/dev/zero of=/dev/sda   count=1  bs=512

然后进入急救模式: 3 2 1

mkdir   bak
mount   /dev/sdb   cak
dd   if=cak/mbr    of=/dev/sda count=1    bs=512
方法二:
ifconfig   网卡名称   ip地址/子网掩码            临时设置ip地址
scp   远程复制
scp     本地文件地址      对面的地址:对面的文件夹

3.2 修复 grub 文件及程序

第一步:模拟破坏  grub.cfg  配置文件

引导和服务_第10张图片

第二步:重启进入急救模式 321

引导和服务_第11张图片

 引导和服务_第12张图片

引导和服务_第13张图片

引导和服务_第14张图片

引导和服务_第15张图片

引导和服务_第16张图片

引导和服务_第17张图片

第三步:先切换根,从光盘的根切换到 自己系统的根

引导和服务_第18张图片

第四步:重新安装 grub2 程序在 sda 磁盘 并 重新生成配置文件

引导和服务_第19张图片

第五步:更改第一启动项

引导和服务_第20张图片

引导和服务_第21张图片

3.3 破解密码

1. 在有光驱的情况下

进入到急救模式

chroot   /mnt/sysimage     切换根目录
passwd                               修改密码

exit
reboot

2.在无光驱的情况下

第一步:进入系统 在选择  内核界面 选择带一个选项 按e

引导和服务_第22张图片

第二步:将光标移动到 linux 开头行的 最后, 添加rd.break            ctrl +x 运行

引导和服务_第23张图片

第三步:进入单用户   进行挂载 、切根 、修改密码 、重新打上标记操作

引导和服务_第24张图片

3.4 设置运行级别

命令格式:

systemctl [command] [unit.target]
command参数:

  get-default :取得当前的target  

  set-default :设置指定的target为默认的运行级别   3 5

  isolate :切换到指定的运行级别

  unit.target :上面列出的运行级别

示例:



init 0        systemctl isolate poweroff.target     systemctl   poweroff       poweroff
init 1        systemctl isolate rescue.target
init 3        systemctl isolate multi-user.target
init 5        systemctl isolate graphical.target    图形
init 6        systemctl isolate reboot.target        systemctl   reboot          reboot


0:关机
1:单用户模式(root自动登录), single, 维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启

systemctl get-default    
#获得当前的运行级别
systemctl set-default multi-user.target   
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
#设置默认的运行级别为mulit-user
systemctl isolate multi-user.target   
#在不重启的情况下,切换到运行级别mulit-user下
systemctl isolate graphical.target   
#在不重启的情况下,切换到图形界面下



systemctl  7  管理工具
chkconfig  6  工具


/etc/init.d   
chkconfig工具:    
格式: chkconfig --list [服务名称]
chkconfig --add 服务名称   
chkconfig --level 级别列表服务名on/off    0-6 7个级别   on off
chkconfig --add httpd
chkconfig --level 35 httpd on

#!/bin/bash 
#chkconfig: - 99 20 
#description:Nginx Service Control Script 
PROG="/usr/local/nginx/sbin/nginx" 
PIDF="/usr/local/nginx/logs/nginx.pid" 

case "$1" in
start) $PROG 
;; 
stop) 
kill -s QUIT $(cat $PIDF) 
;; 
restart) 
$0 stop $0 start
;; 
reload) 
kill -s HUP $(cat $PIDF) 
;;
*) echo "Usage: $0 {start|stop|restart|reload}" 
exit 1 
esac 
exit 0


[root@localhost init.d]#ls /etc/rc*.d/
#S开头启用
[root@localhost init.d]#chkconfig --level 3 nginx on

3.5 编译安装nginx -systemctl

编译安装过程

cd  /opt

wget http://nginx.org/download/nginx-1.18.0.tar.gz

tar xf   nginx-1.18.0.tar.gz

cd  nginx-1.18.0

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel 
#请使用网络源

mkdir /apps/nginx -p    

./configure   --prefix=/apps/nginx

make

make  install


#ln -s /apps/nginx/sbin/nginx   /usr/sbin/nginx 
#做软链接   可以补全  这里不怎么需要

自制 systemctl 管理文件

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



[Unit]
Description=The nginx HTTP and reverse proxy server

[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx
ExecStop=/usr/bin/kill -s TERM $MAINPID
ExecReload=/apps/nginx/sbin/nginx -s reload


[Install]
WantedBy=multi-user.target

#完成后保存并退出


systemctl  daemon-reload
#nginx 要 告诉  systemd  我加入你了

systemctl  start  nginx  
#开启nginx


各段解释:
[Unit]
Description=The nginx HTTP and reverse proxy server
#描述软件的功能

[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
# 方便使用  pid  号 进行操作  ,  指明进程的 pid 号
ExecStart=/apps/nginx/sbin/nginx
#使用绝对路径启动
ExecStop=/usr/bin/kill -s TERM $MAINPID
#杀死进程
ExecReload=/apps/nginx/sbin/nginx -s reload
#重新加载

[Install]
WantedBy=multi-user.target
安装子字符界面

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