1. 磁盤結構
? ? ? ? 磁盤在我們的計算機中有著重要的地位,當文件沒有被打開時其數據就存儲在磁盤上,要了解磁盤的工作原理先要了解磁盤的結構。
1.1 磁盤的物理結構
????????以傳統的存儲設備機械硬盤為例,它通過磁性盤片和磁頭來讀寫數據。磁盤內部有多個旋轉的磁盤(盤片),磁頭通過移動到不同的位置來讀寫數據。
? ? ? ? 機械硬盤的結構主要有:
? ? ? ? 盤片(Platters):硬盤的存儲介質,通常由鋁或玻璃制成,表面覆蓋有磁性涂層。數據以磁化的形式存儲在盤片的表面。每個盤片都有兩個面可以用來存儲數據。
????????磁頭(Read/Write Heads):磁頭用于讀取和寫入數據。每個盤片面上都有一個磁頭,通過磁頭的電磁作用來改變磁化狀態,進而寫入數據;或者通過讀取磁化狀態來獲取數據。
????????主軸電機(Spindle Motor):驅動盤片旋轉的電機,通常有幾千轉每分鐘(RPM)的速度。常見的轉速有5400 RPM和7200 RPM,較高的轉速意味著數據讀取和寫入速度更快。
????????磁頭臂(Actuator Arm):連接磁頭和驅動電機的部分,負責移動磁頭,使其能夠定位到盤片的不同區域。
????????控制器(Controller):硬盤的“腦袋”,負責控制硬盤的讀寫操作、定位磁頭、管理數據的存取等。
????????機械硬盤的成本相對較低,存儲容量大。但是速度較慢,尤其是隨機訪問速度,因為磁頭需要移動到正確的位置讀取數據。
1.2 磁盤的存儲結構
????????機械硬盤(HDD)采用的是一種基于磁性存儲的結構,數據被存儲在盤片上,并按照一定的方式進行組織,以便磁頭能夠快速且高效地讀取或寫入數據。
????????磁道(Tracks):磁道是硬盤上盤片表面上一個圓形的存儲區域。每個盤片上都有多個磁道,磁道的排列是同心圓形狀,磁道的數量通常取決于盤片的密度和大小。硬盤上的每個磁道可以看作是一個線性存儲區域,數據按照順序存儲在這些磁道上。
????????扇區(Sectors):扇區是硬盤上磁道的最小存儲單元,硬盤通過扇區來管理數據的存儲和讀取。每個扇區通常存儲512字節的數據。磁盤將數據按照扇區來組織和存儲,因此每個扇區都有一個編號。當硬盤控制器發出讀寫請求時,它會指定具體的扇區編號,以確定需要訪問的物理位置。當磁頭在磁道上移動時,它會按照一定的順序訪問磁道上的每個扇區。讀取或寫入操作的最小單位通常是扇區。扇區的編號是從1開始的。
? ? ? ? 磁道相對于磁盤面是同心圓環的分布方式,扇區則是同心圓環上的一段扇環。對于老式磁盤而言,采取的是非分區記錄方式,即不同磁道的扇區數目相同。此時所有的扇環圓心角大小相等,又因為扇區存儲的都是512字節的數據,所以由內向外存儲密度逐漸減小。新式的磁盤采取的則是分區記錄方式,不同磁道扇區數不相同。
????????柱面(Cylinders):柱面是硬盤上由多個盤片的相同磁道所組成的一個三維概念。硬盤有多個盤片,每個盤片上都有若干個磁道。在硬盤工作時,磁頭會在同一時間訪問多個盤片上的相同磁道,這些磁道在物理上是垂直對齊的。
1.2.1 扇區的定位——CHS尋址
????????磁盤讀寫就是依靠這些結構完成的。
????????磁盤的盤片是始終處于高速旋轉(固定速率)中的,磁盤有多個盤片,而盤片的兩個面都是可以讀寫的。讀寫工作由磁頭來完成,每一個磁盤面都有一個自己的磁頭,所有的磁頭被機械臂連接在一起,他們是同時做同樣的運動的。
????????當需要對某一個位置(扇區)進行讀寫操作時,硬盤控制器會控制磁頭移動到對應的磁道,然后等待盤片旋轉到指定扇區位置后,對應盤面的磁頭就開始讀寫數據。
? ? ? ? 定位扇區實質就是定位圓柱體內一個點,類比柱坐標系需要三維數據:半徑、高、角度,通過上面的磁盤結構與讀寫過程,定位一個扇區就需要柱面號(半徑)、磁頭號(高)、扇區號(角度)。
? ? ? ? 于是我們可以計算出磁盤容量=磁頭數×柱面數×每道扇區數×扇區字節大小。
1.3 磁盤的邏輯結構
1.3.1 邏輯地址塊(LBA)
? ? ? ? 對于一個磁盤,我們使用的CHS尋址方法實際上是一種三維尋址方法,三個維度分別是面號、磁頭號、扇區號,于是這實際上就是一個三維數組。而我們知道在C語言中,幾維數組都好,它們實質上在物理空間中是連續存儲的,相當于是一個一維數組一樣。
? ? ? ? 對于磁盤而言也是一樣,扇區是基本的單位,多個扇區在一起就組合成了磁道,所有盤面的同位置磁道共同組合成為一個柱面,多個柱面就構成了整個磁盤。
? ? ? ? 于是對于這樣的一個邏輯結構的磁盤,我們抽象成為了一個數組結構,就可以通過線性地址的方法來定位任何一個扇區了。
1.3.2 CHS與LBA的轉換
? ? ? ? 需要注意的是,在CHS下柱面號、磁頭號是從0開始的,扇區號從1開始。
? ? ? ? CHS→LBA:
????????LBA=柱面號×單個柱面扇區數+磁頭號×單個磁道扇區數+扇區號-1
? ? ? ??LBA→CHS:
? ? ? ? 柱面號=LBA/單個柱面扇區數
? ? ? ? 磁頭號=(LBA%單個柱面扇區數)/單個磁道扇區數
? ? ? ? 扇區號=LBA%單個磁道扇區數+1
2. 文件系統
2.1 磁盤分區
2.1.1? 物理塊
? ? ? ? 磁盤以扇區作為基本的存儲單位,當操作系統和磁盤IO交互時,由于磁盤扇區大小為512字節,單次交互數據量少,所以會一次性交互1KB、2KB、4KB、8KB等大小的數據,而其中以4KB最為普遍,因此抽象出物理塊的概念,將4KB大小作為一個物理塊的大小。于是一個塊中就包含了8個扇區,也就是8個LBA地址。在與操作系統交互時,基本存儲單位就是塊,此時磁盤也可以看作是以塊為單位的一維數組。
? ? ? ? 因為我們知道一個塊對應著8個LBA地址,于是就二者之間的轉換就非常容易了。
2.1.2?分區
? ? ? ? 磁盤分區在我們使用電腦的過程中會有很多使用經驗。磁盤分區是對硬盤物理存儲空間進行邏輯劃分的過程,通過分區,硬盤可以被劃分為多個獨立的區域,每個區域可以被操作系統視為一個獨立的存儲設備,即不同分區允許使用不同的文件系統。
????????可以看到我的機器具有三個分區。
? ? ? ? 對于一個磁盤而言,我們在將其看作一個以塊為單位的一維數組后,對其分區相當于就是對這個一維數組進行分割,劃分成為幾個區間。于是要指明分區的具體大小與位置,只需要給出各個分區的起始和終止塊號即可。
2.2 Ext2文件系統
2.2.1 分組
? ? ? ? 硬盤(Disk)被分為了多個分區(Partition),對于任意一個磁盤分區,它的開頭會存在一個啟動塊(Boot Sector),這個啟動塊的??是確定的1KB,?來存儲磁盤分區信息和啟動信息,任何?件系統都不能修改啟動塊。在其之后才是真正的分區的文件系統。
????????為了更好地管理分區的內容,Ext2文件系統對一個分區的空間繼續進行劃分,這樣就劃分出了很多的塊組(Block Group)。
? ? ? ? 得到的分組都具有同樣的結構,包括 Super Block、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data Blocks。
2.2.1.1?inode
? ? ? ? 文件是由屬性和內容兩部分組成的,因此屬性也需要存儲在磁盤中。為了將文件屬性組織起來,Ext2文件系統使用inode的結構體對其屬性進行描述,記錄了文件的權限、屬主、時間、大小等信息以及文件的i結點編號。通過ls的-i選項我們就可以看到文件的inode值,他們的值是不重復的。
? ? ? ? 每一個文件都有著自己的inode,inode結構體的大小是固定的,一般而言大小為128字節或256字節。
2.2.1.1 超級塊(Super Block)
? ? ? ? 超級塊中存放的是文件系統的結構信息,描述了所在分區的文件系統結構,包括分區的inode和block的總量,inode和block的剩余數量,分區最近讀寫時間等等。
? ? ? ? 作為存儲分區信息的塊而言,本來應該是屬于分區結構一層的,為什么會將其下放到塊組結構中呢。這是因為超級塊因為記錄著分區信息,所以十分重要,一旦出現錯誤就會使得整個分區文件系統崩潰。將其放在組的層級之中,就可以創建多個備份來保證文件系統的健壯性。
????????每一個分區都有多個組,其中第一個組一定會有超級塊的備份,其余的個別組會具有超級塊的備份,以此來保證當Super Block的信息被破壞后還有備用的信息。
2.2.1.2 塊組描述符表(GDT/Group Descriptor Table)
????????GDT中存放的是塊組的屬性信息,在每一個塊組中都有一個,描述了當前組的結構信息。包括inode Table開始的塊號、Data Blocks開始的塊號、inode和Data Block剩余的數量等。
? ? ? ? 在此做一下小結和區別,我們當前的層次一共有三層。
? ? ? ? ①第一層是磁盤被分為多個分區。每個分區從何處開始,到何處結束的信息由分區表記錄,而這個分區表位于磁盤的主引導記錄(MBR,Master Boot Record),通常在磁盤第一個扇區。——磁盤內的分區信息→主引導記錄
? ? ? ? ②第二層是分區被分為多個塊組。每個塊組的大小、起始結束塊號等塊組信息由超級塊(Super Block)記錄。超級表位于分區下第一個組塊中和其他某幾個組塊中。——分區內的塊組信息→超級塊
? ? ? ? ③第三層是組塊被劃分為不同的區域。由塊組描述符表(GDT)來記錄塊組內Block Bitmap、inode Bitmap、inode Table、Data Blocks的起始結束塊號與塊總量和剩余量等信息。——塊組內的塊結構信息→GDT
2.2.1.3 塊位圖(Block Bitmap)
? ? ? ? 塊位圖以位圖的形式管理數據塊的占用情況,每個塊對應一個bit位。
2.2.1.4?inode位圖(inode?Bitmap)
? ? ? ? inode位圖以位圖的形式管理i節點表的占用情況,每個inode值對應一個bit位。
2.2.1.5 i節點表(inode Table)
? ? ? ? i節點表中存儲的就是當前組內所有的文件屬性信息,值得注意的是文件名并是inode的字段。inode的結點編號分區之間相互隔離,即同一分區內inode編號是唯一的,不同分區下inode編號可以相同。
?????????在inode結構體內存在著一個數組,用于指向文件對應的文件內容存儲的塊。出于inode結構體大小的128字節限制,這個數組一般有15個元素。
????????前12個屬于直接塊指針,即直接指向文件對應的數據塊。這種方式很快,但是因為一個元素只能指向數據塊,所以12個指針一共可以容納12*4KB=48KB大小的文件。
? ? ? ? 第13個指針是一級間接塊索引表指針,即先指向一個塊,這個塊中存儲著文件的數據塊的直接塊指針。于是可容納文件的大小就增加了4KB(索引表大小--一個塊)/4B(一個塊號占的字節數)*4KB(一個數據塊的大小)=4MB。
? ? ? ? 第14個指針是二級間接塊索引表指針,即指向的一個塊是索引,這個塊再指向的4KB/4B=1K個塊也是索引,所以最后可容納文件的大小增加了1K*4MB=4GB。
? ? ? ? 第15個指針是三級間接塊索引表指針,即指向的一個塊是索引,這個塊再指向的4KB/4B=1K個塊也是索引,這個二級索引指向的塊也是索引,所以最后可容納文件的大小增加了1K*1K*4MB=4TB。
? ? ? ?通過這樣間接塊索引的方法即可讓僅僅只有128KB的文件能夠管理GB級別的文件。當文件較小時,只需要使用前12個指針,速度最快,隨著文件的大小增加,再啟用后續的索引塊。
3.3.1.6 數據塊(Data Block)
? ? ? ? 在數據塊中存放的就是各個文件的文件內容了,可以通過文件i結點表映射找到數據塊中需要的內容。實際在分組中占據空間最大空間的是Data Blocks。
2.2.2 格式化
? ? ? ??文件系統格式化是在磁盤分區之后對分區進行初始化的一系列操作,目的是在一個已分區的存儲介質上建立一個結構化的方式來存儲和管理數據,方便操作系統進行讀寫和管理,通俗來說格式化相當于將搭建整個文件系統的框架好。
? ? ? ? 格式化一個分區,對于每一個塊組,首先會創建超級塊,記錄了分區內的塊組信息;然后創建GDT,管理塊組結構;然后將兩個位圖初始化為全0;然后創建inode表與數據塊區域。于是格式化后,分區有幾個塊組、每個塊組大小、分配的inode數量等結構信息都已經被決定。
? ? ? ? 由于一個塊組內inode的數量和數據塊的數量已經在格式化時被決定,所以會出現inode和數據塊數量不匹配的情況。當文件系統中有大量小文件,每個文件都需要一個 inode,但它們使用的數據塊很少時,inode 耗盡而數據塊未耗盡;當文件系統中有少量大文件,每個文件占用大量數據塊,但只需要一個 inode時,就會出現inode 未耗盡而數據塊耗盡。
2.2.3 文件操作(增刪查改)
? ? ? ? 基于這樣的這樣的文件系統,我們通過文件操作來系統地理解其工作流程。
? ? ? ? 已知創建了一個log.txt文件,其i結點值為114514。在創建時,首先操作系統會在確定新創建的文件屬于哪一個組,然后查詢inode位圖和塊位圖找到一個空閑inode與數據塊分配給文件,然后寫入屬性和內容。最后這個申請到的inode就是i結點位圖空閑的下標+分組起始inode值。
? ? ? ? 對于同一個log.txt文件進行查找,實際上是通過i結點值來查詢的。通過inode對比組inode區間找到對應的組,然后減去start inode即可找到文件的inode結點,通過結構體即可訪問到內容。
? ? ? ? 刪除則是在查找的基礎上將位圖對應的位置置為空閑。修改則是在查找的基礎上對文件的i結點內容或數據塊進行讀入內存,然后修改再寫回磁盤。
2.2.4 目錄文件
? ? ? ? 對于目錄文件,在文件系統看來也和普通文件一樣,有著自己的inode結點,也有著自己的數據塊。只是目錄文件的數據塊(內容)是目錄內的文件名和inode值的映射關系。
? ? ? ? 于是我們理解為什么說訪問文件使用的是inode值而非文件名,因為在使用文件名訪問文件時,首先打開文件所在目錄的,從其中獲取文件名對應的inode值,從而才能查找到文件并打開。于是目錄的r權限會限制能否獲取目錄內容——目錄下文件的文件名與inode值映射,從而限制能否訪問目錄下的文件;w權限會限制能否修改目錄內容,從而限制能否創建、修改、刪除目錄下的文件。
2.2.4.1 路徑解析
? ? ? ? 目錄也是文件,訪問當前目錄也需要他的inode值,因此需要打開它所在的目錄內容來進行映射,而訪問上級目錄又需要上上級目錄的幫助。于是不論打開什么文件,最后一定會遞歸到要打開根目錄來進行文件名與inode映射,于是操作系統將根目錄的固定加載到了內存中,以便從根目錄開始解析。
? ? ? ? 于是我們知道,打開路徑為 "/home/xlz/tmp/log.txt" 這樣的一個文件,首先會從根目錄開始,打開根目錄,將根目錄內容中的home文件名映射得到一個inode,找到這個inode的inode結點從而找到數據塊,取得其內容后就可繼續拿出其中xlz文件名映射的inode。同樣打開了xlz的內容后,映射得到tmp的inode,再由tmp的內容映射得到log.txt的inode,從而找到了這個文件。
? ? ? ? 因此打開文件需要拿到其路徑,而進程打開文件,絕對路徑不必多說。相對路徑由于進程CWD的存在,取得文件的路徑也很容易。接著層層解析自然就可以打開對應的文件。
2.2.4.2 路徑緩存
? ? ? ? 如果對于所有文件的訪問都要從根目錄解析一遍,那效率未免也太低了,于是解決這種問題最經典的方案就是緩存技術。而路徑文件這種結構是一種天生的樹形結構,所以緩存結構采用樹狀結構自然是最優選擇。
? ? ? ? 在Linux中,存在名為dentry的結構體,它就是文件作為樹狀緩存結構的結點,其中包含了文件的inode、父子結點、LRU隊列等信息。
? ? ? ? 所有的文件都會存在自己的dentry結構體,樹的結點從根目錄開始,當需要打開某個文件時,就會根據路徑提供的順序查找這棵樹,查找到了就可以返回文件inode從而得到文件內容。如果沒有找到,則會逐步進行路徑解析,并在樹上增加dentry結點,緩存新的路徑。
? ? ? ? 需要注意的是這棵緩存樹是內核數據結構,僅僅存在于內存當中,來方便內存進行文件訪問。整棵樹形節點也被LRU結構管理,淘汰last recently used的結點。
2.3 分區掛載
①制作磁盤塊
dd if=/dev/zero of=./disk.img bs=1M count=5
????????dd——dd是一個 Unix/Linux 系統上的工具,用于低級數據拷貝和轉換,能夠在設備之間或文件之間以塊為單位復制數據,并支持數據的格式化、轉換等操作。它常用于創建磁盤鏡像、寫入磁盤、備份等任務。
????????if=/dev/zero——if 表示輸入文件(Input File)。/dev/zero 是一個特殊的設備文件,表示無限的空數據流(每個字節為 0)。這里使用 /dev/zero 作為數據源,也就是生成連續的空字節。
????????of=./disk.img——of 表示輸出文件(Output File)。./disk.img 是輸出文件的路徑,即在當前目錄下創建一個名為 disk.img 的文件。
????????bs=1M——bs 表示塊大小(Block Size)。1M 表示每個塊的大小為 1 MB(1,048,576 字節)。這是拷貝的基本單位。
????????count=5——count 指定拷貝多少個塊。5 表示拷貝 5 個塊。
? ? ? ? dd是在按塊進行數據拷貝。在這條指令后dd 會從 /dev/zero 中讀取 5 個塊的數據(每塊大小為 1 MB),然后將這些數據寫入 disk.img 文件,最終在當前目錄下生成一個大小為 5 MB 的文件 disk.img。
②格式化文件系統
mkfs.ext4 disk.img
????????mkfs.ext4——mkfs 是 "make filesystem" 的縮寫,用來創建文件系統。ext4 是常用的 Linux 文件系統類型。
????????disk.img——disk.img 是創建 ext4 文件系統的目標文件。它可以是一個文件,表示一個虛擬磁盤映像。
? ? ? ? mkfs將文件格式化為文件系統。在這步之后,該文件將會被格式化為 ext4 文件系統的結構,并可以像一個實際的磁盤分區一樣使用。
③查看分區
df -h
????????df—— "disk free"(磁盤空間)的縮寫。它用于顯示文件系統的磁盤空間使用情況。
????????-h選項——表示 human-readable(易讀的格式)。它會以適合人類閱讀的格式顯示磁盤空間,通常以 KB、MB、GB 等單位而不是字節(B)顯示。?
④分區掛載?
sudo mount -t ext4 ./disk.img /mnt/test/
????????將磁盤映像文件 disk.img 掛載到 Linux 系統中的一個目錄 /mnt/test/,并指定該磁盤映像使用 ext4 文件系統。
????????在類 Unix 操作系統(如 Linux)中,掛載(mount)是將一個存儲設備或文件系統(如磁盤、分區、CD-ROM、USB 設備等)與系統的目錄結構連接起來的過程。掛載之后,操作系統就能把存儲設備上的文件和目錄呈現給用戶,并允許用戶像操作本地文件一樣操作它們。掛載的目的是讓操作系統能夠訪問存儲設備上的數據,把它“掛”到文件系統的樹狀結構中,使用戶可以通過目錄路徑訪問這些數據。
? ? ? ? 對于真正的存儲設備而言,掛載就是將其接入系統,使得操作系統可以訪問存儲設備的數據從而讓用戶也可以進行訪問。
? ? ? ? 而對于我們這里的磁盤映像文件,也就是虛擬磁盤,有一些容易混淆的地方。可以類比,磁盤映像文件和u盤一樣,一旦生成大小就是固定的,其中的空間只有使用和未使用兩種情況。通過dd if=/dev/zero of=./disk.img bs=1M count=5 生成的磁盤映像文件實際上是將實際的磁盤中拿出5M的空間分給了磁盤映像文件,而磁盤映像文件作為一個磁盤其大小就是5M,這時把它掛載后進行文件創建等操作,在真實磁盤視角是對這個5M映像文件的內容做修改,而在虛擬磁盤的視角是在自己5M大小的磁盤空間內創建文件。簡言之就是拿出了5M的空間給虛擬磁盤,而這個虛擬磁盤在實際磁盤中的表現就是映像文件。
????????掛載點則是一個特定的目錄,操作系統通過該目錄將文件系統中的文件和目錄呈現給用戶和應用程序。例如,/(根目錄)是文件系統的起始掛載點,其他磁盤分區、文件系統或設備可以掛載到 /data、/mnt、/home 等目錄上。?
? ? ? ? 其中/dev/loop0 是 Linux 系統中的一個環回設備(loop device)。環回設備允許你將一個普通的文件(如磁盤映像文件)映射到一個虛擬的塊設備,從而使操作系統能夠像處理物理磁盤一樣處理這個文件。
? ? ? ? 因為磁盤映像文件被看作了環回設備loop0,所以一個文件構成的虛擬磁盤也可以對文件進行掛載、讀取、寫入、分區等操作,就好像它是一個物理設備。通常情況下,環回設備用于掛載磁盤映像文件,或者以類似磁盤的方式訪問存儲在普通文件中的數據。
?⑤分區卸載
sudo umount /mnt/test
????????用于卸載已掛載的文件系統,將之前掛載到 /mnt/test 目錄的文件系統卸載掉。
3. 軟硬鏈接
在Linux中,**軟鏈接**(Symbolic Link)和**硬鏈接**(Hard Link)都是用來為文件創建別名的方式,但它們在實現和使用上有所不同。
3.1 軟鏈接(Symbolic Link 或 Symlink)
????????軟鏈接,也叫符號鏈接,是一個指向目標文件路徑的特殊文件,可以類比為Windows中的快捷方式。軟鏈接文件中保存的是目標文件的路徑,而不是目標文件的內容,因此它是一個獨立的文件,擁有自己獨立的inode。
創建方法【后者鏈接前者】
ln -s <原文件或目錄> <軟鏈接>
注意點
????????①通過軟鏈接查找來打開目標文件的過程包括:通過軟鏈接文件的inode找到其物理塊,其中存儲著目標文件的路徑信息;內存得到這個路徑信息后,進行路徑解析,一步步找到目標文件并打開。因此軟鏈接不局限于當前文件系統,而可以跨文件系統。
? ? ? ? ②軟鏈接不僅可以指向文件,還可以指向目錄。
? ? ? ? ③軟連接文件文件在Linux中是獨立的,有一個自己唯一的inode,包含文件的元數據(如文件大小、權限等)。
? ? ? ? ④刪除軟鏈接不會影響原文件。如果目標文件被刪除,軟鏈接就會變成懸掛鏈接(即無法訪問的鏈接)。
3.2 硬鏈接(Hard Link)
????????硬鏈接是文件系統中對文件的直接引用。硬鏈接創建后,多個文件名指向相同的磁盤塊(即相同的數據)。每個硬鏈接都有相同的inode編號,它們指向相同的數據塊,因此刪除其中一個硬鏈接并不會影響其他硬鏈接,只有當所有硬鏈接都被刪除時,磁盤上的數據才會被回收。
創建方法
ln <原文件> <硬鏈接>
? ? ? ? 因為通過文件名來打開文件,實際上是讀取了所在目錄的文件內容,將文件名映射為了inode值,所以硬鏈接的本質就是創建了一個映射到同一個inode的新文件名,此時一個inode有多個文件名映射了。
? ? ? ? 通過觀察發現軟鏈接的文件間inode不同,而硬鏈接的文件具有相同的inode。
????????另外可以發現在我們熟知的文件信息中有一個數字(紅色標出),這個實際上是硬鏈接數(inode的引用計數),表示當前文件有多少個硬鏈接(inode有多少個映射關系)。如我們剛才創建的text.txt的硬鏈接,二者的引用計數都是2。
? ? ? ? ?又可以發現dir1的引用計數也是2,這是因為目錄文件中默認包含.和..兩個目錄,這個其中.就是指向dir1自身的一個硬鏈接。
? ? ? ? 我們發現當在dir1中再創建一個目錄dir2,會發現引用計數又變為了3,這是因為dir2中的..是dir1目錄的硬鏈接。所以目錄文件固有的.和..實際上就是硬鏈接。
? ? ? ? 可以看到根目錄有17個硬鏈接,所以我們知道根目錄下有16個文件(17-1個根目錄下的.目錄文件),其余的目錄都會貢獻一個..硬鏈接。值得一提的是根目錄的..也是根目錄自身,但是操作系統為了使所有文件保持一致就沒有將..加入引用計數。
注意點
????????①通過硬鏈接查找來打開目標文件和正常文件一致,只需要根據自己的文件名映射到inode訪問數據塊即可。所以硬鏈接不能跨文件系統,因為硬鏈接文件inode一致,不同文件系統下的inode各自為一套。
? ? ? ? ②無法創建目錄的硬鏈接,這是出于避免循環結構的考慮。但是.和..就是目錄的硬鏈接,這是操作系統做的例外操作,用戶是不可以創建目錄的硬鏈接的。
? ? ? ? ③刪除一個硬鏈接不會影響文件內容,只有所有鏈接刪除時,文件才會被刪除。于是我們可以在剪切大型文件的時候,直接使用硬鏈接的方式,避免拷貝開銷。同時也可以采取硬鏈接的方式來備份文件。