存儲基石:深度解讀Linux磁盤管理機制與文件系統實戰

Linux系列


文章目錄

  • Linux系列
  • 前言
  • 一、磁盤
    • 1.1 初識磁盤
    • 1.2 磁盤的物理結構
    • 1.3 磁盤的存儲結構
    • 1.4 磁盤的邏輯結構
  • 二、文件系統
    • 2.1 系統對磁盤的管理
    • 2.2 文件在磁盤中的操作


前言

Linux 文件系統是操作系統中用于管理和組織存儲設備(如硬盤、SSD、USB 等)上數據的一種核心機制。本篇我們將操作系統如何對未打開的文件進行管理的。


一、磁盤

磁盤是是計算機硬件中的唯一的機械設備,被廣泛的運用于企業級存儲,學習磁盤對數據的存儲,對我們學習操作系統的文件系統有很大幫助。

1.1 初識磁盤

隨著計算機行業的發展,磁盤由于存儲效率較低,慢慢的在我們的私人電腦中被固態硬盤所替代,但是在企業中,磁盤依舊是存儲的主流。這是因為:
1、相較于固態硬盤來說,磁盤的成本較低。
2、磁盤雖然效率低,但是容量較大,在企業中往往存在海量的不常訪問數據需要保存,所以磁盤就成了比較適合的選擇,
3、固態硬盤在存儲和刪除數據是對自身會有一定損耗,長時間的使用會有數據丟失的風險。

1.2 磁盤的物理結構

在這里插入圖片描述
一個磁盤會包含好幾個盤片,每個盤片具有兩個盤面,這兩個盤面都會進行數據存儲,每個盤面都會配有對應的磁頭,在工作時,磁盤會在主軸的帶動下開始旋轉,磁頭則會在磁臂的帶動下開始水平擺動,這個過程磁頭并不會和磁盤接觸。

1.3 磁盤的存儲結構

下面我們來對一個磁面進行分析:
在這里插入圖片描述
在一個磁面中,以主軸為圓心,向外會分成多個同心園,我們稱這些同心圓為磁道,這些磁道又會被等分為多分弧段,這些弧段就叫做扇區,在磁盤進行數據的讀寫時就是以扇區為最小單位,每個扇區一般為512字節,從主軸向外扇區的長度是不同的,為了保證存儲空間一致,設計規定離主軸越遠數據的存儲密度越小。

拓展: 磁盤在工作時,主軸帶動磁盤旋轉,磁頭通過擺動來確定數據在哪個磁面、磁道,當確定磁道后,磁頭停止擺動,此時磁盤繼續旋轉完成數據讀寫工作。

為了對方便管理,我們磁面、磁道、扇區進行編號,當我們要對磁盤數據進行訪問時,就可以通過編號快速完成,具體怎么進行的我們下面介紹。

1.4 磁盤的邏輯結構

在這里插入圖片描述
由于磁盤的大小相同,且磁臂是被固定的,這時再將磁盤劃分磁道,我們就會得到一個由磁道組成的柱面結構,當我們對磁盤進行訪問時,我們就可以先確定在哪一個柱面(cylinder),也就是磁盤,然后再確定再哪一個盤片(platter),由于每個盤片都配有一個磁頭,所以我們是通過 磁頭(head) 來確定的,再確定磁道(track),最后確定扇區(sector) 我們稱這種定位方法為 CHS定位法。為了將它于操作系統建立聯系,我們需要將它進一步抽象。

不知到大家有沒有接觸過磁帶,來看下圖:
在這里插入圖片描述
左側圖片是磁帶卷起的樣子,會呈現出一個圓類似于盤面,當我們將它展開就會呈現出右側有寬度的帶子,我們可以依據這個特性將盤面中的磁道抽象為一個,條帶子:

在這里插入圖片描述
這里我們就可以將所有盤面全部抽象為一個線性結構(當成數組也可以,為了方便這里僅畫出了一個盤),這時我們對磁盤的訪問,就變為了對線性結構的訪問,當操作系統要定位一個扇區時,我們只需要知道這個扇區的地址就可以完成對扇區的訪問了,如要查找扇區編號為:355
在這里插入圖片描述
由于是從0開始編號,所以計算時只需要向下取整即可。
這樣我們就成功定位到了扇區,而我們將這種編號稱為LBA地址,定位過程就是LAB地址轉化為CHS地址的過程。

