Linux引导过程与服务控制 理论干货+实验

文章目录

  • 前言
  • 一:引导过程
      • 1.1:☆☆☆引导过程总览☆☆☆
          • 1.1.1:开机自检(BIOS)
          • 1.1.2:MBR引导
          • 1.1.3:GRUB菜单
          • 1.1.4:加载内核(Kernel)
          • 1.1.5:init进程初始化
      • 1.2:systemd单元类型
      • 1.3:systemd 进程
  • 二:修复MBR扇区故障
      • 2.1:故障原因
      • 2.2:故障现象
      • 2.3:解决思路
      • 2.4:修复MBR扇区实验
          • 2.4.1:实验环境
          • 2.4.2:恢复步骤
          • 2.4.3:修复过程实验
  • 三:修复GRUB引导故障
      • 3.1:故障原因
      • 3.2:故障现象
      • 3.3:解决思路
      • 3.4:修复过程实验
  • 四:遗忘root用户密码的解决办法
      • 4.1:故障原因
      • 4.2:故障现象
      • 4.3:解决思路
      • 4.4:修复过程实验
  • 五:以上三个实验总结
  • 六:系统服务控制--使用systemd管理系统
      • 6.1:系统服务控制
      • 6.2:Linux系统的运行级别
          • 6.2.1:查看运行级别
          • 6.2.2:临时切换运行级别
      • 6.3:优化启动过程(开机自启)
          • 6.3.1:系统服务的管理工具
          • 6.3.2:ntsysv工具
          • 6.3.3:systemctl 工具
      • 6.4:系统服务的启动和查看
          • 6.4.1:设置开机启动
          • 6.4.2:查看服务启动状态

前言

  • 系统引导是操作系统运行的开始,在用户能够正常登录到系统之前,Linux的引导过程完成了一系列的初始化任务,并加载必要的程序和命令终端,为用户登录做好准备
  • CentOS7版本,系统启动和服务管理都交给systemd进行管理

一:引导过程

  • CentOS7系统中,由systemd掌管系统的初始化工作,系统的启动过程与之前的版本相比有了新的变化

1.1:☆☆☆引导过程总览☆☆☆

Linux引导过程与服务控制 理论干货+实验_第1张图片

1.1.1:开机自检(BIOS)
  • 服务器主机开机以后,将根据主板BIOS(Basic Input/Output System,基本输入输出系统)中的设置对CPU。内存。显卡,键盘等设备进行初步检测,并初始化部分硬件(加电自检)
  • 检测成功后根据预设的启动顺序移交系统控制权,大多数时候会移交给本机硬盘(加载部分驱动)
  • 自检过程中可以根据主机的POST信息进入配置,通常按某一组合键进入,常用F2或者Delete
1.1.2:MBR引导
  • 当从本机硬盘中启动系统时,首先根据硬盘的第一个扇区中MBR(Master Boot Record,主引导记录)的设置,将系统控制权传递给包含操作系统引导文件的分区
  • 或者直接根据MBR记录中的引导信息调用启动菜单(CentOS7中为grub2)
  • 若安装双系统,则两个系统需要分别安装在不同的盘符当中
1.1.3:GRUB菜单
  • 对于Linux系统来说,GRUB算是使用最广泛的多系统引导器程序
  • 系统控制权传递给GRUB以后,将会显示启动菜单提供给用户选择,并根据所选项(或采用默认值)加载Linux内核文件,然后将系统控制权转交给内核
1.1.4:加载内核(Kernel)
  • 系统引导器程序会从本地硬盘中加载内核以及内存文件系统(CentOS 7 中使用initramfs)
  • Linux内核是一个预先编译好的特殊二进制文件,介于各种硬件资源与系统程序之间,负责资源分配与调度
  • 内核接过系统控制权以后,将完全掌控整个Linux操作系统的运行过程
  • 内存文件系统initramfs 是经过gzip 的cpio归档,其中包含启动时所有必要的硬件内核模块,初始化脚本等。
  • 内核放在/boot目录下,/boot目录相当于Windows的system32
