Linux -- 文件【下】

目錄

一、EXT2文件系統

1、宏觀認識

2、塊組內部構成

2.1?Data Block

2.2?i節點表(Inode Table)

2.3?塊位圖(Block Bitmap)

2.4?inode位圖(Inode Bitmap)?

2.5?GDT(Group Descriptor Table)?

2.6?超級塊(Super Block)

3、目錄與文件名

4、路徑解析

5、路徑緩存

6、掛載分區?

7、文件名與inode映射實驗

8、inode和datablock映射

9、 問題總結

二、軟硬鏈接?

1、軟連接

2、硬鏈接

三、文件時間-ACM

四、文件系統總結?


一、EXT2文件系統

1、宏觀認識

# 所有的準備?作都已經做完,是時候認識下?件系統了。我們想要在硬盤上儲?件,必須先把硬盤格式化為某種格式的?件系統,才能存儲?件。?件系統的?的就是組織和管理硬盤中的?件。

# 在Linux 系統中,最常?的是 ext2 系列的?件系統。其早期版本為 ext2,后來?發展出 ext3ext4ext3 ext4 雖然對 ext2 進?了增強,但是其核?設計并沒有發?變化,我們仍是以較?的 ext2 作為演示對象。

#?ext2?件系統將整個分區劃分成若?個同樣??的塊組 (Block Group),如下圖所?。只要能管理?個分區就能管理所有分區,也就能管理所有磁盤?件。

# 上圖中啟動塊(Boot Block/Sector)的??是確定的,為1KB,由PC標準規定,?來存儲磁盤分區信息和啟動信息,任何?件系統都不能修改啟動塊。啟動塊之后才是ext2?件系統的開始。

?#?ext2?件系統會根據分區的??劃分為數個Block Group。?每個Block Group都有著相同的結構組成。

2、塊組內部構成

2.1?Data Block

#?數據區:存放?件內容,也就是?個?個的Block。根據不同的?件類型有以下?種情況:

  • 對于普通?件,?件的數據存儲在數據塊中。
  • 對于?錄,該?錄下的所有?件名和?錄名存儲在所在?錄的數據塊中,除了?件名外,ls -l命令看到的其它信息保存在該?件的inode中。
  • Block 號按照分區劃分,不可跨分區

2.2?i節點表(Inode Table)

  • 存放文件屬性如文件大小,所有者,最近修改時間等
  • 當前分組所有inode屬性的集合
  • inode編號以分區為單位,整體劃分,不可跨分區

2.3?塊位圖(Block Bitmap)

  • Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用。

2.4?inode位圖(Inode Bitmap)?

  • 每個bit表示一個inode是否空閑可用。

2.5?GDT(Group Descriptor Table)?

#?塊組描述符表,描述塊組屬性信息,整個分區分成多少個塊組就對應有多少個塊組描述符。每個塊組描述符存儲一個塊組的描述信息,如在這個塊組中從哪里開始是inode Table,從哪里開始是Data Blocks,空間的inode和數據塊還有多少個等等。塊組描述符在每個塊組的開頭都有一份拷貝。

  • 塊組內的inode表的塊位置
  • 塊組內的塊位圖和inode位圖的塊位置
  • 塊組內已使用和空閑的塊數對inode
  • 塊組的塊分配策略信息
// 磁盤級blockgroup的數據結構
struct ext2_group_desc
{__le32 bg_block_bitmap;  /* Blocks bitmap block */__le32 bg_inode_bitmap;  /* Inodes bitmap block */__le16 bg_inode_table;   /* Inodes table block */__le16 bg_free_blocks_count;/* Free blocks count */__le16 bg_free_inodes_count;/* Free inodes count */__le16 bg_used_dirs_count;/* Directories count */__le16 bg_pad;__le16 bg_reserved[3];
};

2.6?超級塊(Super Block)

#?存放?件系統本?的結構信息,描述整個分區的?件系統信息。記錄的信息主要有:bolckinode的總量,未使?的blockinode的數量,?個blockinode的??,最近?次掛載的時間,最近?次寫?數據的時間,最近?次檢驗磁盤的時間等其他?件系統的相關信息。Super Block的信息被破壞,可以說整個?件系統結構就被破壞了。

  • 文件系統的大小(總塊數)
  • 每個塊的大小
  • inode的大小和數量
  • 塊組的數量

#?超級塊在每個塊組的開頭都有?份拷?(第?個塊組必須有,后?的塊組可以沒有)。 為了保證?件系統在磁盤部分扇區出現物理問題的情況下還能正常?作,就必須保證?件系統的super block信息在這種情況下也能正常訪問。所以?個?件系統的super block會在多個block group中進?備份,這些super block區域的數據保持?致。

