0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux以inode的方式,讓數(shù)據(jù)形成文件

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-06-19 14:23 ? 次閱讀

Linux文件管理從用戶的層面介紹了Linux管理文件的方式。Linux有一個樹狀結(jié)構(gòu)來組織文件。樹的頂端為根目錄(/),節(jié)點為目錄,而末端的葉子為包含數(shù)據(jù)的文件。當(dāng)我們給出一個文件的完整路徑時,我們從根目錄出發(fā),經(jīng)過沿途各個目錄,最終到達(dá)文件。

我們可以對文件進行許多操作,比如打開和讀寫。在Linux文件管理相關(guān)命令中,我們看到許多對文件進行操作的命令。它們大都基于對文件的打開和讀寫操作。比如cat可以打開文件,讀取數(shù)據(jù),最后在終端顯示:

$cat test.txt

對于Linux下的程序員來說,了解文件系統(tǒng)的底層組織方式,是深入進行系統(tǒng)編程所必備的。即使是普通的Linux用戶,也可以根據(jù)相關(guān)的內(nèi)容,設(shè)計出更好的系統(tǒng)維護方案。

存儲設(shè)備分區(qū)

文件系統(tǒng)的最終目的是把大量數(shù)據(jù)有組織的放入持久性(persistant)的存儲設(shè)備中,比如硬盤和磁盤。這些存儲設(shè)備與內(nèi)存不同。它們的存儲能力具有持久性,不會因為斷電而消失;存儲量大,但讀取速度慢。

觀察常見存儲設(shè)備。最開始的區(qū)域是MBR,用于Linux開機啟動(參考Linux開機啟動)。剩余的空間可能分成數(shù)個分區(qū)(partition)。每個分區(qū)有一個相關(guān)的分區(qū)表(Partition table),記錄分區(qū)的相關(guān)信息。這個分區(qū)表是儲存在分區(qū)之外的。分區(qū)表說明了對應(yīng)分區(qū)的起始位置和分區(qū)的大小。

我們在Windows系統(tǒng)常??吹紺分區(qū)、D分區(qū)等。Linux系統(tǒng)下也可以有多個分區(qū),但都被掛載在同一個文件系統(tǒng)樹上。

數(shù)據(jù)被存入到某個分區(qū)中。一個典型的Linux分區(qū)(partition)包含有下面各個部分:

分區(qū)的第一個部分是啟動區(qū)(Boot block),它主要是為計算機開機服務(wù)的。Linux開機啟動后,會首先載入MBR,隨后MBR從某個硬盤的啟動區(qū)加載程序。該程序負(fù)責(zé)進一步的操作系統(tǒng)的加載和啟動。為了方便管理,即使某個分區(qū)中沒有安裝操作系統(tǒng),Linux也會在該分區(qū)預(yù)留啟動區(qū)。

啟動區(qū)之后的是超級區(qū)(Super block)。它存儲有文件系統(tǒng)的相關(guān)信息,包括文件系統(tǒng)的類型,inode的數(shù)目,數(shù)據(jù)塊的數(shù)目。

隨后是多個inodes,它們是實現(xiàn)文件存儲的關(guān)鍵。在Linux系統(tǒng)中,一個文件可以分成幾個數(shù)據(jù)塊存儲,就好像是分散在各地的龍珠一樣。為了順利的收集齊龍珠,我們需要一個“雷達(dá)”的指引:該文件對應(yīng)的inode。每個文件對應(yīng)一個inode。這個inode中包含多個指針,指向?qū)儆谠撐募鱾€數(shù)據(jù)塊。當(dāng)操作系統(tǒng)需要讀取文件時,只需要對應(yīng)inode的”地圖”,收集起分散的數(shù)據(jù)塊,就可以收獲我們的文件了。

最后一部分,就是真正儲存數(shù)據(jù)的數(shù)據(jù)塊們(data blocks)了。

inode簡介

上面我們看到了存儲設(shè)備的宏觀結(jié)構(gòu)。我們要深入到分區(qū)的結(jié)構(gòu),特別是文件在分區(qū)中的存儲方式。

文件是文件系統(tǒng)對數(shù)據(jù)的分割單元。文件系統(tǒng)用目錄來組織文件,賦予文件以上下分級的結(jié)構(gòu)。在硬盤上實現(xiàn)這一分級結(jié)構(gòu)的關(guān)鍵,是使用inode來虛擬普通文件和目錄文件對象。

