国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、理解文件系統(tǒng)

1、前言

我們一直都在說打開的文件,磁盤中包含了上百萬個(gè)文件,肯定不可能都是以打開的方式存在。其實(shí)文件包含打開的文件和普通的未打開的文件,下面重點(diǎn)談?wù)勎创蜷_的文件。

我們知道打開的文件是通過操作系統(tǒng)被進(jìn)程打開,一旦打開,操作系統(tǒng)就要維護(hù)多個(gè)文件,所以它是需要被操作系統(tǒng)管理的。也就是說這種方式,磁盤上和內(nèi)存上都有這個(gè)文件,它們不是完全一樣的,內(nèi)存中的文件更強(qiáng)調(diào)的是屬性和方法磁盤中的文件更強(qiáng)調(diào)的是數(shù)據(jù),它們是通過緩沖區(qū)關(guān)聯(lián)的;而普通的未打開的文件在磁盤上,未被加載到內(nèi)存中,它當(dāng)然也要被管理;其中管理打開的文件和管理未打開的文件在操作系統(tǒng)中有一個(gè)功能模塊叫做文件系統(tǒng)。

之前我們談過進(jìn)程 VS?程序,一個(gè)被打開的程序就是進(jìn)程,只不過我們在解釋進(jìn)程時(shí)不是嚴(yán)格地把它當(dāng)作文件來解釋,需要明白的是進(jìn)程是要被加載到內(nèi)存的,程序就是一個(gè)磁盤文件,打開的文件進(jìn)程,而普通未打開的文件程序。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接


  • ls -l 除了看到文件名,還可以看到當(dāng)前路徑下文件的元數(shù)據(jù),也就是文件的屬性。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

每行包含? 7? 列:
  • 模式
  • 硬鏈接數(shù)
  • 文件所有者
  • 大小
  • 最后修改時(shí)間
  • 文件名

ls -l?讀取存儲在磁盤上的文件信息,然后顯示出來

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

這里在命令行上輸入 ls -l,bash 解析 ls -l,fork 創(chuàng)建子進(jìn)程,讓子進(jìn)程通過進(jìn)程替換執(zhí)行 ls -l,ls -l 會在當(dāng)前路徑下把文件的屬性通過磁盤讀到內(nèi)核,再由內(nèi)核讀到用戶空間顯示出來。 其實(shí)這個(gè)信息除了通過這種方式來讀取,還有一個(gè)? stat? 命令能夠查看更詳細(xì)的信息。?

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

如果不深入的話,這塊也沒什么價(jià)值,誰不知道文件在磁盤上,ls -l 讀取當(dāng)前路徑下文件的屬性,所以我們還要研究它的原理。

但是在此之前,我們需要先認(rèn)識磁盤,關(guān)于磁盤這個(gè)話題,還會在數(shù)據(jù)庫中再講一次。


2、磁盤

  • 內(nèi)存 -- 掉電易失存儲介質(zhì)
  • 磁盤 -- 永久性存儲介質(zhì) -- SSD、U盤、flash卡、光盤、磁帶

眾所周知,磁盤分為機(jī)械硬盤(HDD)固態(tài)硬盤(SSD),現(xiàn)在很多的電腦都是機(jī)械硬盤和固態(tài)硬盤組合使用,但服務(wù)器上大多都是機(jī)械硬盤,只有一些高效率的存儲集群會用到固態(tài)硬盤。機(jī)械硬盤和固態(tài)硬盤在存儲技術(shù)上肯定是不同的,而我們主要了解機(jī)械硬盤,因?yàn)樗嘤糜诜?wù)器上,其次雖然固態(tài)硬盤要比機(jī)械硬盤快不少,但在 CPU 看來,兩者都很慢,我們這里就了解最慢的。

如下圖,雖然磁盤的盤面看起來很光滑,但是它上面有一些同心圓,這些同心圓用圓白線劃分,每一圈叫做磁道,數(shù)據(jù)寫在這些有顏色的區(qū)域上。實(shí)際上你并不是把一圈的空間都用完,所以這里還使用了一些直白線劃分,被圓白線和直白線劃分出來的區(qū)域叫做扇區(qū)。所以當(dāng)盤片在旋轉(zhuǎn)、磁頭擺動就可以找到這個(gè)盤片的任何一個(gè)扇區(qū)進(jìn)行讀寫。 實(shí)際磁頭和盤面并不是接觸的,它們之間的距離就像一架飛機(jī)在離平地 1 米的距離滑行,所以如果筆記本摔了或者是在開機(jī)狀態(tài)下總被搬來搬去,磁頭就容易與盤片接觸,此時(shí)就有可能會刮花盤片,電腦就可能會發(fā)生藍(lán)屏等。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

盤面是有兩面的,且兩面都是同心圓,數(shù)據(jù)只能寫在同心圓(磁道)上,根據(jù)配置不同,有些磁盤可能還有多組盤片,我們可以從上至下的分為不同的盤面,也叫做你是第幾個(gè)盤面。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接


雖然在 C 語言中訪問內(nèi)存的基本單位是 1byte ,但是在操作系統(tǒng)的角度認(rèn)為內(nèi)存的基本單位一般是 4kb,在操作系統(tǒng)看來,內(nèi)存就是一個(gè)數(shù)組,每一個(gè)元素是 4kb。