3、目錄與文件名

?#?問題:那目錄呢?目錄如何存儲的呢?

# 目錄也是按照前面我們說的方式存儲的,也就是說目錄也有自己的inode,無非就是在inode結構體里面使用type標記位來區分,不管是目錄還是文件,其他都和文件一樣。

# 那目錄的內容存儲什么啊?即目錄文件的數據塊存儲什么呢?答案是文件名->inode映射關系

#?所以在磁盤中保存文件就沒有目錄的概念,都是inode和數據,具體是文件還是目錄,可以通過inode區分。因為磁盤只認inode,所以我們今天打開一個code.cc一定是先找到文件所處的目錄然后根據code.cc,查找目錄映射關系的inode,再根據inode確定分區和分組,加載inode屬性內容。此時我們Is就看到文件屬性!

#?所以,訪問?件,必須打開當前?錄,根據?件名,獲得對應的inode號,然后進??件訪問。訪問?件必須要知道當前?作?錄,本質是必須能打開當前?作?錄?件,查看?錄?件的內容!

4、路徑解析

5、路徑緩存

?

6、掛載分區?

# 問題:我們有一個分區->格式化->能否使用這個分區了?答案是不能。我們可以通過Is /dev/vda* -l查看云服務器的磁盤,可以看到我們云服務器有3個/dev/vad分區,并且我們無法直接進入這個分區。為什么?因為我們的分區需要和一個特定目錄進行關聯,之后進入這個目錄就相當于進入這個分區。這也叫做把目錄和分區進行掛載!?接下來我們做一個試驗來理解:

# 這里我們命令相當于從/dev/zero這個文件里面讀取內容,然后把內容設置為0,寫入到指定文件disk.img里面,寫入塊大小為1M。分區就是一個磁盤空間,形成一個文件就相當于形成一個磁盤空間!所以這里我們就有一個disk.img的5M的文件!?

# 然后我們使用mkfs.ext4?命令格式化分區內容為ext4文件系統,寫入文件系統本質就是清空兩個位圖,然后給分區分組。可以看到我們分配了1280個inode、1280個blocks。此時他已經被我們格式化為一塊盤了。

# 然后此時我們使用 df-h 命令查看掛載情況,同時還有文件系統的使用率、分區大小等。發現我們的/dev/vda3 和根目錄掛載了,所以我只要登錄操作系統就會處在/dev/vda3分區。

# 然后我們可以使用 mount 命令,把分區掛載到 /mnt/mydisk 目錄里面。此時我們 df-h 查看,發現確實已經掛載上了。?

?#?所以此時我們在/mnt/mydisk 創建文件,就是在disk.img所在的分區里面創建文件了。

# 我們要取消掛載,就可以使用 umont 命令,然后再 rm disk.img 即可。

??

#?我們已經能夠根據inode號在指定分區找?件了,也已經能根據?錄?件內容,找指定的inode了,在指定的分區內,我們可以為所欲為了。可是:

#?問題:inode不是不能跨分區嗎?Linux不是可以有多個分區嗎?我怎么知道我在哪?個分區???

# 所以結論就是:

7、文件名與inode映射實驗

# 我們說目錄在磁盤上的數據塊保存的是文件名和inode的映射關系,現在我們寫了一份代碼,先調用opendir 打開一個文件目錄,然后調用 readdir 就可以使用一個文件的描述符,然后返回一個結構體,這個結構體包含目錄中文件的屬性相關信息,然后把里面包含的文件名和inode映射關系打印出來?。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char *argv[]) 
{if (argc != 2) {fprintf(stderr, "Usage: %s <directory>\n", argv[0]);exit(EXIT_FAILURE);}DIR *dir = opendir(argv[1]); // 系統調?,??查閱if (!dir) {perror("opendir");exit(EXIT_FAILURE);}struct dirent *entry;while ((entry = readdir(dir)) != NULL) { // 系統調?,??查閱// Skip the "." and ".." directory entriesif (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {continue;}printf("Filename: %s, Inode: %lu\n", entry->d_name, (unsigned long)entry->d_ino);}closedir(dir);return 0;
}

#?我們發現確實和我們 Is -li 查看到的文件名和inode是一樣的!說明我們的目錄內容就是保存文件名和inode的映射關系!?

8、inode和datablock映射

#?inode內部存在?__le32 i_block[EXT2_N_BLOCKS]; /* Pointers to blocks */,EXT2_N_BLOCKS =15,就是用來進行inodeblock映射的。這樣文件=內容+屬性,就都能找到了。

