【Linux】引导与服务

本文详细介绍了计算机启动过程中的系统引导机制,从BIOS到GRUB引导,再到内核加载和启动程序,同时涵盖了如何解决如MBR分区、GRUB引导故障及遗忘密码等问题,以及systemd在服务管理和运行级别控制中的应用。
摘要由CSDN通过智能技术生成

一、系统引导过程

系统引导过程:
                        开机自检(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 0target关机
init 1rescue.target单用户模式,不需要密码,多用于系统维护
init 2Multi-user.target用户定义/域特定运行级别,默认等同于3
init 3Multi-user.target字符界面的完整多用户模式,大多服务器主机运行在此级别
init 4Multi-user.target用户定义/域特定运行级别,默认等同于3
init 5Graphical.target图形界面的多用户模式
init 6Reboot.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/下,因为已经不常用所以不过多赘述。

  • 32
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值