之前在談進(jìn)程地址空間時(shí)也說過它叫做頁框,4kb 是頁幀,所以操作系統(tǒng)申請內(nèi)存時(shí)是按 4kb 為單位進(jìn)行分配和加載的,語言層面上并不關(guān)心底層是怎么做的,比如你要 malloc 1byte,那么操作系統(tǒng)也不可能直接給你 4kb,有可能 C 語言本身就緩沖了一部分空間讓你去使用,如果超出這一部分空間,操作系統(tǒng)再重新分配。

磁盤存儲的基本單位是一個(gè)扇區(qū),它是磁盤讀取的最小單元,大部分磁盤的一個(gè)扇區(qū)是 512byte,但你會發(fā)現(xiàn)雖然這里好像越靠近圓心,扇區(qū)越小,其實(shí)它們都是 512byte,原因是越靠近圓心的雖然扇區(qū)越小,但是比特位也相對外圈更密集。內(nèi)存和磁盤之間也是有交互的,它們之間的交互我們稱為 output、input,也叫做 IO,一般內(nèi)存和磁盤之間 IO 交互時(shí),不是純硬件級別的交互,而是要通過文件系統(tǒng)完成,也就是通過操作系統(tǒng)。

這里用戶和內(nèi)存之間交互的基本單元大小是 1byte,一般內(nèi)存和磁盤之間交互時(shí)的基本單元大小是 4kb,所以文件系統(tǒng)在往磁盤讀數(shù)據(jù)時(shí),要讀 8 個(gè)扇區(qū),這就是數(shù)據(jù)由磁盤加載到內(nèi)存的過程。

  • 將數(shù)據(jù)存儲到磁盤 --> 將數(shù)據(jù)存儲到該數(shù)組
  • 找到磁盤特定扇區(qū)的位置 --> 找到數(shù)組特定的位置
  • 對磁盤的管理 --> 對該數(shù)組的管理

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

其中我們再選取?stat 中展示的一部分信息,我們將內(nèi)存和磁盤之間交互時(shí)的基本單元大小 4kb 叫 Blocks,這里的 IO Block:4096 就是 8 × 512。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接


一般像這樣的機(jī)械硬盤在物理上是圓狀,操作系統(tǒng)很難去管理它,因?yàn)椴僮飨到y(tǒng)如果不對它進(jìn)行抽象化處理,那么操作系統(tǒng)中的代碼可能就是 read(盤面,磁道,扇區(qū)),操作系統(tǒng)需要知道這三個(gè)參數(shù)的話,那么一定要在操作系統(tǒng)讀取磁盤的代碼中以硬編碼的形式寫到操作系統(tǒng)中。

但是如果有一天,你給自己的電腦加了一塊固態(tài)硬盤,你要對固態(tài)硬盤進(jìn)行讀操作,就不能再用以前的方法了,因?yàn)楣虘B(tài)硬盤與機(jī)械硬盤的結(jié)構(gòu)不一樣,它沒有盤面、磁道、扇區(qū),所以操作系統(tǒng)中曾經(jīng)設(shè)計(jì)好的代碼就得修改。很顯然,這樣的設(shè)計(jì)導(dǎo)致它們之間出現(xiàn)了強(qiáng)耦合,這是很不合理的。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接


所以需要對磁盤抽象化處理,將圓狀結(jié)構(gòu)的磁盤空間抽象成線性結(jié)構(gòu)的磁盤空間。這里舉兩個(gè)例子方便理解:

  1. 其實(shí)在 C 語言中我們見過的 int arr[3][4] 二維數(shù)組就是把線性的數(shù)據(jù)結(jié)構(gòu)抽象成了好理解的有行有列的結(jié)構(gòu)。
  2. 曾經(jīng)風(fēng)靡一時(shí)的磁帶是把數(shù)據(jù)存儲于那條黑色的帶子上,可能是為了空間的原因,把帶子卷起來形成一個(gè)圓狀,所以磁帶在物理上,既可以是圓狀,也可以是線狀。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

同樣的,也能把磁盤抽象成線性結(jié)構(gòu)。把磁盤上的磁道抽象成線性形狀,比如磁盤的所有磁道被我們抽象成了一條 500GB 的線性空間,我們可以把它看作一個(gè)很大的數(shù)組 —— 扇區(qū) array[NUM],其中每一個(gè)元素是 512byte,操作系統(tǒng)要申請 4kb,那就給數(shù)組的 8 個(gè)元素。所以將磁盤抽象后,操作系統(tǒng)就擺脫盤面、磁道、扇區(qū)的束縛了,操作系統(tǒng)只關(guān)心你想訪問的哪個(gè)下標(biāo),這里的地址我們稱為邏輯區(qū)塊地址(Logical Block Address, LBA),這里抽象出來的數(shù)組下標(biāo)是和機(jī)械硬盤中盤面、磁道、扇區(qū)構(gòu)成映射關(guān)系的,這里的映射關(guān)系是由對應(yīng)的機(jī)械磁盤驅(qū)動維護(hù)的,操作系統(tǒng)想往 2 下標(biāo)處寫數(shù)據(jù),最終 2 下標(biāo)一定是能對應(yīng)到具體磁盤中某個(gè)扇區(qū)上。如果要往固態(tài)硬盤中寫數(shù)據(jù),也是把它抽象成線性的數(shù)組,它也有自己的固態(tài)硬盤驅(qū)動維護(hù)數(shù)組下標(biāo)和固態(tài)硬盤之間的映射關(guān)系。至此,通過抽象的方法,就完成了操作系統(tǒng)和磁盤之間的解耦。所以最終操作系統(tǒng)對磁盤的管理,轉(zhuǎn)換成了對數(shù)組的管理。?

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接


