启动原理及故障排除

一、CentOS6系统启动过程及相关配置文件

  1. 开机加电自检

    • 加电自检:BIOS程序的功能,加电后检测所有硬件设备是否可用,并展示结果

  2. 磁盘分区引导

    • 通过BIOS确定引导哪个存储设备后,尝试引导该设备上的分区表,将其中的代码加载到内存运行

  3. grub菜单引导

    • 可实现单系统或多系统的选择功能,可选择不同内核版本

    • 配置文件:/boot/grub/grub.conf

      • default:默认操作系统内核,排序按开机显示顺序

      • timeout:选择操作系统菜单的等待时间,即开机显示倒计时

      • splashimage:内核选择界面背景图片(当前纯黑)

      • hiddenmenu:隐藏菜单

      • title:grub菜单的名称

        • root:grub所能识别的根目录,即/boot/,第一块盘第一个分区

        • kernel:内核文件,"/"为/boot

        • initrd:帮助内核完成系统启动,如寻找LVM驱动

      • password:设定密码。放在title外表示进入grub菜单需密码,防止他人获取root权限(改密码)

    • 找回密码:

      • 开机,选择内核按"e"

      • 选"kernel"按"e",按"空格+1",回车

      • kernel按"b"(根据提示),修改密码

  4. 加载内核

    • 将菜单中选择的内核加载到内存,展开并启动一个微型操作系统

  5. 运行init进程(初始进程)

  6. 加载系统运行级别

    • 加载/etc/inittab文件,设定0~6级别(C7中无用)

  7. 初始化系统

    • 加载/etc/rc.sysinit完成初始化

  8. 根据启动级别开启服务

    • 根据第6步确定的级别N加载对应目录下服务脚本:/etc/rcN.d/

  9. 登录系统

二、CentOS7系统启动过程及相关配置文件

  1. CentOS7启动过程

    • 加载BIOS/UEFI信息,进行硬件检测

      • UEFI须划分/boot/efi分区

    • 按照BIOS(或UEFI)的设定找第一个可启动的设备

    • 读取第一个设备的MBR(主引导记录),加载MBR中的BootLoader(启动引导程序grub2)

      • /boot/grub2/grub.cfg

    • 依据grub2的设置加载内核,内核再次系统检测

    • 依据grub2加载initramfs虚拟文件系统,在内存中加载虚拟文件系统/boot/initramfs

    • 内核初始化,以加载动态模块的形式加载部分硬件驱动。

    • 调用initrd.target,挂载/etc/fstab中文件系统

    • 此时可从VFS模拟的根目录"/boot"切换回硬盘真实根目录"/"

    • 内核启动第一个进程systemd,systemd接管启动过程并启动后续程序

    • systemd调用默认default.target单元组,按照default运行子单元组

    • systemd调用sysinit.target单元组,初始化系统。检测硬件,加载剩余硬件的驱动模块等

    • systemd调用basic.target单元组,准备操作系统。加载外围硬件驱动模块、防火墙、SELinux安全上下文等

    • systemd调用multi-user.target单元组,启动字符界面所需程序

    • systemd调用multi-user.target单元组中/etc/rc.d/rc.local文件,执行文件中命令

    • systemd调用multi-user.target单元组中getty.target单元组,初始化本地终端

    • systemd调用graphical.target单元组(字符界面不需)

    启动过程名词解释:

    • BIOS:BIOS和UEFI统一简称

    • MBR:GPT为了兼容性也保留了MBR区块。此处表示为磁盘首个分区可安装boot loader的区块

    • boot loader:启动引导程序,用于解决内核文件加载文件,存在于启动设备的第1个扇区

    • 加载内核检测硬件与initramfs

      • 内核名:/boot/vmlinuz**

      • 经由boot loader读取内核文件,将内核解压到内存,用内核检验硬件设备

      • 非必要内核功能变成模块,如USB、SATA、SCSI等磁盘设备驱动程序

      • 因而内核不能读取SATA等磁盘

    • 虚拟文件系统

      • C6:/boot/initrd***

      • C7:/boot/initramfs-**(内核版本号)**.img

      • 经由boot loader加载至内存,模拟为一个根目录(非"/")

      • 通过此模拟加载启动过程中所需内核模块

  2. 管理系统服务

    查询服务状态:systemctl list-unit-files

  3. 运行级别

    级别简化:multi-user.target 和 graphical.target

  4. 运行级别切换

    • 临时切换

      • systemctl isolate multi-user.target

      • systemctl isolate runlevel3.target

    • 永久切换

      • 查看默认级别:systemctl get-default

      • 设置默认级别:systemctl set-default graphical.target

  5. grub2和grub区别

    • 配置文件保存位置

      • C6:/boot/grub/grub.conf

      • C7:/boot/grub2/grub.cfg

    • 配置文件修改方法

      • C6:vim直接修改

      • C7:命令间接修改

        修改内核启动顺序

        <span style="background-color:#f8f8f8"><span style="color:#3300aa">vim</span> /etc/default/grub
        ​
        <span style="color:#0000ff">GRUB_TIMEOUT</span><span style="color:#981a1a">=</span><span style="color:#116644">5</span> <span style="color:#aa5500">#开机时 grub 默认 5 秒后启动内核</span>
        <span style="color:#0000ff">GRUB_DISTRIBUTOR</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"</span><span style="color:#009900">$(sed 's, release .*</span><span style="color:#0000ff">$,</span><span style="color:#009900">,g' /etc/system-release)</span><span style="color:#aa1111">"</span>
        <span style="color:#0000ff">GRUB_DEFAULT</span><span style="color:#981a1a">=</span> saved     <span style="color:#aa5500">#saved改成0,1 第1个内核,第2个,以此类推。</span>
        <span style="color:#0000ff">UB_DISABLE_SUBMENU</span><span style="color:#981a1a">=</span><span style="color:#221199">true</span>
        <span style="color:#0000ff">GRUB_TERMINAL_OUTPUT</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"console"</span>
        <span style="color:#0000ff">GRUB_CMDLINE_LINUX</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"crashkernel=auto rhgb quiet net.ifnames=0"</span>
        <span style="color:#0000ff">GRUB_DISABLE_RECOVERY</span><span style="color:#981a1a">=</span><span style="color:#aa1111">"true"</span>
        ​
        grub2-mkconfig <span style="color:#0000cc">-o</span> /boot/grub2/grub.cfg  <span style="color:#aa5500"># 修改或创建配置文件</span>
        ​
        uname <span style="color:#0000cc">-r</span>        <span style="color:#aa5500"># 查看当前内核版本</span></span>

