zoukankan      html  css  js  c++  java
  • Linux 入门记录:十八、Linux 系统启动流程 + 单用户修改 root 密码 + GRUB 加密

    一、系统启动流程

    一般来说,Linux 系统的启动流程是这样的:

    1. 开机之后,位于计算机主板 ROM 芯片上的 BIOS 被最先读取,在进行硬件和内存的校验以及 CPU 的自检没有异常后, BIOS 将被加载到内存中。

    2. BIOS 按照其设置的设备启动顺序,依次尝试加载含有 MBR 信息的可启动设备(一般是硬盘,可设置),然后将控制权交给 MBR 中的 Bootloader(引导程序)。

    3. Linux 中使用 GRUB(多操作系统引导程序)作为 Bootloader。GRUB 可以识别(根)文件系统并加载 Kernel(内核),同时将系统的控制权交给 Kernel。

    4. Kernel 极其精简,加载过程中也可能会加载一些必要的模块打包文件。

    5. 随同 Kernel 一起加载的还有 init(/sbin/init)进程,是 Linux 启动的第一个进程,它负责加载文件系统并根据运行级别启动(重启)和关闭相应服务,最后初始化字符终端和/或启动图形终端,等待用户登录。

    至此,系统启动完成。

    二、流程详解

    1. BIOS(Basic Input Or Output,基本输入输出系统)

    BIOS 是计算机启动后最先被读取的系统,在硬件和内存的校验以及 CPU 的自检通过、没有异常后,BIOS 将被加载到内存里。BIOS 主要存储了设备(一般是硬盘,可在 BIOS 界面设置)的启动顺序,BIOS 依次尝试加载含有 MBR 信息的可启动设备,找到后将控制权交给 MBR 中的 Bootloader。

    2. MBR(Master Boot Record,主引导记录)

    MBR 在磁盘上的第一个扇区(1 扇区占 512 字节),它的前 446 字节是 Bootloader(引导程序),后 4 个 16 字节是最多 4 个主分区信息,最后 2 字节 55 AA 是启动标识。

    Linux 中使用 GRUB 作为 Bootloader。

    3. GRUB(GRand Unified Bootloader,多操作系统引导程序)

    GRUB 是现在 Linux 使用的主流引导程序,可以用来引导现在几乎所有的操作系统。

    GRUB 是模块化的,运行时会经历如下阶段:

    (1)stage1:stage 1 大小 512 字节(和 MBR 一样大),是 MBR 的备份,MBR 损坏时可以从这里得到一个备份。

    (2)*_stage1_5:用于识别多种类型文件系统的文件。CentOS 6 以后的版本默认文件系统是 ext4,会相应地识别 e2fs_stage1_5 文件。识别后,加载文件系统。

    (3)stage2:根据 GRUB 配置文件 /boot/grub/grub.conf 的内容来决定如何加载 Kernel。该文件内容一般如下:

    参数详解:

    default:默认启动的内核编号,从0开始(每个内核信息由title标识)
    timeout:等待用户选择要启动的内核的超时时间,单位为秒
    splashimage:使用的背景图片
    hiddenmenu:隐藏菜单
    title:操作系统或内核的标题
        root:内核所在的分区,(hd0,1)表示第1块磁盘的第1个分区
        (在grub中,设备统统以hd开头,并紧跟一个数字作为各磁盘设备的标记,从0开始编号;分区也是从0开始编号,而我的(hd0,1)是因为我的第0个分区是swap交换分区)
        kernel:要加载的内核文件,后面附带启动参数
        initrd:额外驱动或模块的打包文件,ram disk 或 ram fs 文件(通常是归档压缩文件,以.img为文件名后缀)

    4. Kernel(内核)

    GRUB 的最后阶段 stage2 会根据 GRUB 配置文件 /boot/grub/grub.conf 的内容来加载 Kernel,并将系统控制权交给 Kernel。

    命令 dmesg 可以用来查看本次启动时内核的输出信息。

    5. init(Linux 启动的第一个进程)

    init 进程是 Linux 启动的第一个进程,PID 为 1,其他所有进程是它的子进程。

    Linux 的 init 进程是由传统的 sysvinit 演变而来的,init 进程读取的配置文件 /etc/inittab 仅保留了 sysvinit 的 inittab 文件定义的默认运行级别 runlevel,其他的配置则分散到了 /etc/init/*.conf 多个文件中。

    init 进程会根据 /etc/inittab 文件定义的 runlevel 去执行相应目录下的脚本。

    6. runlevel(运行级别)

    命令 runlevel 可显示上一个及当前 runlevel。命令 init 可用来改变当前的 runlevel。

    Linux 的 runlevel 有 7 个:

    0:系统停机,默认运行级别不能设为0,否则不能正常启动
    1:单用户模式,root权限,用于系统维护,禁止远程登陆
    2:多用户模式(无网络)
    3:多用户状态(命令行界面)
    4:保留未使用
    5:多用户模式(X11图形化界面)
    6:系统重启,默认运行级别不能设为6,否则不能正常启动

    这 7 个 runlevel 分别对应了 /etc/rc.d/rc[0-6].d/ 七个目录:

    每个目录存储了所有以 K* 和 S* 开头的文件,K 开头的文件表示从其他 runlevel 切换过来需要开启(重启)的服务,S 开头的文件表示从其他 runlevel 切换过来需要关闭的服务。

    三、单用户修改root密码

    在开机启动时,为内核传递参数 "1" 或 "single" ,可让系统进入单用户模式(runlevel 1)。单用户模式下不启动任何服务,直接以 root 用户登录,并且不需要密码,可以使用 passwd 修改 root 密码。

    操作步骤如下:

    开机后,在 GRUB 引导等待用户选择要加载内核的超时时间内,随意按下一个键,进入内核的选择界面。

    上图中,选中目标版本内核,按下 "e" 键进入编辑。

    上图中,选中 kernel,按下 "e" 键进入编辑。

    上图中,在行末尾为内核传递参数 "1" 或 "single" ,回车确定,按 "b" 启动。

    上图中,成功进入单用户模式,并且是 root 用户登录。使用 passwd 修改 root 密码,然后 exit 退出,正常重启即可。

    四、GRUB加密

    管理员可以通过单用户模式修改 root 密码,但是这也导致任何人都可能通过这种方式入侵系统。为了防止这种危险,可以进行 GRUB 加密。

    1. 在 root 用户下输入 grub-md5-crypt 命令,然后输入为 GRUB 设置的密码,产生一组 MD5 加密后的密文。

    2. 将得到的密文添加到 GRUB 配置文件 /boot/grub/grub.conf 中。

    这样在用户在开机后要编辑内核时就会强制要求输入 GRUB 密码,剔除了非法修改 root 密码的可能。

    其次,也可以在 title 段添加一个 passward,它是用于内核(系统)启动时要求输入的密码。

    参考链接:

    Linux系统启动流程

    图解Linux系统启动流程

    Linux系统启动过程

    linux中inittab文件详解

    Linux系统有7个运行级别(runlevel)

    CentOS 6.4 Grub加密码

  • 相关阅读:
    C# 设计模式
    FutureTask、Fork/Join、 BlockingQueue
    线程的几种创建方式
    行锁、表锁、乐观锁、悲观锁
    J.U.C之AQS
    同步容器并发容器
    线程不安全类
    线程封闭
    不可变对象
    安全发布对象—单例模式
  • 原文地址:https://www.cnblogs.com/mingc/p/7617038.html
Copyright © 2011-2022 走看看