[ linux-系統 ] 磁盤與文件系統

1.認識磁盤結構

機械鍵盤是計算機中唯一的機械設備,磁盤是外設,容量大,速度慢,價格便宜

物理結構:

  1. 磁頭是一面一個,左右擺動,兩個整體移動的,有磁頭停靠點
  2. 磁頭和盤面不接觸,所以物理上不適用于筆記本,開機狀態移來移去,磁頭刮花了磁盤,屬于硬件問題
  3. 機械磁盤要在無塵環境下,灰塵落上去可能會把數據都磨沒了
  1. 所有的數據都在盤片上以二進制存儲,磁頭通過充放電寫入
  2. 內存掉電易失設備,磁盤永久性存儲介質
  3. 通過充放電/強弱/波,在磁盤上寫入 01 數據,像吸鐵石的 N S 級

存儲結構:

磁盤被訪問的最小基本單元是扇區--大小約為512字節,塊設備

如何定位一個扇區呢?

CHS尋址:先定位磁頭(header),確定磁頭要訪問哪一個柱面(磁道)(cylinder),定位一個扇區(sector)

邏輯結構:

我們可以把磁帶拉直,形成線性結構

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

?這樣每?個扇區,就有了?個線性地址(其實就是數組下標)

這種地址叫做LBA(Logical Block Address)

?

假設是兩片四面。盡管扇區大小有差異,但是每個扇區的內存大小都是一樣的。每一面上都有很多扇區,最后就把磁盤抽象成數組 。
有了數組,就可以通過下標找到某個扇區,但是磁盤只認CHS,所以要通過算法將下標轉換成CHS的地址。
找到下標后交給磁盤,磁盤內部會把線性地址轉換成CHS的地址,進而定位到某一個扇區里。

?

注意:一般而言,OS未來和磁盤交互的時候,基本單位為4KB,而不是512字節(一個扇區512字節),因為一次讀512字節太少了,因為要提高效率

所以4KB=8個連續的扇區,系統把這8個連續的扇區稱為塊大小(數據塊)

8個扇區為一個塊,塊號*8 = 每一個塊的第一個扇區的下標,連續往后讀就能知道整個塊的下標

對于OS而言:未來讀取數據就能以塊為單位了,這里的每一個塊號的起始地址稱作LBA (邏輯區塊地址)

LBA和CHS轉化(了解)

從此往后,在磁盤使?者看來,根本就不關?CHS地址,?是直接使?LBA地址,磁盤內部自己
轉換。所以:從現在開始,磁盤就是?個?元素為扇區?的?維數組,數組的下標就是每?個扇區的LBA地址。OS使用磁盤,就可以??個數字訪問磁盤扇區了。

2.文件系統?

引入塊的概念:

其實硬盤是典型的“塊”設備,操作系統讀取硬盤數據的時候,其實是不會?個個扇區地讀取,這樣
效率太低,?是?次性連續讀取多個扇區,即?次性讀取?個”塊”(block)。

硬盤的每個分區是被劃分為?個個的”塊”。?個”塊”的??是由格式化的時候確定的,并且不可
以更改,最常?的是4KB,即連續?個扇區組成?個”塊”。”塊”是?件存取的最?單位。

?理解分區

其實磁盤是可以被分成多個分區(partition)的,以Windows觀點來看,你可能會有?塊磁盤并且將它分區成C,D,E盤。那個C,D,E就是分區。分區從實質上說就是對硬盤的?種格式化。但是Linux的設備都是以?件形式存在,那是怎么分區的呢?

假設磁盤的空間很大,需要分區管理,因此只要能管理好其中一個區,剩下的其他區就可以照搬它的管理方法,全部管理好。(分治思想)

如果這里管理其中一個區,這個區還是太大,就要在這個區里面繼續分組。只要把一個組管理好了,這個區的每一個組就都能管理好了?

磁盤文件系統圖 :

Linux文件系統特點:文件內容和文件屬性 分開存儲

