初識Linux · 文件系統

目錄

前言:

簡單理解文件系統

細節理解


前言:

前文我們介紹了磁盤,介紹磁盤的原因是因為我們需要在理解文件系統之前,通過磁盤的了解,介紹一些文件相關的內容,比如文件是如何在磁盤里面存儲的,什么是CHS定址法,為什么OS不使用CHS定址法,什么是LBA塊等。

我們今天的介紹順序是,先簡單搭建起來對文件系統的理解,再深挖細節問題。

那么,進入今日的話題吧!


簡單理解文件系統

對于文件系統框架的搭建,我們可以先從這個指令進入:

即stat指令,查看文件的信息,這個信息,是文件的屬性?還是文件的內容呢?

我們知道文件 = 屬性 + 內容,但是我們常常關注的都是文件的內容,對于文件的屬性我們關注的并沒有那么常見。所以要理解文件系統的框架,我們要從文件的屬性進入。

由stat提供的信息來看,我們看到了File:main.c,這個代表的是文件名,Size代表的是文件的大小,Blocks?IO Block? Inode?這些都是什么?

不急,我們再次引入上文的話題:

對于上文,將磁盤從非線性的轉換為了線性的,然后線性的空間我們看成了數組,那么數組,我們可以通過位圖的類似做法,找到數據的存儲地址。但是因為磁盤取數據的特殊點,取數據都是一次性的取4kb數據,所以OS為了方便將數據分為了多個塊,也就是LBA塊,分好之后,找到一整塊空間就十分容易了。

所以我們對于文件的管理從磁盤,到了CHS,到了數組,到了LBA,最后無非就是搞清楚LBA里面究竟有什么就可以了:

形象的圖片就是這樣,那么塊組里面,我們分清楚了有Super Block, Group Deseciptor Table, Block Bitmap, Inode Table, Data Blocks。

那么我們從哪里開始討論呢?

從Data Blocks開始討論:Data Blocks是數據塊的翻譯,也就是文件的內容都是放在這里的,但是因為方便介紹,我們將Data Blocks的大小縮小成了和其他差不多的大小。對于該塊,占據的空間大小應該是整個塊組的95%以上。

那么對于Data Blocks里面都有什么呢?

看起來是非常抽象的,因為Data Blocks里面存儲的都是一個一個的數據塊,大小都是為4kb的,取的時候就直接將該數據塊丟出去就行了。

對于這么多的數據塊,都是只存儲文件的內容的。?

并且,我們知道,文件 = 內容 + 屬性,對于文件內容屬性而言,Linux特定的文件系統是將文件的屬性和內容分開存儲的,這點我們先記住。對于Data Blocks我們就探討到這里。

那么下一個,就是Block?Bitmap,相信在C++學習的時候,同學們都是知道位圖這個概念的。

最開始介紹位圖的時候,都是通過的判斷數據是否在一堆數據的集合里面,這里同理,引入block Bitmap就是為了判斷是否某個數據塊是否存在數據,這里位圖就不多介紹了,但是引入了位圖,確實能在遍歷數據塊上節省極大部分的時間。


下一個就是非常重要的inode Table,inode Table成為i節點表,存放的是文件的屬性,文件的大小,所有者,最近的修改時間等。這是inode Table。

那么文件的屬性一般都有什么呢?

struct inode
{int size;mode_t mode;int creater;int time;...int inode_number;int datablocks[N];
};

我們拿幾個非常常見的出來舉例,文件大小,文件的權限,創建時間等,但是最重要的,我們應該關心inode_number和datablocks[N]。而這個塊的名字是inode_table,所以它所處的空間自然是這么多個結構體所處的集合。

所以!!文件的屬性不過是一個一個完全相同的結構體!!

而在里面,inode的結構體如何分區的呢,都是通過inode_number進行分區的,那么datablocks的作用是什么呢?我們使用文件的時候,通過了inode_number找到了對應的文件屬性結構體,我們需要找到內容,就需要datablocks,這個數據指向的內容就是block Data的空間:

像這樣,比如N等于12的時候,前11個直接指向的數據塊,但是我們沒有辦法找到對應的大文件,所以第12個,指向的Data Blocks里面也存放的指針,指向了其他的數據塊,就有一種指數的感覺。