在Linux文件管理中,我們知道,一個文件除了自身的數(shù)據(jù)之外,還有一個附屬信息,即文件的元數(shù)據(jù)(metadata)。這個元數(shù)據(jù)用于記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數(shù)據(jù)并不包含在文件的數(shù)據(jù)中,而是由操作系統(tǒng)維護的。事實上,這個所謂的元數(shù)據(jù)就包含在inode中。我們可以用$ls -l filename來查看這些元數(shù)據(jù)。正如我們上面看到的,inode所占據(jù)的區(qū)域與數(shù)據(jù)塊的區(qū)域不同。每個inode有一個唯一的整數(shù)編號(inode number)表示。

在保存元數(shù)據(jù),inode是“文件”從抽象到具體的關(guān)鍵。正如上一節(jié)中提到的,inode儲存由一些指針,這些指針指向存儲設(shè)備中的一些數(shù)據(jù)塊,文件的內(nèi)容就儲存在這些數(shù)據(jù)塊中。當(dāng)Linux想要打開一個文件時,只需要找到文件對應(yīng)的inode,然后沿著指針,將所有的數(shù)據(jù)塊收集起來,就可以在內(nèi)存中組成一個文件的數(shù)據(jù)了。

數(shù)據(jù)塊在1, 32, 0, …

inode并不是組織文件的唯一方式。最簡單的組織文件的方法,是把文件依次順序的放入存儲設(shè)備,DVD就采取了類似的方式。但如果有刪除操作,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理。

復(fù)雜的方式可以使用鏈表,每個數(shù)據(jù)塊都有一個指針,指向?qū)儆谕晃募南乱粋€數(shù)據(jù)塊。這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行。如果想隨機存取,那么必須遍歷鏈表,直到目標(biāo)位置。由于這一遍歷不是在內(nèi)存進行,所以速度很慢。

FAT系統(tǒng)是將上面鏈表的指針取出,放入到內(nèi)存的一個數(shù)組中。這樣,F(xiàn)AT可以根據(jù)內(nèi)存的索引,迅速的找到一個文件。這樣做的主要問題是,索引數(shù)組的大小與數(shù)據(jù)塊的總數(shù)相同。因此,存儲設(shè)備很大的話,這個索引數(shù)組會比較大。

inode既可以充分利用空間,在內(nèi)存占據(jù)空間不與存儲設(shè)備相關(guān),解決了上面的問題。但inode也有自己的問題。每個inode能夠存儲的數(shù)據(jù)塊指針總數(shù)是固定的。如果一個文件需要的數(shù)據(jù)塊超過這一總數(shù),inode需要額外的空間來存儲多出來的指針。

inode示例

在Linux中,我們通過解析路徑,根據(jù)沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應(yīng)的inode編號。當(dāng)我們輸入$cat /var/test.txt時,Linux將在根目錄文件中找到var這個目錄文件的inode編號,然后根據(jù)inode合成var的數(shù)據(jù)。隨后,根據(jù)var中的記錄,找到text.txt的inode編號,沿著inode中的指針,收集數(shù)據(jù)塊,合成text.txt的數(shù)據(jù)。整個過程中,我們參考了三個inode:根目錄文件,var目錄文件,text.txt文件的inodes。

在Linux下,可以使用$stat filename,來查詢某個文件對應(yīng)的inode編號。

在存儲設(shè)備中實際上存儲為:

當(dāng)我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然后根據(jù)inode的指針,把數(shù)據(jù)塊組合起來,放入內(nèi)存供進一步的處理。當(dāng)我們寫入一個文件時,是分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然后選取空白的數(shù)據(jù)塊,讓inode的指針指像這些數(shù)據(jù)塊,并放入內(nèi)存中的數(shù)據(jù)。

文件共享

在Linux的進程中,當(dāng)我們打開一個文件時,返回的是一個文件描述符。這個文件描述符是一個數(shù)組的下標(biāo),對應(yīng)數(shù)組元素為一個指針。有趣的是,這個指針并沒有直接指向文件的inode,而是指向了一個文件表格,再通過該表格,指向加載到內(nèi)存中的目標(biāo)文件的inode。如下圖,一個進程打開了兩個文件。

可以看到,每個文件表格中記錄了文件打開的狀態(tài)(status flags),比如只讀,寫入等,還記錄了每個文件的當(dāng)前讀寫位置(offset)。當(dāng)有兩個進程打開同一個文件時,可以有兩個文件表格,每個文件表格對應(yīng)的打開狀態(tài)和當(dāng)前位置不同,從而支持一些文件共享的操作,比如同時讀取。

要注意的是進程fork之后的情況,子進程將只復(fù)制文件描述符的數(shù)組,而和父進程共享內(nèi)核維護的文件表格和inode。此時要特別小心程序的編寫。

