亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  圖解 Linux 文件系統

圖解 Linux 文件系統

時間:2024-02-12

之前我寫過有關 Linux 文件系統源碼分析的文章,但從源碼角度分析文件系統略顯枯燥(對新手不友好),所以這次主要通過圖文的方式來講解 Linux 文件系統的原理,而不用陷入源代碼的深淵之中。

一、硬盤簡介

在介紹文件系統前,我們先來了解一下 硬盤

眾所周知,內存在斷電后數據就會丟失,所以現代計算機都通過 硬盤 來進行數據存儲。也就是說,硬盤中的數據在斷電后依然能夠保存下來。

現在比較流行的硬盤分為:機械硬盤(HDD)固態硬盤(SSD)。由于本文重點介紹的對象是 文件系統,所以對于硬盤的原理就不進行過多的介紹。下面是 機械硬盤 和 固態硬盤 的對照圖:

我們可以把硬盤想象成一個巨大的數組,而數組的每個元素代表一個數據塊,如下圖:

在 Linux 內核中,每個數據塊定義為 4KB 的大小,所以一個 128GB 的硬盤可以分為 33554432 個數據塊,內核就是以數據塊的編號來對硬盤進行讀寫操作的。

二、什么是文件系統

前面說過,內核是以數據塊的形式來對硬盤進行讀寫的,但是這對人類來說是非常不直觀的,因為我們不可能記住每一個數據塊保存了什么數據。

為了讓用戶在使用上更方便和直觀,Linux 內核抽象出兩個概念來管理硬盤中的數據:文件(File)目錄(Directory)

  • 文件:用于保存數據。

  • 目錄:用于保存文件列表,當然目錄也可以保存目錄。

由于數據是保存在硬盤數據塊中,所以文件只需要記錄哪些數據塊屬于當前文件即可。如下圖所示:

從上圖可以看出,目錄中既可以保存文件,也可以保存目錄。而文件中保存的是屬于當前文件的數據塊編號,所以當讀寫文件時,只需要找到文件對應的數據塊進行讀寫即可。

三、MINIX 文件系統實現

現在,我們以 MINIX 文件系統來詳細介紹文件系統的設計原理。由于 MINIX 文件系統非常簡單,所以適合用于教學使用。

1. MINIX 文件與目錄