那么數據還不夠,13 14后面都可以指向,并且就不是一層關系這么簡單了,是一層指向一層,一層又指向一層,套好幾層最后才指向數據,這樣就能找到大文件的數據了。

這種查找數據的方法叫做ext2文件系統,我們目前大多數使用的都是ext2,還有ext3 ext4等。

所以對于inode結構體我們就知道了個所以然,那么inode bitmap?那不就是同理了嗎!!

通過inode bitmap找到表里面的某個位置是否存在文件的屬性,然后進行后續的操作。


那么現在,我們就清楚了inode table, inode bitmap, data blocks, data bitmap。對于剩下的兩個,比如GDT,也就是Group Descriptor table,翻譯過來叫做塊組描述符,描述的是塊組的屬性信息,其實就是這個塊的信息了,這更加體現了一種分治的思想。

對于Super blocks,它的名字可就厲害了,叫做超級塊,存放的是文件系統本身的結構信息,而且不是每個組都有的,可能幾個組才回有一個。比如存放的有inode使用的個數,未使用的個數,datablocks的使用個數,datablocks未使用的個數。這些都是超級塊所要記錄的內容。

那么提問,既然是記錄所有的結構信息,為什么要整這么多個呢?

因為磁盤是可能損壞的,如果損壞的時候,剛好磁頭給一個超級塊的內容消除了,那么這不就完蛋了嗎??所有多存儲幾個,增加了容錯率!!

說了那么多,inode是十分重要的,查看inode是-i:


細節理解

對于上文來說,我們已經理解了塊里面的6個成員,現在我們來談論具體細節問題:

第一個細節:

如何通過inode找到對應的data blocks??

因為inode和data都是以分區為單位的,所以inode可以通過數組datablocks找到的!

第二個細節:

我們使用的不是一直都是文件名嗎?好像并沒有使用inode,可是我們改變文件內容的時候,一直使用的都是文件名啊?

這個時候,我們就要談談目錄了,目錄 = 文件屬性 + 文件內容,這里可不要認為目錄就不是文件了,提問,目錄的文件內容是什么呢?

目錄的文件內容 = 文件名和inode的編號關系,當我們創建好了一個文件,文件所在的目錄就會記錄該文件和inode的關系,方便找到并進行修改。

所以目錄里面的文件名就是和inode映射關系!!

到了這里,相信同學們能理解為什么一個目錄下不能創建多個同名文件了吧?因為如果創建了同名文件,映射關系一亂,整個文件系統就癱瘓了。

可是!!當我們修改目錄的時候,用的還是目錄名啊!!又是什么存儲的目錄和inode的關系呢?

看這個:

pwd打印出來了路徑,是因為環境變量PATH,而我們在該目錄下修改文件,需要找到對應的inode,找到inode之前,我們需要找到該文件所在的目錄,找到該文件所在的目錄,我們就應該要找到目錄的目錄,最后直接到了根目錄!!

而在根目錄這里,就是OS已經提前加載好了有關路徑緩存的信息了,這里涉及到了知識點有結構體dentry,格式化,掛載等。我們先不管,我們只需要知道,Linux會緩存路徑信息,從而我們可以通過文件 目錄來修改對應內容。

現在,我們順便回顧一下目錄的r w,當我們將r去掉之后,也就是沒有可讀權限:

此時目錄就不允許我們讀取文件內容,本質就是不讓我們知道文件名和inode的映射關系。

這里就不演示了,當我們沒有了w權限之后,我們無法創建文件,本質就是因為不要我們創建文件名和Inode的映射關系!!

所以,對于細節2,我們可以得出結論:

1 目錄下不能創建同名文件,因為會打亂映射關系

2 查找的文件順序是通過文件名查找對應的inode編號

3 r是讓我們找到對應的映射關系,w是不讓我們寫入對應的映射關系

第三個細節:

我們如何理解文件的增刪查改呢?

文件增,就是找到對應的映射關系,在datablock里面增加數據,查就是找對應的映射關系,改也是通過inode,修改datablocks里面的數據關系。

那么刪除呢?

其實這里的刪除是一種偽刪除。

即將Inode bitmap , datablock bitmap都置為0即可。這是一種刪除。

