Linux 文件系統超詳解

一.磁盤

磁盤是計算機的主要存儲介質,它可以存儲大量二進制數據,即使斷電后也可以保證數據不會丟失。下面我們將了解磁盤的物理結構、存儲結構以及邏輯結構。

?磁盤的存儲結構

1. 磁盤尋址的時候,基本單位既不是bit也不是byte,而是扇區。
2. 扇區的大小是512字節。512字節是硬件要求,外磁道和內磁道都是一樣的,它們只是密度不同。越靠近圓心的比特位越大,否則就越小。
3. 在單面上定位扇區:通過確定磁道,以及確定對應磁道的扇區,來具體確定該區間。確定磁道:.每一個磁道都有自己的編碼,磁道周長不同,但是存儲大小相同。由于扇區大小是相同的,因此每一個磁道有多少個扇區也是一定的,所以每一個磁道的扇區也是有編號的,因此定位到磁道就能找到對應扇區。
4. 機械硬盤的尋址方式:盤片不斷的轉動,磁頭不斷的擺動,就是在確認在哪個磁道。如何確定扇區?盤片的先選擇就是讓其磁頭定位扇區。
5. 柱面:把一系列同心的磁道壓在一起,宏觀上看成一個整體。一般定位的時候,(磁頭、柱面、扇區)與(磁頭、磁道、扇區)這兩個是等價的。磁頭指向的位置就是柱面的邊界位置。
6. 在磁盤中定位扇區:先定位在哪個磁道(在哪個柱面),磁道定位后,(因為,所有磁頭共同進退)再去定位盤面(磁頭),最后確定是哪一個扇區。

總結:在磁盤中定位一個扇區,采用的是硬件級別定位方法(CHS定位法):柱面(Cylinder)——磁頭(Head)——扇區(Sector)

二.文件系統與inode

1.文件在磁盤中是如何存儲的?

磁盤的空間很大,OS的文件系統會以1KB、2KB、4KB為單位定制多個扇區進行讀寫,即使讀取/修改1bit的內容,也必須將4KB的內容全部加載到內存中進行讀取或修改,完成操作后再將其寫回磁盤。雖然磁盤訪問的基本單位是512字節,但這相對于整個磁盤的大小還是很小的。為了方便管理,我們采用分治的思想,對磁盤空間進行分區:將1個較大的磁盤空間分為多個較小的磁盤空間,再給不同的分區內寫入不同的文件系統。

在一個分區內部再進行分組,然后寫入文件系統,管理好每一個分組就可以管理好一個分區。

這一過程是”格式化“,在磁盤中寫入文件系統。

文件 =? 內容 + 屬性(也就是數據),文件在磁盤中的存儲,本質就是存儲文件的內容和文件的屬性的數據。

Linux文件系統特定:文件內容和文件的屬性數據分開存儲

·?Data blocks(數據區):存放文件內容

· Block Bitmap(塊位圖):記錄著 Data blocks 中哪個數據塊已被占用,哪個沒被占用,Block Bitmap里的塊有編號,塊里的內容表示是否被占用。

·?i節點表(inode Table):存放文件屬性 如 文件大小,所有者,最近修改時間等。

·?inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。

·?GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息。

·?超級塊(Super Block):存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞了。(不是每個分組都有的)

Linux中文件的屬性是一個固定大小的集合體,inode內部是不包含文件名的,內核層面,每一個文件都要有inode number!我們通過inode號標識一個文件。(我們可以通過指令ls -li?來查詢文件對應的inode編號。)

刪除文件時并不需要將文件的數據和內容情況,只需要將對應文件的inode在inode bitmap中的比特位 置為0即可(即使不將它們清空也不會影響新文件的存儲,因為新文件的數據會直接將原數據覆蓋掉)。因此,在刪除文件后是可以及時將文件恢復的,恢復文件只需要找到inode的編號,然后將inode bitmap中對應比特位的值由0置為1,再去inode table對應映射表,將blosk bitmap由0置為1即可。
如果在Linux中誤刪一個文件,還是可以恢復的(前提是文件的inode和data block沒有被占用),因此當誤刪一個文件時最好的做法是什么也不做。
在windows下,刪除文件到回收站,實際上是將文件轉移到回收站的目錄而已,只有在回收站中刪除才是真的刪除。