二、文件系統

2.1 系統對磁盤的管理

我們可以確切的感受到,在我們的計算機中,磁盤是非常大的,如果操作系統直接對他進程管理,效率是非常低的,那么該如何讓操作系統對它進行管理呢?對于這個問題,我們的工程師采用了分治思想,將整個磁盤劃分為小塊空間,通過對所以小塊空間的管理,達到對整個磁盤的管理。

在這里插入圖片描述
這樣操作系統只需要完成對每個組的管理,就可以達到對整個磁盤的管理。
每個組又會被劃分為以下幾個區:
在這里插入圖片描述

具體如何管理我們結合文件在磁盤中的存儲,進行分析:
我們知道文件=內容+屬性,而在Linux中文件的內容和屬性是分開進行存儲的,那么兩者分開存儲是如和建立聯系的呢?或者說是如何管理的呢?

存儲屬性信息: 在Linux中每個文件都會對應一個inode結構體,這個結構體(對象)的大小是固定的,通常為128字節,文件的所有信息都存儲在這個結構體對象中,其中并包含文件名,這是因為,Linux并不通過文件名進行查找文件,每個inode都會有一個編號,操作系統通過編號進行查找。上圖的inode Table就是inode表(inode集合,下面會再次解釋)。

存儲文件內容: 在Linux文件內容是存儲在上圖Data blocks區域中的,而這個區域被劃分為塊(這些塊也是會被分配編號的),操作系統在訪問磁盤時是以塊為單位進行訪問的,塊中包含多個扇區,通常塊的大小為4KB,此處可以理解為對讀取性能的優化,因為當計算機要訪問一段數據是,這段數據周圍的數據也有很大可能被訪問,所以直接讀取4KB,這是一種以空間換時間的方法。(這個塊大小是可以修改的,感興趣的可以去了解)

屬性與內容建立聯系:inode對象中會存在,一個數組,數組中存儲的是該文件內容存儲塊的編號。

在這里插入圖片描述

這樣我們就大概的知道了,存儲邏輯了,下面我們解釋一下,組中各個模塊的含義。
在這里插入圖片描述
Boot Block:引導塊,引導操作系統啟動,我們不做研究。

Super Block:超級塊,存儲文件系統的整個信息(整個分區信息),包含bolckinode的總量,未使用的量,一個bolckinode的大小,文件系統狀態(是否干凈卸載)等。

Group Descriptor Table:塊組描述符,描述塊組的屬性信息。

Block Bitmap:塊位圖,記錄Date bolck中的塊是否被使用,通過塊編號映射,相信學過位圖的都可以理解。

inode Bitmapinode位圖,標識inode是否被使用。

復習的時候再看看超級塊-----這句話給作者看的

2.2 文件在磁盤中的操作

我通過對文件的增、刪、查、改,帶領大家熟悉上面知識。

查看文件的inode編號:

ls -li

在這里插入圖片描述
還可以使用stat 文件名查看更多信息,大家自己去了解一下。

創建文件:

創建文件時,將文件存儲在哪個分區,路徑會幫助我們,這里我們就不關心了,首先操作系統根據,超級塊中的信息,剩余inodebolck較多的組,遍歷該組的inode Bitmap,得到未被使用的inode編號,找到該inode將文件屬性存儲,并將對應位置位圖置1,再遍歷Block Bitmap得到未被使用的塊編號,找到對應塊,將文件內容存儲,并將對應位置位圖置1,再將對應的塊編號,存入該文件inode的數組中。

讀取文件:

讀取文件首先查找文件,拿到該文件的inode編號,根據編號找到對應的分組(LBA->CHS),找到inode中存儲塊編號的數組,那到塊編號,讀取塊數據。

修改文件:

首先拿到該文件的inode編號,根據編號找到對應的分組(LBA->CHS),找到inode中存儲塊編號的數組,那到塊編號,修改數據。

刪除文件:

首先拿到該文件的inode編號,根據編號找到對應的分組(LBA->CHS),找到inode中存儲塊編號的數組,那到塊編號,使用塊編號,將塊位圖對應位置置0(表示未被使用),通過inode編號將inode位圖置0

通過上面的方法我們就可實現文件的增、刪、查、改了,但是我們還面臨一個問題,操作系統該如何來獲取文件的inode編號呢?

我們首先來看這樣一個問題:
在這里插入圖片描述
上面我們說,操作系統在磁盤訪問文件不通過文件名,是通過inode進行的,但現在為什么操作系統不認識它呢?
要回答這個問題我們就得思考一下,目錄文件在磁盤中存儲的內容是什么了,在磁盤中目錄文件存儲的其實是,該目錄下的文件名與文件inode編號的映射關系,當在用戶訪問文件時,操作系統就會根據當前目錄的inode編號,找到當前目錄的內容,從而通過映射關系找到對應文件的inode編號,這樣就可以得到用戶要訪問文件的inode,但是當前目錄文件的inode又從哪來呢,當然是通過它的上級目錄了,就像這樣一直索引,知道找到操作系統啟動時固定的,目錄inode編號,然后逐級返回。這個過程為路徑解析,但是由于太過復雜影響效率,所以操作系統會將常用路徑解析后緩存在dentry緩存

在這里插入圖片描述
這樣我們就將這個問題完美解決了。

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

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

相關文章

本節課課堂總結