1.1.5:init进程初始化
  • 加载硬件驱动以及初始化进程(加载全部驱动)
  • 由Linux内核加载运行/sbin/init程序
  • 是系统中第一个进程
  • PID(进程标记)号永远为1
  • 内核初始化在initramfs中找到驱动程序的所有硬件,然后作为PID1从initramfs执行/sbin/init,CentOS 7中将其复制为systemd,systemd启动initrd.target中所有单元,并挂载根文件系统/sysroot,内核与文件系统由内存文件系统切换至系统根文件系统,并重新运行/sysroot.systemd。
  • systemd启动默认target(图形或者字符终端),最后等待用户进行登录

1.2:systemd单元类型

  • 在systemd中不同类型的systemd对象被统一称为单元,是让系统知道该如何进行操作和管理资源的主要对象,所以systemd有许多单元类型

  • systemd单元文件最初默认存放在/lib/systemd/system目录中,每当安装新的软件都会自动在这个目录中添加一个配置文件

  • systemctl 命令用于管理各种类型的systemd单元,可以使用“systemctl -t help”命令来查询systemd支持的单元类型

  • [root@localhost ~]# systemctl -t help		'//查询systemd支持的单元类型'
    Available unit types:
    service
    socket
    busname
    target
    ...此处省略部分内容
    
    
  • Systemd 单元类型

    单元类型 扩展名 说明
    Service .service 描述一个系统服务
    Socket .socket 描述一个进程间通信的套接字(通信协议的载体)
    Device .device 描述一个内核识别的设备文件
    Mount .mount 描述一个文件系统的挂载点
    Automount .automount 描述一个文件系统的自动挂载点
    Swap .swap 描述一个内存交换设备或目录
    Timer .timer 描述一个定时器(用于实现类似cron的调度任务)
    Path .path 描述一个文件系统中文件或目录(path 路径)
    Snapshot .snapshot 用于保存一个systemd的状态(snapshot 快照)
    Scope .scope 使用systemd的总线接口以编程的方式创建外部进程
    Slice .slice 描述居于Cgroup的一组通过层次组织的管理系统进程
    Target .target 描述一组systemd的单元(target 目标)
  • Init运行级别所对应的Systemd目标

    init运行级别 Systemd 的 target 说明
    0 target 关机状态,使用该级别时会关闭主机
    1 rescue.target 单用户模式,不需要密码验证即可登录系统,多用于系统维护
    2 multi-user.target 用户定义/域特定运行级别,默认等同于3
    3 multi-user.target 字符界面的完整用户模式,大多数服务器主机运行在此级别
    4 multi-user.target 用户定义/域特定运行级别,默认等同于3
    5 graphical.target 图形界面的多用户模式,提供了图形桌面操作环境
    6 reboot.target 重新启动,使用该级别时将会重启主机

1.3:systemd 进程

  • Linux系统中的进程(运行中的程序)使用数字进行标记,每个进程的身份标记称为PID
  • 从CentOS 7版本的系统开始systemd称为PID恒为1的初始化进程,是内核第一个加载的程序
  • systemd进程是维护整个Linux系统运行的所有进程的“始祖”,因此systemd进程是不允许被轻易终止的
  • 需要切换不同的系统运行状态时,可以向systemd进程发送正确的执行命令,由systemd自身来完成相关操作
  • systemd诞生的主要目的是为了将更多的服务并发启动,从而提高系统启动速度。其最大的优点在于具有提供按需启动服务的能力,只有在某个服务被真正请求时才进行启动。当服务结束时systemd就将其关闭,等待下次需要时启动。

二:修复MBR扇区故障

2.1:故障原因

  • 病毒,木马等造成的破坏
  • 不正确的分区操作,磁盘读写误操作

2.2:故障现象

  • 找不到引导程序,启动中断
  • 无法加载操作系统,开机后黑屏

2.3:解决思路

  • 提前做好备份文件
  • 以安装光盘引导进入急救模式
  • 从备份文件中恢复

2.4:修复MBR扇区实验

2.4.1:实验环境
  • VMware软件,开centos 7,并为其添加一块硬盘(备份数据用的)
2.4.2:恢复步骤
  • 1.备份已损坏MBR扇区数据(实际中我们都是备份整个文件)

    加一块磁盘做备份

  • 2.模拟故障

  • 3.加载系统镜像文件中的急救模式

    加载系统镜像文件中的内核界面

  • 将备份数据做恢复处理

