Linux文件系統三要素:塊劃分、分區管理與inode結構解析

理解文件系統

????????我們知道文件可以分為磁盤文件和內存文件,內存文件前面我們已經談過了,下面我們來談談磁盤文件。

目錄

一、引入"塊"概念

解析?stat demo.c?命令輸出

基本信息

設備信息

索引節點信息

權限信息

時間戳

二、引入"分區"概念

1、在Linux系統中,可通過以下命令查看磁盤分區信息

2、磁盤實現分區

3、磁盤格式化

三、引入"inode"概念

解析?ls -l?命令輸出內容

各字段詳細解析

特殊情況的表示

解析?ls -li?命令輸出

Inode號 (第1列)

注意

請注意

目前大家可能還存在兩個疑問


一、引入"塊"概念

????????硬盤是典型的"塊"設備。操作系統在讀取硬盤數據時,并非逐個扇區讀取(這樣效率太低),而是通過一次性連續讀取多個扇區來實現,這個連續讀取的單位稱為"塊"(block)。

????????每個硬盤分區都被劃分為若干個"塊"。"塊"的大小在格式化時確定且不可更改,最常見的大小是4KB(即連續八個扇區組成一個"塊")。"塊"是文件存取的最小單位。

stat 文件名

解析?stat demo.c?命令輸出

stat?命令用于顯示文件或文件系統的詳細狀態信息。以下是?demo.c?文件的詳細信息解析:

基本信息

  • 文件名: 'demo.c'

  • 大小: 182 字節

  • 占用塊數: 8 個塊 (通常每個塊512字節,所以占用約4KB空間)

  • IO塊大小: 4096 字節 (文件系統塊大小)

  • 類型: 普通文件 (regular file)

設備信息

  • 設備號: fd01h/64769d (主設備號fd01h,次設備號64769d)

索引節點信息

  • Inode號: 655967

  • 硬鏈接數: 1 (表示沒有其他硬鏈接指向此文件)

權限信息

  • 訪問權限: 0664 (-rw-rw-r--)

    • 所有者(hmz): 讀寫權限(rw-)

    • 所屬組(hmz): 讀寫權限(rw-)

    • 其他用戶: 只讀權限(r--)

  • 所有者: UID 1000 (用戶名hmz)

  • 所屬組: GID 1000 (組名hmz)

時間戳

  • 最后訪問時間(Access): 2025-07-16 23:18:34.624613705 +0800

  • 最后修改時間(Modify): 2025-07-16 23:18:26.954651585 +0800 (文件內容最后修改時間)

  • 最后狀態變更時間(Change): 2025-07-16 23:18:26.955651450 +0800 (文件元數據如權限等最后變更時間)

  • 創建時間(Birth): - (不支持或未記錄)

注意:

  • 磁盤可視為一個三維數組,我們將其抽象為一維數組處理,數組下標對應LBA(Logical Block Address),每個元素代表一個扇區
  • 每個扇區都有對應的LBA地址,8個扇區組成一個塊,可以根據LBA計算出塊地址
  • LBA與塊號的轉換關系:
    • 已知LBA求塊號:塊號 = LBA / 8
    • 已知塊號求LBA:LBA = 塊號 * 8 + n(n表示塊內扇區序號)


二、引入"分區"概念

????????磁盤作為典型的塊設備,通常以512字節的扇區為基本單位。以512GB磁盤為例,其包含超過十億個扇區。

????????實際上,磁盤可以被劃分為多個分區(partition)。分區編輯器將磁盤劃分為若干邏輯區域,不同分區可存儲特定類型的目錄和文件。分區越多,文件分類管理就越細致。以Windows系統為例,你可能有一塊物理磁盤并將其劃分為C、D、E盤,這些盤符就代表不同的分區。從本質上說,分區就是對硬盤進行格式化的一種方式。

1、在Linux系統中,可通過以下命令查看磁盤分區信息

ls /dev/vda* -l

2、磁盤實現分區

????????在Linux系統中,所有設備都以文件形式存在,那么如何實現分區呢?分區的最小單位是柱面,我們可以通過指定柱面編號來進行分區,具體操作就是設置每個分區的起始和結束柱面編號。

????????為了更直觀地理解,我們可以將硬盤上的柱面(分區)展開,想象成一個平面示意圖,如下圖所示:

注意:

當滿足以下條件時:

  • 所有柱面大小一致(即每個柱面包含相同數量的磁道)

  • 每個磁道的扇區數相同(即"扇區個位一致")

