Linux操作系統之文件(四):文件系統(上)

前言:

我們前幾篇文章講了緩沖區與重定向的有關概念,這些設計是linux系統的核心機制,對系統性能、資源管理和用戶操作靈活性有重要意義。

不涉及一些硬件就不可能讓大家清楚地去理解文件系統,所以這篇文章,我將會從計算機組成原理的角度,為大家講解一下文件系統的構成。

文件被打開了,是存儲到內存里的。那么文件沒有被打開呢?存儲到哪里?

自然是磁盤里。

我們訪問一個文件的前提是不是要打開它?那我們訪問文件的前提是要找到它,也就是說我們要有對應的路徑。

但那么多文件,不只是你一個文件有路徑,所有文件都要有路徑。眾多路徑需要被管理起來,所以就出現了文件系統的概念:

磁盤級文件系統與內存級文件系統。

如同我們去取快遞一樣,快遞就好比一個一個的文件,放在菜鳥驛站的快遞柜上,我們需要根據快遞的編號,找到對應的存放位置,最后取回到我們的宿舍(內存中)。

文件系統又是如何把未打開的文件,在磁盤上管理起來的呢?

我們又如何去理解路徑呢?

別著急,我將為大家一一解答。

一、磁盤

像這些機械磁盤,是計算機中唯一一個機械設備。圖左是一個機械硬盤,圖右是機械硬盤拆開后的樣子。

圖示為一個服務器,里面嵌入了許多個磁盤,而服務器是計算資源的載體,安裝在機柜內 :

圖為一個一個的機柜,機房就是存儲這些機柜的地方。

不同于我們的其他存儲設備,機械磁盤的好處就是容量大,便宜。但它的讀取速度就比較慢。

公司里有大量平時用不到的數據,你不可能用其他昂貴的設備來進行存儲,自然需要用到機房。


而磁盤是怎么進行存儲數據的呢?

我們知道,磁鐵是有著南極與北極的,同樣的,二進制劃分為0,1.

所以,我們就規定南極與北極各自代表0或1。這樣,就方便了我們進行二進制數據的存儲。

所以我們如何銷毀一個磁盤呢?

自然就是對該磁盤進行消磁處理。

一個磁盤的結構如下圖所示:

?

?

?我們的機械臂桿上有著多個讀寫磁頭,分別近距離挨著每個盤片的上下兩個面。比如上圖我們就有著6個讀寫磁頭,以及6個面,二者的數量是相同的。如果我們在讀寫一個磁頭,實際上就是在讀寫一個磁面。注意,磁頭與磁盤之間并沒有實際接觸,就像是一架飛機貼地1m處飛行一樣。

每個面上,存在著包圍著中心的,不同大小的環道,我們稱之為磁道,而每個磁道上,我們劃分了一定區域,每個區域叫做扇區。

有個疑問,我們這上面有不同的扇區,他們的長短是不一樣,那么存儲大小呢?

在早期的磁盤中,是一樣的,但現在的技術已經能做到同質度的存儲數據了,也就是說扇區越大,存儲的數據越多。

?扇區,是磁盤存儲數據的基本單位,通常,一個扇區的大小為512字節。

如果我想修改一個扇區的一個比特位,也要把512字節全部讀取到內存才行,所以我們稱磁盤為快設備。

磁盤容量=磁頭數 × 磁道(柱?)數 × 每道扇區數 × 每扇區字節數
這里有個細節:傳動臂上的磁頭是共進退的(這點?較重要,后?會說明)

那我們如何定位一個扇區呢?

1、可以先定位磁頭(header)
2、確定磁頭要訪問哪?個柱?(磁道)(cylinder)
3、定位?個扇區(sector)

?

以上3步,被我們稱為CHS地址定位法。(但現在大部分已經淘汰了,我們講這個只是為了幫助大家理解)

?件 = 內容+屬性 都是數據,??就是占據那?個扇區的問題!能定位?個扇區了,能不能定位多個扇區呢?

?我們可以通過以上的命令查看我們云服務器的磁盤分區

這是一個?50GB的虛擬磁盤(GPT分區表),包含:

  1. 1MB的BIOS引導分區(兼容傳統啟動)。

  2. 50GB的Linux主分區(實際可用空間)。

?


二、磁帶

我們以前也有磁帶這種存儲設備。