#?我們在ext2_inode上可以發現存在一個i_blocks數組,這個數組的大小是15,這個就是我們說的inode和數據塊的映射數組!

# 如果我們的數組只填寫數據塊編號的15*4kb=60kb,而平時我們的隨便一個文件都是M為單位的,60kb根本不夠看啊! 所以這個數組只有前12個位置存儲數據塊編號映射關系,后面三個存儲一級、二級、三級塊索引指針?。

#?一級索引指針指向一個4kb的block,這4kb的block不是直接存儲文件數據,而是存儲文件數據塊的地址。假設指針大小為4字節,就有了4kb/4字節=1024個數據塊索引。二級索引指向的就是一級索引,以此類推所以我們就可以擴展我們保存的數據塊索引!

9、 問題總結

#?通過上面的學習,我們就可以回答一下幾個問題:?

1. 如何理解創建一個空文件?

  1. 遍歷inode Bitmap,找到比特位為0的位置,申請一個未被使用的inode
  2. inode表中找到對應的inode, 并將文件的屬性信息填到inode結構當中。
  3. 將該文件的文件名和inode指針添加到目錄文件的數據塊當中。

2. 如何理解向文件寫入信息?

  1. 通過文件的inode編號找到對應的inode結構。
  2. 通過inode結構找到存儲該文件內容的數據塊,并將數據寫入數據塊。
  3. 若不存在數據塊或者申請的數據塊已經寫滿了,就需要遍歷block Bitmap找到一個空的塊號,并在數據區當中找到對應的空閑塊,再把數據寫入到數據塊當中,最后還需要建立數據塊和inode結構的對應關系。

3. 刪除文件做了些什么?

  1. 將該文件對應的inodeInode map當中設置為無效。
  2. 將該文件申請過的Data BlockBlock map當中置為無效。

# 這也是我們為什么刪除一個軟件的速度比下載同一個軟件的速度快的多的原因。當然因為文件內容并沒有被刪除,所以我們可以在對應內容被其他文件內容覆蓋之前,通過一些技術手段復原已刪除文件。?

4. 如何理解目錄?

目錄也是一種文件,是文件就有對應的文件屬性與文件內容,其中對應的文件屬性就是我們的inode存儲的就是目錄的大小,目錄的擁有者等。而對應的文件內容存儲的就是該目錄下的文件名以及對應文件的inode指針。


二、軟硬鏈接?

1、軟連接

# 軟鏈接又叫做符號鏈接,軟鏈接文件是一個獨立的文件,該文件有自己的inode號,但是該文件只包含了源文件的路徑名,所以軟鏈接文件一般就是對應路徑文件的一種快捷訪問方式。其中在Windows系統中,我們桌面上軟件圖標就是訪問對應程序的快捷方式,本質其實就是一個軟連接文件。

#?在Linux中,我們可以通過指令ln -s 文件名 軟鏈接名設置軟連接:

# 我們向code.c追加重定向,發現通過軟連接也可以查看code.c的內容,所以軟連接其實就是類似我們的快捷方式!

# 通過快捷方式就可以找到我們的可執行程序,而我們的快捷方式是一個獨立的文件,所以我們刪除快捷方式并沒有真正刪除軟件,所以我們軟連接也是一個獨立的文件,所以我們可以看到code.ccode-softinode不同!

# 并且我們也能通過指令unlink 軟連接名取消對應的軟連接,并且如果一旦刪除軟連接所指向的文件,那么該軟連接文件也將毫無意義。?

2、硬鏈接

#?硬鏈接文件就是源文件的一個別名,它與源文件之間具有相同的inode大小。一旦為某個文件建立硬鏈接,那么對應的硬鏈接數就會加1。

#?在Linux中,我們可以通過指令ln 文件名 硬鏈接名建立對應的硬鏈接,同樣我們也能通過unlink 硬鏈接名取消對應的硬鏈接。

# 硬鏈接沒有獨立的inode,并不是一個獨立的文件, 本質是在特定的目錄下,添加一個文件名和inode編號的映射關系。?

??


三、文件時間-ACM

#?在Linux中,我們可以使用指令stat 文件名來查看對應文件的信息。

# 以下是對應關于文件時間的信息:

  • Access: 文件最后被訪問的時間。
  • Modify: 文件內容最后的修改時間。
  • Change: 文件屬性最后的修改時間。?

# 當我們修改文件內容時,文件的大小一般也會隨之改變,所以一般情況下Modify的改變會影響Change一起改變,但修改文件屬性一般不會影響到文件內容,所以一般情況下Change的改變不會影響Modify的改變。

