Skip to content

Linux-开机引导

开机自动挂载

/etc/fstab

在 Linux 系统中,/etc/fstab 文件用于定义文件系统的静态挂载配置,使得系统在启动时能够自动挂载指定的文件系统。

字段解析

bash
<file system> <mount point> <type> <options> <dump> <pass>

<file system>:文件系统标识符,可以是设备名称(如/dev/sda1)、UUID 或标签。

<mount point>:文件系统的挂载点。

<type>:文件系统的类型(如ext4xfsswap等)。

<options>:挂载选项(如defaultsrwro等)。

  • defaults:使用默认挂载选项(rwsuiddevexecautonouserasync)。
  • noauto:不自动挂载,需要手动挂载。
  • user:允许普通用户挂载。
  • ro:只读挂载。
  • rw:读写挂载。

<dump>:用于dump命令的备份选项,通常设置为0(不备份)。

  • 0:代表不要做dump备份
  • 1:代表要每天进行dump的操作
  • 2:代表不定日期的进行dump操作

<pass>:文件系统检查顺序,通常设置为01/根文件系统设置为1,其他文件

  • 0:不要检验
  • 1:最早检验(一般根目录会选择)
  • 2:1级别检验完成之后进行检验

/etc/rc.d/rc.local

/etc/rc.d/rc.local 是 Linux 系统中的一个脚本文件,它在系统启动过程中会被自动执行,用于运行用户自定义的初始化命令或脚本。

位置和名称

  • 在基于 System V init 的系统中,rc.local 文件通常位于 /etc/rc.d/ 目录下。
  • 在一些现代 Linux 发行版中,如使用 systemd 作为初始化系统的,rc.local 文件的位置可能有所不同,但功能类似。

作用

  • 自定义启动任务 :允许用户在系统启动后自动执行特定的任务或命令,例如启动自定义的服务、挂载网络文件系统、设置网络配置等。
  • 方便系统管理 :为系统管理员提供了一种简单的方法来添加启动时需要执行的命令,而无需修改复杂的系统启动脚本。
bash
#!/bin/bash
# 启动自定义服务
/path/to/custom/service1 start
# 挂载网络文件系统
mount -t nfs nfs_server:/path/to/share /mnt/nfs
# 设置环境变量
export MY_ENV_VAR="my_value"

设置文件权限

默认 rc.local 文件不具备执行权限,修改后确认具有可执行权限。可以使用以下命令来设置权限:

bash
chmod +x /etc/rc.d/rc.local

注意事项

  • 兼容性 :在不同的 Linux 发行版中,rc.local 的位置和配置方式可能会有所不同。例如,在 Ubuntu 系统中,rc.local 文件可能位于 /etc/ 目录下,并且需要在 systemd 中启用它。
  • 执行顺序rc.local 脚本通常在系统启动的最后阶段执行,因此如果需要在某些服务启动之前执行命令,可能需要调整服务的启动顺序。
  • 错误处理 :如果 rc.local 中的命令出现错误,可能会导致系统启动过程出现问题。因此,在添加命令时要确保其正确性,并进行充分的测试。

引导过程与服务控制

开机引导过程

  1. BIOS/UEFI 初始化阶段

    • 硬件自检(POST):电源接通后,主板固件(BIOS/UEFI)执行硬件检测
    • 固件初始化:初始化硬件设备,建立硬件列表
  2. mbr引导加载程序阶段

    根据第一个硬盘,第一个扇区的MBR中2字节校验,加载64字节分区列表,加载446字节主引导记录,找出操作系统所在的分区,直接把系统控制权移交给包含系统引导文件的分区。调用GRUB菜单。

    三种启动模式

    • 本地硬盘启动
    • 移动硬盘启动
    • network网络启动
  3. 加载grub菜单

    系统控制权交给GRUB之后,显示启动菜单供用户选择。

    选择完系统之后,系统控制权会交给所选的操作系统的内核文件。

    centos7使用grub2作为引导器/boot/gurb2/gurb.cfg

  4. 加载内核启动进程

    进程分为父进程和子进程。id=1是整个系统的父进程,父进程可以杀死子进程,子进程无法杀死父进程。

    Linux采用的是写时复制技术,多个进程需要访问相同资源时,内核不会立即为每个进程创建副本,而是让它们共享同一份资源,只有当某个进程尝试修改共享资源时,内核才会为该进程创建真正的独立副本。

  5. 系统初始化

    准备其它进程的运行环境

  6. 读取开机模式(7种运行模式)

  7. 执行初始化脚本

  8. 查看当前启动服务

  9. 执行个人配置脚本(/etc/rc.d/rc.local)

  10. 正常开机

