Linux系統啟動相關:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD

目錄

一、vmlinux、vmlinuz、zImage、bzImage、uImage

二、initrd 和 initramfs

1、initrd(Initial RAM Disk)

2、initramfs(Initial RAM Filesystem)

3、initrd vs. initramfs 對比

4. 如何查看和生成 initramfs

三、SystemV 和 SystemD 的區別


一、vmlinux、vmlinuz、zImage、bzImage、uImage

vmlinux

是編譯出來的最原始的內核文件,未經壓縮的原始Linux內核可執行文件(ELF格式),包含調試符號,體積非常大。

主要用于內核調試(如用GDB分析崩潰),不直接用于啟動系統。

vmlinuz

vmlinux的壓縮版本(名稱中的?z?表示壓縮),去除了調試符號,體積更小,是bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接

實際用于系統啟動的通用內核文件名稱(如?/boot/vmlinuz-<version>

zImage

使用gzip壓縮的小型內核鏡像(適用于老式引導器),大小限制在約512KB

bzImage

Big zImage,同樣壓縮但支持更大內核(現代x86系統的標準格式)

大多數x86架構系統的標準啟動文件(如?/boot/bzImage-<version>

uImage

uboot專用的內核鏡像格式,在zImage/bzImage前添加U-Boot頭(包含加載地址等信息)

嵌入式系統中使用U-Boot引導時必需的文件(如ARM開發板)


二、initrd 和 initramfs

initrd(Initial RAM Disk)和?initramfs(Initial RAM Filesystem)都是 Linux 內核在啟動過程中使用的臨時根文件系統,用于在掛載真正的根文件系統之前提供必要的驅動、工具和腳本。盡管它們的目的一致,但實現方式不同。以下是它們的區別、工作原理及使用場景:

1、initrd(Initial RAM Disk)

  • 基于塊設備:initrd?是一個壓縮的磁盤映像(通常是?gzip?壓縮的?ext2?或?cramfs?文件系統),由引導加載器(如 GRUB)加載到內存。

  • 需要掛載:內核將其視為一個塊設備(如?/dev/ram0),并掛載為臨時根文件系統(/)。

  • 固定大小:需要預先分配固定大小的內存,可能導致資源浪費或空間不足。

工作流程

(1)引導加載器(如 GRUB)加載內核(vmlinuz)和?initrd?到內存。

(2)內核解壓?initrd?并掛載為臨時根文件系統(/)。

(3)initrd?中的?/linuxrc?或?/init?腳本執行,加載必要的模塊(如磁盤驅動、LVM、加密等)。

(4)腳本掛載真正的根文件系統(如?/dev/sda1),并切換根目錄(pivot_root?或?chroot)。

(5)真正的?init?進程(如?systemd?或?SysVinit)接管,initrd?被卸載。

由于其基于塊設備,效率較低。且大小固定不夠靈活,因此現代 Linux 系統已逐漸淘汰initrd,改用initramfs。

2、initramfs(Initial RAM Filesystem)

  • 基于 tmpfs(內存文件系統):initramfs是一個?cpio?歸檔文件(通常用?gzip?壓縮),直接解壓到內核的內存文件系統(tmpfs)。

  • 無需掛載:內核直接將其解壓到根文件系統,無需額外的塊設備驅動。

  • 動態大小:按需使用內存,更高效靈活。

  • 現代標準:從 Linux 2.6 開始成為默認機制。

工作流程

  1. 引導加載器?加載內核(vmlinuz)和?initramfs?到內存。

  2. 內核將?initramfs?解壓到?tmpfs?并作為初始根文件系統(/)。

  3. /init(通常是 shell 腳本或?systemd)執行,加載必要的驅動和工具。

  4. 掛載真正的根文件系統,并切換根目錄(pivot_root)。

  5. 真正的?init?進程接管,initramfs?被釋放。

更快的啟動速度(無需掛載塊設備)。動態調整大小,節省內存。支持更復雜的早期用戶空間(如?systemd?在 initramfs 中運行)。

3、initrd vs. initramfs 對比

特性initrdinitramfs
存儲方式塊設備(如?/dev/ram0tmpfs(內存文件系統)
格式磁盤映像(ext2+gzipcpio?歸檔(gzip?壓縮)
掛載方式需要掛載為塊設備直接解壓到內存
大小固定大小動態調整
性能較慢(需塊設備訪問)更快(直接內存訪問)
現代使用已淘汰(舊系統可能使用)現代 Linux 默認機制

4. 如何查看和生成 initramfs

(1)查看 initramfs 內容

lsinitramfs /boot/initramfs-$(uname -r).img
# 或
unmkinitramfs /boot/initramfs-$(uname -r).img /tmp/initramfs

(2)生成initramfs

# Debian/Ubuntu(使用 update-initramfs)
update-initramfs -u -k $(uname -r)# RHEL/CentOS(使用 dracut)
dracut --force /boot/initramfs-$(uname -r).img $(uname -r)

(3)手動創建 initramfs

# 1. 創建一個簡單的 initramfs 目錄結構
mkdir -p initramfs/{bin,dev,proc,sys}
# 2. 復制必要的工具(如 busybox)
cp /bin/busybox initramfs/bin/
# 3. 創建 init 腳本(必須是可執行的)
echo -e '#!/bin/sh\nmount -t proc proc /proc\nexec /bin/sh' > initramfs/init
chmod +x initramfs/init
# 4. 打包成 cpio.gz
(cd initramfs && find . | cpio -H newc -o | gzip > ../initramfs.cpio.gz)

三、SystemV 和 SystemD 的區別

SystemV 和 SystemD 是 Linux 系統中兩種不同的初始化(init)系統,用于管理系統的啟動和服務。

特性SystemV?(SysV)SystemD
啟動方式順序執行腳本(串行)并行啟動服務
運行級別0-6(如 runlevel3=多用戶模式)使用?target(如?multi-user.target
服務管理/etc/init.d/?腳本 +?service/chkconfigsystemctl?+?.service?單元文件
日志管理依賴?syslog內置?journalctl
依賴管理手動定義啟動順序自動依賴解析
默認配置文件/etc/inittab/etc/systemd/system/default.target

根據Linux內核驅動流程,在架構有關的匯編代碼完成特定初始化后,會調用start_kernel開始內核的初始化工作;

  • start_kernel函數中有關根文件系統掛載的簡要執行流程概述如下:
start_kernel→ vfs_caches_init()→ mnt_init()→ init_rootfs()          // 注冊rootfs→ init_mount_tree()      // 掛載rootfs到/→ rest_init()→ kernel_init()→ do_basic_setup()→ populate_rootfs()    // 處理initramfs/initrd→ 檢查/init是否存在?→ 是:執行init_post()  // 用戶空間接管→ 否:prepare_namespace()→ mount_root()       // 掛載真實根文件系統→ sys_mount(".", "/", MS_MOVE) // 切換根目錄
  • 其中,rest_init函數中依次創建了三個進程,idle進程,init進程以及kthreadd進程;
  • kernel_init函數中調用do_basic_setup函數,解壓釋放initramfs類型文件系統到rootfs的根目錄,其中就必須包括/init可執行文件;

對于采用SystemV管理的系統

在系統啟動過程中,/init可執行文件通常是init程序本身,在制作initramfs根文件系統時,需要將init程序打包進去,并確保/init指向這個init程序。init程序啟動后,會讀取/etc/inittab文件來確定系統的默認運行級別,并執行相應的腳本。
具體步驟如下:

  • 制作initramfs根文件系統時,將init程序打包進去。
  • 創建/init到init程序的軟鏈接。
  • init程序啟動后,讀取/etc/inittab文件,確定系統的默認運行級別。
  • 根據運行級別,init程序會執行/etc/rc.d/rc script,該腳本會進一步調用/etc/rc.d/rc<number>腳本(其中<number>是運行級別)。
  • /etc/rc.d/rc<number>腳本會啟動或停止相應的服務,以完成系統的初始化過程。

對于采用SystemD管理的系統,

  • 實際上/init可執行文件是systemd的符號鏈接,所以在init_post函數中執行的用戶進程即為systemd;
  • 在制作initramfs根文件系統時,將systemd程序也打包進去,創建/init到systemd的軟鏈接,即可啟動systemd;
  • systemd啟動后,完成后續的linux操作系統加載過程。

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

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

相關文章

AIStarter Windows 版本迎來重磅更新!模型插件工作流上線,支持 Ollama / ComfyUI 等多平臺本地部署模型統一管理

如果你正在使用 AIStarter 工具進行本地 AI 模型部署 &#xff0c;那么這條消息對你來說非常重要&#xff01; 在最新推出的 AIStarter Windows 正式版更新中 &#xff0c;官方對整個平臺進行了功能重構和性能優化&#xff0c;尤其是新增了「模型插件工作流 」功能&#xff0c…

深入理解橋接模式:解耦抽象與實現的設計藝術

一、為什么需要橋接模式&#xff1f;從“類爆炸”問題說起 你是否遇到過這樣的開發困境&#xff1f; 當需要為系統擴展新功能時&#xff0c;繼承體系像滾雪球一樣越變越臃腫&#xff1a;新增一種遙控器類型&#xff0c;需要為電視、音響各寫一個子類&#xff1b;新增一種設備類…

Java 中的泛型原理與實踐案例

引言&#xff1a;為什么需要泛型 在Java 5之前&#xff0c;集合類只能存儲Object類型的對象&#xff0c;這帶來了兩個主要問題&#xff1a; 類型不安全&#xff1a;可以向集合中添加任何類型的對象&#xff0c;容易出錯繁瑣的類型轉換&#xff1a;從集合中取出元素時需要手動…

springboot3+vue3融合項目實戰-大事件文章管理系統-獲取文章分類詳情

GetMapping("/detail")public Result<Category> detail(Integer id){Category c categoryService.findById(id);return Result.success(c);}在CategoryService接口增加 Category findById(Integer id); 在CategoryServiceImpl增加 Overridepublic Category f…

從零開始創建一個 Next.js 項目并實現一個 TodoList 示例

Next.js 是一個基于 React 的服務端渲染框架&#xff0c;它提供了很多開箱即用的功能&#xff0c;如自動路由、API 路由、靜態生成、增量靜態再生等。本文將帶你一步步創建一個 Next.js 項目&#xff0c;并實現一個簡單的 TodoList 功能。 效果地址 &#x1f9f1; 安裝 Next.j…

分布式鎖: Redisson紅鎖(RedLock)原理與實現細節

分布式鎖是分布式系統的核心基礎設施&#xff0c;但 單節點 Redis 鎖在高可用場景下存在致命缺陷&#xff1a;當 Redis 主節點宕機時&#xff0c;從節點可能因異步復制未完成而丟失鎖信息&#xff0c;導致多個客戶端同時持有鎖。為此&#xff0c;Redis 作者 Antirez 提出了 Red…

c++多態面試題之(析構函數與虛函數)

有以下問題展開 析構函數要不要定義成虛函數&#xff1f;基類的析構函數要不要定義成虛函數&#xff1f;如果不定義會有什么問題&#xff0c;定義了在什么場景下起作用。 1. 基類析構函數何時必須定義為虛函數&#xff1f; 當且僅當通過基類指針&#xff08;或引用&#xff09;…

Python高級進階:Vim與Vi使用指南

李升偉 整理 在 Python 高級進階中&#xff0c;使用 Vim 或 Vi 作為代碼編輯器可以顯著提升開發效率&#xff0c;尤其是在遠程服務器開發或快速腳本編輯時。以下是關于它們在 Python 開發中的高級應用詳解&#xff1a; 1. Vim/Vi 簡介 Vi&#xff1a;經典的 Unix 文本編輯器…

Dify中使用插件LocalAI配置模型供應商報錯

服務器使用vllm運行大模型&#xff0c;今天在Dify中使用插件LocalAI配置模型供應商后&#xff0c;使用工作流的時候&#xff0c;報錯&#xff1a;“Run failed: PluginInvokeError: {"args":{},"error_type":"ValueError","message":&…

深度學習驅動下的目標檢測技術:原理、算法與應用創新(二)

三、主流深度學習目標檢測算法剖析 3.1 R - CNN 系列算法 3.1.1 R - CNN 算法詳解 R - CNN&#xff08;Region - based Convolutional Neural Networks&#xff09;是將卷積神經網絡&#xff08;CNN&#xff09;應用于目標檢測領域的開創性算法&#xff0c;其在目標檢測發展歷…

【Umi】項目初始化配置和用戶權限

app.tsx import { RunTimeLayoutConfig } from umijs/max; import { history, RequestConfig } from umi; import { getCurrentUser } from ./services/auth; import { message } from antd;// 獲取用戶信息 export async function getInitialState(): Promise<{currentUse…

[學習] RTKLib詳解:qzslex.c、rcvraw.c與solution.c

RTKLib詳解&#xff1a;qzslex.c、rcvraw.c與solution.c 本文是 RTKLlib詳解 系列文章的一篇&#xff0c;目前該系列文章還在持續總結寫作中&#xff0c;以發表的如下&#xff0c;有興趣的可以翻閱。 [學習] RTKlib詳解&#xff1a;功能、工具與源碼結構解析 [學習]RTKLib詳解…

移植RTOS,發現任務棧溢出怎么辦?

目錄 1、硬件檢測方法 2、軟件檢測方法 3、預防堆棧溢出 4、處理堆棧溢出 在嵌入式系統中&#xff0c;RTOS通過管理多個任務來滿足嚴格的時序要求。任務堆棧管理是RTOS開發中的關鍵環節&#xff0c;尤其是在將RTOS移植到新硬件平臺時。堆棧溢出是嵌入式開發中常見的錯誤&am…

window 顯示驅動開發-使用有保證的協定 DMA 緩沖區模型

Windows Vista 的顯示驅動程序模型保證呈現設備的 DMA 緩沖區和修補程序位置列表的大小。 修補程序位置列表包含 DMA 緩沖區中命令引用的資源的物理內存地址。 在有保證的協定模式下&#xff0c;用戶模式顯示驅動程序知道 DMA 緩沖區和修補程序位置列表的確切大小&#xff0c;…

SD-HOST Controller design-----SD CLK 設計

hclk的分頻電路&#xff0c;得到的分頻時鐘作為sd卡時鐘。 該模塊最終輸出兩個時鐘&#xff1a;一個為fifo_sd_clk,另一個為out_sd_clk_dft。當不分頻時&#xff0c;fifo_sd_clk等于hclk&#xff1b;當分頻時候&#xff0c;div_counter開始計數&#xff0c;記到相應分頻的時候…

完全背包問題中「排列數」與「組合數」的核心區別

&#x1f3af; 一句話理解 求組合數&#xff08;不計順序&#xff09; → 外層遍歷物品&#xff0c;內層遍歷背包容量 求排列數&#xff08;計順序&#xff09; → 外層遍歷背包容量&#xff0c;內層遍歷物品 &#x1f3b2; 舉例說明 假設有硬幣 [1, 2, 3]&#xff0c;目標金…

NHANES指標推薦:MDS

文章題目&#xff1a;The association between magnesium depletion score (MDS) and overactive bladder (OAB) among the U.S. population DOI&#xff1a;10.1186/s41043-025-00846-x 中文標題&#xff1a;美國人群鎂耗竭評分 &#xff08;MDS&#xff09; 與膀胱過度活動癥…

C++:字符串操作函數

strcpy() 功能&#xff1a;把一個字符串復制到另一個字符串。 #include <iostream> #include <cstring> using namespace std;int main() {char src[] "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << …

1基·2臺·3空間·6主體——藍象智聯解碼可信數據空間的“數智密碼”

近日&#xff0c;由全國數據標準化技術委員會編制的《可信數據空間 技術架構》技術文件正式發布&#xff0c;標志著我國數據要素流通體系向標準化、規范化邁出關鍵一步。該文件從技術功能、業務流程、安全要求三大維度對可信數據空間進行系統性規范&#xff0c;為地方、行業及企…

基于TI AM6442+FPGA解決方案,支持6網口,4路CAN,8個串口

TI AM6442FPGA解決方案具有以下技術優勢及適用領域&#xff1a; 一、技術優勢 ?異構多核架構?&#xff1a;AM6442處理器集成7個內核&#xff08;2xCortex-A534xCortex-R5F1xCortex-M4F&#xff09;&#xff0c;可實現應用處理、實時控制和獨立任務分核協同&#xff0c;滿足…