為什么操作系統(tǒng)(文件系統(tǒng))和磁盤不以 512byte 為單位呢?

太小了,可能會導(dǎo)致多次 IO,進(jìn)而導(dǎo)致效率的降低。

如果操作系統(tǒng)使用和磁盤一樣的大小,萬一磁盤的基本大小發(fā)生改變,那 OS 的源代碼要不要改呢?那豈不是將硬件和軟件(OS)進(jìn)行解耦。


二、inode

500G 的磁盤空間抽象成每個(gè)元素是 512byte 的數(shù)組,那樣非常大,不易管理,所以操作系統(tǒng)還要對這 500G 的數(shù)組進(jìn)行拆分,比如這里拆分成了 100G、100G、150G、150G,所以這里只要管理好了第一個(gè) 100G 的空間,然后把管理的方法復(fù)制到其它空間,其它的空間也能被管理好。

把拆分的過程叫做分區(qū),這也就是我們的電腦上為什么會有 C 盤、D 盤、E 盤等。至此我們僅僅是對空間進(jìn)行劃分,要把空間管理好還需要寫入相關(guān)的管理數(shù)據(jù),比如把中國 960 萬平方公里,劃分了不同大小的省份,要管理好一個(gè)省,我們不考慮地質(zhì)差異等因素,只要一個(gè)領(lǐng)導(dǎo)、一個(gè)團(tuán)隊(duì),他們把一個(gè)省管理好了,那么他們的管理方法就可以復(fù)制到其它省。同樣的,剛剛我們分區(qū)的工作只是把中國劃分成不同的省份,接下來我們還要分配每個(gè)省的省長、省中每個(gè)市的市長、市中每個(gè)鎮(zhèn)的鎮(zhèn)長等,以此來管理一個(gè)省。

將這種分配的過程叫做格式化過程,所謂的格式化在計(jì)算機(jī)中就是寫入文件系統(tǒng),也就是說我們要把文件系統(tǒng)寫入某個(gè)分區(qū)中,這個(gè)文件系統(tǒng)的核心包括數(shù)據(jù) + 方法,數(shù)據(jù)就類似這個(gè)省有多少人口、糧食等,方法就類似這個(gè)省有生育政策、耕種政策等。同樣文件系統(tǒng)包含的數(shù)據(jù)就是文件系統(tǒng)的類型等,方法就是操作各種文件的方法。

當(dāng)然不同的分區(qū)可以使用不同的文件系統(tǒng),Linux 下就使用五六種不同的文件系統(tǒng),Linux 可以支持多種文件系統(tǒng),包括 Ext2、Ext3、fs、usb-fs、sysfs、proc。這就好比各個(gè)省份需要因地制宜地分配不同的團(tuán)隊(duì)。我們談的都是 Ext 系列的文件系統(tǒng),也不談其它的文件系統(tǒng)如何,我們就認(rèn)為磁盤上不同分區(qū)的文件系統(tǒng)是一樣的。

因?yàn)橐粋€(gè)省也很大,為了更好的管理,還要分配市長、鎮(zhèn)長等,同樣的分區(qū)后的 100G 空間還要再劃分,比如這里劃分了 10 組 10G 的空間,然后把它看作成一個(gè)一個(gè)的塊組(Block group),一個(gè)塊組中又有多個(gè) 4kb 空間,而磁盤存儲是有塊基本單位的,文件系統(tǒng)認(rèn)為一塊是 4kb,我們只要把一個(gè)塊組管好,整個(gè)文件系統(tǒng)內(nèi)的塊組就能管好,所以問題又轉(zhuǎn)換為怎么把這 10G 的空間管好,所以接下來劃分的才是文件系統(tǒng)寫入的相關(guān)細(xì)節(jié),也是我們要研究的,這個(gè)區(qū)域的信息大家都有,可能略有差異。


【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

