引导过程与服务控制

文章目录

一、Linux操作系统引导过程

1、开机启动的完整过程

  • BIOS加电自检 ---- MBR --- GRUB --- 加载内核文件 --- 启动进程

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

BIOS:检测硬件是否正常,然后根据BIOS中的启动项设置,去找内核文件

1.1 开机自检(BIOS)

服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘

总结:检测出第一个能够引导系统的设备,比如硬盘或者光驱

1.2 MBR引导
  • 指引硬件找到内核文件

当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR(主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区,或者直接根据MBR记录中的引导信息调用启动菜单(如GRUB)

总结:运行放在MBR扇区里的启动GRUB引导程序(因为grub程序启动太大,第一个扇区存不下所有的grub程序,所以分为两部分)

1.3 GRUB菜单
  • 根据grub配置文件(grub.cfg)中记录的位置,去找到内核文件

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

CentOS 7采用的是GRUB2启动引导器。

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

1.4 加载内核(kernel)

Linux内核是一个预先编译号的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度。内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程

CentOS 7系统中,默认的内核文件位于"/boot/vmlinuz-3.10.0-514.e17.x86_64"

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

1.5 init进程初始化

为了完成进一步的系统引导过程,Linux内核首先将系统中的额"/sbin/init"程序加载到内核中运行(运行中的程序称为进程),init集成负责完成整个系统的初始化,最后等待用户进行登录

总结:加载硬件驱动程序,内核把init进程加载到内存中运行

2、系统初始化进程

2.1 init进程

①、由Linux内核加载运行/sin/init程序

②、init进程是系统中第一个进程,是所有进程的父程序

③、init进程的PID(进程标记)号永远为1

2.2 systemd
  • systemd是系统的级程序,代为管理系统上的程序

①、systemd是Linux操作系统的一种init软件

②、CentOS 7中采用全新的Systemd启动方式,取代传统的SysVinit

③、CentOS 7中运行的第一个init进程是/lib/systemd/systemd

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

  • centos6:启动init(串行启动后续程序,一个一个按顺序启动)

  • centos7:启动systemd(并行启动程序,全部一起启动)

    init与systemd区别
    1. init:串行启动后续程序,一个一个按顺序启动
    2. systemd:并行启动程序,全部一起启动

systemd方便管理程序,将程序按照特定的功能分成了很多特定的单元(如:服务单元,文件路径单元,挂载单元等)

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

3、Systemd单元类型

4、运行级别所对应的Systemd目标

  • 0---关机
  • 1---单用户(类似于windows的急救模式)
  • 2---字符界面(少一些功能)
  • 3---字符界面(默认)
  • 4---字符界面(没有使用)
  • 5---图形界面
  • 6---重启
bash 复制代码
runlevel    #查看当前运行级别

systemctl  get-default    #查看默认的运行级别

systemctl  set-default    #设置默认的级别

target    #关机

rescue.target    #单用户

multi-user.target    #字符界面

graphical.target    #图形界面

reboot.target    #重新启动

二、故障处理

1、service unit文件格式

1.1 unit 格式说明
  • 以 "#" 开头的行后面的内容会被认为是注释
  • 相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
  • 时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
1.2 service unit file文件通常由三部分组成
  • [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
  • [Service]:与特定类型相关的专用选项;此处为Service类型
  • [Install]:定义由"systemctl enable"以及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项
1.3 Unit段的常用选项
  • Description:描述信息
  • After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
  • Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
  • Wants:依赖到的其它units,弱依赖
  • Conflicts:定义units间的冲突关系
1.4 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/目录

1.5 Install段的常用选项

Alias:别名,可使用systemctl command Alias.service

RequiredBy:被哪些units所依赖,强依赖

WantedBy:被哪些units所依赖,弱依赖

Also:安装本服务的时候还要安装别的相关服务

1.6 编译安装nginx-systemctl
bash 复制代码
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 /data/nginx -p    
./configure   --prefix=/data/nginx
make
make  install

ln -s /data/nginx/sbin/nginx   /usr/sbin/nginx 
#做软链接   可以补全  

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

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

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

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

systemctl  daemon-reload     #重新加载服务的配置文件

systemctl  start  nginx      #开启

systemctl status nginx      #查看状态
编译安装nginx,然后用systemctl管理(图文详解)

2、修复MBR扇区故障

2.1 故障原因
  • 病毒、木马等造成的破坏
  • 不正确的分区操作、磁盘读写误操作
2.2 故障现象
  • 找不到引导程序,启动中断

  • 无法加载操作系统,开机后黑屏

2.3 解决思路
  • 应提前做好备份文件

  • 以安装光盘引导进入急救模式

  • 从备份文件中恢复

2.4 故障模拟及处理过程

MBR位于第一块硬盘(/dev/sda)的第一个物理扇区处,总共512字节

①、备份MBR扇区数据到其他磁盘(/dev/sdb1)

bash 复制代码
mkdir /backup

mount /dev/sdb /backup

dd if=/dev/sda  of=/backup/mbr.bak bs=512 count=1

②、模拟破坏MR引导扇区

bash 复制代码
 dd if=/dev/zero  of=/dev/sda bs=512 count=1

③、应道界面进入急救模式,从备份文件中国灰度MBR扇区数据

bash 复制代码
先加载好光盘镜像,重启操作系统

当出现安装向导界面时,选择"Troubleshooting"选项

再选择"Rescue a CentOS system"选项,进入急救模式
1111
选择"1"选择Continue并按Enter键继续

在此按Enter键后将进入带"sh-4.2#"提示符的Bash Shell环境

sh-4.2# mkdir /backupdir

sh-4.2# mount/dev/sdb /backupdir      #挂载带有备份文件的分区

sh-4.2# dd if=/backupdir/mbr.bak of=/dev/sda     #恢复备份数据

sh-4.2# hexdump -C -n 512 /dev/sda       #查看字节(字节恢复正常后,重新启动系统即可恢复)
修复MBR扇区故障(图文详解)

3、修复GRUB引导故障

3.1 故障原因

①、MBR中的GRUB引导程序遭到破坏

②、grub.conf文件丢失、引导配置有误

3.2 故障现象

系统引导停滞,显示"grub>"提示符

3.3 解决思路

①、尝试手动输入引导命令

②、进入急救模式,重写或者从备份中恢复grub.conf

③、向MBR扇区中重建grub程序

3.4 故障模拟及处理过程

/boot/grub/目录下的包是用于启动菜单的背景图片及样式

/boot/grub2/grub.cfg #GRUB配置文件

方法一:手动输入引导命令(笨拙繁琐,不建议使用)

bash 复制代码
grub> insmod xfs     #加载指定的模块到内核

grub> linux16 /vmlinuz-3.10.0-693.e17.x86_64  root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f ro rhgb quite  LANG=zh_CN.UTF-8       #内核的名字及位置等信息

grub> initrd16 /initramfs-3.10.0..693.e17.x86_64.img    #镜像系统文件

grub> boot      #引导boot

方法二:进入急救模式,恢复GRUB引导程序

MBR位于第一块硬盘(/dev/sda)的第一个物理扇区处,总共512字节,前446字节是主引导记录,分区保存在MBR扇区中的第447-510字节中

①、备份数据到其他磁盘中

bash 复制代码
mkdir /bak

monut /dev/sdb1 /bak

dd if=/dev/sda of=/bak/grub.bak bs=446 count=1

②、模拟对MBR中的GRUB引导程序的破坏,但并不破坏分区表

bash 复制代码
  dd if=/dev/zero of=/dev/sda bs=446 count=1

③ 引导界面进入急救模式,从备份文件中恢复GRUB引导程序

bash 复制代码
sh-4.2# mkdir /backupdir

sh-4.2# mount/dev/sdb1 /backupdir    #挂载带有备份文件的分区

sh-4.2# dd if=/backupdir/grub.bak of=/dev/sda     #恢复备份数据

sh-4.2# exit     #执行exit命令退出临时Shell环境,系统将会自动重启

方法三:引导界面进入急救模式,重建GRUB菜单配置文件

bash 复制代码
mv /boot/grub2/grub.cfg /opt       #先模拟破坏grub.cfg配置文件

重启进入急救模式 321

sh-4.2# chroot /mnt/sysimage     #先切换根,从光盘的根切换到系统的根

bash-4.2# grub2-install /dev/sda     #重新将GRUB引导程序安装到第一块硬盘(/sev/sda)的MBR扇区,(如果有多个分区可省略)

bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg     #重新生成GRUB菜单的配置文件

bash-4.2# exit     #退出chroot环境

sh-4.2# reboot     #重启
修复GRUB引导故障(图文详解)

4、遗忘root用户密码

4.1 故障原因
  • 遗忘root用户的密码
4.2 故障现象
  • 无法进行需要root权限的管理操作

  • 若没有其他可用账号,将无法登陆系统

4.3 解决思路
  • 进入急救模式,重设密码
4.4 故障模拟及处理过程
  • 有光驱
bash 复制代码
chroot /mnt/sysimage    #切换根目录
passwd    #修改密码
exit     #退出chroot环境
reboot    #重启
  • 无光驱
bash 复制代码
进入系统,在选择内核界面,选择第一个选项,按e

将光标移动到linux开头行的最后(按end键),添加rd.break 然后按ctrl+x 运行
进入单用户

mount -o remount,rw /sysroot    #重新挂载,添加读写权限

chroot /sysroot    #切换到真正的根

passwd    #修改密码

touch /.autorelabel    #如果你开启了selinux需要重新打上标记
修改root用户密码(图文详解)

三、Linux系统服务控制

1、系统服务控制

服务程序

  • 一旦运行,一直运行,不会退出;
  • 一般是后台运行,不会影响前台的操作
1.1 格式:systemctl 控制类型 服务名称
1.2 控制类型

①、start---启动

②、stop---停止

③、restart---重新启动

④、reload---重新加载配置文件

⑤、status---查看服务状态

centos6 ------ chkconfig

bash 复制代码
service  服务程序  start     #开启

service  服务程序  stop     #关闭

service  服务程序  status    #查看状态

service  服务程序  reload     #重新加载配置文件

service  服务程序  restart      #重启

chkconfig --level 35 服务程序 on    #开机自启

chkconfig --level 35 服务程序 off    #关闭开机自启

centos7 ------ systemd

bash 复制代码
systemctl  start  服务名       #开启

systemctl  stop  服务名       #关闭

systemctl  status  服务名       #查看状态

systemctl  reload  服务名       #重新加载配置文件

systemctl  restart  服务名       #重启


systemctl  enable  服务名    #开机自启

systemctl  disable  服务名    #开机不自启

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

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

四、Linux系统运行级别切换

1、查看运行级别

1.1 runlevel命令:runlevel只能查看切换运行级别与当前运行级别
1.2 systemctl工具
  • systemctl 时能查看默认的运行级别

2、临时切换运行级别

2.1 init命令
  • init命令参数是运行级别所对应的的数字
2.2 systemctl工具
  • systemctl的命令参数是具体的target
2.3 init与systemctl对应表

3、查看系统默认级别

  • systemctl get-default

4、设置临时运行级别

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

​ chkconfig --add 服务名称

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

bash 复制代码
chkconfig --add httpd

chkconfig --level 35 httpd on     #开机自启

chkconfig --level 35 httpd off     #关闭开机自启

5、设置永久运行级别

bash 复制代码
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

systemctl set-default multi-user.target

五、优化开机自动加载服务

1、优化启动过程

1.1 ntsysv工具
  • 提供一个交换式、可视化窗口
  • 可以在字符终端运行
  • 便于集中管理多个服务
  • 用于控制服务是否开机自启动
1.2 systemctl/chkconfig工具
  • 不提供交互式、可视化窗口
  • 管理单个服务效率更高

2、系统服务的启动和控制

2.1 ntsysv系统服务管理工具
  • 输入ntsysv命令进入设置界面
  • 按空格键标志服务选项(*为自启项)
  • 按↑、↓键切换服务选项
  • 按tab切换光标

常用命令

bash 复制代码
sysemctl is-enabled 服务名称     #查看系统服务的启动状态

systemctl enable 服务名称       # 开启开机自启动

syatemctl disable 服务名称      # 关闭开机自启动

3、命令补充

bash 复制代码
hostnamectl set-hostname 新主机名    #永久修改主机名

hostnamectl status    #查看主机名的状态

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

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

systemd=analyze     #查看系统启动耗时
相关推荐
hikktn30 分钟前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
音徽编程32 分钟前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
幺零九零零2 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
23zhgjx-NanKon2 小时前
华为eNSP:QinQ
网络·安全·华为
23zhgjx-NanKon2 小时前
华为eNSP:mux-vlan
网络·安全·华为
点点滴滴的记录2 小时前
RPC核心实现原理
网络·网络协议·rpc
昔我往昔3 小时前
阿里云文本内容安全处理
安全·阿里云·云计算
Lionhacker3 小时前
网络工程师这个行业可以一直干到退休吗?
网络·数据库·网络安全·黑客·黑客技术
程思扬4 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
ZachOn1y4 小时前
计算机网络:运输层 —— 运输层概述
网络·tcp/ip·计算机网络·运输层