在 MINIX 文件系統中,以 minix2_inode 對象來描述一個文件。我們來看看 minix2_inode 的定義:

 struct minix2_inode {     __u16 i_mode;     // 模式     __u16 i_nlinks;   // 鏈接數     __u16 i_uid;      // 所屬用戶UID     __u16 i_gid;      // 所屬組ID     __u32 i_size;     // 文件大小     __u32 i_atime;    // 訪問時間     __u32 i_mtime;    // 修改時間     __u32 i_ctime;    // 創建時間     __u32 i_zone[10]; // 文件數對應的數據塊編號 };

我們需要特別關注 minix2_inode 對象的 i_zone 字段,它就是用來記錄屬于當前文件的數據塊編號。從定義來看,i_zone 是一個用于 10 個元素的整型數組,那么是否就說明 MINIX 的文件只能保存 40 KB 的數據呢?

答案是否定的,因為 MINIX 文件系統將 i_zone 數組分為 4 個部分:前 7 個元素直接指向保存數據的數據塊編號,也就是數據會直接存儲在這些數據塊上,而第 8 個元素是一級間接指向,第 9 個元素是二級間接指向,第 10 個元素是三級間接指向。我們通過下圖來說明這個關系:

通過這種多級指向的方式,一個 MINIX 文件就可以保存超過 40KB 的數據。

有描述文件的對象,那么也應該有描述目錄的對象吧?在 MINIX 文件系統中,目錄也是使用 minix2_inode 對象來描述的。那么怎么區分文件和目錄呢?

minix2_inode 對象中有個 名為i_mode 的字段,它保存著 minix2_inode 對應的類型,普通文件使用 S_IFREG 標志來表示,而目錄使用 S_IFDIR 來表示。所以從本質來看,目錄也是一種特殊的文件。

普通文件的數據塊保存的是文件的數據,那么目錄的數據塊保存的是什么?答案就是文件列表,而文件列表的每個表項使用 minix_dir_entry 對象表示,定義如下:

 struct minix_dir_entry {     __u16 inode;     char name[0]; };
  • inode:當前文件對應的 minix2_inode 對象所處于 inode 數組的索引,我們暫時可以忽略此字段的作用,下面將會介紹。

  • name:用于記錄當前文件的文件名,由于文件名的長度是不固定的,所以這里使用了柔性數組(大小可變的數據)來表示。

我們通過下圖來展示文件與目錄所指向的數據內容的區別:

上圖展示了文件與目錄兩個明顯的區別:

  • 文件的 i_mode 字段設置為 S_IFREG,而目錄的 i_mode 字段設置為 S_IFDIR

  • 文件的 i_zone 字段指向的數據塊保存的是文件的數據,而目錄的 i_zone 字段指向的數據塊保存的是文件列表。

2. MINIX 文件系統格式化

現在,我們基本了解 MINIX 文件系統對文件與目錄的存儲方式了,接下來我們將會介紹 MINIX 文件系統怎么管理硬盤中的文件和目錄,也就是我們常說的 格式化

前面說過,我們可以把硬盤當成一個由數據塊組成的巨大數組,那么 MINIX 文件系統會把硬盤劃分為以下幾個部分,如下圖所示:

下面我們對這幾個部分進行解說:

  • 引導塊:占用一個數據塊,用于操作系統啟動時使用,我們可以忽略。

  • 超級塊:占一個數據塊,用于保存文件系統的信息,MINIX 文件系統使用 minix_super_block 對象來保存文件系統的信息,如 inode位圖 占用幾個數據塊、數據塊位圖 占用幾個數據塊等。

  • inode位圖:占若干個數據塊,用于描述 inode表 中哪些成員已經被使用,每個位表示一個 inode 的使用情況。

  • 數據塊位圖:占若干個數據塊,用于描述 數據塊列表 中哪些成員已經被使用,每個位表示一個數據塊的使用情況。

  • inode表:占若干個數據塊,由多個 minix2_inode 對象組成,每個 minix2_inode 對象表示一個文件或目錄。

  • 數據塊列表:占若干個數據塊,用于保存文件的數據。

上圖就是 MINIX 文件系統在硬盤中的格式化結構,我們先來看看 超級塊 記錄的信息有哪些,超級塊是由 minix_super_block 對象表示,其定義如下:

 struct minix_super_block {     __u16 s_ninodes;       // inode表的元素個數     __u16 s_nzones;        // 數據塊列表的元素個數(v1版本)     __u16 s_imap_blocks;   // inode位圖占用的數據塊數量     __u16 s_zmap_blocks;   // 數據塊位圖占用的數據塊數量     __u16 s_firstdatazone; // 第一個數據塊起始號     __u16 s_log_zone_size;     __u32 s_max_size;      // 文件最大尺寸     __u16 s_magic;         // 魔數(用于識別MINIX文件系統)     __u16 s_state;         // 文件系統狀態     __u32 s_zones;         // 數據塊列表的元素個數(v2版本) };

minix_super_block 每個字段的作用都在注釋中進行了說明,通過 minix_super_block 對象我們可以了解到 MINIX 文件系統的信息。

3. 讀取文件過程

了解了 MINIX 文件系統的結構組織,現在我們介紹一下 MINIX 文件系統讀取文件的過程。

例如,我們要讀取 /home/file.txt 文件的內容,MINIX 文件系統是怎么準確地查找到文件并且讀取其中的內容呢?下面我們進行分步來描述這個過程。

第一步:讀取根目錄

要讀取 /home/file.txt 文件,首先要從根目錄 / 開始,MINIX 文件系統約定根目錄使用 inode表 的第一個元素進行存儲。如下圖:

如上圖所示,根目錄使用 inode表 的第一個元素進行存儲,然后從根目錄的文件列表中查找目錄 home。從上圖可以看出,home 目錄的 inode索引 為 5,表示 home 目錄存儲在 inode表 的第 5 個元素中。

第二步:讀取 home 目錄

知道 home 目錄的 inode索引 為 5 后,再讀取 inode表 的第 5 個元素,然后再從 home 目錄的文件列表中查找文件 file.txt,過程如下圖:

如上圖所示,從 home 目錄的文件列表中找到 file.txt 文件的 inode索引 為 9,所以現在可以通過讀取 inode表 的第 9 個元素來獲得 file.txt 文件對應的 inode 節點。

第三步:讀取 file.txt 文件的內容

現在我們已經知道了 file.txt 文件對應的 inode索引,所以從 inode表 中讀取第 9 個元素即可獲得 file.txt 文件的 inode節點,然后就可以通過 inode節點i_zone 字段所指向的數據塊來讀取文件的內容,如下圖所示:

如上圖所示,通過讀取 inode表 的第 9 個元素獲得 file.txt 文件的 inode節點 后,可以通過 inode節點i_zone 字段所指向的數據塊讀取文件的內容。

另外說明一下,inode位圖數據塊位圖 用于創建文件時,快速查找哪些 inode節點數據塊 沒有被使用的。

四、總結

本文通過 MINIX 這種簡單的文件系統來介紹怎么設計一個文件系統,雖然 Linux 系統有多種文件系統,但其基本思想都是怎么有效地管理硬盤的數據。所以,掌握 MINIX 文件系統的設計對理解其他不同的文件系統有非常大的幫助。

亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产精品一区| 在线看一区二区| 在线欧美日韩国产| 久久疯狂做爰流白浆xx| 国产欧美精品| 久久亚洲视频| 亚洲人成在线免费观看| 欧美精品自拍| 亚洲欧美日韩网| 国产在线拍偷自揄拍精品| 久久久噜噜噜久噜久久 | 国产欧美在线视频| 久久久最新网址| 99综合电影在线视频| 国产欧美日韩不卡免费| 久久久女女女女999久久| 亚洲麻豆视频| 国产综合av| 欧美日韩久久| 久久精品国产清高在天天线 | 亚洲第一精品夜夜躁人人爽 | 国产亚洲亚洲| 欧美精品18+| 欧美一级久久久| 亚洲精品永久免费| 国产综合久久久久久| 欧美四级剧情无删版影片| 久久精品视频网| 亚洲午夜激情网页| 亚洲日本aⅴ片在线观看香蕉| 国产精品久久婷婷六月丁香| 免费看黄裸体一级大秀欧美| 欧美一级欧美一级在线播放| 一本到高清视频免费精品| 尤物视频一区二区| 国产亚洲va综合人人澡精品| 欧美精品在线观看播放| 久久综合色综合88| 欧美一区中文字幕| 亚洲欧美99| 亚洲一区欧美二区| 一本色道久久加勒比88综合| 在线精品视频免费观看| 国产一区二区看久久| 国产精品每日更新| 欧美日韩精品伦理作品在线免费观看 | 国产精自产拍久久久久久| 欧美极品在线观看| 久久一二三国产| 欧美在线视频观看| 欧美一区二区黄| 亚洲欧美综合一区| 亚洲欧美日韩一区二区三区在线观看 | 久久er99精品| 亚洲欧美另类中文字幕| 日韩亚洲视频在线| 亚洲精品一区中文| 亚洲精品国精品久久99热一| 影音先锋久久精品| 亚洲国产第一| 亚洲人成77777在线观看网| 在线看日韩欧美| 亚洲欧洲日本国产| 日韩视频―中文字幕| 夜夜嗨一区二区三区| 久久精品人人做人人爽| 欧美中文字幕视频在线观看| 欧美一级网站| 久久深夜福利| 蜜臀久久99精品久久久久久9| 亚洲在线一区二区三区| 亚洲在线视频一区| 久久成人免费日本黄色| 久久精品国产成人| 男女激情久久| 欧美女同视频| 国产精品美女主播| 国产一区激情| 亚洲精品一二| 亚洲欧美清纯在线制服| 久久精品三级| 欧美美女喷水视频| 国产欧美一区二区精品婷婷| ●精品国产综合乱码久久久久| 亚洲欧洲精品一区二区精品久久久| 亚洲精品一区在线观看| 午夜精品一区二区三区四区| 久久香蕉国产线看观看av| 欧美日韩成人在线观看| 国产美女精品人人做人人爽| 亚洲高清电影| 亚洲欧美一区二区原创| 久热精品视频| 国产精品久久久久婷婷| 精品99一区二区三区| 亚洲图色在线| 美乳少妇欧美精品| 国产精品素人视频| 亚洲国产影院| 久久精品欧美| 国产精品美女久久福利网站| 1024精品一区二区三区| 午夜精品久久久久99热蜜桃导演| 老司机午夜精品视频在线观看| 欧美日韩卡一卡二| 韩国三级电影一区二区| 一本色道久久综合一区| 久久久综合激的五月天| 国产精品一二三四区| 91久久精品国产91久久性色| 欧美一区二区视频观看视频| 欧美精品色一区二区三区| 国产一区二区三区丝袜| 亚洲一区视频| 欧美色123| 日韩视频在线观看| 久久综合一区二区三区| 国产日韩亚洲欧美| 亚洲尤物在线视频观看| 欧美久色视频| 亚洲精品免费在线| 久久精品中文字幕免费mv| 欧美性猛交一区二区三区精品| 亚洲高清不卡| 久久亚洲综合网| 国产精品亚洲产品| 亚洲精品在线免费观看视频| 狂野欧美激情性xxxx| 国产精品色网| 亚洲欧美日韩国产中文| 欧美日韩视频在线一区二区| 亚洲电影免费观看高清完整版在线 | 久久久久高清| 国产精品永久免费观看| 一本久道久久综合狠狠爱| 欧美电影在线观看| 亚洲高清一区二区三区| 久久视频在线视频| 国产一区二区三区在线观看免费| 中文网丁香综合网| 欧美日韩一区二区三区四区五区| 欧美伊人久久| 一区二区三区在线视频免费观看| 久久乐国产精品| 激情综合色综合久久综合| 久久九九99| 亚洲婷婷在线| 欧美成人久久| 亚洲精品免费网站| 99在线热播精品免费| 欧美伦理91i| 99国产精品久久久久久久| 亚洲最新在线视频| 国产精品视频自拍| 久久深夜福利免费观看| 欧美日韩成人在线视频| 亚洲视频精选| 国产一区二区三区精品久久久| 久久香蕉国产线看观看网| 亚洲精品久久久久久久久久久久久 | 亚洲女人天堂av| 国产精品日韩欧美一区二区三区| 亚洲欧美另类久久久精品2019| 国产美女精品视频免费观看| 欧美日韩综合| 久久久久久电影| 亚洲精品视频一区二区三区| 久久精品欧美| 久久久久久尹人网香蕉| 国产精品最新自拍| 亚洲成人资源| 久久精品综合网| 国产亚洲欧美色| 99国产精品久久久久久久久久 | 欧美午夜性色大片在线观看| 亚洲欧美成人网| 久久国产精彩视频| 国产精品免费电影| 亚洲欧洲日本在线| 一区二区成人精品| 在线免费不卡视频| 怡红院精品视频| 亚洲国产精品久久精品怡红院| 国产欧美婷婷中文| 欧美日韩国产经典色站一区二区三区| 亚洲欧美日韩一区二区在线| 欧美成人午夜剧场免费观看| 91久久精品视频| 精品成人一区二区三区| 好吊妞**欧美| 欧美日韩国产高清视频| 欧美a级在线| 欧美日韩中文字幕| 亚洲经典三级| 亚洲永久免费视频| 国产主播在线一区| 亚洲一区二区三区三| 亚洲综合清纯丝袜自拍| 在线视频你懂得一区| 黄色av日韩|