這里 Linux 文件系統(tǒng)以 Ext 系列的為話題,上圖為磁盤文件系統(tǒng)圖(內(nèi)核內(nèi)存映像肯定有所不同),磁盤是典型的塊設(shè)備,硬盤分區(qū)被劃分為一個(gè)個(gè)的 block。一個(gè) block?的大小是由格式化的時(shí)候確定的,并且不可以更改。例如?mke2fs?的?-b?選項(xiàng)可以設(shè)定 block?大小為?1024、2048?或?4096?字節(jié)。而上圖中啟動塊(Boot Block)的大小是確定的,因?yàn)椴煌奈募到y(tǒng)可能略有差異。一般一個(gè)磁盤的 0 號分區(qū)的 0 號塊組上的第一扇區(qū)存儲著一些啟動信息。掌握以下信息能夠讓一個(gè)文件的信息可追溯,可管理。

  • 超級塊(Super Block):是文件系統(tǒng)的核心結(jié)構(gòu),用于存放文件系統(tǒng)本身的結(jié)構(gòu)信息,描述文件系統(tǒng)的屬性信息,記錄的信息主要有:bolck 和 inode的總量,未使用的?block?和?inode?的數(shù)量,一個(gè)?block?和?inode?的大小,最近一次掛載的時(shí)間,最近一次寫入數(shù)據(jù)的時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等其他文件系統(tǒng)的相關(guān)信息。一般計(jì)算機(jī)啟動時(shí),Super Block 會被加載到操作系統(tǒng),其中每一塊組好像都有一個(gè) Super Block,但實(shí)際可能 10 個(gè)塊組中只有兩三個(gè)有 Super Block。如果 Super Block?的信息被破壞,可以說整文件系統(tǒng)結(jié)構(gòu)就被破壞了。
  • GDT,Group Descriptor Table:塊組描述符。Super Block 描述的是整個(gè)塊組相關(guān)的信息,這里描述的是一組的屬性信息,每一個(gè)塊組都必需要有一個(gè) Group Descriptor Table。
  • 塊位圖(Block Bitmap):Block Bitmap 中記錄著 Data Block 中哪個(gè)數(shù)據(jù)塊已經(jīng)被占用,哪個(gè)數(shù)據(jù)塊沒有被占用。其中比特位為 1 表示該 block 被占用,否則表示可用。
  • Block Group:ext2 文件系統(tǒng)會根據(jù)分區(qū)的大小劃分為數(shù) 個(gè)Block Group,而每個(gè) Block Group 都有著相同的結(jié)構(gòu)組成。
  • inode 位圖(inode Bitmap):每個(gè) bit 表示一個(gè) inode 是否空閑可用,比特位和特定的 inode 是一一對應(yīng)的。其中,inode bitmap 中比特為 1 表示該 indoe 被占用,否則表示可用。
  • i 節(jié)點(diǎn)表:存放文件屬性,如文件大小、所有者、最近修改時(shí)間等。
  • 數(shù)據(jù)區(qū):存放文件內(nèi)容。

我們說過文件 = 內(nèi)容 + 屬性。這里的內(nèi)容和屬性采用分離存儲,屬性放在 inode Table 中。一個(gè)組中可以放多少個(gè) inode 是一定的,基本上一個(gè)文件或目錄一個(gè) inode,inode 是一個(gè)文件的所有屬性集合,屬性也是數(shù)據(jù),也要占用空間。所以即便是一個(gè)空文件也要占用空間,這里的屬性集合包含文件權(quán)限、大小等,但不包含文件名。

內(nèi)容放在 Date blocks 中。比如這里的塊組是 10G,那么 inode Table 占 1G,Date blocks 占了 8G, 一個(gè) inode 是 512byte,粗略的算一下,1G 大概 42 億多字節(jié),除以 512 大概也有幾千萬,所以這樣一個(gè)塊組能保存幾千萬文件的 inode 信息。這里 inode Table 和 Data blocks 的劃分可能會出現(xiàn)你用完了、我沒用完,或者你沒用完、我用完了的情況,這種情況并沒有有效的方法解決。

Date blocks 相當(dāng)于一個(gè)數(shù)據(jù)塊集合,報(bào)錯(cuò)的都是特定文件的內(nèi)容,它以 4k 為單位(Date blocks 可以理解成多個(gè) 4kb(扇區(qū)*8)大小的集合),對應(yīng)的數(shù)據(jù)塊屬于哪些文件,是由 Data Blocks 和 inode Table 維護(hù)的。如下圖,inode Table?是一個(gè)大小為 128字節(jié)的空間,包含了若干大小相同的塊,這些塊有不同的編號,對應(yīng)就是對應(yīng)文件的屬性,Data blocks 也包含了若干大小相同的塊,這些塊也有不同的編號,對應(yīng)就是文件的內(nèi)容。此時(shí)新建文件或目錄,就給文件申請 1 號 inode,并把文件的各種屬性寫入到 1 號 inode,1 號 inode 中包含了一個(gè)數(shù)組 block b[32],比如 1 號 inode 需要 2 個(gè)數(shù)據(jù)塊,所以 [0] = 2,[1] = 3,所以 1 號 inode 就可以找到對應(yīng)的數(shù)據(jù)塊。換而言之,要在磁盤上查找一個(gè)文件,我們只需要知道這個(gè)文件的 inode 是多少,因?yàn)?inode 需要標(biāo)識唯一性,每一個(gè) inode 塊都要有一個(gè) inode 編號,至此,我們知道真正標(biāo)識文件的不是文件名,而是文件的 inode 編號。既然 inode 大小是確定的,萬一文件是 10 個(gè) T,此時(shí)數(shù)據(jù)塊就不夠了,文件系統(tǒng)的處理策略是數(shù)據(jù)塊不僅可以保存數(shù)據(jù)的內(nèi)容,還可以保存其它數(shù)據(jù)塊的編號,它類似于 b+ 樹。換言之,對于保存較大的文件,可能就需要多級索引的形式。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