Block Group:文件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組成
超級塊(Super Block):存放文件系統本身的結構信息,描述的是整個分區整體的文件系統的情況
? ? ? ? 1.記錄的信息主要有:
? ? ? ? ? ? ? ? 1.bolck 和 inode的總量
? ? ? ? ? ? ? ? ?2.未使用的block和inode的數量
? ? ? ? ? ? ? ? 3.一個block和inode的大小
? ? ? ? ? ? ? ? 4.近一次掛載的時間
? ? ? ? ? ? ? ? 5.最近一次寫入數據的時間
? ? ? ? ? ? ? ? 6.最近一次檢驗磁盤的時間等其他文件系統的相關信息
? ? ? ? 2.Super Block 的信息被破壞,可以說整個文件系統結構就被破壞了
? ? ? ? 3.超級塊不止一個,可能有多個,在不同的塊組里,這樣可以讓文件系統更穩定
GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用
inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
inode表:存放文件屬性 如 文件大小,所有者,最近修改時間等
數據區:存放文件內容
inode Table里面存的是文件的屬性Data blocks里面存的是文件的內容


Linux中文件的屬性是一個大小固定的集合體,也就是inode結構體

結構體里面沒有文件名。內核層面,每一個inode都有inode number,通過inode號標識一個文件。通過inode號找到inode后,inode里面還有一個數組,可以映射到對應數據塊

?

理解inode

在linux文件系統中,?inode(索引節點)是一個非常重要的概念。每個文件和目錄在Linux文件系統中都有一個對應的?inode?,它包含了除文件名之外的所有元信息(文件屬性)

文件內容與inode映射

inode結構中除了有編號屬性外,還有一個屬性,這個屬性是存儲指向data Blocks中指定數據塊的指針,其有四種分類:

1.12個直接映射指針,每個指針直接指向每一個存儲內容的數據塊,一共可以存儲4kb * 12 = 48kb的數據,對于小文件非常有效
2.一級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲其他塊的索引,此時有4 * 1024 / 4 * 4 * 1024 = 4MB個存儲空間
3.二級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲與一級指針指向的數據塊相同的數據塊,此時有4 * 1024 / 4 * 4 = 4096MB = 4GB個存儲空間
4.三級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲與二級指針指向的數據塊相同的數據塊,此時有4 * 1024 / 4 * 4 = 4096GB = 4TB個存儲空間

inode的定義

inode 是文件系統中的一個數據結構,用于存儲文件的元數據(即文件的屬性信息)
每個文件或目錄都有一個唯一的 inode 號,注意:一個文件inode是有可能有多個目錄項的,比如給一個文件創建多個硬鏈接,因此文件 和 inode 不是 一一對應
inode 編號是以分區為單位的,一個分區內 inode 號不能重復,兩個分區間可以,所以 inode 不能跨分區訪問。

inode包含的信息

文件類型:普通文件、目錄、符號鏈接等
權限:文件的讀、寫、執行權限
所有者:文件的所有者和組
時間戳:文件的創建時間、修改時間和訪問時間
文件大小:文件的實際大小
指向數據塊的指針:文件數據在磁盤上的位置
硬鏈接數:指向該inode的目錄項數量


inode的作用


唯一標識: inode 號是文件系統的唯一標識符,即使文件名改變, inode 號也不會改變。
元數據管理: inode 存儲了文件的所有重要元數據,使得文件系統可以高效地管理和檢索文件。
硬鏈接支持:多個目錄項可以指向同一個 inode ,這就是硬鏈接的基礎。

inode與文件名的關系?


文件名實際上是目錄中的一個條目,指向相應的 inode

可以有多個文件名(硬鏈接)指向同一個 inode

刪除一個文件名并不會刪除 inode ,只有當所有的硬鏈接都被刪除時,inode 才會被釋放

查看inode信息

可以使用一些命令來查看inode信息:

ls -i:顯示文件和目錄的 inode 號。
stat :顯示文件的詳細信息,包括inode號和其他元數據。
df -i:顯示文件系統的 inode 使用情況。

inode限制?

每個文件系統有一個固定的?inode?數量上限,這在創建文件系統時確定

如果文件系統中的?inode?用盡,即使還有可用的磁盤空間,也無法再創建新的文件或目錄

?

Inode 、Inode Table 、Data Blocks 三者關系

Inode 是一個數據結構,用于存儲文件的元數據(即文件的屬性信息)。每個文件和目錄都有一個唯一的 inode
Inode Table 是文件系統中存儲所有inode 的一個區域。它是一個固定大小的數組,每個 inode 占用固定的大小。作用如下:
????????Inode Table 存儲了文件系統中所有文件和目錄的元數據