總結(jié)

這里概括性的總結(jié)了Linux的文件系統(tǒng)。Linux以inode的方式,讓數(shù)據(jù)形成文件。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 硬盤
    +關(guān)注

    關(guān)注

    3

    文章

    1269

    瀏覽量

    56983
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207905
  • 存儲設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    148

    瀏覽量

    18523

原文標(biāo)題:Linux文件系統(tǒng)的實現(xiàn)

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    RAR文件成文件

    RAR文件成文件夾我們平常用到RAR壓縮包里的文件需要先解壓到某個位置在進行操作,有了他你可以不必進行如此繁瑣的操作了RAR
    發(fā)表于 07-12 16:50

    Linux文件恢復(fù)的實現(xiàn)

    首先簡單介紹一下 Linux 文件系統(tǒng)的最基本單元:inode。inode 譯成中文就是索引節(jié)點,每個存儲設(shè)備(例如硬盤)或存儲設(shè)備的分區(qū)被格式化為
    發(fā)表于 07-19 08:30

    Linux連接文件的方法

    文件最近更新簡介Linux有兩種連接文件:符號連接(軟連接)和硬鏈接。符號鏈接類似Windows下的快捷方式。硬鏈接通過文件系統(tǒng)的
    發(fā)表于 02-11 06:45

    Linux下的inode的理解

    文件數(shù)據(jù)都儲存在"塊"中,那么很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創(chuàng)建者、文件的創(chuàng)建日期、文件的大小等等。這種儲存
    發(fā)表于 05-08 14:06 ?438次閱讀

    linux下利用inode刪除指定文件文件

    本文主要介紹使用inode刪除異常文件名的文件的方法,供大家參考:在Linux中,有時候會遇到文件名是亂碼或者是某些特殊中文
    發(fā)表于 04-02 14:39 ?325次閱讀

    設(shè)計和集成文件

    設(shè)計和集成文件
    發(fā)表于 03-18 13:50 ?2次下載
    設(shè)計和集<b class='flag-5'>成文件</b>

    設(shè)計和集成文件

    設(shè)計和集成文件
    發(fā)表于 03-18 13:57 ?0次下載
    設(shè)計和集<b class='flag-5'>成文件</b>

    inode是理解Unix/Linux文件系統(tǒng)和硬盤儲存的基礎(chǔ)

    inode是一個重要概念,是理解Unix/Linux文件系統(tǒng)和硬盤儲存的基礎(chǔ)。 我覺得,理解inode,不僅有助于提高系統(tǒng)操作水平,還有助于體會Unix設(shè)計哲學(xué),即如何把底層的復(fù)雜性抽
    的頭像 發(fā)表于 04-04 17:15 ?1647次閱讀
    <b class='flag-5'>inode</b>是理解Unix/<b class='flag-5'>Linux</b><b class='flag-5'>文件</b>系統(tǒng)和硬盤儲存的基礎(chǔ)

    AD9249設(shè)計和集成文件

    AD9249設(shè)計和集成文件
    發(fā)表于 06-05 14:54 ?2次下載
    AD9249設(shè)計和集<b class='flag-5'>成文件</b>

    AD9257設(shè)計和集成文件

    AD9257設(shè)計和集成文件
    發(fā)表于 06-05 20:30 ?4次下載
    AD9257設(shè)計和集<b class='flag-5'>成文件</b>

    AD9681設(shè)計和集成文件

    AD9681設(shè)計和集成文件
    發(fā)表于 06-06 21:22 ?6次下載
    AD9681設(shè)計和集<b class='flag-5'>成文件</b>

    AD9637設(shè)計和集成文件

    AD9637設(shè)計和集成文件
    發(fā)表于 06-07 16:19 ?7次下載
    AD9637設(shè)計和集<b class='flag-5'>成文件</b>

    CN0155設(shè)計與集成文件

    CN0155設(shè)計與集成文件
    發(fā)表于 06-10 11:08 ?1次下載
    CN0155設(shè)計與集<b class='flag-5'>成文件</b>

    CN0204設(shè)計與集成文件

    CN0204設(shè)計與集成文件
    發(fā)表于 06-11 12:01 ?10次下載
    CN0204設(shè)計與集<b class='flag-5'>成文件</b>

    你是否知道Linuxinode包含什么內(nèi)容?

    理解inode,要從文件儲存說起。
    的頭像 發(fā)表于 11-28 09:30 ?368次閱讀
    你是否知道<b class='flag-5'>Linux</b>中<b class='flag-5'>inode</b>包含什么內(nèi)容?