找到文件:inode 編號 -> 分區(qū)特定的 BlockGroup?-> inode -> 屬性 -> 內(nèi)容


目錄是文件嗎?

是。目錄有自己的 inode 和自己的 data block,data block 存儲的是文件名和對應(yīng)的 inode 編號的映射關(guān)系,兩者互為 key 值。??


這里 ls - i 就可以查看文件或目錄對應(yīng)的 inode 了,可以看到這里的 inode 并不是嚴(yán)格連續(xù)申請的,它依然能看到文件名,是因?yàn)槲覀冃枰R別。

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

為了說明問題,我們將上圖簡化:

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

1、創(chuàng)建一個(gè)新文件的?4 個(gè)操作

(1)存儲屬性

內(nèi)核先找到一個(gè)空閑的i節(jié)點(diǎn)(這里是263466)。內(nèi)核把文件信息記錄到其中。


(2)存儲數(shù)據(jù)

該文件需要存儲在三個(gè)磁盤塊,內(nèi)核找到了三個(gè)空閑塊:300、500、800。將內(nèi)核緩沖區(qū)的第一塊數(shù)據(jù)復(fù)制到 300,下一塊復(fù)制到 500,以此類推。


(3)記錄分配情況

文件內(nèi)容按順序 300、500、800 存放。內(nèi)核在 inode 上的磁盤分布區(qū)記錄了上述塊列表。


(4)添加文件名到目錄

新的文件名 linux_1。linux 如何在當(dāng)前的目錄中記錄這個(gè)文件?內(nèi)核將入口(1052214,linux_1)添加到目錄文件。文件名和 inode 之間的對應(yīng)關(guān)系將文件名和文件的內(nèi)容及屬性連接起來。


如何知道文件的 inode 編號 && 如何理解目錄?

我們知道定位一個(gè)文件是通過絕對路徑或相對路徑來定位的,但不管是絕對路徑還是相對路徑最終一定是要有一個(gè)目錄。目錄當(dāng)然是一個(gè)文件,也有獨(dú)立的 inode 和自己的數(shù)據(jù)塊,目錄中的 block 數(shù)組能找到對應(yīng)的數(shù)據(jù)塊,目錄的數(shù)據(jù)塊維護(hù)的是文件名和 inode 的映射關(guān)系。換而言之,在目錄下創(chuàng)建文件時(shí),除了給文件申請 inode、數(shù)據(jù)塊以外,還要把文件名和申請創(chuàng)建成功之后文件的 inode 編號寫到目錄的數(shù)據(jù)塊中。

所以就能理解為什么大多數(shù)操作系統(tǒng)下同一個(gè)目錄中不允許存在同名文件。只要我們找到了目錄就可以找到目錄下的文件和對應(yīng)的 inode,然后就可以通過 inode 讀取文件的內(nèi)容。所以 ls -l 時(shí)就可以讀到文件的屬性信息,它是在當(dāng)前目錄對應(yīng)的 inode 下找到對應(yīng)數(shù)據(jù)塊中文件名和文件名映射的 inode,再去找對應(yīng)文件的 inode,此時(shí)就看到文件的屬性了。所以 echo “hello world” > file.txt 是先啟動進(jìn)程,這個(gè)進(jìn)程當(dāng)然知道自己所在的目錄,那么它就可以拿著 file.txt 文件名找它對應(yīng)的 inode,把數(shù)據(jù)追加到對應(yīng)的數(shù)據(jù)塊中。所以說 inode 不存儲文件名,只是往目錄的數(shù)據(jù)塊中寫入文件名和文件對應(yīng)的 inode。


touch 一個(gè)空文件 file.txt,ext* 文件系統(tǒng),做了什么工作?

它先在 inode Bitmap 申請沒有被使用的比特位,然后把文件對應(yīng)的屬性信息 inode Table 里寫,再把申請好文件的文件名和 inode 編號寫入 Data blocks 建立映射關(guān)系。如果想 echo “hello world” > file.txt,現(xiàn)在是在當(dāng)前目錄下,file.txt 和 inode 就找到了,再通過 file.txt 文件的 inode 去對應(yīng)的 Data blocks 中寫入數(shù)據(jù)。所以就能理解為什么大多數(shù)操作系統(tǒng)下同一個(gè)目錄中不允許存在同名文件。一方面是不方便人查看,另一方面是若一個(gè)目錄下有同名文件了,那么 inode 去操作文件時(shí)操作的就不知道是哪個(gè)文件了。

Block Bitmap 和 inode Bitmap 是位圖,就是用比特位 0 / 1 來表示的。Block Bitmap 用來標(biāo)識數(shù)據(jù)塊的使用情況,inode Bitmap 用來標(biāo)識 inode 的使用情況,每個(gè)比特位都對應(yīng)一個(gè)塊。換而言之,當(dāng)你新建文件時(shí),它并不是遍歷 inode 區(qū)域,因?yàn)檫@樣做太慢了,它只需要在系統(tǒng)啟動時(shí)將 Blok Bitmap 和 inode Bitmap 預(yù)加載到系統(tǒng)中。要新建文件就把 inode Bitmap 的比特位由 0 置為?1,文件需要多少數(shù)據(jù)塊,就把 Block Bitmap 的比特位由 0 置為?1。所以我們可以通過位圖快速的完成 inode 的申請和釋放,同時(shí)也能確認(rèn)當(dāng)前磁盤的使用情況。但是位圖依然還是需要去遍歷哪些使用和未使用,以及做位操作等,所以這里通過 Group Descriptor Table 來管理。


