自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux文件系統(tǒng)中的硬鏈接及常見(jiàn)面試題

系統(tǒng) Linux
如果能對(duì)inode的概念有所了解,對(duì)理解本文會(huì)有所幫助。如果對(duì)inode的概念不太清楚也沒(méi)有關(guān)系,我們會(huì)捎帶介紹一下。

如果能對(duì)inode的概念有所了解,對(duì)理解本文會(huì)有所幫助。如果對(duì)inode的概念不太清楚也沒(méi)有關(guān)系,我們會(huì)捎帶介紹一下。在文件系統(tǒng)的實(shí)現(xiàn)層面,我們可以認(rèn)為包含兩個(gè)組件:一個(gè)是包含數(shù)據(jù)塊的池子,池子中的數(shù)據(jù)塊是等大小的,比如4KB,8KB等;另外一個(gè)是管理這些數(shù)據(jù)塊的數(shù)據(jù)庫(kù)。當(dāng)普通用戶訪問(wèn)文件數(shù)據(jù)時(shí),正是通過(guò)前面所說(shuō)的數(shù)據(jù)庫(kù)來(lái)找到文件對(duì)應(yīng)的數(shù)據(jù)塊的。

什么是inode

inode是Linux(Unix)操作系統(tǒng)中文件系統(tǒng)的一個(gè)概念。inode的全稱為index node,也就是索引節(jié)點(diǎn)。那么inode是用來(lái)索引什么的呢?其實(shí)inode表示的是一個(gè)文件,它是用來(lái)索引文件數(shù)據(jù)的。以Ext3文件系統(tǒng)為例,其文件數(shù)據(jù)通過(guò)間接塊的方式來(lái)管理,inode通過(guò)一個(gè)間接塊樹(shù)來(lái)管理整個(gè)文件的數(shù)據(jù)。

圖1 Ext3間接塊數(shù)組組織形式圖1 Ext3間接塊數(shù)組組織形式

如圖所示,inode中包含索引信息,通過(guò)文件的邏輯地址和inode中的索引信息,可以很方面的找到文件特定位置的數(shù)據(jù)。關(guān)于inode與文件系統(tǒng)的更多知識(shí),大家可以翻閱本號(hào)的其它文章,本文不再贅述。

需要注意的是,在inode中并沒(méi)有文件名稱相關(guān)的信息。文件名稱相關(guān)的信息是存儲(chǔ)在目錄當(dāng)中,在目錄當(dāng)中有文件名稱與inode ID之間的對(duì)應(yīng)關(guān)系,具體如下所示。由于有兩者之間的對(duì)應(yīng)關(guān)系,因此可以根據(jù)文件名輕松地獲取到inode ID,進(jìn)而得到inode的信息。

圖2 目錄內(nèi)數(shù)據(jù)格式圖2 目錄內(nèi)數(shù)據(jù)格式

什么是硬鏈接

文件的硬鏈接是一個(gè)指向inode的目錄項(xiàng)。硬鏈接從表面上來(lái)說(shuō)就是一個(gè)文件,但是該文件是基于原始文件創(chuàng)建的鏈接文件。硬鏈接與源文件指向相同的inode,因此其數(shù)據(jù)也是完全一樣的。

相對(duì)于硬鏈接,還有一個(gè)軟鏈接的概念。軟鏈接是指向一個(gè)具體的文件的,而非文件的inode,所以當(dāng)文件重新命名時(shí),軟鏈接就會(huì)失效。因?yàn)樵撥涙溄釉局赶虻奈募淮嬖诹?。而硬鏈接則不會(huì)存在這種情況。

假設(shè)如圖所示的目錄結(jié)構(gòu),在目錄Linux中有file1和file2兩個(gè)文件。目錄編程語(yǔ)言中有file2文件一個(gè)指向目錄linux中file1的硬鏈接。這是在用戶層面的形態(tài),那么在文件系統(tǒng)層面是如何的呢?

在文件系統(tǒng)層面,我們知道文件系統(tǒng)通過(guò)一個(gè)inode來(lái)指示一個(gè)文件(包括目錄)的內(nèi)容。目錄“電子書(shū)”的inode ID是15,其內(nèi)容圖下圖所示,包含Linux,編程語(yǔ)言等子目錄,對(duì)應(yīng)的inode ID分別如圖所示。

對(duì)于目錄“Linux”來(lái)說(shuō),其中包含文件file1和file2,inode ID分別是19和20。目錄“編程語(yǔ)言”的包含文件file2和硬鏈接file1_hlink,可以看出file1的inode ID和硬鏈接file1_hlink的inode ID是相同的,都指向19。inode 19 的內(nèi)容如下所示。

通過(guò)上圖可以看出硬鏈接與源文件的對(duì)應(yīng)關(guān)系。

如何在Linux創(chuàng)建一個(gè)硬鏈接

前面介紹了很多原理性的內(nèi)容,那么如何在Linux中創(chuàng)建一個(gè)硬鏈接呢?很簡(jiǎn)單,通過(guò)ln命令即可,如下是創(chuàng)建硬鏈接的命令格式。

ln target_file link_name

上述命令將為文件target_file創(chuàng)建一個(gè)名為link_name的硬鏈接。通過(guò)對(duì)比你會(huì)發(fā)現(xiàn)兩者沒(méi)有任何差異,包括文件內(nèi)容和屬性。