我們對于文件系統的框架有了簡單的理解,那么理解接下來的軟硬連接動態庫就會輕松很多了。


感謝閱讀!

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

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

相關文章

前端數據庫 IndexedDB

前端數據庫 IndexedDB IndexedDB核心概念解析1. 數據庫(Database)2. 對象存儲(Object Store)3. 索引(Index)4. 事務(Transaction)5. 游標(Cursor) IndexDB的使…

Cesium入門教程(二)環境搭建(HTML版)

一、快速開始&#xff08;無需安裝依賴&#xff09; 1. 創建HTML文件 新建一個 .html 文件&#xff08;如 cesium-demo.html&#xff09;&#xff0c;粘貼以下代碼&#xff1a; <!DOCTYPE html> <html> <head><title>Cesium Quick Start</title&g…

數據分析學習筆記4:加州房價預測

一、實驗概述本實驗旨在利用機器學習技術&#xff0c;基于加州房價數據集&#xff08;California Housing Dataset&#xff09;構建一個房價預測模型。實驗涵蓋了從數據加載、探索性數據分析&#xff08;EDA&#xff09;、數據預處理到模型構建與評估的完整流程。核心任務是利用…

openEuler Embedded 的 Yocto入門 : 2. 構建一個Hello,world!

獲取BitBake 官方下載 git clone https://git.yoctoproject.org/poky cd poky/bitbake國內鏡像下載&#xff08;推薦&#xff09; git clone https://gitee.com/openeuler/yocto-poky.git -b v3.3.6 cd yocto-poky/bitbake配置BitBake環境 export PATH/path/to/bitbake/bin:$PA…

人工智能物聯網(AIoT)的技術邏輯、核心價值與典型應用場景解析

一、AIoT 技術&#xff1a;從 “連接” 到 “智能” 的底層邏輯 在企業數字化轉型過程中&#xff0c;“數據” 常被視為核心資產&#xff0c;但如何讓海量數據產生實際價值&#xff0c;卻成為多數組織的難題。根據 Gartner 2024 年發布的調查數據&#xff0c;87% 的組織商業智…

SpringBoot系列之實現高效批量寫入數據

Spring Boot 實現高效批量插入數據的實踐指南 在實際開發中&#xff0c;我們經常會遇到需要批量插入大量數據到數據庫的場景。如果使用傳統的單條插入方式&#xff0c;不僅效率低下&#xff0c;還會給數據庫帶來巨大壓力。本文將介紹如何使用 Spring Boot 實現高效 批量數據插入…

SQL語言基礎知識(2)

在學會創建數據庫之后&#xff0c;在數據庫中需要創建表&#xff08;實體以表的形式存在&#xff09;&#xff0c;以及對表中存儲的數據記錄進行定義&#xff0c;相當于 Java 語言中對類編寫其屬性。在定義前我們需要了解 SQL 語言有哪些數據類型。一、數據類型1.1 數據值類型1…

響應式編程框架Reactor【1】

文章目錄一、Reactor 框架概述與理論基礎1.1 響應式編程&#xff08;Reactive Programming&#xff09;是什么&#xff1f;1.2 Reactive Streams 規范1.3 響應式編程與 Reactor 的誕生1.4 Reactor核心特性1.5 Reactor與其它響應式框架比較二、Reactor核心類型2.1 Reactor 核心概…

【LeetCode】29. 兩數相除(Divide Two Integers)

文章目錄29. 兩數相除&#xff08;Divide Two Integers&#xff09;1. 題目重述與約束解析2. 算法選擇與總體設計3. 核心難點與關鍵技巧4. 解法一&#xff1a;快倍增&#xff08;重復加倍減法&#xff09;4.1 思路4.2 流程圖4.3 正確性要點5. 解法二&#xff1a;位移長除法&…

智能物聯網(AIoT)核心技術落地路徑與企業數字化轉型適配方案

一、行業現狀&#xff1a;AIoT 落地潛力與企業轉型痛點并存根據中國信通院《2023 年中國物聯網發展白皮書》數據&#xff0c;截至 2023 年&#xff0c;我國物聯網設備連接數已突破 300 億&#xff0c;龐大的設備基數為企業數字化轉型奠定了技術基礎。但與之形成鮮明對比的是&am…

