文件系統基礎與根文件系統詳解
- 什么是文件系統?
- 什么是根文件系統(Root File System)?
- 一句話理解:
- 更詳細地說:
- 根文件系統為什么重要?
- 1. 啟動依賴
- 2. 提供根目錄 `/`
- 3. 支持掛載其他文件系統
- 4. 提供運行環境
- 嵌入式Linux中,根文件系統的作用更突出
- 根文件系統的組成結構
- 可執行映像文件的結構
- 什么是可執行映像文件?
- 可執行文件的組成部分
- 1. 代碼段(.text)
- 2. 數據段(.data)
- 3. BSS段(.bss)
- 4. 堆(Heap)
- 5. 棧(Stack)
- 舉個小例子說明:
- 小結
- 總結歸納
什么是文件系統?
文件系統(File System)是操作系統用于管理和存儲數據的一種機制。它負責:
- 組織文件(比如目錄結構)
- 保存文件(比如磁盤上的具體存儲位置)
- 訪問文件(比如讀寫權限、文件打開關閉等)
就好比我們在圖書館里找書,文件系統就像是圖書館的管理員和索引目錄,幫我們高效查找、保存、組織信息。
常見的文件系統類型包括:
- FAT32:U盤常見格式,兼容性強
- NTFS:Windows系統常用
- ext3/ext4:Linux系統常用
什么是根文件系統(Root File System)?
一句話理解:
根文件系統就是Linux啟動后最先使用、最基本的那個文件系統,是所有文件和目錄的“家”。
更詳細地說:
根文件系統是內核啟動后**第一個掛載(mount)**的文件系統,它的作用是支撐操作系統后續的運行,包括:
- 提供基礎目錄結構(如
/bin
、/etc
、/lib
、/sbin
、/dev
等) - 提供啟動腳本和初始化進程(如
init
、inittab
、rcS
腳本等) - 提供運行基本命令所需的程序和動態庫(如
ls
、cd
等命令)
如果把內核比作發動機,那么根文件系統就像是車身結構和操作系統環境,它必須提供最基本的組件,才能讓“車子真正跑起來”。
根文件系統為什么重要?
我們來分幾個角度解釋它的重要性:
1. 啟動依賴
內核啟動之后,需要運行第一個用戶空間進程——init
,這個 init
程序必須在根文件系統中才能找到。
2. 提供根目錄 /
整個 Linux 的文件系統是一個倒置的樹形結構,根節點就是 /
,所有文件和目錄都從 /
出發。比如:
/bin/ls
:存放基本命令ls
/lib/ld-linux.so.3
:動態鏈接器/etc/init.d/
:啟動服務腳本
沒有根 /
,整個目錄體系就無法組織。
3. 支持掛載其他文件系統
Linux 支持掛載多個磁盤/分區作為子目錄,比如:
/home
:單獨掛載在另一分區/mnt/usb
:掛載U盤
但是這些操作本身的邏輯和配置文件(如 /etc/fstab
)就要放在根文件系統里。
4. 提供運行環境
命令行工具(如 ls
, cd
)、系統調用所依賴的庫(如 libc.so
)、shell 終端(如 bash
或 sh
)都在根文件系統中。否則你輸入命令也執行不了。
嵌入式Linux中,根文件系統的作用更突出
在嵌入式設備中,內核與根文件系統通常是分開存儲的:
- 內核(zImage/uImage):負責硬件驅動、系統調度
- 根文件系統(rootfs):負責提供用戶空間運行環境
如果你下載了內核卻沒有對應的根文件系統,會出現提示“無法加載rootfs”,系統也就啟動失敗。
根文件系統的組成結構
通常包含如下目錄:
目錄 | 含義 |
---|---|
/bin | 基本命令(二進制程序),如 ls , cp , mkdir |
/sbin | 系統管理員用命令,如 mount , reboot |
/lib | 程序運行所依賴的共享庫,如 libc.so |
/etc | 系統配置文件,如 fstab , passwd |
/dev | 設備節點,如 tty , null |
/proc | 虛擬文件系統,內核和進程信息 |
/sys | 與設備相關的內核信息 |
/tmp | 臨時文件目錄 |
/root | 超級用戶的家目錄 |
/home | 普通用戶家目錄 |
/mnt | 掛載點,臨時掛載外部設備 |
/usr | 用戶軟件目錄 |
/var | 可變數據,如日志文件 |
可執行映像文件的結構
什么是可執行映像文件?
可執行映像文件是指可以被操作系統裝載并運行的程序文件。比如:
- Linux中的
a.out
,hello
- Windows中的
.exe
Linux 系統中的可執行文件通常是 ELF 格式(Executable and Linkable Format)。
可執行文件的組成部分
一個標準的可執行文件通常包含以下幾個區域:
1. 代碼段(.text)
- 存放程序的機器指令(也就是編譯后的代碼)
- 通常是只讀的,防止程序被惡意修改
- 可以被多個程序共享加載(節省內存)
2. 數據段(.data)
- 存放已初始化的全局變量和靜態變量
- 是可讀寫的,比如
int a = 10;
編譯后就會進入數據段
3. BSS段(.bss)
- 存放未初始化的全局變量和靜態變量
- 在程序運行前,這些變量會被自動初始化為0
- BSS不占據磁盤空間,只在內存中占用空間(更節省)
4. 堆(Heap)
- 程序運行時動態分配的內存區域(如使用
malloc()
) - 空間大小在運行時決定
5. 棧(Stack)
- 用于函數調用時保存局部變量、返回地址等
- 每個線程都有自己的棧,自動增長/收縮
舉個小例子說明:
#include <stdio.h>int global_a = 10; // .data段
static int static_b; // .bss段
int main() {int local_var = 5; // 棧int *heap_var = malloc(100); // 堆printf("Hello World\n"); // .text段return 0;
}
部分 | 內容 |
---|---|
.text | main() 、printf() 的編譯代碼 |
.data | global_a = 10 |
.bss | static_b |
棧 | local_var |
堆 | heap_var = malloc() |
小結
名稱 | 含義 | 是否可寫 |
---|---|---|
.text | 代碼段 | 否(只讀) |
.data | 初始化的數據 | 是 |
.bss | 未初始化的數據 | 是 |
Heap | 動態分配區 | 是 |
Stack | 函數調用用 | 是 |
總結歸納
項目 | 說明 |
---|---|
根文件系統 | 是Linux啟動后的第一個文件系統,提供基本命令、庫、腳本等,保障系統能運行 |
文件系統 vs 內核 | 文件系統是用戶空間的“工具箱”,內核是操作系統的“核心引擎” |
沒有根文件系統 | 內核無法完成系統初始化,Linux系統無法運行 |
可執行文件組成 | 包括代碼段、數據段、bss段、堆、棧等,各有不同用途和特性 |