那么計算分區大小和LBA地址可以簡化為:

  1. 分區大小計算:

    分區大小 = (結束柱面號 - 起始柱面號 + 1) × 每柱面扇區數 × 扇區大小
  2. LBA計算:

    某位置的LBA = 起始柱面的LBA + (柱面偏移 × 每柱面扇區數) + 磁頭偏移 × 每磁道扇區數 + 扇區偏移 - 1

3、磁盤格式化

????????在完成磁盤分區后,還需要進行格式化操作。格式化是對磁盤分區進行初始化的過程,這一操作會清除分區內所有現有文件。

簡而言之,格式化就是在各個分區中寫入相應的管理信息。

????????其中,寫入的管理信息是什么是由文件系統決定的,不同的文件系統格式化時寫入的管理信息是不同的,常見的文件系統有EXT2、EXT3、XFS、NTFS等。 會在后面的博客中進行講解!


三、引入"inode"概念

????????在Linux系統中,文件內容與元數據是分開存儲的。這種存儲元數據的結構稱為inode。由于系統中可能存在大量文件,每個文件屬性集都需要一個唯一標識符,即inode編號。

????????簡而言之,inode就是文件屬性的集合。Linux系統中幾乎所有文件都擁有自己的inode。為了有效區分系統中的眾多inode,每個inode都被分配了唯一的編號。

????????正如之前所述,文件由數據和屬性兩部分組成。當我們使用ls -l命令時,不僅能看到文件名,還能查看文件的元數據(即屬性信息)。

ls -l

解析?ls -l?命令輸出內容

? ? ls -l?是 Linux/Unix 系統中常用的命令,用于以長格式顯示文件和目錄的詳細信息。以下是典型輸出的解析:

各字段詳細解析

  1. 文件類型和權限(第1列)
    由10個字符組成,例如?-rwxr-xr--

    • 第1個字符:文件類型

      標識符文件類型說明
      -普通文件常規文件,如文本、二進制文件等
      d目錄文件夾,包含其他文件或子目錄
      l符號鏈接快捷方式,指向另一個文件或目錄(如?link -> target
      c字符設備文件按字符流訪問的設備(如終端?/dev/tty
      b塊設備文件按數據塊訪問的設備(如硬盤?/dev/sda
      s套接字文件進程間通信的套接字文件(如 MySQL 的?/var/run/mysqld/mysqld.sock
      p命名管道文件先進先出(FIFO)管道,用于進程間通信(如?mkfifo?創建的文件)
    • 第2-4字符:所有者權限(u)

    • 第5-7字符:組權限(g)

    • 第8-10字符:其他用戶權限(o)

    • 權限字符:

      字符權限類型說明
      r讀權限允許查看文件內容(文件)或列出目錄內容(目錄)
      w寫權限允許修改文件內容(文件)或在目錄中創建/刪除文件(目錄)
      x執行權限允許執行文件(程序/腳本)或進入目錄(目錄)
      sSUID/SGIDSUID(所有者位置):以文件所有者權限執行
      SGID(組位置):以文件所屬組權限執行或繼承父目錄的組權限
      t粘滯位僅對目錄有效,用戶只能刪除自己擁有的文件(如?/tmp?目錄)
  2. 硬鏈接數(第2列)
    顯示指向該文件/目錄的硬鏈接數量。目錄通常至少有2個鏈接(自身和.)。

  3. 所有者(第3列)
    文件/目錄的屬主用戶名。

  4. 所屬組(第4列)
    文件/目錄的屬組名。

  5. 大小(第5列)

    • 普通文件:顯示字節大小

    • 目錄:顯示目錄元數據占用的空間(通常4096字節)

  6. 最后修改時間(第6-8列)
    顯示文件/目錄的最后修改時間,格式通常為:

    • 月份(如Jun)

    • 日期(如12)

    • 時間(如14:30)

    • 如果文件修改時間超過6個月,會顯示年份而非時間

  7. 文件名(最后一列)
    文件或目錄名稱。如果是符號鏈接,會顯示?linkname -> targetname

特殊情況的表示

  • SUID/SGID權限

    • rwsr-xr-x(所有者x位置變為s表示SUID)

    • rwxr-sr-x(組x位置變為s表示SGID)

  • 粘滯位

    • rwxr-xr-t(其他用戶x位置變為t)

  • 大小時單位顯示
    使用?-lh?選項時會以K/M/G等易讀單位顯示大小

ls -l 用于讀取磁盤上的文件信息并顯示詳細列表:

除了通過這種方式讀取信息,還可以使用 stat 命令查看更詳細的內容:

????????這里我們需要思考一個問題:既然文件數據都存儲在"塊"中,那么顯然還需要一個地方來存儲文件的元信息(屬性信息),比如創建者、創建日期、文件大小等。這個存儲文件元信息的區域就叫做inode,中文譯名為"索引節點"。

ls -li

解析?ls -li?命令輸出

? ? ls -li?命令結合了?-i?(顯示inode號) 和?-l?(長格式) 選項,提供比普通?ls -l?更詳細的信息。以下是完整解析:

Inode號 (第1列)

  • 唯一標識文件系統內的文件

  • 示例:1234567

  • 特點:

    • 每個文件/目錄有唯一inode號

    • 硬鏈接共享相同inode號

    • 刪除文件實際上是減少inode的鏈接計數

????????每個文件都對應一個inode,其中存儲著該文件的相關信息。要理解inode的概念,我們需要先深入了解文件系統的工作原理。

注意

  • Linux系統中文件采用屬性與內容分離的存儲機制
  • Linux通過inode結構存儲文件屬性,每個文件對應一個獨立的inode
  • inode中包含唯一的標識符,稱為inode號

一個文件的 inode 屬性具體是什么樣呢?我們來到源碼中看看對應的結構:

/** Structure of an inode on the disk (ext2文件系統的磁盤inode結構)*/
struct ext2_inode {/* 基礎信息 */__le16 i_mode;          /* 文件類型和權限 (rwx) */__le16 i_uid;           /* 所有者UID低16位 */__le32 i_size;          /* 文件大小(字節) *//* 時間戳(Unix時間戳格式) */__le32 i_atime;         /* 最后訪問時間 */__le32 i_ctime;         /* 創建時間 */__le32 i_mtime;         /* 最后修改時間 */__le32 i_dtime;         /* 刪除時間 *//* 所有權信息 */__le16 i_gid;           /* 所屬組GID低16位 */__le16 i_links_count;   /* 硬鏈接計數 */__le32 i_blocks;        /* 占用塊數(512字節為單位) */__le32 i_flags;         /* 文件標志(如不可修改、壓縮等) *//* 操作系統特定數據1 */union {struct {__le32 l_i_reserved1;} linux1;struct {__le32 h_i_translator;} hurd1;struct {__le32 m_i_reserved1;} masix1;} osd1;/* 數據塊指針 */__le32 i_block[EXT2_N_BLOCKS];  /* 直接/間接塊指針(共15個) *//* 擴展屬性 */__le32 i_generation;    /* 文件版本(用于NFS) */__le32 i_file_acl;      /* 文件ACL塊指針 */__le32 i_dir_acl;       /* 目錄ACL塊指針 */__le32 i_faddr;         /* 碎片地址 *//* 操作系統特定數據2 */union {struct {__u8  l_i_frag;       /* 碎片編號 */__u8  l_i_fsize;      /* 碎片大小 */__u16 i_pad1;__le16 l_i_uid_high;   /* 所有者UID高16位 */__le16 l_i_gid_high;   /* 所屬組GID高16位 */__u32  l_i_reserved2;} linux2;struct {__u8  h_i_frag;__u8  h_i_fsize;__le16 h_i_mode_high;__le16 h_i_uid_high;__le16 h_i_gid_high;__le32 h_i_author;} hurd2;struct {__u8  m_i_frag;__u8  m_i_fsize;__u16 m_pad1;__u32 m_i_reserved2[2];} masix2;} osd2;
};/** 數據塊相關常量*/
#define EXT2_NDIR_BLOCKS  12  /* 直接塊數量 */
#define EXT2_IND_BLOCK    (EXT2_NDIR_BLOCKS)      /* 一級間接塊索引 */
#define EXT2_DIND_BLOCK   (EXT2_IND_BLOCK + 1)    /* 二級間接塊索引 */
#define EXT2_TIND_BLOCK   (EXT2_DIND_BLOCK + 1)   /* 三級間接塊索引 */
#define EXT2_N_BLOCKS     (EXT2_TIND_BLOCK + 1)   /* 總塊指針數(15個) */

查看源碼后,我們可以知道inode這個數據結構中包含了很多很多的文件屬性!!!

請注意

  • 文件名屬性不包含在inode數據結構中
  • inode大小通常為128字節或256字節,后續討論中將統一采用128字節
  • 不同文件的內容大小可以各不相同,但其屬性大小始終相同

目前大家可能還存在兩個疑問

  1. 我們已經知道硬盤是典型的"塊"設備,操作系統讀取硬盤數據的基本單位是"塊"。這些"塊"作為硬盤分區下的結構,它們是如何在分區上有序分布的?系統又是如何快速定位到這些"塊"的呢?

  2. 前面提到的存儲文件屬性的inode,它們又是如何被組織存放的?

文件系統正是為了解決這些問題而設計的!后面將會講解文件系統的相關知識!!!

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

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

相關文章

基于paddleDetect的半監督目標檢測實戰

基于paddleDetect的半監督目標檢測實戰前言相關介紹前提條件實驗環境安裝環境項目地址使用paddleDetect的半監督方法訓練自己的數據集準備數據分割數據集配置參數文件PaddleDetection-2.7.0/configs/semi_det/denseteacher/denseteacher_ppyoloe_plus_crn_l_coco_semi010.ymlPa…

計算機網絡:(十)虛擬專用網 VPN 和網絡地址轉換 NAT

計算機網絡:(十)虛擬專用網 VPN 和網絡地址轉換 NAT前言一、虛擬專用網 VPN1. 基礎概念與作用2. 工作原理3. 常見類型4. 協議對比二、NAT:網絡地址轉換1. 基礎概念與作用2. 工作原理與類型3. 優缺點與問題4. 進階類型三、VPN 與 N…

數位 dp

數位dp 特點 問題大多是指“在 [l,r][l,r][l,r] 的區間內,滿足……的數字的個數、種類,等等。” 但是顯然,出題人想要卡你,rrr 肯定是非常大的,暴力枚舉一定超時。 于是就有了數位 dp。 基本思路 數位 dp 說白了…

Selector的用法

Selector的用法 Selector是基于lxml構建的支持XPath選擇器、CSS選擇器&#xff0c;以及正則表達式&#xff0c;功能全面&#xff0c;解析速度和準確度非常高 from scrapy import Selectorbody <html><head><title>HelloWorld</title></head>&…

Netty封裝Websocket并實現動態路由

引言 關于Netty和Websocket的介紹我就不多講了,網上一搜一大片。現如今AI的趨勢發展很熱門,長連接對話也是會經常接觸到的,使用Websocket實現長連接,那么很多人為了快速開發快速集成就會使用spring-boot-starter-websocket依賴快速實現,但是注意該實現是基于tomcat的,有…

行為型設計模式:解釋器模式

解釋器模式 解釋器模式介紹 解釋器模式使用頻率不算高&#xff0c;通常用來描述如何構建一個簡單“語言”的語法解釋器。它只在一些非常特定的領域被用到&#xff0c;比如編譯器、規則引擎、正則表達式、SQL 解析等。不過&#xff0c;了解它的實現原理同樣很重要&#xff0c;能…

SaTokenException: 未能獲取對應StpLogic 問題解決

&#x1f4dd; Sa-Token 異常處&#xff1a;未能獲取對應StpLogic&#xff0c;typeuser&#x1f9e8; 異常信息 cn.dev33.satoken.exception.SaTokenException: 未能獲取對應StpLogic&#xff0c;typeuser拋出位置&#xff1a; throw new SaTokenException("未能獲取對應S…

Web前端性能優化原理與方法

一、概述 1.1 性能對業務的影響 大部分網站的作用是&#xff1a;產品信息載體、用戶交互工具或商品流通渠道。這就要求網站與更多用戶建立聯系&#xff0c;同時還要保持良好的用戶黏性&#xff0c;所以網站就不能只關注自我表達&#xff0c;而不顧及用戶是否喜歡。看看網站性…

第十八節:第六部分:java高級:注解、自定義注解、元注解

認識注解自定義注解注解的原理元注解常用的兩個元注解代碼&#xff1a; MyTest1&#xff08;注解類&#xff09; package com.itheima.day10_annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Retent…

北京科技企業在軟文推廣發稿平臺發布文章,如何精準觸達客戶?

大家好&#xff01;我是你們的老朋友&#xff0c;今天咱們聊聊北京科技企業如何通過軟文推廣發稿平臺精準觸達目標客戶這個話題。作為企業營銷的老司機&#xff0c;我深知在這個信息爆炸的時代&#xff0c;如何讓你的品牌聲音被目標客戶聽到是多么重要。下面就讓我來分享一些實…

UE蒙太奇和動畫序列有什么區別?

在 UE5 中&#xff0c;Animation Sequence&#xff08;動畫序列&#xff09;和 Animation Montage&#xff08;動畫蒙太奇&#xff09;雖然都能播放骨骼動畫&#xff0c;但它們的定位、功能和使用場景有較大區別&#xff1a;1. 概念定位Animation Sequence&#xff08;動畫序列…

Nordic打印RTT[屏蔽打印中的<info> app]

屏蔽打印中的 app Nordic原裝的程序答應是這樣的,這個有" app"打印,因為習慣問題,有時候也不想打印太多造成RTT VIEW顯示被沖點,所以要把" app"去掉:這里把prefix_process函數調用屏蔽到,主要涉及到nrf_log_hexdump_entry_process和nrf_log_std_entry_proc…

Python基礎和高級【抽取復習】

1.Python 的深拷貝和淺拷貝有什么區別&#xff1f; 淺拷貝【ls.copy()】&#xff1a; 將列表的不可變對象【值】復制一份&#xff0c;同時引用其中的可變對象【列表】&#xff0c;共用一個內存地址 深拷貝【lscopy.deepcopy(list)】&#xff1a; 完全的復制原可變對象&#xff…

TinyPiXOS組件開發(一):開發規范、組件開發方法介紹,快速上手組件開發,創造各種有趣的UI組件!

本文將通過實現一個點擊切換進度的電量指示燈組件和exampleGUI組件庫介紹如何基于TinyPiXOS開發新組件。主要內容包括組件開發規范、自定義組件開發和組件庫開發三部分。 組件開發規范 命名規范 采用tp開頭命名組件類&#xff0c;名稱具備易讀性。 目錄規范 頭文件放置 in…

主流熔斷方案選型指南

主流熔斷方案選型1. Netflix Hystrix (經典但已停止維護)適用場景&#xff1a;傳統Spring Cloud項目&#xff0c;需要快速集成熔斷功能優點&#xff1a;成熟穩定&#xff0c;社區資源豐富與Spring Cloud Netflix套件無縫集成提供熔斷、降級、隔離等完整功能缺點&#xff1a;已停…

Django中get()與filter()對比

在 Django 中&#xff0c;get() 和 filter() 是 QuerySet API 中用于檢索數據的兩個核心方法&#xff0c;它們的功能和使用場景有明顯區別。以下是詳細對比&#xff1a; 1. 核心區別特性get()filter()返回值單個對象&#xff08;模型實例&#xff09;查詢集&#xff08;QuerySe…

MySQL鎖(一) 概述與分類

1.1 MySQL鎖的由來 客戶端發往 MySQL 的一條條 SQL 語句&#xff0c;實際上都可以理解成一個個單獨的事務&#xff08;一條sql語句默認就是一個事務&#xff09;。而事務是基于數據庫連接的&#xff0c;每個數據庫連接在 MySQL 中&#xff0c;又會用一條工作線程來維護&#x…

PyTorch里的張量及張量的操作

張量的簡介 張量是多重線性映射在給定基下的坐標表示&#xff0c;可視為向量和矩陣的泛化。 0 維張量&#xff1a;標量&#xff08;如 5&#xff09;1 維張量&#xff1a;向量&#xff08;如 [1, 2, 3]&#xff09;2 維張量&#xff1a;矩陣&#xff08;如 [[1, 2], [3, 4]]&…

向量數據庫Faiss vs Qdrant全面對比

Faiss vs Qdrant 全面對比表 向量數據庫是一種相對較新的方式,用于與來自不透明機器學習模型(如深度學習架構)派生的抽象數據表示進行交互。這些表示通常被稱為向量或嵌入(embeddings),它們是用于訓練機器學習模型完成諸如情感分析、語音識別、目標檢測等任務的數據的壓…

2025年AIR SCI1區TOP,縮減因子分數階蜣螂優化算法FORDBO,深度解析+性能實測

目錄1.摘要2.蜣螂優化算法DBO原理3.改進策略4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流1.摘要 傳統DBO存在探索與開發能力失衡、求解精度低以及易陷入局部最優等問題。因此&#xff0c;本文提出了帶有縮減因子分數階蜣螂優化算法&#xff08;FORDBO&#xff0…