為什么我們在目錄中查找文件時,用的是文件名而不是inode id?
因為任何一個文件都是創建在目錄下的(注意,同一目錄下不能出現相同文件名的兩個文件),而目錄也是一個文件,也有自己的inode,以及data block。目錄的數據塊(data block)中存儲的是當前目錄下文件的文件名與文件inode id的對應關系(這也是為啥inode中不保存文件名)。
新增文件要在當前目錄的內容(data block)中添加該文件名與inode id的映射關系,所以當我們在一個目錄下新增文件時,必須要有對目錄的寫權限。
羅列當前目錄的文件,要有對目錄的讀權限,想知道目錄中的文件,需要根據文件名找到inode,再讀取該文件的屬性。讀目錄內容是要拿到文件名,因此,目錄必須要有讀權限。

三.軟硬鏈接

1.軟鏈接

創建軟鏈接:
ln -s <目標路徑> <鏈接路徑>

例如,創建軟鏈接soft_text.txt文件指向text.txt文件

從上圖中可以看到,soft_text.txt有自己獨立的inode,它是一個獨立的文件,具有自己獨立的內容。
所謂的軟鏈接標定文件,它并非用文件的inode來標記。
看這個現象:我們刪除text.txt然后再去cat soft_text.txt:

軟鏈接的數據塊中保存的是指向目標文件的路徑,當目標文件被刪除時,軟鏈接也就失效了。

可以理解為你電腦桌面的快捷方式

刪除軟鏈接:
rm
rm -f soft_text.txt//和刪除普通文件一樣ulink
ulink ssoft_text.txt//刪除鏈接

2.硬鏈接

創建硬鏈接:

ln <目標路徑> <鏈接路徑>

可以發現硬鏈接的inode和text.txt的相同,它沒有獨立的inode,用的是目標文件的inode。

硬鏈接的作用?
當某一個硬鏈接的文件大小和內容發生變化,那么它對應的目標文件以及所有目標文件的硬鏈接都會一起發生改變。
硬鏈接沒有創建新的文件,它沒有獨立的inode、內容。它用的全部是目標文件的inode和內容。

創建硬鏈接的本質就是在指定的路徑下,新增文件名和inode的映射關系

一個inode可能會被多個文件名所映射,為了方便管理,inode有一個計數器count的引用計數,也將引用計數稱為硬鏈接數:

當我們刪除硬鏈接后,計數由2變為1.

硬鏈接的作用
1.為啥創建一個普通文件時,硬鏈接數是1?
因為,普通文件本身就有一個文件名和inode對應(只要創建文件,就有一個inode的映射關系)。
2.為啥創建一個目錄,它的硬鏈接數是2?
因為目錄名與它自己的inode就是一組1映射關系;其次,目錄內部的'.'('.'也表示當前目錄,它也是文件名)和inode也是一組映射,所以硬鏈接數是2。特別的,如果在當前目錄下再創建一個目錄,當前目錄的硬鏈接數就會變為3。這是因為,當前目錄下創建的子目錄中默認的有一個文件名'..''..'表示上一層目錄,它也是文件名)和當前目錄的inode也是一組映射。

用戶不能給目錄建立硬鏈接

1. 為什么不允許給目錄建立硬鏈接呢?
如果允許給目錄建立硬鏈接,則可能會打破文件系統目錄的有向無環圖結構,創建目錄循環,導致fsck以及其他的遍歷文件樹的軟件出錯。可能會出現:你的子目錄是你的父目錄這種奇怪的現象,即當前目錄的子目錄是硬鏈接的當前目錄的父目錄這種情況,此時很多遍歷系統的命令(du, ls -r, pwd等)就無法使用了,因為可能會導致無限循環。
2. 為什么軟鏈接就不會出現循環調用這個情況呢?
上文中,我們了解到軟鏈接所指向的是鏈接文件本身的信息,而不是鏈接文件指向的文件的信息;硬鏈接直接指向的是inode,而不是路徑(直接指向鏈接文件所指向的文件信息)。這就意味著,在遍歷的時候,如果是軟鏈接就不會出現環路從而導致死循環。因此不允許用戶給目錄建立硬鏈接。

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

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