2.4.3:修复过程实验
  • '第一步 : 将新添加的硬盘分区--格式化--挂载'
    ...省略部分内容		'//此处挂载操作省略,若有疑问,可查看之前关于挂载的博客'
    [root@localhost ~]# mount -a		
    [root@localhost ~]# df -hT
    文件系统       类型      容量  已用  可用 已用% 挂载点
    /dev/sda2      xfs        20G  3.1G   17G   16% /
    devtmpfs       devtmpfs  898M     0  898M    0% /dev
    ...省略部分内容
    /dev/sdb1      xfs        20G   33M   20G    1% /123
    [root@localhost ~]# dd if=/dev/sda of=/123/sda.mbr.bak bs=512 count=1		'//将/dev/sda中的512k 备份到挂载点/123中'
    记录了1+0 的读入
    记录了1+0 的写出
    512字节(512 B)已复制,0.000168125 秒,3.0 MB/秒
    [root@localhost ~]# ls /123		'//查看是否备份成功'
    sda.mbr.bak
    
    '第二步:模拟故障'
    [root@localhost ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1  	'//将/dev/zero无用文件覆盖/dev/sda,即损坏/dev/sda'
    记录了1+0 的读入
    记录了1+0 的写出
    512字节(512 B)已复制,0.000202559 秒,2.5 MB/秒
    
    
    
    '第三步:准备加载系统镜像文件中的急救模式'
    [root@localhost ~]# init 6		'//重启'
    

    Linux引导过程与服务控制 理论干货+实验_第2张图片Linux引导过程与服务控制 理论干货+实验_第3张图片

    Linux引导过程与服务控制 理论干货+实验_第4张图片

    Linux引导过程与服务控制 理论干货+实验_第5张图片

    Linux引导过程与服务控制 理论干货+实验_第6张图片

    Linux引导过程与服务控制 理论干货+实验_第7张图片

    Linux引导过程与服务控制 理论干货+实验_第8张图片

    Linux引导过程与服务控制 理论干货+实验_第9张图片

三:修复GRUB引导故障

3.1:故障原因

  • MBR中的GRUB引导程序遭到破坏
  • grub.conf文件丢失,引导配置有误

3.2:故障现象

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

3.3:解决思路

  • 尝试手工输入引导命令(成功率很低,不建议)
  • 进入急救模式,重写或者从备份中恢复grub.conf
  • 向MBR扇区中重建grub程序

3.4:修复过程实验

  • '//第一步:查找并破坏grub引导程序(grub.cfg)'
    [root@localhost ~]# cd /boot 		'//进入/boot目录'
    [root@localhost boot]# ls			'//查看'
    config-3.10.0-693.el7.x86_64
    efi
    grub		'存放的是启动菜单的背景图片和样式'
    grub2		'存放配置文件'
    initramfs-0-rescue-d078430d0d8f434fb5ad6e47678ea86f.img
    initramfs-3.10.0-693.el7.x86_64.img
    initramfs-3.10.0-693.el7.x86_64kdump.img
    initrd-plymouth.img
    symvers-3.10.0-693.el7.x86_64.gz
    System.map-3.10.0-693.el7.x86_64
    vmlinuz-0-rescue-d078430d0d8f434fb5ad6e47678ea86f
    vmlinuz-3.10.0-693.el7.x86_64
    [root@localhost boot]# cd grub		'//进入grub目录'
    [root@localhost grub]# ls			'//查看'
    splash.xpm.gz
    [root@localhost grub]# cd ../grub2		'//没有发现grub配置文件,进入grub2目录中查找'
    [root@localhost grub2]# ls				'//发现grub.cfg配置文件'
    device.map  fonts  grub.cfg  grubenv  i386-pc  locale
    [root@localhost grub2]# rm -rf grub.cfg		'//删除grub.cfg配置文件'
    [root@localhost grub2]# ls
    device.map  fonts  grubenv  i386-pc  locale		'//删除成功,'
    [root@localhost grub2]# init 6				'//重启'
    
    

    Linux引导过程与服务控制 理论干货+实验_第10张图片

    Linux引导过程与服务控制 理论干货+实验_第11张图片

    Linux引导过程与服务控制 理论干货+实验_第12张图片

    Linux引导过程与服务控制 理论干货+实验_第13张图片

    Linux引导过程与服务控制 理论干货+实验_第14张图片

    Linux引导过程与服务控制 理论干货+实验_第15张图片

四:遗忘root用户密码的解决办法

4.1:故障原因

  • 遗忘root用户的密码

4.2:故障现象

  • 无法进行需要root权限的管理操作
  • 若没有其他可用账号,将无法登录系统

4.3:解决思路

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

4.4:修复过程实验

  • Linux引导过程与服务控制 理论干货+实验_第16张图片

  • 重启之后直接选择root 输入新设置的密码就OK,这里就不赘述了
    

五:以上三个实验总结

  • 选择急救模式,进入救援centos系统的方式都是一样的

  • 加载镜像系统命令

    chroot /mnt/sysimage
    
  • 重新构建grub菜单系统命令

    grub2-install /dev/sda
    grub2-mkconfig -o /boot/grub2/grub.cfg
    

六:系统服务控制–使用systemd管理系统

  • systemd不是一个单独的命令,而是一个集合体
  • systemctl 是管理系统的主要命令
  • hostnamectl 是用于查看与修改当前主机信息的命令

6.1:系统服务控制

  • systemctl命令可以控制系统服务,此命令涵盖了之前版本操作系统的service命令和chkconfig 命令两者的功能

  • 使用systemctl命令,可以省略服务单元名称的标识.service,即:不输入后缀标识,systemctl命令默认将后缀标识当做.service来处理

  • 常用方式
    systemctl 控制类型 服务名称
    
    常用控制类型
    start  启动
    stop   停止
    restart  重新启动		'//重新启动,会中断服务,此服务的PID值会改变'
    reload  重新加载		'//重新加载配置文件不会中断服务,此服务的PID值会改变'
    status  查看服务状态
    
    例如:
    [root@localhost ~]# systemctl start httpd		'//启动httpd服务'
    [root@localhost ~]# systemctl stop httpd		'//停止httpd服务'
    [root@localhost ~]# systemctl restart httpd		'//重新启动httpd服务'
    [root@localhost ~]# systemctl reload httpd		'//重新加载httpd服务配置文件'
    生产环境中建议使用reload命令来重新加载服务
    

6.2:Linux系统的运行级别

6.2.1:查看运行级别
  • runlevel 命令
    runlevel 只能查看切换运行级别与当前运行级别
    
    例如
    [root@localhost ~]# runlevel 
    N 5		'//N 是上一次运行的级别,5是这一次运行的级别。因为是开机后就查看,所以上一次的运行级别显示为N(no)'
    '若从init 5 切换到 init 3 ,在init3中输入runlevel命令,则会显示 5 3'
    
    systemctl 工具
    systemctl 能查看默认的运行级别
    
6.2.2:临时切换运行级别
  • init 命令
    init的命令参数是运行级别所对应的数字
    
    init的命令参数有 0到6七个运行级别
    init 0代表关机
    init 6代表重启
    
    
    init运行级别 Systemd 的 target 说明
    0 target 关机状态,使用该级别时会关闭主机
    1 rescue.target 单用户模式,不需要密码验证即可登录系统,多用于系统维护
    2 multi-user.target 用户定义/域特定运行级别,默认等同于3
    3 multi-user.target 字符界面的完整用户模式,大多数服务器主机运行在此级别
    4 multi-user.target 用户定义/域特定运行级别,默认等同于3
    5 graphical.target 图形界面的多用户模式,提供了图形桌面操作环境
    6 reboot.target 重新启动,使用该级别时将会重启主机
    systemctl 工具
    systemctl 的命令参数是具体的target
    进入init 3 = systemctl isolate multi-user.target		(multi-user:多用户)
    进入init 5 = systemctl isolate graphical.target		(graphical:图形化的)
    
'目标:原本开机自动进入图形化界面,现在想变成字符化界面'

[root@localhost ~]# systemctl get-default 		'查看现在开机默认的进入界面'
graphical.target		'发现是图形化模式'
[root@localhost ~]# find / -name multi-user.target	 '查询multi-user.target在哪个目录下'
/usr/lib/systemd/system/multi-user.target
[root@localhost ~]# find / -name default.target		'查询default.target在哪个目录下'
/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target
/usr/lib/systemd/user/default.target
[root@localhost ~]# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target		'创建multi-user.target的软件了并删除原本的链接,将文件存放在/etc/systemd/system/default.target中'
[root@localhost ~]# systemctl get-default 		'查询现在开机默认的进入界面'
multi-user.target		'已经修改成字符化界面'
[root@localhost ~]# 

6.3:优化启动过程(开机自启)

6.3.1:系统服务的管理工具
  • ntsysv 工具

    提供一个交互式,可视化窗口(伪图形化界面)

    可以在字符终端运行

    便于集中管理多个服务

  • systemctl 工具

    不提供交互式,可视化窗口

    管理单个服务效率更高

6.3.2:ntsysv工具
  • [root@localhost ~]# ntsysv		'//进入ntsysv伪图形化界面'
    * 符号代表开机自启
    空格  代表开启不自启
    Tab键 切换到选项(确定,取消)
    空格键可以输入 * 或者取消 *
    

    Linux引导过程与服务控制 理论干货+实验_第17张图片

6.3.3:systemctl 工具
  • [root@localhost ~]# systemctl enable httpd		'//将httpd服务设置开机自启'
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
    [root@localhost ~]# systemctl disable httpd		'//将httpd服务设置关闭开机自启'
    Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
    [root@localhost ~]# 
    
    

6.4:系统服务的启动和查看

6.4.1:设置开机启动
  • 在运行着的系统上启动服务不能确保该服务在重启后依然启动

  • 同理:在运行着的系统上关闭服务不能确保该服务在重启后依然关闭

  • 一般用systemctl 命令管理开机自启动服务

  • 命令基本格式
    systemctl [enable|disable] name.service
    
    例如
    [root@localhost ~]# systemctl enable httpd		'//将httpd服务设置开机自启'
    Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
    [root@localhost ~]# systemctl disable httpd		'//将httpd服务设置开启不启动,即禁用服务'
    Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
    
    
  • 从返回信息可以看出:

    systemctl enable 命令相当于在 /etc/systemd/system目录中添加一个软链接,指向/sur/lib/systemd/system 目录中的.service文件

    而systemctl disable 则是从 /etc/systemd/system目录中移除该软链接

  • 开机时,systemd只执行启动/etc/systemd/system目录中的配置文件

6.4.2:查看服务启动状态
  • 命令基本格式
    systemctl status mame.service  '//查看服务启动状态'
    
    例如
    [root@localhost ~]# systemctl status httpd
    ● httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
       Active: active (running) since 三 2019-11-13 23:46:33 CST; 16min ago
         Docs: man:httpd(8)
               man:apachectl(8)
     Main PID: 2174 (httpd)
       Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
       CGroup: /system.slice/httpd.service
               ├─2174 /usr/sbin/httpd -DFOREGROUND
               ├─2176 /usr/sbin/httpd -DFOREGROUND
               ├─2177 /usr/sbin/httpd -DFOREGROUND
               ├─2178 /usr/sbin/httpd -DFOREGROUND
               ├─2179 /usr/sbin/httpd -DFOREGROUND
               └─2180 /usr/sbin/httpd -DFOREGROUND
    
    11月 13 23:46:33 localhost.localdomain systemd[1]: Starting The Apache HTTP Se....
    11月 13 23:46:33 localhost.localdomain httpd[2174]: AH00558: httpd: Could not r...
    11月 13 23:46:33 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
    Hint: Some lines were ellipsized, use -l to show in full.
    
    
    服务状态关键字
    load   配置文件被处理
    active(running)		一个或多个进程在持续运行
    active(exited)		成功完成一个“一次性”配置
    active(waiting)		运行但等待“事件”
    inactive			未运行
    enabled			开启自启
    disable			开启不自启
    static			不能自动启动,只能随其他单元启动而启动
    
    查看服务状态除了status选项,systemctl还提供了另外两种查询服务状态的方法
    [root@localhost ~]# systemctl is-active httpd		'//查看httpd服务是否启动成功状态'
    active		'//启动成功'
    [root@localhost ~]# systemctl is-failed httpd		'//查看httpd服务是否启动失败状态'
    active		'//没有启动失败'
    
    
    查看服务自启动状态
    [root@localhost ~]# systemctl is-enabled httpd		'//查看httpd服务自启动状态'
    disabled
    
netstat -ntap   	'查看所有tcp协议端口'
'netstat:查看网络中正在跑的服务器端口,'
'n:以数字形式显示,'
't:tcp,'
'a:all,'
'p:协议'
[root@localhost ~]# netstat -ntap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1310/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      985/sshd            
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      986/cupsd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1286/master  
以上表示IPV4的地址       
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      985/sshd            
tcp6       0      0 ::1:631                 :::*                    LISTEN      986/cupsd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1286/master         
以上表示IPV6的地址

你可能感兴趣的:(Linux系统)