偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

圖解 Linux 文件系統(tǒng)

系統(tǒng) Linux
眾所周知,內(nèi)存在斷電后數(shù)據(jù)就會(huì)丟失,所以現(xiàn)代計(jì)算機(jī)都通過(guò) 硬盤(pán) 來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)。也就是說(shuō),硬盤(pán)中的數(shù)據(jù)在斷電后依然能夠保存下來(lái)。

[[392353]]

本文轉(zhuǎn)載自微信公眾號(hào)「Linux內(nèi)核那些事」,作者songsong001 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Linux內(nèi)核那些事公眾號(hào)。

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

一、硬盤(pán)簡(jiǎn)介

在介紹文件系統(tǒng)前,我們先來(lái)了解一下 硬盤(pán)。

眾所周知,內(nèi)存在斷電后數(shù)據(jù)就會(huì)丟失,所以現(xiàn)代計(jì)算機(jī)都通過(guò) 硬盤(pán) 來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ)。也就是說(shuō),硬盤(pán)中的數(shù)據(jù)在斷電后依然能夠保存下來(lái)。

現(xiàn)在比較流行的硬盤(pán)分為:機(jī)械硬盤(pán)(HDD) 和 固態(tài)硬盤(pán)(SSD)。由于本文重點(diǎn)介紹的對(duì)象是 文件系統(tǒng),所以對(duì)于硬盤(pán)的原理就不進(jìn)行過(guò)多的介紹。下面是 機(jī)械硬盤(pán) 和 固態(tài)硬盤(pán) 的對(duì)照?qǐng)D:

 

我們可以把硬盤(pán)想象成一個(gè)巨大的數(shù)組,而數(shù)組的每個(gè)元素代表一個(gè)數(shù)據(jù)塊,如下圖:

 

在 Linux 內(nèi)核中,每個(gè)數(shù)據(jù)塊定義為 4KB 的大小,所以一個(gè) 128GB 的硬盤(pán)可以分為 33554432 個(gè)數(shù)據(jù)塊,內(nèi)核就是以數(shù)據(jù)塊的編號(hào)來(lái)對(duì)硬盤(pán)進(jìn)行讀寫(xiě)操作的。

二、什么是文件系統(tǒng)

前面說(shuō)過(guò),內(nèi)核是以數(shù)據(jù)塊的形式來(lái)對(duì)硬盤(pán)進(jìn)行讀寫(xiě)的,但是這對(duì)人類(lèi)來(lái)說(shuō)是非常不直觀的,因?yàn)槲覀儾豢赡苡涀∶恳粋€(gè)數(shù)據(jù)塊保存了什么數(shù)據(jù)。

為了讓用戶在使用上更方便和直觀,Linux 內(nèi)核抽象出兩個(gè)概念來(lái)管理硬盤(pán)中的數(shù)據(jù):文件(File) 和 目錄(Directory)。

文件:用于保存數(shù)據(jù)。

目錄:用于保存文件列表,當(dāng)然目錄也可以保存目錄。

由于數(shù)據(jù)是保存在硬盤(pán)數(shù)據(jù)塊中,所以文件只需要記錄哪些數(shù)據(jù)塊屬于當(dāng)前文件即可。如下圖所示:

 

從上圖可以看出,目錄中既可以保存文件,也可以保存目錄。而文件中保存的是屬于當(dāng)前文件的數(shù)據(jù)塊編號(hào),所以當(dāng)讀寫(xiě)文件時(shí),只需要找到文件對(duì)應(yīng)的數(shù)據(jù)塊進(jìn)行讀寫(xiě)即可。

三、MINIX 文件系統(tǒng)實(shí)現(xiàn)

現(xiàn)在,我們以 MINIX 文件系統(tǒng)來(lái)詳細(xì)介紹文件系統(tǒng)的設(shè)計(jì)原理。由于 MINIX 文件系統(tǒng)非常簡(jiǎn)單,所以適合用于教學(xué)使用。

1. MINIX 文件與目錄