相關文章

2025年大模型與Transformer架構:重塑AI未來的科技革命

引言&#xff1a;一場關于智能的革命 想象一下&#xff0c;當你向一個虛擬助手提問時&#xff0c;它不僅能夠準確理解你的需求&#xff0c;還能生成一段流暢且富有邏輯的回答&#xff1b;或者當你上傳一張模糊的照片時&#xff0c;系統可以快速修復并生成高清版本——這一切的…

GO語言學習(16)Gin后端框架

目錄 ??前言 1.什么是前端&#xff1f;什么是后端&#xff1f;&#x1f300; 2.Gin框架介紹 &#x1f337; 3.Gin框架的基本使用 -Hello&#xff0c;World例子&#x1f337; &#x1f33f;入門示例 - Hello&#xff0c;World &#x1f4bb;補充&#xff08;一些常用的網…

深入解析 Git Submodule:從基礎到高級操作指南

深入解析 Git Submodule&#xff1a;從基礎到高級操作指南 一、Git Submodule 是什么&#xff1f; git submodule 是 Git 提供的一個強大功能&#xff0c;允許在一個 Git 倉庫&#xff08;主倉庫&#xff09;中嵌入另一個獨立的 Git 倉庫&#xff08;子模塊&#xff09;。主倉…

電子電氣架構 --- EEA演進與芯片架構轉移

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

如何用deepseek生成流程圖

軟件準備&#xff1a; 在線流程圖【Flowchart Maker & Online Diagram Software】或【process on】 步驟&#xff1a; 1、用 【DeepSeek】生成 結構化內容&#xff08;Mermaid文件&#xff09; 1.1、向deepseek輸入指令&#xff1a;【幫我用mermaind寫出“某某”的具體…

【華為OD技術面試真題 - 技術面】- Java面試題(17)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 文章目錄 華為OD面試真題精選虛擬機分區1. **虛擬磁盤分區**2. **虛擬機的內存分區**3. **CPU分配**4. **虛擬網絡分區**5. **存儲虛擬化和分區**6. **虛擬機分區管理**…

Linux | I.MX6ULL內核及文件系統源碼結構(7)

01 類型 描述 備注 ARM 交叉編譯器 版本&#xff1a;4.9.4 提供軟件工具 Uboot 版本&#xff1a;2016.03 提供源碼 支持LCD顯示&#xff1b;支持網口&#xff1b; 支持 EMMC,NAND FLASH&#xff1b; 支持環境變量修改保存 Linux 內核 版本&#xff1a;4.1.15 提供…

0基礎入門scrapy 框架,獲取豆瓣top250存入mysql