????????每個 inode 在 Inode Table 中有一個唯一的編號(inode號)

????????當文件系統創建時,Inode Table 的大小是預先分配好的,這意味著文件系統中可以存儲的文件和目錄數量有一個上限

Data Blocks 是實際存儲文件內容的磁盤空間。文件的數據被分割成多個塊,并存儲在這些數據塊中。作用如下:
????????文件的實際內容存儲在Data Blocks中

????????Inode中的指針指向這些數據塊的位置

????????數據塊的大小通常是固定的,例如4KB或8KB,具體取決于文件系統的配置

三者的關系
????????Inode 存儲文件的元數據,并包含指向數據塊的指針。
????????Inode Table 是存儲所有inode 的區域,每個inode 在其中有一個唯一的編號。
????????Data Blocks 存儲文件的實際內容,通過inode 中的指針來訪問。

?

格式化

操作系統在建立完分區之后就需要對當前分區進行分組,而這個過程也被稱為格式化分區,本質上就是向Group Descriptor TableSuper Block中寫入數據,既然要寫入數據,就需要先獲得到對應的數據,操作系統會根據一定的比率分配inode Tabledata blocks,所以整個分區的大小都是固定的,這就會導致出現inode用完,但是data Blocks沒有用完。所以前面說「可以確定起始值是因為組內每一個字段以及大小都是固定的」

需要注意,同時也存在出現inode沒用完,但是data Blocks用完的情況

實際上,如果一個分區不進行格式化,那么這個分區就無法被用戶使用,除了因為制定的分組信息沒有填寫外,還存在沒有給當前分區建立目錄索引的原因。這個原因在接下來的內容中會提及

如何查找文件?

前面提到每一個文件有對應的屬性,而屬性存儲在inode結構中,操作系統為了查找一個文件首先就需要對應文件的inode結構的編號成員,接著根據這個編號減去當前分組的inode Table的起始值就可以算出一個偏移量,在inode Bitmap中根據這個偏移量判斷指定inode編號是否有效,即判斷這個編號在inode中的對應位置是否為1,如果為1,證明指定文件存在。

因為每一個分組的起始值不同,導致inode Tableinode編號的偏移量加上對應的起始值就不會相同,所以就可以解釋為什么inode不會相同

接著在該inode結構中根據數據區指針指向的數據塊在block Bitmap中判斷是否有效,如果有效,就找出對應的文件內容即可

如果現在這個文件非常大,其內容不僅在當前組中存在,也存在于其他組,此時就需要不同組之間的Data Blocks進行連接,所以實際上,Data Blocks在Linux中是可以跨分組的,但是不可以跨分區,因為不同的分區可能使用的文件系統不同

對于其他的「如何刪除文件」、「如何修改文件」以及「如何新增文件」都涉及到「如何查找文件」,所以基本思路都是一致的

對于刪除文件來說,本質上就是先進行查找文件的操作,而刪除的過程就是將對應的inode Bitmapblock Bitmap對應位置置為0,此時就表示指定的文件內容和屬性無效,新的文件或者已有的文件可以使用對應的數據塊

正是因為有上面的刪除機制,所以刪除的文件理論上是可以被恢復的,但是恢復的難度很大

對于修改文件,依舊是先查找文件,再修改文件對應的數據塊的內容即可

對于新增文件,之所以要先查找,是因為需要防止出現文件沖突,如果沒有發生沖突,就需要先在inode Bitmap申請一塊空間將指定位置記為1),在根據這個位置加上指定inode Table的起始值就可以找到一個位置存儲inode節點,再將inode節點中的編號屬性賦值即可

文件與目錄

前面提到「如何查找一個文件」是通過獲取到的inode編號,但是現在的問題是,系統如何拿到的inode編號。換句話說,在使用Linux命令行操作時,用戶輸入的文件名或者目錄名都是字符串,系統是如何知道指定文件對應的inode編號的?

在inode結構中不存儲著文件名,但是系統能根據文件名獲取到其對應的inode編號,主要原因是文件所在路徑,為了更好理解下面的內容,先討論目錄文件:

對于底層磁盤硬件來說,不論是目錄還是普通的文件,它們都是由二進制組成,而系統要找到某一個目錄就需要根據當前目錄的所在路徑從根路徑開始解析(根路徑是系統加載時一定會被固定加載的),直到進入到當前目錄的數據塊,而在目錄中的數據塊存儲著當前目錄中所有文件名字符串和其inode編號的映射關系

