【Linux】引导与服务

发布于:2024-04-16 ⋅ 阅读:(197) ⋅ 点赞:(0)

一、系统引导过程

系统引导过程:
                        开机自检(BIOS) ----> MBR ----> GRUB ----> 加载内核 ----> 启动程序

1.1 开机自检

(1)开机自检:硬件启动POST(BIOS的一个主要功能)来加电检测硬件

(2)指引硬件:主板的ROM BIOS指引硬件去找操作系统(根据BIOS中设置的启动顺序去找操作系统)

顺序:硬盘、移动设备(u盘、光驱)、网卡

BIOS功能集成在主板上

1.2 MBR引导

MBR(跟硬盘有关) 512字节

存在于硬盘第一个扇区中(开机引导程序 446字节的GRUB引导文件,后64字节为分区表), 运行放在MBR扇区中的GRUB引导程序。

1.3 GRUB菜单

GRUB

主要作用:引导硬件去找到内核即操作系统(根据/boot/grub2/grub.cfg找到内核文件)

注意centos6和centos7的区别,centos6使用grubcentos7使用grub2

1.4 加载内核

内核是操作系统的核心

kernel 加载内核,把内核放入内存中运行

1.5 启动程序

centos7启动的第一个程序 systemd(守护进程)

centos6启动的第一个程序 init

init:启动其他程序时,是串行启动(一个一个启动)

systemd:启动其他程序时,是并行启动(同时启动)


​​​​​​​

二、 解决系统启动中的故障

2.1 多块磁盘处理MBR分区故障

                                                MBR分区故障( Centos7系统演示)        

                             方法:作好备份文件,进入急救模式,从备份文件中恢复。


1. 添加硬盘

2.为新磁盘做分区


3. 格式化分区,并且挂载


4. 备份MBR文件


5. 模拟破坏原MBR


6. 重启虚拟机发现进入以下界面

完成以上步骤 输入reboot重启即可

2.2 多台设备处理MBR分区故障 

                    备份mbr引导扇区到其他磁盘,引导镜像急救模式进行mbr扇区恢复


1. 先备份一份MBR文件到opt下


2. 使用scp命令发送给第二台虚拟机


3. 模拟第一台虚拟机MBR故障


4. 重新开启虚拟机进入急救模式


5. 将IP地址临时修改为与第二台虚拟机为一个网段下


6. 使用scp命令传输备份文件MBR.bak


7. 将损坏的/dev/sda文件用备份文件MBR.bak恢复


8. 重启虚拟机即可

2.3 GRUB引导故障 

                                       GRUB引导故障 MBR中的GRUB程序被破坏

                                使备份grub.cfg文件丢失,进入急救模式后更改环境


1. 将/boot/grub2/grub.cfg转移至/mnt


2. 重启虚拟机,见到如下界面时,立马按下ESC按键


3. 重新配置grub.cfg文件


4. 重启虚拟机即可

2.4 遗忘密码

情景一:有光驱的情况下

                                                进入急救模式后在光驱中修改密码


1. 进入急救模式


2. 输入修改密码的命令即可

passwd ***    #新密码

exit    #退出当前系统

reboot    #重启操作系统

情景二 :没有光驱的情况下

1. 开机时在如下界面按'e'键进入编辑模式


2. 将光标移至此处

输入rd.break console=tty0 后​​​​​​​,按' ctrl + x '启动


 

3. 重新挂载并修改权限


4. 切换根目录,修改密码

三、 服务

什么是服务程序?

1.本地服务程序,管理本机

2.网络服务程序
为其他设备提供服务的程序,服务程序启动后,会持续监听端口。

systemd:管家式的程序,管理系统中其他程序。
为了方便管理,将系统中的程序按照一定的规则进行分类。

3.1 运行级别所对应的Systemd目标

运行级别 systemd的目标 说明
init 0 target 关机
init 1 rescue.target 单用户模式,不需要密码,多用于系统维护
init 2 Multi-user.target 用户定义/域特定运行级别,默认等同于3
init 3 Multi-user.target 字符界面的完整多用户模式,大多服务器主机运行在此级别
init 4 Multi-user.target 用户定义/域特定运行级别,默认等同于3
init 5 Graphical.target 图形界面的多用户模式
init 6 Reboot.target 重新启动
通过 ‘ runlevel ’ 命令可以查看在此之前使用的运行级别以及现在所处的运行级别

3.2 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的单元


3.3 .service文件格式

service unit file文件通常由三部分组成:

  • [Unit]:主要用来描述此软件的功能,man帮助,依赖关系等等
     
  • [Service]:主要作用是,systemd程序怎么具体管理该程序,以及一些额外配置
     
  • [Install]:在哪个运行级别启动

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要运行的命令或脚本 $mainpid
     
  • 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:安装本服务的时候还要安装别的相关服务

 

3.4 管理服务的方式 

1. 通过写脚本以及使用chkconfig工具 (一般不使用此方法)

chkconfig --list [服务名称]

chkconfig --add 服务名称

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

chkconfig --add httpd

chkconfig --level 35 httpd on

脚本编写以及chkconfig工具使用如下:

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自动开启

 2. 通过配置文件让systemd直接管理

a.系统必要的程序
b.yum rpm 安装的程序
c.编译安装的程序,自己编写.service文件且放在/usr/lib/systemd/system/文件夹下

编译安装程序编写.service文件过程如下:

cd   /opt    #切换目录至opt

wget http://nginx.org/download/nginx-1.18.0.tar.gz    #下载nginx包

tar xf nginx-1.18.0.tar.gz     #解压tar包


yum -y install pcre-devel zlib-devel gcc gcc-c++ make    #下载编译环境

cd  nginx-1.18.0/    #切换至解压后的目录下

./configure   --prefix=/apps/nginx    #编译检测安装环境

make
make  install    #编译安装


ln -s  /apps/nginx/sbin/nginx     /usr/local/bin    #为编译后的可执行文件做软链接


vim  /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
ExecReload=/apps/nginx/sbin/nginx -s reload
ExecStop=/usr/bin/kill  -s TERM  ${MAINPID}


[Install]
WantedBy=multi-user.target


systemctl  daemon-reload    #重新加载systemd程序

systemd管理时,使用的是systemctl命令,其中

systemctl start 服务名为开启服务

systemctl stop 服务名为关闭服务

systemctl status 服务名为查看服务状态

systemctl restart 服务名为重启服务

systemctl reload 服务名为重新热加载服务

systemctl enable --now 服务名为开启时自动启动服务且立即启动

systemctl disable --now 服务名为关闭开机自启且立即关闭

systemctl daemon-reload 重新加载systemd程序

3. 通过init程序管理(centos6)

同样写脚本到/dev/init.d/下,因为已经不常用所以不过多赘述。


网站公告

今日签到

点亮在社区的每一天
去签到