一、基礎教程 創建項目命令 scrapy startproject mySpider --項目名稱 創建爬蟲文件 scrapy genspider itcast "itcast.cn" --自動生成 itcast.py 文件 爬蟲名稱 爬蟲網址 運行爬蟲 scrapy crawl baidu(爬蟲名&#xff09; 使用終端運行太麻煩了&#xff0c;而且…

鴻蒙NEXT小游戲開發:猜小球

1. 引言 “猜小球”是一個經典的益智游戲&#xff0c;通常由一名表演者和多名參與者共同完成。表演者會將一個小球放在一個杯子下面&#xff0c;然后將三個杯子快速地交換位置&#xff0c;參與者則需要猜出最終哪個杯子下面有小球。本文將介紹如何使用HarmonyOS NEXT技術&…

網絡購物謹慎使用手機免密支付功能

在數字經濟蓬勃發展的當下&#xff0c;“免密支付”成為許多人消費時的首選支付方式。 “免密支付”的存在有其合理性。在快節奏的現代生活中&#xff0c;時間愈發珍貴&#xff0c;每節省一秒都可能帶來更高的效率。以日常通勤為例&#xff0c;上班族乘坐交通工具時&#xff0c…

記錄 | Android getWindow().getDecorView().setSystemUiVisibility(...)設置狀態欄屬性

純純的一邊開發一邊學習&#xff0c;是小白是菜鳥&#xff0c;單純的記錄和學習&#xff0c;大神勿噴&#xff0c;理解有錯望指正&#xff5e; getWindow().getDecorView().setSystemUiVisibility(…) 該方法用于控制系統 UI&#xff08;如狀態欄、導航欄&#xff09;的可見性…

java虛擬機---JVM

JVM JVM&#xff0c;也就是 Java 虛擬機&#xff0c;它最主要的作用就是對編譯后的 Java 字節碼文件逐行解釋&#xff0c;翻譯成機器碼指令&#xff0c;并交給對應的操作系統去執行。 JVM 的其他特性有&#xff1a; JVM 可以自動管理內存&#xff0c;通過垃圾回收器回收不再…

VectorBT:使用PyTorch+LSTM訓練和回測股票模型 進階四

VectorBT&#xff1a;使用PyTorchLSTM訓練和回測股票模型 進階四 本方案融合 LSTM 時序預測與動態風險控制。系統采用混合架構&#xff0c;離線訓練構建多尺度特征工程和雙均線策略&#xff0c;結合在線增量更新持續優化模型。技術要點包括三層特征篩選、波動率動態倉位管理、混…

前端中rem,vh,vw

1. rem&#xff08;Root EM&#xff09; 參照對象 基準&#xff1a;相對于 根元素&#xff08;<html>&#xff09;的 font-size 計算。 默認情況下&#xff0c;瀏覽器的根 font-size 為 16px&#xff08;即 1rem 16px&#xff09;&#xff0c;但可通過 CSS 修改&#…

詳解 MySQL 常見的存儲引擎及它們之間的區別

MySQL 支持多種存儲引擎&#xff0c;每種引擎針對不同的應用場景提供了特定的特性和優化。下面是幾種常見的存儲引擎以及它們之間的主要區別&#xff1a; 常見存儲引擎 1. InnoDB&#xff08;重點&#xff09; 事務支持&#xff1a; 完全支持 ACID 事務&#xff0c;確保數據一…

html+css+js 實現一個貪吃蛇小游戲

目錄 游戲簡介 游戲功能與特點 如何玩轉貪吃蛇 游戲設計與實現 HTML結構 JavaScript核心實現 代碼結構&#xff1a; 效果 關于“其他游戲” 游戲簡介 貪吃蛇是一款經典的單人小游戲&#xff0c;玩家通過控制蛇的移動&#xff0c;吃掉食物來增加長度&#xff0c;避免撞…

GLSL(OpenGL 著色器語言)基礎語法

GLSL&#xff08;OpenGL 著色器語言&#xff09;基礎語法 GLSL&#xff08;OpenGL Shading Language&#xff09;是 OpenGL 計算著色器的語言&#xff0c;語法類似于 C 語言&#xff0c;但提供了針對 GPU 的特殊功能&#xff0c;如向量運算和矩陣運算。 著色器的開頭總是要聲明…

ngx_http_core_merge_srv_conf

定義在 src\http\ngx_http_core_module.c static char * ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child) {ngx_http_core_srv_conf_t *prev parent;ngx_http_core_srv_conf_t *conf child;ngx_str_t name;ngx_http_server_name_t…

uni-app:firstUI框架的選擇器Select改造,添加一個搜索的插槽

<fui-select :show"showSiteType" :options"siteTypeList" textKey"dict_label" title"請選擇站點類型" confirm"chooseSiteType" close"onCloseSiteType"><template v-slot:search><view><…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件,如何配置route路由

Debian/Ubuntu的networking的/etc/network/interfaces配置文件,如何配置route路由 在 Debian/Ubuntu 系統中&#xff0c;通過 /etc/network/interfaces 配置文件配置路由&#xff08;靜態路由或默認路由&#xff09;可以通過以下方式實現。以下是詳細配置方法及示例&#xff1…