一般來說,這個映射關系是相互映射

所以系統獲取一個文件的inode編號只需要根據其所在路徑按照路徑解析進入到其所在目錄找到映射關系就可以獲取到

但是,如果同一個目錄有很多個文件,對每一個文件都進行路徑解析,那么系統整體的效率就會受到影響,為了盡可能提升系統效率,在Linux中還存在一個多叉樹結構dentry,這個結構的根節點就是根路徑,剩下的節點就是按照文件路徑中的目錄構成的一個一個節點。與進程PCB結構一樣,dentry結構也是內存級的結構

有了上面的概念,所以在一個程序中之所以可以使用open打開一個文件本質就是因為進程的CWD給出了當前程序的路徑,即根據這個路徑找到該進程要打開的文件

至此,系統獲取到文件的inode編號的方式就已經基本確定,現在也就可以基本解釋在前面權限部分提到rwx三個權限為什么缺失時目錄會用相應的效果:

缺失r權限,無法讀取目錄中的內容:本質就是無法獲取到目錄中的文件名和inode編號的映射關系
缺失w權限,無法修改目錄中的文件:本質就是無法向目錄的數據塊寫入
缺失x權限,無法進入目錄:本質就是無法進入到目錄的數據塊中

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

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

相關文章

Spring AI RAG

