linux进入命令行的启动流程
linux进入命令行的启动流程详细介绍
Linux 进入命令行的启动流程涉及硬件自检、引导加载程序、内核初始化、系统服务启动等多个阶段,以下是详细步骤:
1. 硬件自检(POST,Power-On Self Test)
- 作用:计算机启动时,固件(BIOS/UEFI)首先进行硬件检测,包括 CPU、内存、硬盘、显卡等,确保硬件正常。
- 关键动作:
- BIOS(传统固件):基于 MBR(主引导记录),启动顺序可在 BIOS 设置中配置(如优先从硬盘、U 盘启动)。
- UEFI(新型固件):替代 BIOS,支持更大硬盘、安全启动(Secure Boot),启动顺序存储在 NVRAM 中,依赖 EFI 系统分区(ESP)。
2. 引导加载程序(Boot Loader)
- 作用:加载并启动操作系统内核。
- 常见引导程序:
- GRUB(Grand Unified Bootloader):主流 Linux 引导程序,支持多系统启动、内核参数配置。
- systemd-boot:轻量级引导程序,与 systemd 集成(部分发行版使用)。
- 关键步骤:
- 固件读取引导程序(如 GRUB 位于硬盘 MBR 或 ESP 分区)。
- GRUB 显示启动菜单(可选不同内核版本或系统),用户若不干预,默认启动倒计时后加载内核。
- GRUB 将内核(
vmlinuz)和初始内存磁盘(initramfs/initrd)加载到内存,并传递启动参数(如root=/dev/sda1指定根分区)。
3. 内核初始化(Kernel Initialization)
- 作用:内核解压缩、初始化硬件驱动、挂载临时根文件系统。
- 关键动作:
- 内核(
vmlinuz)运行,初始化 CPU、内存、中断控制器等底层硬件。 - 加载驱动模块(通过
initramfs/initrd,包含临时文件系统和必要驱动,如存储控制器驱动)。 - 利用
initramfs中的脚本(如init)尝试挂载真正的根文件系统(/dev/sda1等),完成后释放initramfs。 - 内核启动第一个用户空间进程:
init(传统 SysVinit)或 **systemd**(现代主流初始化系统,PID=1)。
- 内核(
4. init 进程启动(systemd 时代)
- 作用:接管系统初始化,启动服务、配置运行目标。
- 核心组件(以 systemd 为例):
- systemd 初始化:
- 读取配置文件:
/etc/systemd/system/default.target(默认目标,如命令行或图形界面)。 - 命令行对应目标:
multi-user.target(等价于传统 Runlevel 3)。 - 图形界面对应目标:
graphical.target(依赖multi-user.target,额外启动桌面环境)。
- 读取配置文件:
- 生成内核参数:
- 若启动时指定参数(如
systemd.unit=multi-user.target),可强制进入命令行。
- 若启动时指定参数(如
- 启动系统服务:
- 按依赖关系并行启动服务(如网络
network.target、文件系统检查fsck、日志服务systemd-journald等)。 - 关键服务路径:
/etc/systemd/system/下的符号链接指向/usr/lib/systemd/system/中的服务定义。
- 按依赖关系并行启动服务(如网络
- systemd 初始化:
5. 进入命令行环境
- 目标激活(Target Activation):
- systemd 激活
multi-user.target,触发启动终端服务(getty进程)。 getty负责初始化终端(如tty1-tty6),显示登录提示符(如login:)。
- systemd 激活
- 终端登录:
- 用户输入用户名和密码,或通过密钥认证。
- 登录成功后,启动 shell(如
bash),加载用户配置(~/.bashrc、~/.profile等),进入命令行交互界面。
6. 补充:传统 SysVinit 与运行级别(Runlevel)
- 虽然现代 Linux 多使用 systemd,但部分旧系统或嵌入式系统仍用 SysVinit:
- 运行级别:
runlevel 3为多用户命令行模式(无图形界面)。 - 启动流程:
init读取/etc/inittab,启动getty进程到指定终端。 - 切换命令行:按
Ctrl+Alt+F1~F6切换虚拟终端(tty1~tty6),tty7通常为图形界面。
- 运行级别:
总结流程图
plaintext
开机 → POST自检 → BIOS/UEFI加载引导程序(GRUB)→ 加载内核 & initramfs → 内核初始化 → 启动systemd(PID=1)↳ systemd读取默认目标(multi-user.target)→ 启动依赖服务 → 启动getty终端 → 显示登录提示 → 用户登录 → 进入命令行
常见问题与操作
- 强制进入命令行:
- 启动时在 GRUB 菜单按
e编辑内核参数,在linux行末尾添加systemd.unit=multi-user.target或3,按F10启动。
- 启动时在 GRUB 菜单按
- 查看当前目标:
systemctl get-default(输出multi-user.target为命令行,graphical.target为图形界面)。 - 切换目标:
- 临时切换:
systemctl isolate multi-user.target(命令行)或graphical.target(图形界面)。 - 永久设置:
systemctl set-default multi-user.target(默认命令行)。
- 临时切换:
通过以上流程,Linux 从硬件启动到用户登录命令行的各个环节被完整串联,核心是引导程序、内核、初始化系统(systemd)和终端服务的协同工作。