Linux-开机引导
开机自动挂载
/etc/fstab
在 Linux 系统中,/etc/fstab 文件用于定义文件系统的静态挂载配置,使得系统在启动时能够自动挂载指定的文件系统。
字段解析
<file system> <mount point> <type> <options> <dump> <pass><file system>:文件系统标识符,可以是设备名称(如/dev/sda1)、UUID 或标签。
<mount point>:文件系统的挂载点。
<type>:文件系统的类型(如ext4、xfs、swap等)。
<options>:挂载选项(如defaults、rw、ro等)。
defaults:使用默认挂载选项(rw、suid、dev、exec、auto、nouser、async)。noauto:不自动挂载,需要手动挂载。user:允许普通用户挂载。ro:只读挂载。rw:读写挂载。
<dump>:用于dump命令的备份选项,通常设置为0(不备份)。
- 0:代表不要做dump备份
- 1:代表要每天进行dump的操作
- 2:代表不定日期的进行dump操作
<pass>:文件系统检查顺序,通常设置为0或1(/根文件系统设置为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文件的位置可能有所不同,但功能类似。
作用
- 自定义启动任务 :允许用户在系统启动后自动执行特定的任务或命令,例如启动自定义的服务、挂载网络文件系统、设置网络配置等。
- 方便系统管理 :为系统管理员提供了一种简单的方法来添加启动时需要执行的命令,而无需修改复杂的系统启动脚本。
#!/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 文件不具备执行权限,修改后确认具有可执行权限。可以使用以下命令来设置权限:
chmod +x /etc/rc.d/rc.local注意事项
- 兼容性 :在不同的 Linux 发行版中,
rc.local的位置和配置方式可能会有所不同。例如,在 Ubuntu 系统中,rc.local文件可能位于/etc/目录下,并且需要在 systemd 中启用它。 - 执行顺序 :
rc.local脚本通常在系统启动的最后阶段执行,因此如果需要在某些服务启动之前执行命令,可能需要调整服务的启动顺序。 - 错误处理 :如果
rc.local中的命令出现错误,可能会导致系统启动过程出现问题。因此,在添加命令时要确保其正确性,并进行充分的测试。
引导过程与服务控制
开机引导过程
BIOS/UEFI 初始化阶段
- 硬件自检(POST):电源接通后,主板固件(BIOS/UEFI)执行硬件检测
- 固件初始化:初始化硬件设备,建立硬件列表
mbr引导加载程序阶段
根据第一个硬盘,第一个扇区的MBR中2字节校验,加载64字节分区列表,加载446字节主引导记录,找出操作系统所在的分区,直接把系统控制权移交给包含系统引导文件的分区。调用GRUB菜单。
三种启动模式:
- 本地硬盘启动
- 移动硬盘启动
- network网络启动
加载grub菜单
系统控制权交给GRUB之后,显示启动菜单供用户选择。
选择完系统之后,系统控制权会交给所选的操作系统的内核文件。
centos7使用grub2作为引导器/boot/gurb2/gurb.cfg
加载内核启动进程
进程分为父进程和子进程。id=1是整个系统的父进程,父进程可以杀死子进程,子进程无法杀死父进程。
Linux采用的是写时复制技术,多个进程需要访问相同资源时,内核不会立即为每个进程创建副本,而是让它们共享同一份资源,只有当某个进程尝试修改共享资源时,内核才会为该进程创建真正的独立副本。
系统初始化
准备其它进程的运行环境
读取开机模式(7种运行模式)
执行初始化脚本
查看当前启动服务
执行个人配置脚本(/etc/rc.d/rc.local)
正常开机
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 扇区故障示例:
添加一块新的硬盘
/dev/sdb格式化新硬盘
/dev/sdbbashmkfs.ext4 /dev/sdb挂载到
/backupbashmkdir /backup && mount /dev/sdb /backup将mbr备份文件拷贝到新硬盘
bashdd if=/dev/sda of=/mnt/mbr count=1 bs=512 # 将mbr备份文件拷贝到新硬盘模拟破坏mbr
bashdd if=/dev/zero of=/dev/sda count=1 bs=512 # 向/dev/sda的前512字节写0覆盖原来内容 hexdump -C -n 512 /dev/sda # 查看前512字节进入急救模式恢复mbr
reboot重启后,选择
Troubleshooting,再选择Rescue a CentOS system,最后选择Continue后,进入急救模式,输入1将备份文件拷贝到/dev/sda
bashmkdir bak # 新建文件夹 mount /dev/sdb1 bak # 将存有备份文件的硬盘挂载到新建文件夹下 dd if=bak/mbr of=/dev/sda # 将备份文件添加到原本的目录下 hexdump -C -n 512 /dev/sda # 查看到/dev/sda前512字节已恢复重启即可正常使用系统
忘记root密码
CentOS7
进入系统时选择内核界面,选中第一个选项并按
e键将光标移动到Linux开头行的最后,添加
rd.break,然后ctrl+x运行,进入单用户模式进入单用户模式后,重新挂载并添加读写权限,然后切换到系统的根修改密码
bashmount -o remount,rw /sysroot # 重新挂载并添加读写权限 chroot /sysroot # 从光盘的根切换到主机系统的根 passwd 用户名 # 修改密码 touch ./autorelabel # 如果开启selinux需重新打上标记 exit # 退出 reboot # 重启
openEuler
- 进入系统时选择内核界面,选中第一个选项并按
e键 - 输入账号
root - 输入初试密码
openEuler#12 - 在linux开头行的
root=/dev/Mapper/openeuler-root后面追加rw - 在linux开头行的行尾添加
init=/bin/bash - 按
Ctrl + X或F10启动系统。 - 修改密码
echo "123456" | passwd --stdin root - 如果开启selinux需重新打上标记
touch ./autorelabel - 重启
/sbin/init
Ubuntu
- 在启动时,在GRUB菜单出现时按下Shift或Esc键来进入GRUB菜单
- 按
e键进入 - 在linux开头的行尾添加
rw init=/bin/bash,然后按Ctrl + X或F10来启动系统 - 重置密码
passwd username - 重启服务器
exec /sbin/init