三、加密grub防止通过init1(单用户)修改root密码

  1. CentOS6加密

    <span style="background-color:#f8f8f8">[root@localhost ~]<span style="color:#aa5500"># grub-md5-crypt</span>
    Password: <span style="color:#116644">123456</span>
    Retype password: <span style="color:#116644">123456</span>
    <span style="color:#0000ff">$1$oaqo5$3</span>d/cmTosm68jTw6o1wCu31
    ​
    [root@localhost init]<span style="color:#aa5500"># vim /boot/grub/grub.conf</span>
    password <span style="color:#0000cc">--md5</span> <span style="color:#0000ff">$1$oaqo5$3</span>d/cmTosm68jTw6o1wCu31  <span style="color:#aa5500"># title之前</span>
    title Red Hat Enterprise Linux (2.6.32-220.el6.x86_64)</span>
  2. CentOS7加密

    • 改密码:选择内核按"e","linux16"行末尾,输入"rd.break"或"init=/bin/sh"

    • 加密(法1)

      <span style="background-color:#f8f8f8">[root@localhost ~]<span style="color:#aa5500"># grub2-mkpasswd-pbkdf2 </span>
      输入口令:123
      Reenter password: <span style="color:#116644">123</span>
      PBKDF2 hash of your password is grub.pbkdf2.********************
      ​
      [root@localhost ~]<span style="color:#aa5500"># vim /etc/grub.d/00_header </span>
      <span style="color:#aa5500"># 文件底部</span>
      <span style="color:#3300aa">cat</span> << EOF
      <span style="color:#770088">set</span> <span style="color:#0000ff">superusers</span><span style="color:#981a1a">=</span><span style="color:#aa1111">'rs'</span>     <span style="color:#aa5500"># rs为进入grub的用户名</span>
      password_pbkdf2 rs grub.pbkdf2.********************
      EOF
      ​
      [root@localhost ~]<span style="color:#aa5500"># grub2-mkconfig -o /boot/grub2/grub.cfg</span></span>
    • 法2

      • grub2-setpassword # 设置密码,创建/boot/grub2/user.cfg

      • 用户名为root

四、通过liveCD进入救援模式、重装grub修复损坏系统

  1. CentOS6救援模式

    • 损坏grub: dd if=/dev/zero of=/dev/sda bs=1 count=450

    • 重启,一路按提示选择:不联网、continue、shell

    • chroot /mnt/sysimage(光盘挂载) 切换文件系统

    • grub-install /dev/sda 修复grub

    • exit,重启

  2. CentOS7救援模式

    • 损坏grub: dd if=/dev/zero of=/dev/sda bs=1 count=446

    • 重启,进入Troubleshooting界面,选择rescue模式

    • 选1进入continue模式,按提示回车进shell

    • <span style="background-color:#f8f8f8">mount | <span style="color:#3300aa">grep</span> /mnt
      <span style="color:#3300aa">chroot</span> /mnt/sysimage
      grub2-install /dev/sda
      <span style="color:#770088">exit</span>
      reboot</span>
  3. CentOS7误删除grub2文件修复

    • 删除grub2目录

    • 关机进BIOS模式(打开电源进入固件),光盘优先级调高

    • 同损坏grub,修复后执行grub2-mkconfig -o /boot/grub2/grub.cfg生成grub.cfg

    • 退出,改回优先级

  4. CentOS7密码找回

    • rd.break(UEFI无效,C9部分版本无效)

      • e编辑内核,"linux16"行末尾输入rd.break,Ctrl+x进入shell

      • mount查看根分区挂载点,重载为rw权限

      • chroot /sysroot,修改root密码

      • 解决SELinux

        • vim /etc/selinux/config

        • touch /.autorelabel

      • 退出重启

    • init=/bin/sh

      • 与rd.break大体相同,无需chroot

      • 解决SELinux后可直接exec /lib/systemd/systemd,无需重启(也无法自启)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值