如何理解刪除文件?

計(jì)算機(jī)中刪除一個(gè)文件并不是真正的刪除,而是把那塊空間標(biāo)識為無效,就像拷貝一部電影到 U 盤需要 1 分鐘,但是刪除 U 盤上的電影只需要短暫的一兩秒;亦或是蓋一個(gè)房子需要 1 年,而銷毀一個(gè)房子只需要在墻上寫上拆 。而現(xiàn)在理解的是不用把 inode 屬性清空,不用把 inode 對應(yīng)的數(shù)據(jù)塊清空,只需要把兩個(gè)位圖中對應(yīng)的比特位由 1 到 0,再把所在的目錄下中的對應(yīng)的映射關(guān)系去掉,此時(shí)空間就是無效的,當(dāng)下一次再新建文件時(shí),就可以直接把無效的空間覆蓋。

按上面這樣說,刪除后的文件當(dāng)然可以恢復(fù),Windows 下的回收站就是一個(gè)目錄,當(dāng)你刪除時(shí)就是把文件移動到回收站目錄下,然后把其它目錄下數(shù)據(jù)塊中的映射關(guān)系移動到回收站目錄下的數(shù)據(jù)塊中。Windows 下就算把回收站的內(nèi)容刪除也是能恢復(fù)的,Linux 下如果要恢復(fù)刪除的文件是有一些恢復(fù)工具的,但有可能在恢復(fù)過程中創(chuàng)建各種臨時(shí)文件,可能就會把想恢復(fù)的文件的信息覆蓋掉。如果想自己恢復(fù)刪除的文件,就需要更深入的了解文件系統(tǒng)原理。


三、軟硬鏈接

硬鏈接是通過? inode? 引用另外一個(gè)文件,軟鏈接是通過名字引用另外一個(gè)文件。

1、軟鏈接

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

ln -s testLink.txt soft.link 給 testLink.txt 建立軟鏈接 soft.link(可任意取名)。testLink.txt 的 inode 是 1052193,soft.link 的 inode 是 1052198,也就是說軟鏈接 soft.link 就是一個(gè)普通的正常文件,它有自己獨(dú)立的 inode,soft.link 中的數(shù)據(jù)塊中保存著它指向的文件 testLink.txt 的路徑,就類似于 Winodws 下的快捷方式,比如桌面看到的軟件保存的是其它的路徑,在系統(tǒng)中可能你要運(yùn)行的可執(zhí)行程序在一個(gè)很深的目錄下,就可以在較上層的目錄中建立軟鏈接。


2、硬鏈接

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

ln testLink1.txt?hard.link 給 testLink.txt?建立硬鏈接 hard.link(可任意取名)。其中我們發(fā)現(xiàn)硬鏈接和它鏈接的文件的所有屬性都是一樣的,包括 inode,所以硬鏈接沒有獨(dú)立的 inode,而軟鏈接有自己獨(dú)立的 indoe,那么嚴(yán)格來說硬鏈接不是一個(gè)獨(dú)立的文件,軟鏈接是一個(gè)獨(dú)立的鏈接。還發(fā)現(xiàn)鏈接后的 testLink1.txt?的有一個(gè)屬性信息由 1 變成立?2,所以這里 ls -li 顯示的這一列數(shù)據(jù)表示的不是軟鏈接,而是硬鏈接。而當(dāng)把 testLink1.txt 刪除后,hard.link?就由 2?變成了?1,所以硬鏈接本質(zhì)就是在 testLink1.txt?文件所在目錄的數(shù)據(jù)塊中重新創(chuàng)建一個(gè)映射關(guān)系,也就是給 testLink1.txt?的 inode 重新起了一個(gè)別名。

我們在刪除文件時(shí)干了兩件事情:
  1. 在目錄中將對應(yīng)的記錄刪除。
  2. 將硬連接數(shù)?-1;如果為?0,則將對應(yīng)的磁盤釋放。

3、硬鏈接的應(yīng)用

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

為什么創(chuàng)建普通目錄的硬鏈接是 2 ?而創(chuàng)建普通文件的硬鏈接是 1 ?

普通文件的硬鏈接是 1 是因?yàn)楫?dāng)前目錄中只包含一組 file 和 file 的 inode.

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接?

而普通目錄是 2 的原因是,因?yàn)槌水?dāng)前目錄下包含了 dir 和 dir 的 inode,還有 dir 目錄下隱藏的 ".",這個(gè)點(diǎn)叫做當(dāng)前路徑,此時(shí)我們發(fā)現(xiàn)這個(gè)點(diǎn)的 inode 和 dir 的 inode 是一樣的,所以 dir 的 inode 編號是?2。 這個(gè)點(diǎn)就是 dir 的別名,因?yàn)楫?dāng)前路徑的使用頻率很高,所以它是為了方便我們對當(dāng)前路徑的索引,如果沒有這個(gè)別名,那就只能是 "dir/xxx/…",完全沒有 "./xxx/…" 方便。?

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