?磁帶上?可以存儲數據,我們可以把磁帶“拉直”,形成線性的結構:

那么磁盤本質上雖然是硬質的,但是邏輯上我們可以把磁盤想象成為卷在?起的磁帶,那么磁盤的邏輯存儲結構,我們也可以類似于:

?

這樣每?個扇區,就有了?個線性地址(其實就是數組下標),這種地址叫做LBA地址定位法。?

?

由于我們前面說到,傳動臂上的磁頭是共進退的。

所以,我們可以把每個盤面上,相同半徑大小的磁道,組成一個柱面?

所以,磁盤物理上分了很多?,但是在我們看來,邏輯上,磁盤整體是由“柱?”卷起來的。?

因此,把一個磁道展開,我們可以看做是一個一維數組,隨后一個柱面上有多個磁道,我們可以看做柱面為二維的扇區數組。多個柱面盤旋起來形成磁盤,所以磁盤可以看作是扇區的三維數組?

所有,尋址?個扇區:先找到哪?個柱?(Cylinder) ,在確定柱?內哪?個磁道(其實就是磁頭位置,Head),在確定扇區(Sector),所以就有了CHS。
如果我們只給你一個LBA地址1000,那你還需要CHS地址嗎?
答案是不必需要了,因為LBA與CHS地址可以進行相互轉化,所以操作系統 只需要使?LBA就可以了!!
這個轉化是誰來做啊??
磁盤自己 來做!固件(硬件電路,伺服系統)!
所以:從此往后,在磁盤使?者看來,根本就不關?CHS地址,而是直接使用LBA地址,磁盤內部??可以進行轉換。所以:
從現在開始,磁盤就是?個元素為扇區的?維數組,數組的下標就是每?個扇區的LBA地址。OS使?如果要磁盤,就可以??個數字訪問磁盤扇區了。

?三、塊

如果我們進行IO操作,是以扇區512字節為單位,未免就太少了。

所以我們可以把一定數量的扇區,劃分為一個塊。一個塊的數據大小為4kb,也就是八個扇區。

而這些塊,我們也可以進行編號,比如說,塊1,塊2,塊3.

所以磁盤就劃分為了以塊為單位的一維數組。

假如我們磁盤中有500GB的存儲空間,我們應該如何進行管理呢?

答案是,我們會把這500GB的空間換劃分為一個一個的的分區。

就像是大家電腦上的C盤,E盤,D盤。

?

從linux系統看,我的這個就劃分為了2個區域。一個分區掛掉了不會影響其他分區,這一切都是為了磁盤的?靈活性、安全性、性能優化和兼容性。

這也體現了分治的思想。我們只需要管理好一個分區,隨后把這個分區的管理方法復制到其他分區進行管理就行了。?

那我們該如何管理好一個分區呢?

這里就要開始引入我們的文件系統的概念了。

?四、EXT2文件系統?

1、分區

我們想要在硬盤上儲?件,必須先把硬盤格式化為某種格式的?件系統,才能存儲?件。?件系統的?的就是組織和管理硬盤中的?件。在Linux 系統中,最常?的是 ext2 系列的?件系統。其早期版本為 ext2,后來?發展出 ext3 和 ext4。ext3 和 ext4 雖然對 ext2 進?了增強,但是其核?設計并沒有發?變化,我們仍是以較老的ext2 作為演示對象。
ext2?件系統將整個分區劃分成若?個同樣??的塊組 (Block Group),如下圖所示。只要能管理?個分區就能管理所有分區,也就能管理所有磁盤?件。
ext2?件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組
成。

這里獨立于分區外的是Boot Block,通常記錄的是啟動的相關設置。

啟動塊的大小是確定的,為1KB,由PC標準規定,?來存儲磁盤分區信息和啟動信息,任何?件系統都不能修改啟動塊。啟動塊之后才是ext2?件系統的開始。

而一個分區內通常會存儲以上信息: Data blocks,inode Table ,inode Bitmap等。

2、inode?

我們知道,一個文件=屬性+數據

那么一個文件的屬性信息,其實也是一種數據,我們把這個屬性信息以結構體的方式構建出來。

這個結構體我們就把它叫做inode。(所以inode,是文件屬性的集合)

通常來說,一個文件就對應著這一個inode。

一個inode的大小通常為128字節,當然也有256字節的情況,我們在這里不討論256字節的inode。

