【Linux】Linux 系統啟動流程詳解

在這里插入圖片描述

1. BIOS/UEFI 階段

  • 硬件自檢(POST)

    • BIOS/UEFI 執行硬件檢查(內存、CPU、外設等)。
    • 若硬件異常,通過蜂鳴碼或屏幕提示錯誤。
  • 選擇啟動設備

    • 按配置順序(硬盤、U盤、網絡等)尋找可引導設備。
    • BIOS:讀取磁盤第一個扇區的 MBR(512字節)
    • UEFI:從 ESP 分區(EFI System Partition)加載 .efi 文件(如 grubx64.efi)。

2. 引導加載程序(Bootloader)

常見工具:GRUB2(GNU GRand Unified Bootloader)

GRUB2 工作流程:
  1. Stage 1(MBR 或 ESP 分區)

    • 加載 Stage 1.5(如 core.img),提供基礎文件系統驅動。
  2. Stage 2/boot/grub/

    • 加載配置文件 /boot/grub/grub.cfg,顯示啟動菜單。
    • 用戶可選擇內核版本或進入救援模式。
  3. 加載內核與 initramfs

    • 將選定的 內核(vmlinuz)initramfs 鏡像加載到內存。

關鍵文件

  • grub.cfg:由 grub-mkconfig 生成(編輯 /etc/default/grub 后需更新)。
  • initramfs-*.img:包含根文件系統掛載前的必要驅動和工具。

3. 內核初始化

  1. 解壓與初始化

    • 內核解壓并初始化硬件(CPU、內存、設備樹等)。
    • 掛載臨時根文件系統(initramfs),加載關鍵驅動(如磁盤控制器、文件系統驅動)。
  2. 切換至真實根文件系統

    • 通過 initramfs 中的腳本(如 /init)掛載真正的根分區(/)。
    • 卸載 initramfs,釋放內存。
  3. 啟動第一個用戶進程

    • 內核啟動 PID=1 的進程:
      • 傳統系統:/sbin/init(SysV init)
      • 現代系統:systemd

4. 用戶空間初始化

(1)SysV init 流程
  • 讀取 /etc/inittab
    • 確定默認運行級別(id:3:initdefault:)。
  • 執行 /etc/rc.d/rc.sysinit
    • 初始化網絡、掛載文件系統、加載內核模塊等。
  • 按運行級別啟動服務
    • 運行級別目錄(如 /etc/rc3.d/),按 S##Service 順序啟動服務。
(2)systemd 流程
  • 加載默認 Target
    • 默認目標:graphical.target(圖形界面)或 multi-user.target(命令行)。
  • 并行啟動服務
    • 根據單元(Unit)依賴關系并發啟動服務,加速啟動。
  • 關鍵命令
    systemctl get-default        # 查看默認 Target
    systemctl set-default TARGET# 修改默認 Target
    

5. 運行級別(Runlevel)與 Target 對照

SysV 運行級別systemd Target描述
0poweroff.target關機
1rescue.target單用戶模式(救援)
3multi-user.target多用戶命令行模式
5graphical.target圖形界面模式
6reboot.target重啟

6. 用戶登錄

  • 顯示管理器(Display Manager)
    • 圖形登錄:GDM(GNOME)、LightDM 等。
  • 終端登錄
    • 啟動 getty 進程,提供 TTY 登錄界面。
  • 登錄后加載 Shell
    • 執行用戶配置(/etc/profile~/.bash_profile 等)。

常見故障排查

  1. GRUB 損壞

    • 使用 Live CD 修復或重裝 GRUB:
      grub-install /dev/sda
      update-grub
      
  2. 內核啟動失敗

    • 在 GRUB 菜單中選擇舊版本內核啟動。
    • 檢查 /var/log/boot.logjournalctl -b(systemd 日志)。
  3. 根文件系統掛載失敗

    • 在啟動參數中添加 init=/bin/bash 進入救援 Shell。
    • 檢查 /etc/fstab 或手動掛載根分區。

四、流程圖

BIOS/UEFI → Bootloader → Kernel → Init Process → Target/Runlevel → Login

附錄

  • 查看啟動時間:systemd-analyze
  • 重建 initramfs:mkinitramfs -o /boot/initrd.img-$(uname -r)
  • 修改內核參數:編輯 /etc/default/grubGRUB_CMDLINE_LINUX → 運行 update-grub

通過理解啟動流程,可更高效地診斷系統問題或優化啟動速度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75274.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75274.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75274.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++封裝、繼承、多態(虛函數)

目錄 1、封裝 2、繼承 繼承方式: (1)公有繼承;public (2)保護繼承;protected (3)私有繼承;private 菱形繼承: 同名隱藏? 含義…

藍橋杯沖刺:一維前綴和

系列文章目錄 藍橋杯系列:一維前綴和 文章目錄 系列文章目錄前言一、暴力的寫法:二、一維前綴和的模板: 具體實現: 三、具體例題:求和 1.題目參考:2.以下是具體代碼實現: 總結 前言 上次我介紹…

使用UDP建立連接,會存在什么問題?

使用UDP建立連接,會存在可靠性、有序性、連接狀態管理等方面的問題: 1、數據傳輸不可靠: UDP沒有確認和重傳機制,發送方發送數據后,不會等待接收方的確認消息。這意味著如果數據在傳輸過程中丟失,發送方不…

YOLOv5配置訓練以及華為昇騰910B推理

參考文章: 保姆式yolov5教程,訓練你自己的數據集 - 知乎 Windows 10|11下安裝mmyolo-0.5.0版本 - 知乎 Ubuntu22.04安裝教程&基于華為Ascend AI處理器的om模型atc轉換環境安裝_ubuntu安裝atc工具-CSDN博客嵌入式AI---在華為昇騰推理自己的yolov5目標…