當(dāng)我們再在 dir 下建立一個(gè)目錄 other,此時(shí) dir 的硬鏈接數(shù)就變成了 3,other 的硬鏈接數(shù)就是 2。other 的硬鏈接數(shù)是 2 是因?yàn)?other 和 inode + . 和 inode。?

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

而 dir 之所以是 3,是因?yàn)橐?"cd",所以 other 下還有一個(gè)點(diǎn)點(diǎn),它是 dir 的別名。

所以硬鏈接最典型的應(yīng)用場景就是方便進(jìn)行路徑轉(zhuǎn)換。


4、文件的 ACM

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

文件的三個(gè)時(shí)間:
  • Access:文件最近被訪問的時(shí)間
  • Modify:文件內(nèi)容最后被修改的時(shí)間
  • Change:文件屬性最后被修改的時(shí)間

touch file.txt 時(shí)會刷新文件的 ACM:

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

vim file.txt 寫入內(nèi)容后也會更新 file.txt 的 ACM(因?yàn)樗鼘ξ募M(jìn)行訪問,內(nèi)容修改,屬性也修改的原因是寫入了內(nèi)容,文件的大小屬性就變了)(不寫入內(nèi)容后也會刷新 file.txt 文件的 ACM,但不同版本下的 linux,結(jié)果可能也不同):

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

chmod u+x file.txt 后,更新的只有 Change:

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

cat file.txt 后并沒有刷新 file.txt 的 Access,是因?yàn)?linux 2.6 之后,把訪問的頻率降低了,而是要真正有效訪問或者訪問多次后才會刷新,不同的版本策略不一樣。那是因?yàn)槲募诖疟P上,文件內(nèi)容和屬性的操作其實(shí)并不高頻,比較高頻的是文件的訪問,而如果你經(jīng)常 cat 文件,且每次都要刷新時(shí)間的話,效率就太低了:

【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解,Linux,linux,基礎(chǔ)IO,inode,文件系統(tǒng),磁盤,軟鏈接,硬鏈接

之前說過 make 時(shí),它會自動檢測源文件是否作修改,若沒有修改則不會再被重新編譯。實(shí)際上只要?vim 了,即使沒有修改,它依然還是會編譯。其中 make 就是通過文件的修改時(shí)間來甄別文件是否是最新的,可執(zhí)行程序的修改時(shí)間一定是晚于原文件的時(shí)間,當(dāng)對原文件修改后,原文件的修改時(shí)間又比可執(zhí)行程序的時(shí)間新了,所以就可以 make。那么在 make 時(shí),若原文件的修改時(shí)間晚于可執(zhí)行程序,那么就可以編譯。文章來源地址http://www.zghlxwxcb.cn/news/detail-842121.html