前端文件下載的三種方式:URL、二進制與 Base64 的深度解析

前言在 Web 應用開發中&#xff0c;文件下載是一個常見的功能需求。從簡單的圖片保存到復雜的報表導出&#xff0c;前端開發者需要根據后端返回的數據格式選擇合適的處理方式。本文探討三種主流的文件下載方式 —— 基于 URL、二進制數據和 Base64 編碼的實現原理、區別對比及通…

B站 XMCVE Pwn入門課程學習筆記(8)

這個視頻講的比較難&#xff0c;我花了比較長時間來分析&#xff0c;甚至一個點反復很多次&#xff0c;這也是在學PWN的過程中不可避免的&#xff0c;需要堅持和毅力pwn3:沒有system&#xff0c;通過ROP調用write的plt入口&#xff0c;執行write函數&#xff0c;并且將gots里的…

AMGCL介紹和使用

文章目錄一、AMGCL 簡介1.1 什么是 AMG&#xff1f;1.2 AMGCL 特點二、安裝與配置2.1 獲取源碼2.2 編譯依賴&#xff08;可選&#xff09;三、基本使用示例3.1 構造稀疏矩陣&#xff08;以 1D Poisson 為例&#xff09;四、核心組件介紹4.1 后端&#xff08;Backend&#xff09…

AI解決生活小事系列——用AI給我的電腦做一次“深度體檢”

哈嘍&#xff0c;大家好&#xff0c;這里是Ai極客團長&#xff0c;我打算做一個用AI解決生活實際問題的系列專欄。 決定做這個系列的初衷很簡單&#xff1a;現在打開手機、電腦&#xff0c;到處都是 "AI 改變世界" 的宏大敘事&#xff0c;但對普通人來說&#xff0c…

JavaWeb 30 天入門:第二十一天 ——AJAX 異步交互技術

在前二十天的學習中&#xff0c;我們掌握了 JavaWeb 開發的核心技術&#xff0c;包括 Servlet、JSP、會話管理、過濾器、監聽器、文件操作、數據庫交互、連接池、分頁與排序等。今天我們將學習一項徹底改變 Web 應用交互方式的技術 ——AJAX&#xff08;Asynchronous JavaScrip…

從枯燥C++到趣味音樂:我的Windows系統底層探索之旅

一段穿越計算機抽象層次的旅程&#xff0c;從高級語言到底層硬件&#xff0c;探索代碼如何創造美妙旋律第一章&#xff1a;初學C的枯燥與靈感閃現 當我第一次打開《C Primer Plus》這本厚重的教程時&#xff0c;面對那些晦澀的語法規則和抽象概念&#xff0c;確實感到有些枯燥乏…

taro+vue3+vite項目 tailwind 踩坑記,附修復后的模板源碼地址

tailwind 踩坑記 這&#xff0c;是taro官網地址&#xff1a;taro引入tailwind的教程 我完全按照上面的步驟來&#xff0c;結果根本無效&#xff08;文檔太過時了&#xff09; 我后來又按照 weapp-tailwindcss 的官方文檔做了一番修正&#xff1a; weapp-tailwindcss Taro (所…

LCEDA電氣規則

MARK點普通問題 鋪銅太靠近MARK點放置一個禁止區域&#xff0c;圓形編輯封裝

無人機Remote ID:天空中的數字車牌與未來空域管理

一架沒有牌照的汽車上路會被交管部門處罰,那么一架沒有“數字車牌”的無人機升空呢?隨著無人機Remote ID技術的推廣,未來天空中的每架無人機都將擁有自己的身份標識。 近年來,無人機呈爆炸式增長,從航拍攝影到物流配送,從農業植保到應急救援,應用場景不斷拓展。但隨著無…

自下而上的樹形dp

最大獨立集 1.藍橋舞會 link:1.藍橋舞會 - 藍橋云課 分析&#xff1a; code #include <bits/stdc.h> using namespace std; using ll long long; const ll MAXN 1e5 7; ll hpy[MAXN], fa[MAXN], dp[MAXN][2]; vector<ll> sons[MAXN];void dfs(ll u, ll fa) {…