基于yolov11的汽車損傷檢測系統python源碼+onnx模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv11的汽車損傷檢測系統是一種先進的計算機視覺技術,旨在快速準確地識別汽車的各種損傷類型。該系統利用YOLOv11模型的強大性能,實現了對車輛損傷的精確檢測與分類。 該系統能夠識別的損傷類型包括裂紋(crack&#xff…

[ 3分鐘算法 ] | 遞歸搜索題目 : 合并兩個有序鏈表(遞歸版)

目錄 1. 題目鏈接: 2. 思路分析: 1. 重復子問題? 2. 具體子問題? 3. 遞歸出口? 3. 代碼實現: 4. 小結: 1. 循環(迭代) vs 遞歸 2. 遞歸 vs 深搜 1. 題目鏈接: 21. 合并…

單元測試原則之——不要模擬值對象 (1)

1. 什么是值對象(Value Objects)? 值對象是指那些不可變且僅通過其屬性(數據)來定義的對象。它們通常沒有復雜的邏輯或行為,主要用于存儲和傳遞數據。例如: ● 字符串(String) ● 數字(Integer, Double) ● 日期(LocalDate, Instant) ● 自定義的簡單數據類(如…

【軟件】在Windows和Ubuntu上使用TFTP和NFS

在Windows和Ubuntu上使用TFTP和NFS 零、介紹 最近在玩Linux開發板,在開發的過程中發現需要用到tftp和nfs來幫助傳輸文件,故此記錄如何使用這兩種軟件。 TFTP(Trivial File Transfer Protocol) :是一種簡化的文件傳輸…

JS判斷變量是否為空的方法

在 JavaScript 中,判斷變量是否為空需要根據不同的數據類型和具體需求來處理。以下是常見場景的解決方案: 1. 基礎判斷:null 或 undefined javascript if (value null || value undefined) {// 變量為空 } 或簡寫為: javasc…

Linux更換掛載nfs遷移數據流程

當前:原nfs(10.16.2.1:/myData)掛載在/myData,新的nfs(10.16.2.2:/myData)未掛載 目標:把舊nfs的數據遷移到新的nfs上,并把新nfs掛載到/myData 步驟: 1、新nfs掛載到一…

深入解析音頻:格式、同步及封裝容器

物理音頻和數字音頻 物理音頻 定義:物理音頻就是聲音在自然界中的物理表現形式,本質上是一種機械波,通過空氣或其他介質傳播。例如,當我們說話、樂器演奏或物體碰撞時,都會產生振動,這些振動會引起周圍介…

AI與.NET技術實操系列(四):使用 Semantic Kernel 和 DeepSeek 構建AI應用

1. 引言 在人工智能技術飛速發展的今天,大型語言模型(Large Language Models, LLMs)已成為智能應用開發的核心驅動力。從智能客服到自動化內容生成,LLMs的應用正在深刻改變我們的工作和生活方式。 對于.NET開發者而言,…

導出cad實體所有信息到txt并打開(生成唯一文件名) ——c#cad二次開發

效果如下: 建議在保存時指定編碼為UTF-8: using (StreamWriter sw new StreamWriter(filePath, false, Encoding.UTF8)) { // 寫入內容 } 最終 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD…

Redis 源碼硬核解析系列專題 - 第一篇:Redis源碼入門與整體架構

1. 引言 Redis作為一個高性能的內存鍵值數據庫,其源碼以簡潔高效著稱。通過解析Redis源碼,我們可以深入理解其單線程模型、事件驅動機制以及模塊化設計的精髓。本篇將從Redis的源碼目錄結構入手,剖析其整體架構,并聚焦啟動流程和事件循環的核心實現。 2. Redis源碼目錄結構…

異步加載+內存分析

異步加載 Resources和AB包的同步加載與異步加載對比代碼: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class AsyncLoad : MonoBehaviour {// Start is called before the first frame updatev…

將視頻m4s文件轉換為mp4格式

將視頻m4s文件轉換為mp4格式 一般情況:偏大的文件為視頻,偏小的文件為音頻。 環境要求:下載并安裝ffmpeg,并配置好環境變量,如下圖: 轉換代碼: import subprocessdef merge_m4s_to_mp4(vide…

EXCEL報錯:無法共享此工作薄,因表包含excel表或xml映射的解決方法

在分享工作薄是,如果出現了“無法共享此工作薄,因表包含excel表或xml映射”的報錯,那么有兩個原因: 1.包含Excel表格,這個也是相對比較常見的原因。 首先選中表格。如果你不知道表的位置在哪,那么在Excel左…

w2ui 水平滾動移動 虛擬列 數據丟失

https://w2ui.com/web/docs/1.5/w2grid.disableCVS https://github.com/vitmalina/w2ui/issues/1398 解決方案來源 問題現象: 窗口縮小 導致多列 出現水平滾動,滾動時觸發本地樣式重繪,導致record undefined,從而引發多列報錯 解決方案: 使用 disableCVS : true 一次加載到d…

在ensp進行OSPF+RIP+靜態網絡架構配置

一、實驗目的 1.Ospf與RIP的雙向引入路由消息 2.Ospf引入靜態路由信息 二、實驗要求 需求: 路由器可以互相ping通 實驗設備: 路由器router7臺 使用ensp搭建實驗壞境,結構如圖所示 三、實驗內容 1.配置R1、R2、R3路由器使用Ospf動態路由…

基于mediapipe深度學習和限定半徑最近鄰分類樹算法的人體摔倒檢測系統python源碼

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 Mediapipe人體姿態檢測原理 4.2 限定半徑最近鄰分類樹算法原理 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 人工智能算法python程序運行環…