在 MINIX 文件系統(tǒng)中,以 minix2_inode 對(duì)象來(lái)描述一個(gè)文件。我們來(lái)看看 minix2_inode 的定義:

  1. struct minix2_inode { 
  2.      __u16 i_mode;     // 模式 
  3.      __u16 i_nlinks;   // 鏈接數(shù) 
  4.      __u16 i_uid;      // 所屬用戶UID 
  5.      __u16 i_gid;      // 所屬組ID 
  6.      __u32 i_size;     // 文件大小 
  7.      __u32 i_atime;    // 訪問(wèn)時(shí)間 
  8.      __u32 i_mtime;    // 修改時(shí)間 
  9.      __u32 i_ctime;    // 創(chuàng)建時(shí)間 
  10.      __u32 i_zone[10]; // 文件數(shù)對(duì)應(yīng)的數(shù)據(jù)塊編號(hào) 
  11.  }; 

我們需要特別關(guān)注 minix2_inode 對(duì)象的 i_zone 字段,它就是用來(lái)記錄屬于當(dāng)前文件的數(shù)據(jù)塊編號(hào)。從定義來(lái)看,i_zone 是一個(gè)用于 10 個(gè)元素的整型數(shù)組,那么是否就說(shuō)明 MINIX 的文件只能保存 40 KB 的數(shù)據(jù)呢?

答案是否定的,因?yàn)?MINIX 文件系統(tǒng)將 i_zone 數(shù)組分為 4 個(gè)部分:前 7 個(gè)元素直接指向保存數(shù)據(jù)的數(shù)據(jù)塊編號(hào),也就是數(shù)據(jù)會(huì)直接存儲(chǔ)在這些數(shù)據(jù)塊上,而第 8 個(gè)元素是一級(jí)間接指向,第 9 個(gè)元素是二級(jí)間接指向,第 10 個(gè)元素是三級(jí)間接指向。我們通過(guò)下圖來(lái)說(shuō)明這個(gè)關(guān)系:

 

通過(guò)這種多級(jí)指向的方式,一個(gè) MINIX 文件就可以保存超過(guò) 40KB 的數(shù)據(jù)。

有描述文件的對(duì)象,那么也應(yīng)該有描述目錄的對(duì)象吧?在 MINIX 文件系統(tǒng)中,目錄也是使用 minix2_inode 對(duì)象來(lái)描述的。那么怎么區(qū)分文件和目錄呢?

在 minix2_inode 對(duì)象中有個(gè) 名為i_mode 的字段,它保存著 minix2_inode 對(duì)應(yīng)的類(lèi)型,普通文件使用 S_IFREG 標(biāo)志來(lái)表示,而目錄使用 S_IFDIR 來(lái)表示。所以從本質(zhì)來(lái)看,目錄也是一種特殊的文件。

普通文件的數(shù)據(jù)塊保存的是文件的數(shù)據(jù),那么目錄的數(shù)據(jù)塊保存的是什么?答案就是文件列表,而文件列表的每個(gè)表項(xiàng)使用 minix_dir_entry 對(duì)象表示,定義如下:

  1. struct minix_dir_entry { 
  2.      __u16 inode; 
  3.      char name[0]; 
  4.  }; 

inode:當(dāng)前文件對(duì)應(yīng)的 minix2_inode 對(duì)象所處于 inode 數(shù)組的索引,我們暫時(shí)可以忽略此字段的作用,下面將會(huì)介紹。

name:用于記錄當(dāng)前文件的文件名,由于文件名的長(zhǎng)度是不固定的,所以這里使用了柔性數(shù)組(大小可變的數(shù)據(jù))來(lái)表示。

我們通過(guò)下圖來(lái)展示文件與目錄所指向的數(shù)據(jù)內(nèi)容的區(qū)別:

 

上圖展示了文件與目錄兩個(gè)明顯的區(qū)別:

  • 文件的 i_mode 字段設(shè)置為 S_IFREG,而目錄的 i_mode 字段設(shè)置為 S_IFDIR。
  • 文件的 i_zone 字段指向的數(shù)據(jù)塊保存的是文件的數(shù)據(jù),而目錄的 i_zone 字段指向的數(shù)據(jù)塊保存的是文件列表。

