@TOC

Linux引导过程与服务控制

Linux操作系统引导过程

引导过程总览(简)

  • 开机自检(BIOS)

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

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

  • MBR引导

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

    ==总结:运行放在MBR扇区里的启动GRUB引导程序==

  • GRUB菜单

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

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

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

  • 加载Linux内核

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

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

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

  • init进程初始化

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

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

系统初始化进程

  • init进程

    • 由Linux内核加载运行/sbin/init程序
    • init进程是系统中第一个进程,是所有进程的父进程
    • init进程的PID(进程标记)号永远为1
  • Systemd

    • Systemd是Linux操作系统的一种init软件

    • CentOS7中采用全新的Systemd启动方式,取代传统的SysVinit(CentOS 5,6)

    取代传统的串行的脚本启动方式(/etc/init.d/一个接一个)

    Systemd能够将更多的服务进程并行启动,并且具有提供按需启动服务的能力,使得启动更少进程,从而提高系统启动速度

    • CentOS7中运行的第一个init进程是/lib/systemd/systemd
  • Systemd单元类型

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

运行级别所对应的Systemd目标

运行级别 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 重新启动,使用该级别时将会重启主机
命令 命令 命令 结果
init 0 systemctl isolate poweroff.target (systemctl) poweroff 关机(shutdown)
init 1 systemctl isolate resue.target 切换单用户模式
init 3 systemctl isolate multi-user.target 切换字符界面多用户模式
init 5 systemctl isolate graphical.target 切换图形界面多用户模式
init 6 systemctl isolate reboot.target (systemctl) reboot 重启

排除启动类故障

修复MBR扇区故障

  • 故障原因
    • 病毒,木马等造成的破坏
    • 不正确的分区操作,磁盘读写误操作
  • 故障现象
    • 找不到引导程序,启动中断
    • 无法加载操作系统,开机后黑屏
  • 解决思路
    • 应提前作好备份文件
    • 以安装光盘引导进入急救模式
    • 从备份文件中恢复

故障模拟恢复

  • 修复MBR扇区故障

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

    1. 备份MBR扇区数据到其它磁盘(/dev/sdb1)

      mkdir /backup

      mount /dev/sdb1 /backup

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

      pic1.png

      pic2.png

      pic3.png

      pic4.png

    2. 模拟破坏MBR引导扇区

      dd if=/dev/zero of=/dev/sda bs=512 count=l

      pic5.png

    3. 引导界面进入急救模式,从备份文件中恢复MBR扇区数据

      先加载好光盘镜像,重启操作系统

      pic6.png

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

      pic7.png

      再选择"Rescue a CentOS Linux system"选项,进入急救模式

      pic8.png

      选择"1"选择 Continue 并按 Enter 键继续

      pic9.png

      再次按 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环境,系统将会自动重启

      pic10.png

      pic11.png

修复GRUB引导故障

  • 故障原因
    • MBR中的GRUB引导程序(1--446字节)遭到破坏
    • grub.confg文件丢失、引导配置有误
  • 故障现象

    • 系统引导停滞,显示"grub>"提示符
  • 解决思路

    • 尝试手动输入引导模式(步骤繁琐,需要手动输入/boot/grub2/grub.cfg中的配置信息,很容易出错,不建议使用)

    grub> insmod xfs //加载指定的模块到内核

    grub> linux16 /vmlinuz-0-rescue-3e3bbcbbcd23437fabc66e7016070505 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet //内核的名字及位置等信息,UUID等信息每台设备都不同

    grub> initrd16 /initramfs-0-rescue-3e3bbcbbcd23437fabc66e7016070505.img //镜像系统文件

    grub> boot //引导boot

    • 进入急救模式,重写或者从备份中恢复grub.confg(数据被破坏,上述第一个原因)(和恢复MBR类似,不作赘述)

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

    • mkdir /bak

      mount /dev/sdb1 /bak

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

    • 模拟对MBR中的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/grub.bak of=/dev/sda

      sh-4.2# exit

    • 向MBR扇区中重建grub程序(引导界面进入急救模式,重建GRUB菜单配置文件)

    rm -rf /boot/grub2/grub.cfg //模拟丢失GRUB菜单配置文件

    pic12.png

    进入急救模式,加载光盘镜像,切换到系统根环境(急救模式进入方法同上)

    sh-4.2# chroot /mnt/sysimage

    pic13.png

    pic14.png

    重新将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

    pic15.png

    ==此方法对于多个硬盘的Linux系统可能会出现第一次重启无法正常启动的情况,多数情况下可以正常启动,要做好MBR程序备份==