目錄 Spring AI 介紹 Spring AI 組件介紹 Spring AI 結構化輸出 Srping AI 多模態 Spring AI 本地Ollama Spring AI 源碼 Spring AI Advisor機制 Spring AI Tool Calling Spring AI MCP Spring AI RAG Spring AI Agent 一、技術架構與核心流程? 檢索增強生成 (RA…

深入Linux開發核心:掌握Vim編輯器與GCCG++編譯工具鏈

文章目錄 一、Vim:終端環境下的編輯藝術1.1 Vim設計哲學:模態編輯的終極實踐1.2 高效導航:超越方向鍵的移動藝術1.3 定制化開發環境:從基礎到專業IDE1.4 調試集成:Vim作為調試前端 二、GCC/G:Linux編譯基石…

阿里云-spring boot接入arms監控

目標:在ecs中啟動一個java應用,且攜帶arms監控 原理:在java應用啟動時,同時啟動一個agent探針,時刻監控java應用變化(如:接口調用、CPU、線程池狀態等) 1.arms接入中心添加java應用…

昆泰芯3D霍爾磁傳感器芯片在汽車零部件中的應用

HUD即抬頭顯示系統(Head-Up Display),HUD 是一種將重要的車輛或飛行等相關信息(如速度、導航指示、警告信息等)投射到駕駛員或操作員前方視野范圍內的透明顯示屏或直接投射到風擋玻璃上的技術。 HUD即抬頭顯示系統(Head-Up Display)&#xff…

new Vue() 的底層工作原理

當你調用 new Vue() 時,Vue.js 會執行一系列復雜的初始化過程。讓我們深入剖析這個看似簡單的操作背后發生的事情: 1. 初始化階段 (1) 內部初始化 function Vue(options) {if (!(this instanceof Vue)) {warn(Vue is a constructor and should be cal…

最簡安裝SUSE15SP7導致大部分命令缺失

我嘞個去~~~明明選擇Enable了ssh,結果也沒給裝。 俺習慣使用NetworkManager管理網絡,沒給裝,用不了nmcli和nmtui。不高興歸不高興,最簡安裝的話,也情有可原。我嘞個去去~~連ping、vi都沒有裝,這也太簡了。…

Vue-14-前端框架Vue之應用基礎嵌套路由和路由傳參

文章目錄 1 嵌套路由1.1 News.vue1.2 Detail.vue1.3 router/index.ts2 路由傳參2.1 query參數2.1.1 News.vue(傳遞參數)2.1.2 Detail.vue(接收參數)2.2 params參數2.2.1 router/index.ts(需要提前占位)2.2.2 News.vue(傳遞參數)2.2.3 Detail.vue(接收參數)2.3 props配置2.3.1 r…

Python網安-ftp服務暴力破解(僅供學習)

目錄 源碼在這里 需要導入的模塊 連接ftp,并設置密碼本和線程 核心代碼 設置線程 源碼在這里 https://github.com/Wist-fully/Attack/tree/cracker 需要導入的模塊 import ftplib from threading import Thread import queue 連接ftp,并設置密碼…

ES6數組的`flat()`和`flatMap()`函數用法

今天給大家分享ES6中兩個超實用的數組函數:flat()和flatMap(),學會它們能讓數組處理變得更輕松! 1. flat()函數 1.1 基本介紹 flat()用于將嵌套數組"拍平",即將多維數組轉換為一維數組。 1.2 語法 const newArray …

upload-labs靶場通關詳解:第15-16關

第十五關 getimagesize函數驗證 一、分析源代碼 function isImage($filename){$types .jpeg|.png|.gif;if(file_exists($filename)){$info getimagesize($filename);$ext image_type_to_extension($info[2]);if(stripos($types,$ext)>0){return $ext;}else{return false…

【Linux】基礎IO流

好的代碼自己會說話,清晰的邏輯與優雅的結構,是程序員與世界對話的方式。 前言 這是我自己學習Linux系統編程的第五篇筆記。后期我會繼續把Linux系統編程筆記開源至博客上。 上一期筆記是關于進程: 【Linux】進程-CSDN博客https://blog.csdn…

【C語言】學習過程教訓與經驗雜談:思想準備、知識回顧(二)

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

AD8021ARZ-REEL7【ADI】300MHz低噪聲運放放大器,高頻信號處理的性價比之選!

AD8021ARZ-REEL7(ADI)產品解析與推廣文案 1. 產品概述 AD8021ARZ-REEL7 是 Analog Devices Inc.(ADI) 推出的一款 高速、低噪聲運算放大器(Op-Amp),屬于 ADI的高性能放大器系列,專為…

WPF學習筆記(11)數據模板DataTemplate與數據模板選擇器DataTemplateSelector

數據模板DataTemplate與數據模板選擇器DataTemplateSelector 一、DataTemplate1. DataTemplate概述2. DataTemplate詳解 二、DataTemplateSelector1. DataTemplateSelector概述2. DataTemplateSelector詳解 總結 一、DataTemplate 1. DataTemplate概述 DataTemplate 表示數據…

【V6.0 - 聽覺篇】當AI學會“聽”:用聲音特征捕捉視頻的“情緒爽點”

系列回顧: 在上一篇 《AI的“火眼金睛”:用OpenCV和SHAP洞察“第一眼緣”》 中,我們成功地讓AI擁有了視覺,它已經能像一個嚴苛的“質檢員”一樣,評判我視頻的畫質和動態感。 但我的焦慮并沒有完全消除。因為我發現&a…

(5)pytest-yield操作

1. 簡介 上一篇中,我們剛剛實現了在每個用例之前執行初始化操作,那么用例執行完之后如需要清除數據(或還原)操作,可以使用 yield 來實現。fixture通過scope參數控制setup級別,既然有setup作為用例之前前的操…

C++中的cmath庫

在C編程中,數值計算是科學計算、工程應用及算法開發的基礎。cmath庫作為C標準庫的重要組成部分,提供了豐富的數學函數和工具,能夠高效處理各種數值計算任務。本文將全面解析cmath庫的核心功能,并通過實戰案例展示其強大威力。 一…

python包管理工具uv VS pip

在 Python 中,uv 和 pip 都是包管理工具,但它們的定位和特性有所不同。以下是主要區別: 1. pip(傳統工具) 定位:Python 官方的包安裝工具,是 Python 生態中最基礎的包管理器。特點:…

OpenCv基礎(C++)

1.圖像讀取與顯示 #include<opencv2/opencv.hpp> using namespace cv;Mat src imread("C:/Users/16385/Desktop/new/photo/1.jpg");//讀取圖像 Mat src imread("C:/Users/16385/Desktop/new/photo/1.jpg",IMREAD_GRAYSCALE); //將讀取的圖像轉為灰…

MySQL非阻塞創建索引的方法

文章目錄 1. Online DDL (MySQL 5.6)2. pt-online-schema-change 工具3. gh-ost 工具4. 對于MySQL 8.0注意事項 在MySQL中創建大型表索引時&#xff0c;傳統方式會阻塞表的寫操作&#xff0c;影響生產環境使用。以下是幾種非阻塞創建索引的方法&#xff1a; 1. Online DDL (My…