引导和服务

  • linux操作系统引导过程

  • 排除启动类故障

  • 服务控制以及切换运行级别

  • 优化启动过程

引导和服务

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

Kernel一般指实时操作系统。实时操作系统(Real Time Operating System,简称RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统。提供及时响应和高可靠性是其主要特点。————来自百度百科

内核设计流派

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

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

centos6之前版本的启动流程

服务,通过软件实现

Linux操作系统引导

操作系统存储在

硬盘、光驱 udisk、网络的远程机器

第一步:

POST:加电自检;

第二步:

磁盘第一个扇区,前446字节是grub程序的第一阶段。

grub,加载系统

引导过程(centos启动过程)

1、加电检测硬件是否有故障,如果无故障,就去bios中设置的第一启动项找操作系统

2、MBR引导第一个扇区的前446字节有一个grub程序第一阶段,引导硬件找到grub完整的程序

3、grub会根据grub.cfg配置文件找到操作系统

4、加载内核(操作系统)

5、启动程序——>祖宗进程(第一个启动的进程)centos7 systemd centos6 init

centos7——平行启动

 dd if=/dev/zero of=/dev/sda bs=512 count=1
 ​
 if(从哪里复制)of(复制到哪里)count(复制多少次)bs(一次复制多大 默认单位是字节)

 

Linux 操作系统的引导过程(完整补充): 1.开机自检 服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权,大多时候会移交给本机硬盘。 总结:检查硬件设备,检测出第一个能够引导系统的设备,比如硬盘或者光驱

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

3.GRUB 菜单 对于Linux操作系统来说,GRUB(统一启动加载器)是使用最为广泛的多系统引导器程序。系统控制权传递给GRUB以后,将会显示启动菜单给用户选择,并根据所选项(或采用默认值)加载Linux内核文件,然后将系统控制权转交给内核。 CentOS 7 采用的是 GRUB2 启动引导器。 总结:GRUB引导程序通过读取GRUB配置文件/boot/grub2/grub.cfg,来获取内核和镜像文件系统的设置和路径位置,并屏幕显示grub菜单

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

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

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

修复MBR扇区故障

故障现象

  • 找不到引导程序,启动中断

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

故障原因

  • 病毒、木马等造成的破坏

  • 不正确的分区操作、磁盘读写误操作

解决思路

  • 提前备份好文件

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

  • 从备份文件中恢复

 ###1.备份MBR 扇区数据到其它磁盘(/dev/sdb1)
 #查看非文本文档十六进制查看前512字节
 hexdump -C -n 512 /dev/sda
 #备份,备份到新硬盘上
 dd if=/dev/sda of=/opt/mbr.bak count=1 bs=512
 df#看新磁盘挂载路径(/mnt/)
 cp /opt/mbr.bak /mnt/#备份此处保留分区表
 ###2.模拟破坏MBR引导扇区
 dd if=/dev/zero of=/dev/sda bs=512 count=1
 ###3.引导界面进入急救模式,从备份文件中恢复MBR 扇区数据
 先加载好光盘镜像,重启操作系统,
 当出现安装向导界面时,选择“Troubleshooting”选项,
 再选择“Rescue a CentOS Linux system”选项,进入急救模式
 选择“1”选择 Continue并按 Enter 键继续
 再次按 Enter 键后将进入带“sh-4.2#”提示符的 Bash Shell 环境
 sh-4.2# mkdir /backupdir
 sh-4.2# mount /dev/sdb1 /backupdir              #挂载带有备份文件的分区
 sh-4.2# dd if=/backupdir/mbr.bak of=/dev/sda    #恢复备份数据
 sh-4.2# exit                                    #执行exit命令退出临时Shell 环境,系统将会自动重启

 

其一:存本地

image-20230831151413062

image-20230831151436614

image-20230831152242036

修复过程:

image-20230831153034223

其二:存其它机器

 ip a a 192.168.100.100 dev ens33
 #配置IP地址
 #scp远程拷贝
 scp 192.168.177.100:/mbr.bak .
 dd if=./mbr.bak of=/dev/sda bs=512 count=1
 ​
 ​
 mkdir /bak
 mount /dev/sdb1 /bak
 dd if=/bak/mbr.bak of=/dev/sda
 ​
 #备份MBR分区表
 dd if=/dev/sda of=/data/mbr.bak bs=1 count=64 skip=446
 scp /data/mbr.bak 192.168.177.100:/opt/
 #破坏MBR分区表
 [root@yml-2 ~]#dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
 #无法启动
 [root@yml-2 ~]#reboot
 #用光盘启动,进入rescue mode,选第3项skip to shell
 #配置网络
 #ifconfig ens33 192.168.177.200/24
 #ip a a 192.168.177.200/24 dev ens33
 #scp 192.168.177.100:/opt/mbr.bak ./
 #恢复MBR分区表
 #dd if=mbr.bak of=/dev/sda bs=1 seek=446
 #reboot

修复GRUB引导故障

故障现象

  • 系统引导停滞,显示“brub>”提示符

故障原因

  • MBR中的GRUB引导程序遭到破坏(引导第一阶段)

  • grub.conf文件丢失、引导配置有误(引导第二阶段)

解决思路

  • 尝试手动输入引导命令

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

  • 向MBR扇区中重建grub程序

 /boot/grub/目录下的包是用于启动菜单的背景图片以及样式
 /boot/grub2/grub.cfg    #GRUB配置文件
 #方法一
 grub> insmod xfs    #加载指定的模块到内核
 grub> linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=8fd74986-ae66-4ffd-b7d8-a19f2eca7b6f 
 grub> initrd16 /initramfs-3.10.0-693.el7.x86_64.img #镜像系统文件
 grub> boot  #引导boot
 #方法二
 MBR位于第一块硬盘(/dev/sda)的第一个物理扇区处,共512字节,前446字节是主引导记录,分区表保存在MBR扇区中的第447-510字节中
 mkdir /bak
 mount/dev/sdb1 /bak
 dd if=/dev/sda of=/bak/grub.bak bs=446 count=1
 #模拟对MRB中的GRUB引导程序的破坏,但并不破坏分区表
 dd if=/dev/zero of=/dev/sda bs=446 count=1
 #引导界面进入急救模式,从备份文件中恢复GRUB引导程序
 sh-4.2# mkdir /backupdir
 sh-4.2# mount /dev/sdb1 /backupdir
 sh-4.2# dd if=/backupdir/qrub.bak of=/dev/sda
 sh-4.2# exit
 #方法三:引导界面进入急救模式,重建GRUB菜单配置文件
 rm -rf /boot/grub2/grub.cfg
 #进入急救模式,加载光盘镜像,
 切换到硬盘的系统根环境
 sh-4.2# chroot mnt/sysimage
 #重新将GRUB引导程序安装到第一块硬盘 (/dev/sda) 的MRB扇区,如果有多个分区可省略
 bash-4.2# grub2-install /dev/sda
 ​
 #重新构建GRUB菜单的配置文件
 bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg
 ​
 #退出chroot 环境,并重启
 bash-4.2# exit
 sh-4.2# reboot
 ​
 ######遗忘 root 用户的密码
 #进入急救模式,加载系统镜像,切换到系统根环境
 sh-4.2# chroot /mnt/sysimage
 #重设 root 用户密码
 bash-4.2# passwd root

image-20230831165634232

image-20230831165659634

image-20230831165714065

操作:

image-20230831165941457

修复密码

故障现象

  • 无法进行需要root权限的管理操作

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

故障原因

  • 遗忘root用户密码

解决思路

  • 进入急救模式,重设密码

破解密码(有光盘时)
chroot /mnt/sysimage
#进入急救模式后,更改环境
passwd
#修改密码

image-20230831171457294

破解密码(无光驱)

进入单用户模式

 启动时任意键暂停启动
 按e键进入编辑模式
 将光标移动linux 开始的行,添加内核参数 rd.break(“end键”到行末)
 按ctrl-x启动
 mount –o remount,rw /sysroot
 chroot /sysroot
 passwd root
 #如果SELinux是启用的,才需要执行下面操作,如没有启动,不需要执行
 touch /.autorelabel
 exit
 reboot

image-20230726193641551

image-20230726193850227

image-20230726194620754

image-20230726195039513

image-20230726195302877

编译njinx

 

 

 

服务

所谓”服务“这类程序,就是要为其他程序或者是用户提供服务的,所以这些服务进程要在系统后台始终处于运行状态,以随时等待被调用。Linux系统中服务名称的最后一般都带有字母d,如vsftpd,httpd、sshd等,d是英文单词daemon的缩写,表示这是一种守护进程。 按照所服务的对象不同,Linux系统中的服务分为对内和对外两种类型。对内的服务面向的是本地计算机,主要作用是维持本地计算机的正常运行;对外的服务面向的是网络上的用户,主要作用是为网络中的用户提供各种功能。CentOs系统王要就是用来塔建各种网络服条器,而绝大多数的服条器程序都是以服务的状态在系统中运行的,所以我们所要研究的主要是那些对外提供功能的网络服务。通常情况下,运行了某种对外的服务后,都会在系统中开放相应的端口,如运行了httpd服务后会开放TCP80端口,运行了FTP服务后会开放TCP21端口等。

systemd服务

该进程可管理所以进程,使用命令systemctl

服务程序:为其他机器提供服务,若开启则一直监听端口等待服务命令

系统控制服务:systemctl

类型:start、stop、status、reload

在systemd中不同类型的systemd对象被统一称为单元,是让系统知道该如何进行操作和管理资源的主要对象,所以systemd有许多单元类型。
systemd单元文件最初默认存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件。
systemctl 命令用于管理各种类型的systemd单元,可以使用“systemctl -t help”命令来查询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的单元
 #linux系统的运行级别
 init可以临时切换运行级别
 runlevel查看运行级别
 [root@31yml ~]#runlevel
 N 5

systemctl start 服务名(开启)

systemctl stop 服务名(关闭)

systemctl status 服务名(查看状态)

systemctl restart 服务名(重启)

systemctl reload 服务名(重新加载配置文件不影响业务)

systemctl enable 服务名(开机自启动)(systemctl enable --now 开机自启并立马启动)

systemctl disable 服务名(开机不自启)(systemctl disable --now 开机不自启并立马关掉)

systemd,是保姆级的进程,代为管理所有进程,有请求来会负责叫醒

强调:安装的软件是否能使用systemd服务是依靠“/usr/lib/systemd/system/服务名.service”——yum安装会自动生成,编译安装需要手写。

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

 

设置运行级别

 #命令格式:(centos6中只需要改改配置文件)
 systemctl [command][unit.target]
 command参数:
 get-default:取得当前的target
 set-default:设置指定的target为默认的运行级别 例:35
 isolate:切换到指定的运行级别
 unit.target:上面列出的运行级别
 ​
 ​
 init 0      systemct] isolate poweroff.target       systemct1   poweroff    poweroff
 init 1      systemct1 isolate rescue.target
 init 3      systemct1 isolate multi-user.target
 init 5      systemct] isolate graphical.target      图形
 init 6      systemct] isolate reboot.target         systemct7   reboot      reboot
 ​
 #(centos7中需要使用命令修改权限)
 ​
 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
 #在不重启的情况下切换到图形界面

 

chkconfig

centos7里用systemctl,可以到/etc/init.d/network里写脚本才能使用chkconfig

 #chkconfig:2345 10 90
 2345级别  第10个启动 第90个关闭
 -表示全部级别

 

运行级别 systemd的target 功能
0 target 关机
1 rescue.target 单用户
2 multi-user.target 功能不全的字符界面
3 multi-user.target 完整的字符界面
4 multi-user.target 未被使用的字符界面
5 graphical.target 图形化界面
6 reboot.target 重启

init 0-6——就可以切换到对应的运行级别

chkconfig工具(在CentOS6里面进行使用): 格式: chkconfig --list [服务名称] chkconfig --add 服务名称 chkconfig --level 级别列表服务名on/off chkconfig --add httpd chkconfig --level 35 httpd on

 什么需要加入服务中  便于管理 习惯 写脚本
 #编译安装 不会 生成脚本,单元文件需要手动编写
  
 写脚本,复制yum 单元
  
 ​
 对于开机启动设置,centos7里可以利用脚本
 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 ]
 #查看当前系统使用的语言
 
posted @   Bacolate  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示