操作系統與磁盤進行IO交互時基本單位是4KB,所以一個塊就有4kb/128字節個inode。

每個inode都有自己的編號:

我們在ls指令后面跟上-i選項就可以查看每個文件的inode的隊友編號:

?前面的920502就是inode編號,而每個文件直接的inode編號互不重復。

值得注意的是,在linux中,文件名這個屬性并不保存在inode中。

inode table對應這個組里的所有文件屬性集。如果我們有一萬個文件,inode table中會要占用多少塊呢?

:10000*128/4/1024個

既然文件的屬性已經被保存起來了,那么文件的內容呢?

答案是保存在Data Blocks中,所以我們可以知道,在linux下,文件的屬性與內容是分開存儲的

?在inode結構中,還有一個數組:int blocks[NUM],用于存儲文件數據塊的地址。這個數組直接決定了如何找到文件的實際內容。

blocks[NUM]存儲的是文件內容所在的?磁盤塊號,通過這些號碼可以在磁盤上定位文件的具體數據。


由于時間的原因,本篇文章就暫時寫到這里,后面的內容,我會在下一篇文章中為大家詳細介紹inode等信息。

結語:

文件系統上怎么知道一個一共有多少inode,還有多少inode沒使用這些信息的呢?

下一篇文章再來談文件系統的塊號如何理解,inode的值是怎么來?為什么找文件只需要通過inode就行了這些內容。

本篇文章介紹了大量概念,希望同學們能夠進行一定程度的記憶。

如果有任何疑問與指正,歡迎評論區或者私信留言!!

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

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

相關文章

java中,stream的filter和list的removeIf篩選速度比較

在 Java 里,Stream 的filter和 List 的removeIf篩選效率要依據具體情形來判斷。 1. 操作本質有別 Stream 的 filter: 它是一種中間操作,不會立刻執行,而是把篩選條件記錄下來。只有遇到終端操作時,才會開始處理元素。…

Python(28)Python循環語句指南:從語法糖到CPython字節碼的底層探秘

目錄 引言一、推導式家族全解析1.1 基礎語法對比1.2 性能對比測試 二、CPython實現揭秘2.1 字節碼層面的秘密2.2 臨時變量機制 三、高級特性實現3.1 嵌套推導式優化3.2 條件表達式處理 四、性能優化指南4.1 內存使用對比4.2 執行時間優化技巧 五、最佳實踐建議六、總結&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 復刻實現

深度分析:Microsoft .NET Framework Random 的 C 復刻實現 核心原理與算法結構 本實現基于 Knuth 減隨機數生成器(Subtractive Random Number Generator),是 .NET Framework 中 System.Random 的精確復刻。其核心特點包括&#x…

[論文閱讀] 人工智能 | 在非CUDA硬件上運行幾何學習:基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐

在非CUDA硬件上運行幾何學習:基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐 論文標題:PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多線程-threading

1 需求 2 接口 3 示例 4 參考資料 Python treading 模塊 | 菜鳥教程

2025年- H91-Lc199-- 62.不同路徑(多維動態規劃)--Java版

1.題目描述 2.思路 dp含義:代表到當前位置的路徑數 遞推公式:dp[i][j]dp[i-1][j]dp[i][j-1] dp數組初始化,我們要確保第一行和第一列是有值的. dp數組的遍歷順序:我們需要從左往右遍歷,從上往下遍歷。并且把第一行和第…

char 不是 Java 中的 2 字節(16 位)嗎? 為什么用 UTF-8 編碼寫入時,一個中文要占 3 個字節?

char 不是 Java 中的 2 字節(16 位)嗎? 為什么用 UTF-8 編碼寫入時,一個中文要占 3 個字節? ? 一、Java 中的 char 是什么? Java 的 char 是一個 固定大小的 2 字節(16 位)類型&am…

【Elasticsearch】檢索排序 分頁

檢索排序 & 分頁 1.測試數據準備2.排序功能2.1 簡單字段排序2.2 多字段排序2.3 日期排序 3.分頁功能3.1 基礎分頁3.2 深度分頁(不推薦大數據量使用)3.3 使用 search_after 進行高效分頁 4.綜合示例:高亮排序分頁5.實踐建議 1.測試數據準備…

Delta、Jackknife、Bootstrap