Linux 系统7种运行模式

Linux 系统有7种运行模式,init 通常通过 /etc/inittab 文件进行配置,并且它按照运行级别(runlevel)来启动系统服务和进

程, systemd 使用单元文件(unit files)进行配置:

  • 0:关机状态,使用该级别时将会关闭主机
  • 1:单用户模式,无需密码验证即可登录系统,用于系统维护
  • 2:字符界面的多用户模式(不支持访问网络)【很少使用】
  • 3:字符界面的完整多用户模式,大多数服务器运行在此级别
  • 4:未分配使用(开发者模式/保留模式)
  • 5:图形界面的多用户模式,提供了图形桌面操作环境
  • 6:重新启动,使用该级别时将会重启主机

运行级别 (Runlevel) 与 Systemd 目标 (Target) 对照表

运行级别 (Runlevel)Systemd 目标 (Target)用途
0 (关机)poweroff.target关闭系统
1 (单用户模式)rescue.target紧急修复模式(仅 root shell)
2 (多用户无网络)multi-user.target (无网络)多用户模式,但不支持网络(较少使用)
3 (多用户命令行)multi-user.target完整的多用户模式(无图形界面)
4 (未定义)无标准对应(可自定义)通常未使用,可自定义
5 (图形界面)graphical.target带图形界面(X11/Wayland)的多用户模式
6 (重启)reboot.target重启系统

修复 MBR 扇区故障

1、故障原因 :

  • 病毒、木马等造成的破坏(如硬盘炸弹)
  • 不正确的分区操作、磁盘读写误操作

2、故障现象 :

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

3、解决思路 :

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

4、修复 MBR 扇区故障示例:

  1. 添加一块新的硬盘/dev/sdb

  2. 格式化新硬盘/dev/sdb

    bash
    mkfs.ext4 /dev/sdb
  3. 挂载到/backup

    bash
    mkdir /backup && mount /dev/sdb /backup
  4. 将mbr备份文件拷贝到新硬盘

    bash
    dd if=/dev/sda of=/mnt/mbr count=1 bs=512 	# 将mbr备份文件拷贝到新硬盘
  5. 模拟破坏mbr

    bash
    dd if=/dev/zero of=/dev/sda count=1 bs=512		# 向/dev/sda的前512字节写0覆盖原来内容
    hexdump -C -n 512 /dev/sda 						# 查看前512字节
  6. 进入急救模式恢复mbr

    • reboot重启后,选择Troubleshooting,再选择Rescue a CentOS system,最后选择Continue后,进入急救模式,输入1

    • 将备份文件拷贝到/dev/sda

      bash
      mkdir bak 						# 新建文件夹
      mount /dev/sdb1 bak 			# 将存有备份文件的硬盘挂载到新建文件夹下
      dd if=bak/mbr of=/dev/sda 		# 将备份文件添加到原本的目录下
      hexdump -C -n 512 /dev/sda 		# 查看到/dev/sda前512字节已恢复

      重启即可正常使用系统

忘记root密码

CentOS7

  1. 进入系统时选择内核界面,选中第一个选项并按e

  2. 将光标移动到Linux开头行的最后,添加rd.break,然后ctrl+x运行,进入单用户模式

  3. 进入单用户模式后,重新挂载并添加读写权限,然后切换到系统的根修改密码

    bash
    mount -o remount,rw /sysroot 	# 重新挂载并添加读写权限
    chroot /sysroot 				# 从光盘的根切换到主机系统的根
    passwd 用户名					  # 修改密码
    touch ./autorelabel				# 如果开启selinux需重新打上标记
    exit 							# 退出
    reboot							# 重启

openEuler

  1. 进入系统时选择内核界面,选中第一个选项并按e
  2. 输入账号root
  3. 输入初试密码openEuler#12
  4. 在linux开头行的root=/dev/Mapper/openeuler-root后面追加rw
  5. 在linux开头行的行尾添加init=/bin/bash
  6. Ctrl + XF10 启动系统。
  7. 修改密码echo "123456" | passwd --stdin root
  8. 如果开启selinux需重新打上标记touch ./autorelabel
  9. 重启/sbin/init

Ubuntu

  1. 在启动时,在GRUB菜单出现时按下Shift或Esc键来进入GRUB菜单
  2. e键进入
  3. 在linux开头的行尾添加 rw init=/bin/bash,然后按Ctrl + XF10来启动系统
  4. 重置密码passwd username
  5. 重启服务器exec /sbin/init