# 我們若是想將文件的這三個時間都更新到最新狀態,可以使用指令touch 文件名


四、文件系統總結?

#?下???張圖總結,主要想從不同?度說明:

?

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

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

相關文章

谷歌手機刷機和面具ROOT保姆級別教程

#比較常用的谷歌輸入root面具教程,逆向工程師必修課程# 所需工具與材料清單 真機設備 推薦使用 Google Pixel 4 或其他兼容設備&#xff0c;確保硬件支持刷機操作。 ADB 環境配置 通過安裝 Android Studio 自動配置 ADB 和 Fastboot 工具。安裝完成后&#xff0c;需在系統環境…

平衡二叉搜索樹 - 紅黑樹詳解

文章目錄一、紅黑樹概念引申問題二、紅黑樹操作一、紅黑樹概念 紅黑樹是一棵二叉搜索樹&#xff0c;它在每個節點上增加了一個存儲位用來表示節點顏色(紅色或者黑色)&#xff0c;紅黑樹通過約束顏色&#xff0c;可以保證最長路徑不超過最短路徑的兩倍&#xff0c;因而近似平衡…

從0開始跟小甲魚C語言視頻使用linux一步步學習C語言(持續更新)8.14

第十六天 第五十二&#xff0c;五十三&#xff0c;五十四&#xff0c;五十五和五十六集 第五十二集 文件包含 一個include命令只能指定一個被包含文件 文件允許嵌套&#xff0c;就是一個被包含的文件可以包含另一個文件。 文件名可以用尖括號或者雙引號括起來 但是兩種的查找方…

B+樹索引分析:單表最大存儲記錄數

在現代數據庫設計中&#xff0c;隨著數據量的增加&#xff0c;如何有效地管理和優化數據庫成為了一個關鍵問題。根據阿里巴巴開發手冊的標準&#xff0c;當一張表預計在三年內的數據量超過500萬條或者2GB時&#xff0c;就應該考慮實施分庫分表策略 Mysql B樹索引介紹 及 頁內儲…

三、memblock 內存分配器

兩個問題&#xff1a; 1、系統是怎么知道物理內存的&#xff1f;linux內存管理學習&#xff08;1&#xff09;&#xff1a;物理內存探測 2、在內存管理真正初始化之前&#xff0c;內核的代碼執行需要分配內存該怎么處理&#xff1f; 在Linux內核啟動初期&#xff0c;完整的內存…

Python 桌面應用形態后臺管理系統的技術選型與方案報告

下面是一份面向“Python 桌面應用形態的后臺管理系統”的技術選型與方案報告。我把假設前提→總體架構→客戶端技術選型→服務端與數據層→基礎設施與安全→交付與運維→質量保障→里程碑計劃→風險與對策→最小可行棧逐層給出。 一、前置假設 & 非功能目標 業務假設 典型…

Winsows系統去除右鍵文件顯示的快捷列表

前言&#xff1a;今天重做了電腦系統&#xff0c;安裝的是純凈版的系統。然后手動指定D盤安裝了下列軟件。&#xff08;QQ&#xff0c;迅雷&#xff0c;百度網盤&#xff0c;搜狗輸入法&#xff0c;驅動精靈&#xff09;然后我右鍵點擊桌面的軟件快捷方式&#xff0c;出現了一排…

【Go】Gin 超時中間件的坑:fatal error: concurrent map writes

Gin 社區超時中間件的坑&#xff1a;導致線上 Pod 異常重啟 在最近的項目中&#xff0c;我們遇到了因為 Gin 超時中間件&#xff08;timeout&#xff09; 引發的生產事故&#xff1a;Pod 異常退出并重啟。 問題現場 pod無故重啟&#xff0c;抓取標準輸出日志&#xff0c;問題…

數據結構:用數組實現隊列(Implementing Queue Using Array)

目錄 第1步&#xff1a;設計藍圖 (The Struct) 第2步&#xff1a;隊列的誕生 (創建與初始化) 第3步&#xff1a;狀態檢查 (判滿與判空) 第4步&#xff1a;核心操作 (入隊與出隊) 入隊 (Enqueue) 出隊 (Dequeue) 第5步&#xff1a;善后工作 (銷毀隊列) 現在&#xff0c;我…

Boost庫核心組件與應用

一、BOOST 庫簡介&#xff1a;C 開發者的 “擴展工具集” 在 C 編程領域&#xff0c;除了標準庫&#xff08;STL&#xff09;外&#xff0c;BOOST 庫是最具影響力的第三方庫之一。它由全球數百位開發者共同維護&#xff0c;包含超過 160 個高質量的組件&#xff0c;覆蓋從基礎…