用班級平均身高的案例,展示 ?Delta、Jackknife、Bootstrap? 的完整計算過程。 ?0. 數據準備? ?原始數據(4個學生的身高)??: 真實均值(目標統計量)??: ?1. Delta 方法(公式…

企業智腦技術架構設計:緊貼企業場景規劃面向未來的發展趨勢與實現路徑

摘要 本文深入探討了企業智腦技術架構的設計理念與發展趨勢,分析了當前企業智能化轉型的技術需求與挑戰,提出了一個面向未來的企業智腦技術架構設計方案。文章從底層技術支撐、核心能力構建、應用場景適配、安全合規保障以及未來發展路徑五個維度展開論…

新手向:Python方向講解

從NASA火星任務到TikTok推薦算法,從自動化腳本到量子計算,Python用import antigravity重新定義了編程邊界 一、設計哲學:優雅明確的編程禪學 Python之禪(import this): 優美勝于丑陋(Beautifu…

Chrome谷歌瀏覽器插件ModHeader,修改請求頭,開發神器

文章目錄一、介紹與下載二、使用一、介紹與下載 ModHeader顧名思義就是讓我們可以自定義HTTP請求頭或者是重寫響應頭,包括新增請求頭/響應頭或者覆蓋Chrome瀏覽器設置的請求頭的默認值,同時還可以根據URL Pattern來只對特定網站生效。 有條件的同學可以…

SEW:無監督預訓練在語音識別中的性能-效率權衡

摘要 本文研究了自動語音識別(ASR)中預訓練模型的性能-效率權衡問題。我們聚焦于 wav2vec 2.0,并形式化了多種影響模型性能和效率的架構設計。基于所有觀察結果,我們提出了 SEW(Squeezed and Efficient Wav2vec&#…

linux系統部署express+vue項目

一、準備階段: 1、安裝linux上所需要的環境:npm nodejs nginx pm2 //安裝 npm(Node 包管理器) sudo apt install npm//判斷是否安裝成功 npm -v//安裝 Node.js(可以根據需要選擇版本) sudo apt inst…

PixiJS教程(004):點擊事件交互

1.6 事件交互實現要求:點擊寶劍,修改寶劍的顏色。1??實現代碼: // 為精靈添加交互事件 sprite.interactive true; sprite.on(click, () > {// 點擊精靈時,改變精靈的顏色sprite.tint Math.random() * 0xFFFFFF; });說明&am…

創客匠人助力家庭教育IP破局:從0到1打造創始人個人品牌全攻略

一、IP定位:細分賽道的精準錨定與用戶畫像構建 在家庭教育8000億市場規模的競爭中,創始人IP的差異化定位成為破局關鍵。創客匠人通過“標簽化定位”工具,幫助教育者鎖定垂直領域,如親子溝通、青春期教育等細分賽道。以景麗霞老師…

使用堅果云擴容Zotero同步空間的簡單快捷方法

本文介紹基于堅果云的WebDAV協議,用于文獻管理軟件Zotero的文件同步,從而實現Zotero存儲空間擴容的方法。 在之前的文章Zotero文獻管理軟件入門使用方法:軟件下載、文獻導入、引文插入(https://blog.csdn.net/zhebushibiaoshifu/a…

Java啟動腳本

Java啟動腳本 編寫代碼,然后打包 Java-1.0-SNAPSHOT.jar public class test {public static void main(String[] args) {System.out.println("Hello IDEA");} }編寫運行腳本 #!/bin/sh WORKDIR$(cd $(dirname $0); pwd) cd $WORKDIRexport JAVA_OPTS"…

VSCode使用ssh遠程連接阿里云

1. 終端選擇 Windows使用PowerShell Ubuntu和Mac使用Terminal 2. 設置ssh 2.1. 第一臺電腦 生成密鑰 ssh-keygen -o -t rsa -b 4096 -C "emailexample.com" 按三次回車 查看密鑰 cat ~/.ssh/id_rsa.pub 拷貝密鑰,粘貼到服務器的密鑰框中 2.2. 第…

XLSR-Wav2Vec2:用于語音識別的無監督跨語言表示學習

摘要 本文提出了 XLSR,該方法通過從多種語言的原始語音波形中預訓練單個模型,以學習跨語言的語音表示。我們基于 wav2vec 2.0 構建模型,該方法通過對掩蔽后的潛在語音表示解決對比任務進行訓練,并聯合學習在多種語言之間共享的潛…