Linux中的文件系統和軟硬連接

磁盤的訪問方式

  1. CHS(柱面,磁頭,扇區) 法(磁盤硬件查找):

  1. 確定柱面(C)
    磁頭臂移動到對應的柱面位置。例如,柱面號為 5,則磁頭移動到第 5 個磁道組
  2. 選擇磁頭(H)
    激活對應的磁頭(即選擇具體的盤面)。例如,磁頭號為 0 表示第一個盤面
  3. 定位扇區(S)
    等待磁盤旋轉,直到目標扇區轉到磁頭下方。例如,扇區號為 3 表示讀取當前磁道的第 3 個扇區

操作系統拿到 CHS 地址之后,會將其轉換成 LBA 地址,一般而言,操作系統和硬盤交互時,基本單位為 4KB,也就是 8 個連續的扇區,作為一個塊,后續操作系統只需要提供塊號,然后磁盤自動向后數 8 個就可以訪問到一整個塊了,如:提供的塊號為 2,通過 2*8 得到第一個這個塊的第一個扇區為 16,然后自動向后數 8 個這個就是整個塊了

  1. LBA 法(操作系統抽象后):LBA=(C×Hmax+HSmax+(S?1)
  • Hmax:每個柱面的最大磁頭數
  • SmaxSmax:每個磁道的最大扇區數
  • 扇區號 S 需減 1(因 LBA 從 0 開始,而 CHS 扇區從 1 開始)

對磁盤的管理就變成了對 LBA 地址的管理,然后通過將硬盤整個硬盤分成很多個分區進行更好的管理

文件系統是系統底層對文件進行管理的

常見文件系統:ext4 exfat fat32

VFS 虛擬文件系統是文件系統的抽象層,隱藏了底層文件系統的實現,用于對外提供接口用于文件管理,在操作系統中通常以一個內核軟件層的形式存在,它位于操作系統內核和底層文件系統之間

磁盤文件系統

在硬盤中會存在多個分區,這些分區內部又被分成了多個組,每個分組內部都會有超級塊、分區描述符、塊位圖、inode 表、inode 位圖、數據塊

在每個分區的內部分組,然后寫入文件系統的管理數據的過程叫做格式化

bootblock

磁盤中用于引導操作系統加載和啟動最小指令集或代碼,同時也可能包含了磁盤分區表和磁盤狀態信息

MBR 中通常只有一個 Boot Block 位于整個磁盤的開始部分,而不是每個分區都有,而在 GPT 中每個分區都有類似于 boot block 這樣用于引導分區內容的分區引導記錄(PBR),但 PBR 和傳統的 boot block 有一定區別

超級塊

超級塊是存儲對應整個分區的文件系統相關情況,它包含了文件系統的全局信息,記錄的信息主要有:block 和 inode 的總量,未使用的 block 和 inode 的數量,一個 block 和 inode 的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。并不是所有塊組都有超級塊,由于超級塊是全局性的,因此可以不用每個分區都設置超級塊,通常為了確保數據的可靠性,會在文件系統的多個位置進行備份。Super Block的信息被破壞,可以說整個文件系統結構就被破壞了,整個分區就掛掉了

數據塊

用于存放文件數據,文件的數據被打散分布在磁盤上,類似一個數組,數組里面可以直接存放數據,也可以存放指向下一個數組的指針,用來間接存儲文件

GDT 塊組描述符

描述的是一整個塊組的具體屬性,如塊組起始位置、大小、包含的塊數等,塊組描述符還描述了塊組內部的布局,包括inode表、數據塊和空閑塊的分布

塊位圖

用于記錄數據塊中哪些被占用,哪些沒有

在申請空間時,文件系統先對位圖進行檢查,若有剩余空間,則將這些空間標記為已分配,一旦位圖更新,文件系統將會實際將這些空間分配,最后文件系統把這些文件的頭指針返回給請求者

inode 位圖

記錄 inode 中哪些被占用,哪些沒有

分配 inode 位圖的過程:

  • 掃描inode位圖,查找一個空閑的位(即值為0的位)
  • 將找到的空閑位標記為已使用(即將該位設置為1)
  • 將新文件的元數據信息寫入對應的inode中
  • 文件刪除時先將元數據和 inode 位圖的關聯斷開,然后將 inode 的相應位置標記為空閑

inode 表

用于存放文件的屬性,如所有者,文件大小,修改時間等,inode 中不僅保存著文件的屬性,還有一個 datablock 數組,數組中保存著文件占據了哪些塊,數據塊中也不僅僅只是數據,還有可能是指向實際數據位置的指針,或者指針的指針等,通過建立多級指針來間接映射來管理更大的空間,從而可以建立更大的文件。但是這種方式降低了磁盤的尋址效率

inode 內部并沒有文件名,在內核層面,每個文件都有一個 inode number,通過這個來標識文件,可以通過 ls -i 命令來查看文件的 inode 號

inode 編號是以分區為單位的,而不是以分組為單位的,因為 inode 在分區內部不能重復,但是在另一個分區內可能會有與該分區重復的 inode,因此inode 不能跨分區訪問

有多少文件就有多少個 inode,通常在 Linux 中 inode 大小為 128 字節或 256 字節

inode 表中有許多 inode 塊,一個塊大小通常為 4kb,一個塊中有 4*1024/128=32 個 inode

查找文件 inode 的過程

當用戶或程序請求訪問一個文件時,文件系統會首先查找該文件所在的目錄

目錄本身也是一個文件,它包含了文件名和對應inode編號的映射關系(稱為目錄項)

文件系統會讀取包含目標文件名的目錄項,一旦找到與文件名匹配的目錄項,文件系統就可以從中提取出inode編號

有了inode編號后,文件系統會使用這個編號和inode表的大小來計算inode在inode表中的位置

因此,當目錄的 R 權限被取消后,由于無法讀取到目錄的文件屬性和內容,也就無法獲得對應的 inode,因此也就無法進行訪問,當目錄的 W 權限被取消后,由于無法向目錄寫入文件名和 inode 的映射關系,也就無法創建文件了

通過 inode 查找文件的過程

每一個分組都會有對應的 inode 范圍,查找文件時,首先確定在哪個分區,然后通過 inode 的編號來確定文件是在哪個分組中的,再通過分組內的 inode 表找到具體的 inode,這樣就找到了文件

目錄

目錄也是一個文件,也有自己的文件屬性和文件內容,因此也會有 inode,目錄的文件內容為文件名和 inode 編號的映射關系,目錄本質上是一個存儲文件名與文件元數據(如存儲位置、大小、權限等)映射關系的數據庫,inode 和文件名互為鍵值,彼此間能夠找到對方,如果出現同名文件,就會導致兩條相同的鍵(文件名)對應不同的值(inode 號)

可以通過目錄來知道在哪個分區下的原因

當完成分區并且創建好文件系統后,此時由于并沒有將其掛載到任何目錄,因此操作系統無法訪問,所以需要將其掛載到某一個目錄中,此時訪問該目錄也就是在訪問該分區了

進程的獲得完整的文件路徑是通過 CWD 獲取的,CWD 存放在 task_struct 中

創建一個新文件的過程

  1. 存儲屬性
    內核先找到一個空閑的i節點(這里是263466)。內核把文件信息記錄到其中
  2. 存儲數據
    該文件需要存儲在三個磁盤塊,內核找到了三個空閑塊:300,500,800。將內核緩沖區的第一塊數據
    復制到300,下一塊復制到500,以此類推
  3. 記錄分配情況
    文件內容按順序300,500,800存放。內核在inode上的磁盤分布區記錄了上述塊列表
  4. 添加文件名到目錄

當通過文件名訪問文件時,系統先通過目錄找到對應的 inode 號,再通過 inode 讀取文件數據,如果存在同名文件,就會出現不確定到達訪問哪個文件的 inode 的情況

刪除文件的過程

通過文件名找到對應的 inode,然后找到 inode 在 inode bitmap 中的位置,將這個位置標記為空,然后遍歷 inode table 中的映射關系,在 塊位圖中依次標記為空,這樣就將一個文件刪除了

軟、硬鏈接

軟鏈接

相當于生成一個快捷方式,是一個獨立的文件,因為有自己獨立的 inode,文件里面包含著目標文件所對應的路徑字符串,軟鏈接被刪除后不會影響目標文件,但是刪除目標文件后軟鏈接就會失效

硬鏈接

就是一個文件名和 inode 的映射關系,建立硬鏈接,就是在指定目錄下,添加一個新的文件名和 inode number 的映射關系

硬鏈接沒有自己獨立的 inode,用的 inode 是目標文件的

硬鏈接就是兩個文件共享同一個數據塊,可以認為是同一個文件的不同副本,但這些副本共享同一個空間,只要還存在一個硬鏈接的文件,文件內容就不會丟失

由于硬鏈接的兩個文件共享一個 inode,因此當修改任意一個文件的權限時,其他文件也會跟著被修改

硬連接數:

有多少文件名字符通過 inode 指向目標文件,硬連接數就是多少

硬鏈接的作用:
  • 硬鏈接可以構建 Linux 的相對文件結構,從而能夠使用...來進行路徑定位
  • 通過硬鏈接來備份文件

當前目錄中即使沒有文件,但也會有一個 ... ,其中 . 代表當前目錄,使用的 inode 和當前目錄相同,因此目錄會有兩個硬鏈接數,當在該目錄中創建一個新的目錄時,新創建的目錄中 .. 會指向上一個目錄的 inode,因此上一個目錄的 inode 還會增加 1,變為 3

任何目錄剛新建的時候引用計數一定是 2,因此一個目錄內的目錄數量引用計數-2

Linux 中不允許給目錄建立硬鏈接,防止形成路徑環繞

一般用硬鏈接來進行文件備份,節省空間

打開的文件和內核、內存有關,沒有被打開的文件和硬盤、文件系統有關,當要修改文件時,首先會找到 inode,然后將 inode 和 task_struct 關聯起來,然后獲取文件的塊號,從指定的分區分組中拿到數據塊,將其加載到文件的內核緩沖區中,這樣通過內核的方式將文件拷貝到用戶緩沖區要修改文件時,將寫入的數據寫入語言的緩沖區,然后通過文件描述符將內容寫入文件的內核緩沖區,最終將修改的內容寫回 inode,如果內容少了,則釋放空間,否則申請空間

文本寫入和二進制寫入:

  • 文本寫入:會把數據轉換為文本字符串,并且按照特定的字符編碼(像 UTF8、ASCII)來存儲,語言通過將輸入的數據轉換成字符,存放在語言的緩沖區中,最后打印出來
  • 二進制寫入:直接存儲數據的原始字節,不會進行編碼轉換

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

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

相關文章

whisper相關的開源項目 (asr)

基于 Whisper(OpenAI 的開源語音識別模型)的開源項目有很多,涵蓋了不同應用場景和優化方向。以下是一些值得關注的項目: 1. 核心工具 & 增強版 Whisper OpenAI Whisper 由 OpenAI 開源的通用語音識別模型,支持多語…

深入解析Spring Boot與JUnit 5集成測試的最佳實踐

深入解析Spring Boot與JUnit 5集成測試的最佳實踐 引言 在現代軟件開發中,單元測試和集成測試是確保代碼質量的重要手段。Spring Boot作為當前最流行的Java Web框架之一,提供了豐富的測試支持。而JUnit 5作為最新的JUnit版本,引入了許多新特…

gitlab占用內存 優化

優化 GitLab 配置 GitLab 的配置文件可以對內存使用進行優化。 以下是一些優化配置的方法: 1.1 調整 Unicorn(或 Puma)配置 GitLab 使用 Unicorn(舊版)或 Puma(新版本)作為其 Web 服務器。可以…

視覺語言模型(Vision-Language Model, VLM)的簡單介紹

目錄 1. 起源與歷史 2. 核心技術與原理 3. 優勢 4. 應用領域 5. 技術難點與挑戰 6. 學習方法與路徑 7. 未來發展方向 8. 總結 1. 起源與歷史 起源: 視覺語言模型(VLM)的起源可以追溯到多模態機器學習的研究。早期的計算機視覺&#…

關于PHP的詳細介紹,結合其核心特點、應用場景及2025年的技術發展趨勢,以清晰的結構呈現:

一、PHP的核心特點 動態腳本語言 語法靈活:支持過程式與面向對象編程,類似C/Java的語法結構,但動態類型特性更接近Python。即時編譯:PHP 8.x的JIT(Just-In-Time)編譯器顯著提升性能,尤其在數學…

MCP、MCPHub、A2A、AG-UI概述

MCP Model Context Protocol,模型上下文協議,Anthropic于2024年開源的標準協議,旨在統一AI模型與數據源的交互方式,提升數據訪問的便捷性和可靠性,提供標準化的工具調用、資源管理和提示詞功能。 MCP的基本定義&…

[學習]淺談C++異常處理(代碼示例)

淺談C異常處理 文章目錄 淺談C異常處理一、異常處理基礎1.異常的概念與作用2.C異常處理機制(try、catch、throw)3.基本語法示例 二、標準異常類1.常見標準異常類:2.自定義異常類的實現 三、異常安全與最佳實踐1. RAII(資源獲取即初…

PHP學習筆記(十)

extends 一個類可以在聲明中用extends關鍵字繼承另一個類的方法和屬性。PHP不支持多重繼承,一個類只能繼承一個基類。 被繼承的方法和屬性可以通過同樣的名字重新聲明被覆蓋,但是如果父類定義或者常量時是使用類final,則不可被覆蓋&#xff…

rt-linux里的泛rtmutex鎖的調用鏈整體分析

一、背景 linux系統里有非常多的鎖種類,除了spinlock,mutex,rwlock,rwsem,還有rcu及順序鎖,這里面還有不少鎖變種,比如spinlock的帶bh或者irq字樣的lock/unlock,還有nmi里可以用的順…

LLM多平臺統一調用系統-LiteLLM概述

概述 在當今快速發展的AI領域,大語言模型(LLM)已成為技術創新的核心驅動力。然而,隨著市場上涌現出越來越多的LLM提供商(如OpenAI、Anthropic、Google Gemini、AWS Bedrock等),開發者面臨著一個日益復雜的問題&#x…

C#實現MCP Client 與 LLM 連接,抓取網頁內容功能!

該專欄優先在飛書發布,歡迎收藏關注! https://www.feishu.cn/community/article?id7507084665509904403 前面的課程,我們已經用C#實現了,自己的MCP Client。 下面我們一起來實現,MCP Client與LLM 對接。 一、添加依…

并發編程(6)

指令重排序 指令重排序是指在程序執行過程中,為了提高性能,編譯器或處理器會對指令的執行順序進行重新排列。 指令重排序導致可見性消失 在多線程環境下,每個線程都有自己的工作內存,線程對變量的操作是在工作內存中進行的&…

鴻蒙倉頡開發語言實戰教程:頁面跳轉和傳參

前兩天分別實現了商城應用的首頁和商品詳情頁面,今天要分享新的內容,就是這兩個頁面之間的相互跳轉和傳遞參數。 首先我們需要兩個頁面。如果你的項目中還沒有第二個頁面,可以右鍵cangjie文件夾新建倉頡文件: 新建的文件里面沒什…

Java 學習筆記:注解、泛型與 IO 流

目錄 課程目標 Java 注解(Annotation) 1. 概念與作用 2. 自定義注解示例 3. JDK 內置注解 4.注釋 Java 泛型(Generics) 1. 基本語法 2. 通配符與上下限 3. 常見應用場景 Java IO 流 1. 流的分類1.File文件類 2. 字節流與字符流 3. 經典示例:文件拷貝 總結與…

git倉庫代碼操作

1、從gitee下載代碼提交到本地github倉庫,保留提交記錄 # 查看當前分支 git branch# 查看當前遠程倉庫 git remote -v# 確保所有更改已提交 git add . git commit -m "準備提交到GitLab"# 添加GitLab遠程倉庫 git remote add gitlab https://gitlab.com/…

Thinkphp6使用token+Validate驗證防止表單重復提交

htm頁面加 <input type"hidden" name"__token__" value"{:token()}" /> Validate 官方文檔 ThinkPHP官方手冊

Mcu_Bsdiff_Upgrade

系統架構 概述 MCU BSDiff 升級系統通過使用二進制差分技術&#xff0c;提供了一種在資源受限的微控制器上進行高效固件更新的機制。系統不傳輸和存儲完整的固件映像&#xff0c;而是只處理固件版本之間的差異&#xff0c;從而顯著縮小更新包并降低帶寬要求。 該架構遵循一個…

Spring Boot微服務架構(四):微服務的劃分原則

微服務劃分原則&#xff08;CRM系統案例說明&#xff09; 一、微服務劃分的核心原則 單一職責原則&#xff08;SRP&#xff09; 每個微服務只負責一個明確的業務功能服務邊界清晰&#xff0c;避免功能混雜便于獨立開發、測試和部署 業務領域驅動設計&#xff08;DDD&#xff0…

基于CNN卷積神經網絡的帶頻偏QPSK調制信號檢測識別算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 matlab2024b 3.部分核心程序 &#xff08;完整版代碼包含詳細中文注釋和操作步驟視頻&#xff09…

從機械應答到深度交互,移遠通信如何讓機器人“靈魂覺醒”?

你是否還在因機器人的“答非所問”而無奈&#xff0c;為它們的“反應慢半拍”而抓狂&#xff1f;別慌&#xff01;一場引領機器人實現“靈魂覺醒”的技術革命&#xff0c;正如同暗夜中悄然綻放的繁星&#xff0c;徹底顛覆人們對機器人的傳統認知。 5月20日&#xff0c;移遠通信…