匿名子類: 說明 和 Java 一樣,可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。 單例對象(伴生對象) Scala語言是完全面向對象的語言,所以并沒有靜態的操作(即在Scala中沒有靜態的概念&a…

I2C、SPI、UART、CAN 通信協議詳解

一、協議基本特性對比 特性ICSPIUARTCAN通信類型同步、半雙工同步、全雙工異步、全雙工異步、多主多從信號線SDA(數據)、SCL(時鐘)MOSI、MISO、SCK、SS(片選)TX(發送)、RX&#xff…

【diffusers 進階(十五)】dataset 工具,Parquet和Arrow 數據文件格式,load dataset 方法

系列文章目錄 【diffusers 極速入門(一)】pipeline 實際調用的是什么? call 方法!【diffusers 極速入門(二)】如何得到擴散去噪的中間結果?Pipeline callbacks 管道回調函數【diffusers極速入門&#xff0…

第十三章:持久化存儲_《鳳凰架構:構建可靠的大型分布式系統》

第十三章 持久化存儲 一、Kubernetes存儲設計核心概念 (1)存儲抽象模型 PersistentVolume (PV):集群級別的存儲資源抽象(如NFS卷/云存儲盤)PersistentVolumeClaim (PVC):用戶對存儲資源的聲明請求&#…

以太網安全

前言: 端口隔離可實現同一VLAN內端口之間的隔離。用戶只需要將端口加入到隔離組中,就可以實現隔離組內端口之間的二層數據的隔離端口安全是一種在交換機接入層實施的安全機制,旨在通過控制端口的MAC地址學習行為,確保僅授權設備能…

跨域問題前端解決

由于瀏覽器的同源策略,前后端分離的項目,調試的時候總是會遇到跨域的問題,這里通過修改前端代碼解決跨域問題。 首先先查看前端代碼的根目錄下,有沒有vue.config.js文件, 若有,使用方法1,若沒有此文件&…

Elasticsearch 報錯index_closed_exception

index_closed_exception 是 Elasticsearch 中的一個異常類型,它通常發生在嘗試對一個已經被關閉(closed)的索引執行搜索、寫入或其他操作時。在 Elasticsearch 中,索引是用來存儲和檢索數據的邏輯命名空間,可以將其類比…

LearnOpenGL-筆記-其九

今天讓我們完結高級OpenGL的部分: Instancing 很多時候,在場景中包含有大量實例的時候,光是調用GPU的繪制函數這個過程都會帶來非常大的開銷,因此我們需要想辦法在每一次調用GPU的繪制函數時盡可能多地繪制,這個過程就…

PDF預覽-搜索并高亮文本

在PDF.js中實現搜索高亮功能可以通過自定義一些代碼來實現。PDF.js 是一個通用的、基于Web的PDF閱讀器,它允許你在網頁上嵌入PDF文件,并提供基本的閱讀功能。要實現搜索并高亮顯示文本,你可以通過以下幾個步驟來完成: 1. 引入PDF…

二叉樹——隊列bfs專題

1.N叉樹的層序遍歷 我們之前遇到過二叉樹的層序遍歷,只需要用隊列先進先出的特性就可以達到層序遍歷的目的。 而這里不是二叉樹,也就是說讓節點的孩子入隊列時不僅僅是左右孩子了,而是它的所有孩子。而我們看這棵多叉樹的構造,它…

Python高級爬蟲之JS逆向+安卓逆向1.1節-搭建Python開發環境

目錄 引言: 1.1.1 為什么要安裝Python? 1.1.2 下載Python解釋器 1.1.3 安裝Python解釋器 1.1.4 測試是否安裝成功 1.1.5 跟大神學高級爬蟲安卓逆向 引言: 大神薯條老師的高級爬蟲安卓逆向教程: 這套爬蟲教程會系統講解爬蟲的初級&…

Windows 安裝和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES (1)ES 是一個開源的分布式搜索和分析引擎,專為處理大模型數據而設計,它能夠實現近乎實時的數據檢索、分析和可視化,廣泛用于全文搜索、日志分析和監控&…

matplotlib初探

庫引入 import matplotlib.pyplot as pltpyplot.figure 創建新圖形或激活現有圖形

NVM 多版本Node.js 管理全指南(Windows系統)

🧑 博主簡介:CSDN博客專家、全棧領域優質創作者、高級開發工程師、高級信息系統項目管理師、系統架構師,數學與應用數學專業,10年以上多種混合語言開發經驗,從事DICOM醫學影像開發領域多年,熟悉DICOM協議及…

實驗室預約|實驗室預約小程序|基于Java+vue微信小程序的實驗室預約管理系統設計與實現(源碼+數據庫+文檔)

實驗室預約小程序 目錄 基于微信小程序的實驗室預約管理系統設計與實現 一、前言 二、系統功能設計 三、系統實現 1、微信小程序前臺 2、管理員后臺 (1)管理員登錄 (2)實驗室管理 (3)公告信息管理…

SpringBoot底層-數據源自動配置類

SpringBoot默認使用Hikari連接池,當我們想要切換成Druid連接池,底層原理是怎樣呢 SpringBoot默認連接池——Hikari 在spring-boot-autoconfiguration包內有一個DataSourceConfiguraion配置類 abstract class DataSourceConfiguration {Configuration(p…

面試算法高頻03-遞歸

認識遞歸 遞歸的概念與特性:遞歸本質類似循環,是通過函數體進行的循環操作。借助電影《盜夢空間》類比,遞歸如同主角在不同夢境層穿梭,向下進入不同遞歸層,向上能回到原來一層,每一層環境和周圍元素相似&a…

linux Gitkraken 破解

ubuntu 安裝 Gitkraken 9.x Pro 版本_gitcracken.git-CSDN博客

設計模式簡述(十一)裝飾器模式

裝飾器模式 描述基本使用使用 描述 裝飾器模式是一種功能型模式 用于動態增強對象的功能 這么一說感覺上和代理模式有些類似 抽象裝飾器 要實現原有業務接口,并注入原有業務對象 至于對原有業務對象的調用,可以采用private業務對象 實現業務接口方法的…

【NetCore】ControllerBase:ASP.NET Core 中的基石類

ControllerBase:ASP.NET Core 中的基石類 一、什么是 ControllerBase?二、ControllerBase 的主要功能三、ControllerBase 的常用屬性四、ControllerBase 的常用方法2. 模型綁定與驗證3. 依賴注入五、ControllerBase 與 Controller 的區別六、實際開發中的最佳實踐七、總結在 …