機器學習 [白板推導](十二)[卡曼濾波、粒子濾波]

15. 線性動態系統&#xff08;卡曼濾波&#xff0c;Kalman Filter&#xff09; 15.1. 概述 15.1.1. 背景介紹 變量隨時間變化的系統叫做動態系統&#xff0c;其中隱變量取值離散的是隱馬爾可夫模型&#xff08;HMM&#xff09;&#xff0c;而隱變量取值連續的分為線性動態系統…

RH134 訪問網絡附加存儲知識點

1. NFS 的主要功能是什么&#xff1f;答&#xff1a;NFS是一種分布式文件系統協議&#xff0c;主要功能包括&#xff1a;允許遠程計算機通過網絡訪問共享文件。 實現文件系統在客戶端和服務器之間的透明訪問。支持文件的共享、讀取和寫入&#xff0c;使得多個 …

組合模式及優化

組合模式是一種結構型設計模式&#xff0c;其核心思想是將對象組合成樹形結構&#xff0c;以表示“部分-整體”的層次關系&#xff0c;使得用戶對單個對象和組合對象的使用具有一致性。 一、介紹 核心角色 組合模式包含以下3個關鍵角色&#xff1a; 抽象組件&#xff08;Compon…

【wmi異常】關于taskkill命令提示“錯誤:找不到” 以及無法正常獲取設備機器碼的處理辦法

記錄一下我的解決方案。 我先查閱了這篇博客&#xff1a;https://blog.csdn.net/qq_45698181/article/details/138957277 發現他寫的批處理不知怎么執行不了&#xff0c;后來問了ai又可以執行了&#xff0c;估計是csdn防盜版格式問題 這里寫一下我跟ai的對話&#xff0c;大家可…

制造裝配、倉儲搬運、快遞裝卸皆適配!MinkTec 彎曲形變傳感器助力,讓人體工學改變勞動生活

【導語】Minktec 最新實驗顯示&#xff1a;將Minktec 柔性彎曲形變傳感器FlexTail 貼于受試者背部&#xff0c;記錄 1 分鐘內從洗碗機取餐具的動作&#xff0c;結合配套的flexlib -專用Python庫分析&#xff0c;不僅量化出 “越低越傷腰” 的結論&#xff0c;更為制造裝配、物流…

Nginx蜘蛛請求智能分流:精準識別爬蟲并轉發SEO渲染服務

> 一招解決搜索引擎爬蟲無法解析現代前端框架的痛點,提升網站收錄率與SEO排名! **痛點場景**:你的網站采用Vue/React等前端框架構建,頁面內容依賴JavaScript動態渲染。搜索引擎爬蟲訪問時,只能抓取到空HTML骨架,無法獲取真實內容,導致網站收錄率低、SEO效果差。 --…

鏈表。。。

目錄 5.1 鏈表的結點 5.2 插入 5.3 鏈表長度 5.4 查找 5.5 指定位置刪除 5.6 代碼 5.1 鏈表的結點 一個結點包括&#xff1a;值和指向下一個結點的指針。 package com.qcby.鏈表;public class Node {int value;Node next;public Node(int val){valueval;}Overridepublic…

私人AI搜索新突破:3步本地部署Dify+Ollama+QwQ,搜索能力MAX

1.安裝Docker容器 本地部署Dify要先安裝Docker桌面版&#xff0c;跟Ollama一樣簡單&#xff0c;也是去官網下載對應版本文件&#xff0c;直接安裝就OK。 2&#xff1a;安裝Dify 安裝 Dify 簡單的方式就是git clone&#xff0c;復制其github地址github.com/langgenius/dify&am…

(2-10-1)MyBatis的基礎與基本使用

目錄 0.前置小節 1. MyBatis 框架介紹 1.1 軟件開發中的框架 1.2 使用框架的好處 1.3 SSM 開發框架 1.4 什么是 MyBatis 1.5 MyBatis 的開發流程 2. MyBatis 的開發流程 2.0 MyBatis的工作流程 2.1 引入 MyBatis 依賴 00.base(目錄、pom、單元測試、Junit4) 01.Cal…

StarRocks集群部署

Starrocks 是一款基于 MPP 架構的高性能實時分析型數據庫&#xff0c;專為 OLAP&#xff08;聯機分析處理&#xff09;場景 設計&#xff0c;尤其擅長處理海量數據的實時分析、復雜查詢和多維統計。 硬件 CPU&#xff1a;StarRocks依靠AVX2指令集充分發揮其矢量化能力。因此&am…