2. MINIX 文件系統(tǒng)格式化

現(xiàn)在,我們基本了解 MINIX 文件系統(tǒng)對(duì)文件與目錄的存儲(chǔ)方式了,接下來(lái)我們將會(huì)介紹 MINIX 文件系統(tǒng)怎么管理硬盤(pán)中的文件和目錄,也就是我們常說(shuō)的 格式化。

前面說(shuō)過(guò),我們可以把硬盤(pán)當(dāng)成一個(gè)由數(shù)據(jù)塊組成的巨大數(shù)組,那么 MINIX 文件系統(tǒng)會(huì)把硬盤(pán)劃分為以下幾個(gè)部分,如下圖所示:

 

下面我們對(duì)這幾個(gè)部分進(jìn)行解說(shuō):

  • 引導(dǎo)塊:占用一個(gè)數(shù)據(jù)塊,用于操作系統(tǒng)啟動(dòng)時(shí)使用,我們可以忽略。
  • 超級(jí)塊:占用一個(gè)數(shù)據(jù)塊,用于保存文件系統(tǒng)的信息,MINIX 文件系統(tǒng)使用 minix_super_block 對(duì)象來(lái)保存文件系統(tǒng)的信息,如 inode位圖 占用幾個(gè)數(shù)據(jù)塊、數(shù)據(jù)塊位圖 占用幾個(gè)數(shù)據(jù)塊等。
  • inode位圖:占用若干個(gè)數(shù)據(jù)塊,用于描述 inode表 中哪些成員已經(jīng)被使用,每個(gè)位表示一個(gè) inode 的使用情況。
  • 數(shù)據(jù)塊位圖:占用若干個(gè)數(shù)據(jù)塊,用于描述 數(shù)據(jù)塊列表 中哪些成員已經(jīng)被使用,每個(gè)位表示一個(gè)數(shù)據(jù)塊的使用情況。
  • inode表:占用若干個(gè)數(shù)據(jù)塊,由多個(gè) minix2_inode 對(duì)象組成,每個(gè) minix2_inode 對(duì)象表示一個(gè)文件或目錄。
  • 數(shù)據(jù)塊列表:占用若干個(gè)數(shù)據(jù)塊,用于保存文件的數(shù)據(jù)。

上圖就是 MINIX 文件系統(tǒng)在硬盤(pán)中的格式化結(jié)構(gòu),我們先來(lái)看看 超級(jí)塊 記錄的信息有哪些,超級(jí)塊是由 minix_super_block 對(duì)象表示,其定義如下:

  1. struct minix_super_block { 
  2.      __u16 s_ninodes;       // inode表的元素個(gè)數(shù) 
  3.      __u16 s_nzones;        // 數(shù)據(jù)塊列表的元素個(gè)數(shù)(v1版本) 
  4.      __u16 s_imap_blocks;   // inode位圖占用的數(shù)據(jù)塊數(shù)量 
  5.      __u16 s_zmap_blocks;   // 數(shù)據(jù)塊位圖占用的數(shù)據(jù)塊數(shù)量 
  6.      __u16 s_firstdatazone; // 第一個(gè)數(shù)據(jù)塊起始號(hào) 
  7.      __u16 s_log_zone_size; 
  8.      __u32 s_max_size;      // 文件最大尺寸 
  9.      __u16 s_magic;         // 魔數(shù)(用于識(shí)別MINIX文件系統(tǒng)) 
  10.      __u16 s_state;         // 文件系統(tǒng)狀態(tài) 
  11.      __u32 s_zones;         // 數(shù)據(jù)塊列表的元素個(gè)數(shù)(v2版本) 
  12.  }; 

minix_super_block 每個(gè)字段的作用都在注釋中進(jìn)行了說(shuō)明,通過(guò) minix_super_block 對(duì)象我們可以了解到 MINIX 文件系統(tǒng)的信息。

3. 讀取文件過(guò)程

了解了 MINIX 文件系統(tǒng)的結(jié)構(gòu)組織,現(xiàn)在我們介紹一下 MINIX 文件系統(tǒng)讀取文件的過(guò)程。