如果你通過(guò)ls -li命令可以看到,兩個(gè)文件的inode ID是相同的(第一列的內(nèi)容),而文件的計(jì)數(shù)則是2(rwx權(quán)限后面的數(shù)字),說(shuō)明有兩個(gè)文件名稱指向該inode。

134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  link_name

下面這些知識(shí)點(diǎn)在面試中經(jīng)常遇到

在后端程序員面試過(guò)程中經(jīng)常會(huì)遇到鏈接相關(guān)的面試題,下面幾個(gè)面試題是硬鏈接相關(guān)的題目。

如果一個(gè)文件有硬鏈接,刪除源文件會(huì)怎樣?

如果存在硬鏈接,刪除源文件將不會(huì)刪除文件的數(shù)據(jù)。通過(guò)硬鏈接仍然能夠訪問(wèn)文件的數(shù)據(jù)。

為什么會(huì)出現(xiàn)這種情況?這是因?yàn)楫?dāng)有目錄項(xiàng)指向inode的時(shí)候,inode會(huì)增加引用計(jì)數(shù)。通常情況下引用計(jì)數(shù)是1,當(dāng)有一個(gè)硬鏈接時(shí)為2,再有一個(gè)硬鏈接的時(shí)候就變成了3。

當(dāng)我們刪除普通文件(無(wú)硬鏈接)的時(shí)候,首先會(huì)刪除目錄項(xiàng)中的內(nèi)容,然后將inode的引用計(jì)數(shù)減1,如果此時(shí)inode中引用計(jì)數(shù)為0,則刪除該inode,同時(shí)刪除相關(guān)聯(lián)的數(shù)據(jù)。如果非0,則只刪除目錄項(xiàng),而不刪除相關(guān)內(nèi)容。所以,如果存在硬鏈接則可以正常訪問(wèn)文件內(nèi)容。

為什么沒(méi)法為目錄創(chuàng)建硬鏈接?

我們可以為目錄創(chuàng)建一個(gè)軟鏈接,但是當(dāng)我們?yōu)槟夸泟?chuàng)建硬鏈接的時(shí)候?qū)?huì)出現(xiàn)如下錯(cuò)誤提示:

ln: newdir/test_dir: hard link not allowed for directory

為什么不能為目錄創(chuàng)建硬鏈接呢?這是因?yàn)樵谀夸浿谐宋募嚓P(guān)內(nèi)容外,還有一個(gè)指向父目錄的目錄項(xiàng),具體如下圖所示的".."目錄。如果我們?cè)谄渌夸泟?chuàng)建該目錄的硬鏈接,那么該內(nèi)容就會(huì)被改寫(xiě),從而導(dǎo)致混亂。

除了導(dǎo)致目錄數(shù)據(jù)混亂外,還有一種問(wèn)題就是會(huì)形成路徑環(huán)。至于如何形成路徑環(huán)本文不再贅述,大家可以自己思考一下。

能否區(qū)分源文件與硬鏈接?

實(shí)際上并沒(méi)有任何信息區(qū)分硬鏈接和源文件。如果我們?cè)谖募?guī)則上沒(méi)有限制,那么我們將無(wú)法區(qū)分兩者。也就是說(shuō),文件本身也是一個(gè)硬鏈接。

134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  target_file
134195 -rw-r--r-- 2 sunnyzhang sunnyzhang        0 Jul 17 19:49  link_target_file

比如上面這個(gè)例子,我們可以通過(guò)文件名稱來(lái)知道哪個(gè)是硬鏈接。但是并沒(méi)有其它信息進(jìn)行區(qū)分。

如何查找一個(gè)文件的硬鏈接?

如果你發(fā)現(xiàn)一個(gè)文件的引用計(jì)數(shù)大于1,那么該文件肯定是有硬鏈接的。那么如何找到這個(gè)文件的所有硬鏈接呢?其實(shí)很簡(jiǎn)單,通過(guò)find命令就行。find命令有個(gè)-inum選項(xiàng),用于查找指定inode ID的文件,具體如下。

find . -inum inode_number
責(zé)任編輯:華軒 來(lái)源: 今日頭條
相關(guān)推薦

2021-07-16 10:20:56

Linux 硬鏈接Linux 系統(tǒng)

2009-06-02 15:11:11

Hibernate面試題查詢

2015-09-29 09:24:22

Node.js面試題

2018-09-11 10:04:27

程序員面試數(shù)據(jù)結(jié)構(gòu)

2017-12-22 13:38:55

2021-01-14 05:12:19

Http協(xié)議面試

2023-11-15 08:27:46

Linux系統(tǒng)

2024-09-26 10:10:00

MyBatis數(shù)據(jù)庫(kù)

2017-12-04 13:30:12

Linux文件系統(tǒng)鏈接

2011-03-29 14:31:41

CC++

2017-02-28 20:00:17

Linux文件系統(tǒng)對(duì)比

2009-06-16 14:03:16

Hibernate面試Hibernate面試

2023-08-18 08:13:11

k8s容器

2018-01-26 14:39:55

Nginx網(wǎng)頁(yè)服務(wù)器

2009-12-18 17:08:10

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

2020-03-01 15:13:05

Linux文件系統(tǒng)

2020-06-01 19:00:42

Linux軟鏈接硬鏈接

2013-05-22 10:04:18

Hibernate面試問(wèn)題

2017-09-25 10:00:18

Hadoop面試題答案解析

2014-07-28 14:00:40

linux面試題
點(diǎn)贊
收藏

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