引导过程与服务控制

文章目录

一、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     #查看系统启动耗时
相关推荐
城南云小白4 分钟前
Linux网络服务只iptables防火墙工具
linux·服务器·网络
羌俊恩11 分钟前
视频服务器:GB28181网络视频协议
服务器·网络·音视频
Flying_Fish_roe33 分钟前
linux-网络管理-网络配置
linux·网络·php
xuan哈哈哈2 小时前
web基础—dvwa靶场(九)Weak Session IDs
web安全·网络安全
huaiyanchen2 小时前
chorme浏览器 您的连接不是私密连接
安全
hellojackjiang20112 小时前
即时通讯框架MobileIMSDK的H5端开发快速入门
网络·即时通讯·im开发
有时间要学习2 小时前
Linux——应用层自定义协议与序列化
linux·服务器·网络
Tony聊跨境3 小时前
什么是 SSL 代理?
网络·网络协议·ssl
我叫啥都行3 小时前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端