例如,我們要讀取 /home/file.txt 文件的內(nèi)容,MINIX 文件系統(tǒng)是怎么準(zhǔn)確地查找到文件并且讀取其中的內(nèi)容呢?下面我們進(jìn)行分步來(lái)描述這個(gè)過(guò)程。

第一步:讀取根目錄

要讀取 /home/file.txt 文件,首先要從根目錄 / 開(kāi)始,MINIX 文件系統(tǒng)約定根目錄使用 inode表 的第一個(gè)元素進(jìn)行存儲(chǔ)。如下圖:

 

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

第二步:讀取 home 目錄

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

 

如上圖所示,從 home 目錄的文件列表中找到 file.txt 文件的 inode索引 為 9,所以現(xiàn)在可以通過(guò)讀取 inode表 的第 9 個(gè)元素來(lái)獲得 file.txt 文件對(duì)應(yīng)的 inode 節(jié)點(diǎn)。

第三步:讀取 file.txt 文件的內(nèi)容

現(xiàn)在我們已經(jīng)知道了 file.txt 文件對(duì)應(yīng)的 inode索引,所以從 inode表 中讀取第 9 個(gè)元素即可獲得 file.txt 文件的 inode節(jié)點(diǎn),然后就可以通過(guò) inode節(jié)點(diǎn) 的 i_zone 字段所指向的數(shù)據(jù)塊來(lái)讀取文件的內(nèi)容,如下圖所示:

 

如上圖所示,通過(guò)讀取 inode表 的第 9 個(gè)元素獲得 file.txt 文件的 inode節(jié)點(diǎn) 后,可以通過(guò) inode節(jié)點(diǎn) 的 i_zone 字段所指向的數(shù)據(jù)塊讀取文件的內(nèi)容。

另外說(shuō)明一下,inode位圖 和 數(shù)據(jù)塊位圖 用于創(chuàng)建文件時(shí),快速查找哪些 inode節(jié)點(diǎn) 和 數(shù)據(jù)塊 沒(méi)有被使用的。

四、總結(jié)

本文通過(guò) MINIX 這種簡(jiǎn)單的文件系統(tǒng)來(lái)介紹怎么設(shè)計(jì)一個(gè)文件系統(tǒng),雖然 Linux 系統(tǒng)有多種文件系統(tǒng),但其基本思想都是怎么有效地管理硬盤(pán)的數(shù)據(jù)。所以,掌握 MINIX 文件系統(tǒng)的設(shè)計(jì)對(duì)理解其他不同的文件系統(tǒng)有非常大的幫助。

責(zé)任編輯:武曉燕 來(lái)源: Linux內(nèi)核那些事
相關(guān)推薦

2011-01-13 14:10:30

Linux文件系統(tǒng)

2024-02-02 10:38:06

虛擬文件系統(tǒng)VFS

2020-07-22 14:53:06

Linux系統(tǒng)虛擬文件

2021-06-06 16:55:22

Linux文件系統(tǒng)

2009-12-25 09:58:46

linux劃分文件系統(tǒng)

2009-12-22 15:12:33

Linux擴(kuò)展文件系統(tǒng)

2011-01-13 13:18:38

Linux網(wǎng)絡(luò)文件

2009-12-14 13:14:57

2021-11-01 13:38:55

Linux文件系統(tǒng)

2021-03-04 13:14:54

文件系統(tǒng)存儲(chǔ)

2015-07-10 16:20:26

集群

2021-05-31 07:50:59

Linux文件系統(tǒng)

2019-09-20 10:04:45

Linux系統(tǒng)虛擬文件

2018-08-24 10:10:25

Linux文件系統(tǒng)技術(shù)

2020-09-25 07:48:12

Linux系統(tǒng)文件

2019-08-27 18:28:54

Linux文件系統(tǒng)文件系統(tǒng)類(lèi)型

2018-07-02 15:18:39

Linux文件系統(tǒng)

2020-10-29 08:34:48

Linux - tmp

2009-12-18 17:08:10

Linux常見(jiàn)文件系統(tǒng)

2009-09-11 08:41:59

Linux文件系統(tǒng)ACLs權(quán)限控制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)