遗忘root用户密码

  • 故障原因

    遗忘用户密码

  • 故障现象

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

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

  • 解决思路

    进入急救模式,重设密码

    • 按上例进入引导界面更改密码

    passwd root

    pic16.png

    • 重新登陆即可

服务控制及切换运行级别

系统服务控制

  • systemctl 控制类型 服务名称
  • 控制类型 6

    • start:启动
    • stop:停止
    • restart:重新启动(对于关闭的服务等于start)
    • status:查看服务状态
    • reload:重新加载配置文件(修改了配置文件后,重启耗时较长或者不适宜重启使用)

    pic17.png

Linux系统的运行级别

  • 查看运行级别

    • runlevel命令:只能查看切换前一次的运行级别于当前运行级别

    • systemctl工具(systemctl get-default):只能查看默认的运行级别

    pic18.png

  • 临时切换运行级别

    • init命令:命令参数是运行级别对应的数字

    • systemctl工具:命令参数是具体的targrt(上面已经给出)

    pic19.png

  • 设置永久运行级别

    • systemctl set-default 命令级别(.target)
    • ln -sf /usr/lib/systemd/system/graphical.target(命令级别.target) /etc/systemd/system/default.target //强制覆盖软链接文件

    Centos7中所有用systemctl管理的服务都在/usr/lib/systemd/system中

    Centos6是放在/etc/init.d/中,例如service network restart是调用/etc/init.d/的network脚本来完成。要用service命令来管理服务的话,必须要有相关的脚本文件在/etc/init.d/中。Centos7可以实现将/etc/init.d/中的服务重定向到systemctl能实现的管理操作。

    service 服务名称 控制类型

优化启动过程

ntsysv工具

提供一个交互式、可视化窗口

可以在字符终端运行

便于集中管理多个服务

用于控制服务是否开机自启动

  • 命令行输入ntsysv会出现图形交互界面

    上下键移动光标,空格选择打上星号和取消星号(有星号的服务开机自启)

    Tab键切换操作按键

    回车选择确定/取消

    pic23.png

systemctl / chkconfig工具

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

管理单个服务效率更高

systemctl

  • 查询服务是否开机自启

    systemctl is-enabled 服务名

    开机自启-> enabled ; 开机不自启-> disabled

  • 开启关闭服务的开机自启

    systemctl enable 服务名

    systemctl disable 服务名

pic20.png

  • 查询服务是否启动

    systemctl is-active 服务名

    未开启(但是开机会自启)->inactive ; 开启->active ; 未开启且开机不自启->unknown

    pic21.png

  • 打开并设置开机自启(disable同理)

    systemctl enable --now 服务名

    pic22.png

chkconfig

  • 只能对/etc/init.d/中的服务实现管理
  • 需要在/etc/init.d/中写入脚本文件
  • 脚本文件中的"# chkconfig: 2345 10 90"字段三段数字分别表示开机自启的运行级别(-:都不自启),开机第几个启动,关机第几个关闭。
  • chkconfig --add 创建的服务名 //添加有可执行权限的命令至系统中
  • chkconfig --list [服务名] //查看服务相关信息
  • chkconfig --level [0123456] 服务名 on/off //更改设定的运行级别下,该服务是否开机自动启动
  • 添加脚本之后可以使用service 服务名 控制类型进行管理

一点相关知识

主机相关

  • 永久修改主机名

    hostnamectl set-hostname newname

  • 查看主机名状态

    hostnamectl status

    pic24.png

设置系统语言

  • 设置系统语言为中文

    localectl set-locale LANG=zh_CN.utf8 //万国字符集UTF8(ASCII码演化)

  • 查看当前系统使用的语言

    localectl [status]

查看启动用时

  • sytemd-analyze

    pic25.png