到了這里,關(guān)于【Linux】基礎(chǔ) IO(文件系統(tǒng) & inode & 軟硬鏈接)-- 詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux】-文件系統(tǒng)的詳解以及軟硬鏈接

    【Linux】-文件系統(tǒng)的詳解以及軟硬鏈接

    ??作者:小樹苗渴望變成參天大樹?? ??作者宣言:認(rèn)真寫好每一篇博客?? ??作者gitee:gitee? ??作者專欄:C語言,數(shù)據(jù)結(jié)構(gòu)初階,Linux,C++ 動態(tài)規(guī)劃算法?? 如 果 你 喜 歡 作 者 的 文 章 ,就 給 作 者 點(diǎn) 點(diǎn) 關(guān) 注 吧! 今天我們開始講解文件系統(tǒng),上一篇我們通過文件操作,

    2024年02月04日
    瀏覽(29)
  • Linux基礎(chǔ)IO【軟硬鏈接與動靜態(tài)庫】

    Linux基礎(chǔ)IO【軟硬鏈接與動靜態(tài)庫】

    ?個(gè)人主頁: 北 海 ??所屬專欄: Linux學(xué)習(xí)之旅 ??操作環(huán)境: CentOS 7.6 阿里云遠(yuǎn)程服務(wù)器 假設(shè)你下載了一款游戲,你是否會跑到游戲所在目錄中雙擊 .exe 打開游戲?答案是不會,大多數(shù)人都會通過桌面的快捷方式直接打開文件,而這個(gè)快捷方式實(shí)際就是對 .exe 的 軟鏈接 文

    2024年02月02日
    瀏覽(24)
  • Linux文件系列:磁盤,文件系統(tǒng),軟硬鏈接

    Linux文件系列:磁盤,文件系統(tǒng),軟硬鏈接

    我們之前所學(xué)的都是被進(jìn)程打開了的文件,接下來我們要學(xué)習(xí)沒有被進(jìn)程所打開的文件,它們是存儲在磁盤當(dāng)中的 要學(xué)習(xí)這些文件,首先我們要先學(xué)習(xí)一下磁盤 1.LBA地址 我們知道磁帶在展開之后呈現(xiàn)一種帶狀結(jié)構(gòu),磁帶中的數(shù)據(jù)就是以這種線性的方式進(jìn)行存儲的 那么我們可不可以

    2024年03月27日
    瀏覽(20)
  • Linux之文件系統(tǒng)與軟硬鏈接

    Linux之文件系統(tǒng)與軟硬鏈接

    目錄 一、磁盤 1、磁盤的物理結(jié)構(gòu) 2、磁盤的存儲結(jié)構(gòu) 3、磁盤的抽象結(jié)構(gòu) 二、文件系統(tǒng)與inode 1、初識inode 2、文件系統(tǒng) 3、用inode編號找文件屬性和內(nèi)容 4、inode和文件名的關(guān)系 5、創(chuàng)建一個(gè)文件 6、查看一個(gè)文件 7、刪除一個(gè)文件 三、軟硬鏈接 1、軟連接 2、硬鏈接 磁盤可以存

    2024年02月03日
    瀏覽(22)
  • 【Linux】15. 文件系統(tǒng)與軟硬鏈接

    【Linux】15. 文件系統(tǒng)與軟硬鏈接

    在之前的學(xué)習(xí)過程當(dāng)中,我們知道當(dāng)文件被打開后需要加載進(jìn)內(nèi)存,第一步為其創(chuàng)建struct file結(jié)構(gòu)體描述其結(jié)構(gòu)(操作系統(tǒng)需要管理被打開的文件:先描述再組織),在通過進(jìn)程當(dāng)中的文件描述符指針指向文件描述符表,根據(jù)文件描述符的分配規(guī)則給新打開的文件分配文件描述符

    2024年02月09日
    瀏覽(19)
  • 【Linux】磁盤結(jié)構(gòu) | 文件系統(tǒng) | 軟硬鏈接

    【Linux】磁盤結(jié)構(gòu) | 文件系統(tǒng) | 軟硬鏈接

    文件的狀態(tài)有被打開和沒有被打開,之前談到一個(gè)文件被進(jìn)行讀寫,就要打開加載到內(nèi)存中,通過對應(yīng)的系統(tǒng)調(diào)用,fd文件描述符的管理,write和read等函數(shù)的增刪查改。并且借助緩沖區(qū)對文件屬性和內(nèi)容的修改。 大部分文件是沒有被打開的(不需要訪問),都在磁盤里保存的

    2024年01月20日
    瀏覽(25)
  • 【Linux】文件系統(tǒng)軟硬鏈接的那些事兒

    【Linux】文件系統(tǒng)軟硬鏈接的那些事兒

    作者:?舊言~ 座右銘:松樹千年終是朽,槿花一日自為榮。 目標(biāo):理解什么是軟硬鏈接,并且能創(chuàng)建軟硬鏈接。 毒雞湯:再小的事,別人做了是情分,不做是本分??墒怯行┤?永遠(yuǎn)只要求他人付出,不懂得感恩。 專欄選自:Linux初階 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲????

    2024年04月22日
    瀏覽(24)
  • 【探索Linux】—— 強(qiáng)大的命令行工具 P.13(文件系統(tǒng) | 軟硬鏈接 | 動態(tài)庫和靜態(tài)庫)

    【探索Linux】—— 強(qiáng)大的命令行工具 P.13(文件系統(tǒng) | 軟硬鏈接 | 動態(tài)庫和靜態(tài)庫)

    在計(jì)算機(jī)科學(xué)領(lǐng)域中,Linux 系統(tǒng)一直以來都是備受推崇的操作系統(tǒng)之一。其中,文件系統(tǒng)、軟硬鏈接、動態(tài)庫和靜態(tài)庫是 Linux 系統(tǒng)中非常重要的概念,在實(shí)際應(yīng)用中扮演著不可或缺的角色。 在上一篇文章中,我們了解了 Linux 系統(tǒng)中文件描述符、重定向以及基礎(chǔ) IO 操作的相關(guān)

    2024年02月04日
    瀏覽(21)
  • [Linux]基礎(chǔ)IO詳解(系統(tǒng)文件I/O接口、文件描述符、理解重定向)

    [Linux]基礎(chǔ)IO詳解(系統(tǒng)文件I/O接口、文件描述符、理解重定向)

    ? ? ? ? hello,大家好,這里是bang___bang_ ,今天和大家談?wù)凩inux中的基礎(chǔ)IO,包含內(nèi)容有對應(yīng)的系統(tǒng)文件I/O接口,文件描述符,理解重定向。 ?? 目錄 1??初識文件 2?? 系統(tǒng)文件I/O接口 ??open ??write ??read ??close 3??文件描述符 ??012 ??內(nèi)核中文件描述符的探究 ??分配

    2024年02月12日
    瀏覽(20)
  • 【Linux】inode軟硬連接

    【Linux】inode軟硬連接

    本章我們將學(xué)習(xí)學(xué)習(xí)認(rèn)識一下磁盤的的物理結(jié)構(gòu),理解磁盤分區(qū)分塊,如何對區(qū)塊進(jìn)行管理。學(xué)習(xí)認(rèn)識inode和軟硬連接。目標(biāo)已經(jīng)確定,接下來就要搬好小板凳,準(zhǔn)備開講了…???????? 前面我們學(xué)到的所有的東西,全部都是在內(nèi)存中。但是并不是所有的文件都被打開了。

    2024年02月16日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包