這篇文章主要介紹linux硬鏈接和軟鏈接的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機域名、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、澤庫網(wǎng)站維護、網(wǎng)站推廣。
最近前端包管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之后,發(fā)現(xiàn)pnpm整個架構(gòu)都是基于硬鏈接和軟鏈接組織的,但我對這兩個概念比較模糊,所以想研究一下。
眾所周知,Unix/Linux系統(tǒng)中一切皆文件。可見,文件在Linux系統(tǒng)中非常重要。我們平常比較直觀的對于文件的感受肯定是文件名和文件內(nèi)容。但在Linux的文件系統(tǒng)中,除了文件名和文件內(nèi)容,還有一個很重要的概念,就是inode。
維基百科這樣描述inode:
The inode (index node) is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode stores the attributes and disk block locations of the object's data.File-system object attributes may include metadata (times of last change,access, modification), as well as owner and permission data.
A directory is a list of inodes with their assigned names. The list includes an entry for itself, its parent, and each of its children.
意思就是:inode是類Unix文件系統(tǒng)中用來描述文件系統(tǒng)對象(比如文件或文件夾)的一種數(shù)據(jù)結(jié)構(gòu)。它存儲著文件的各種屬性(最近一次inode變動的時間、最近一次訪問的時間、最近一次修改的時間等元信息,以及權(quán)限信息等)。文件夾是一組inode,包括自身的入口、父節(jié)點的入口以及所有子節(jié)點。
其實,inode包含的內(nèi)容不止上面這些,具體有:
文件的字節(jié)數(shù)
文件的User ID
文件的Group ID
文件的讀、寫、執(zhí)行權(quán)限
時間戳:ctime,inode上一次變動的時間;mtime,文件內(nèi)容上一次變動的時間;atime,文件上一次打開的時間
鏈接數(shù),即有多少個文件名指向這個inode
文件數(shù)據(jù)block的位置
Linux使用的ext2/ext3文件系統(tǒng)中,不同類型的數(shù)據(jù)存放在不同的區(qū)域。inode組成的inode table存放在一個位置,文件數(shù)據(jù)塊則存在另外一個位置。
inode不包含文件名,文件名存放在文件夾信息的結(jié)構(gòu)體里。文件名相當(dāng)于inode的別名,便于我們管理和記憶。Linux系統(tǒng)對文件的操作都是通過inode做到的,當(dāng)我們修改文件時,系統(tǒng)從文件夾的信息結(jié)構(gòu)體里找到文件名對應(yīng)的inode,再通過存儲在inode中的文件數(shù)據(jù)block地址找到對應(yīng)的硬盤位置進行讀寫操作。
一般來說,inode與文件名、文件數(shù)據(jù)是一對一的關(guān)系,但我們可以通過shell命令讓多個文件名指向同一個inode,這種就是硬鏈接(hard link)。
使用ln <origin> <destination>命令可以創(chuàng)建硬鏈接,如
ln test.txt test_hard.txt
對應(yīng)nodejs的fs.link方法。
創(chuàng)建硬鏈接前,test.txt可以這樣表示:
創(chuàng)建硬鏈接后:
可以看到,test_hard.txt的inode跟源文件test.txt使用的是同一個,只是現(xiàn)在鏈接數(shù)變成2了。
我們可以執(zhí)行l(wèi)s -li查看一下。
第一列是inode number,可以看到都是13029546,所以兩個文件使用的是同一個inode。第二列是權(quán)限信息,第四列是擁有者,第六列是文件內(nèi)容大小??梢钥吹剑宋募灰粯又?,硬鏈接創(chuàng)建的文件跟源文件的所有元信息完全一樣。第三列表示鏈接數(shù),可以看到,目前鏈接數(shù)為2。
由于硬鏈接文件和源文件使用同一個inode,并指向同一塊文件數(shù)據(jù),除文件名之外的所有信息都是一樣的。所以這兩個文件是等價的,可以說是互為硬鏈接文件。修改任意一個文件,可以看到另外一個文件的內(nèi)容也會同步變化。
準(zhǔn)確來說叫符號鏈接(symbolic link),一般又叫軟鏈接(soft link)。與硬鏈接共用一個inode不同,軟鏈接會創(chuàng)建新的inode,并指向源文件??梢岳斫廛涙溄泳褪莣indows系統(tǒng)中的桌面快捷方式。
創(chuàng)建軟鏈接的命令和硬鏈接很像,多了-s參數(shù):ln -s <origin> <destination>:
ln -s test.txt test_symbolic.txt
對應(yīng)的nodejs的fs.symlink方法。
創(chuàng)建軟鏈接之后:
源文件inode的鏈接數(shù)還是1,創(chuàng)建了新的inode,軟鏈接指向源文件。
執(zhí)行l(wèi)s -li看一下:
可以看到,軟鏈接的inode number跟源文件的不一樣,權(quán)限一列開頭為小寫L,表示軟鏈,鏈接數(shù)為1,大小為8個字節(jié)。沒錯,軟鏈文件也有大小,不過一般很小,畢竟只是一個快捷方式。
文件重命名和文件移動對于Linux系統(tǒng)來說都是文件絕對路徑的更改。對硬鏈接來說,文件重命名或文件移動不會改變鏈接指向,而對軟鏈接來說,文件重命名或文件移動則使鏈接斷開,這時通過軟鏈接修改文件內(nèi)容時會重新創(chuàng)建一個新的inode,跟原文件名和文件數(shù)據(jù)塊關(guān)聯(lián)。
rm命令或者nodejs的unlink其實是將inode的鏈接數(shù)減1。對于前文的硬鏈接,刪除test_hard.txt使得inode1的鏈接數(shù)變成1,當(dāng)鏈接數(shù)變成0時,系統(tǒng)就會釋放掉這個inode,之后再創(chuàng)建的新文件就可以使用該inode的inode number了。這時沒有inode指向文件數(shù)據(jù)block,所以文件找不到了。但實際上文件數(shù)據(jù)還存在硬盤中,所以經(jīng)常能看到網(wǎng)上有一些幫助恢復(fù)誤刪的文件的工具。軟鏈接inode鏈接數(shù)為1,刪除軟鏈接則系統(tǒng)釋放該inode。
軟鏈接可以鏈接文件和文件夾,但硬鏈接只能鏈接文件。
軟鏈接可以跨不同的文件系統(tǒng)創(chuàng)建,但是硬鏈接不行,因為硬鏈接是共用一個inode,而不同的文件系統(tǒng)有不同的inode table。
文件備份:為了防止重要的文件被誤刪,文件備份是一種好的辦法,但拷貝文件會帶來磁盤空間的消耗。硬鏈接能不占用磁盤空間實現(xiàn)文件備份。
文件共享:多人共同維護同一份文件時,可以通過硬鏈接的方式,在私人目錄里創(chuàng)建硬鏈接,每個人的修改都能同步到源文件,但又避免某個人誤刪就丟掉了文件的問題。
文件分類:不同的文件資源需要分類,比如某個電影即是的分類是外國、懸疑,那我們可以在外國的文件夾和懸疑的文件夾里分別創(chuàng)建硬鏈接,這樣可以避免重復(fù)拷貝電影浪費磁盤空間。有人可能說,使用軟鏈接不也可以嗎?是的,但不太好。因為一旦源文件移動位置或者重命名,軟鏈接就失效了。
快捷方式:對于路徑很深的文件,查找起來不太方便。利用軟鏈接在桌面創(chuàng)建快捷方式,可以迅速打開并編輯文件。
靈活切換程序版本:對于機器上同時存在多個版本的程序,可以通過更改軟鏈接的指向,從而迅速切換程序版本。這里提到了python版本的切換可以這么做。
動態(tài)庫版本管理:不是很懂,具體可以看這里。
Linux系統(tǒng)通過inode管理文件,inode存儲著文件字節(jié)數(shù)、文件權(quán)限、鏈接數(shù)、數(shù)據(jù)block位置等信息。
硬鏈接與源文件共用inode,除了文件名不同,其他與源文件一樣。不能對文件夾創(chuàng)建硬鏈接,不能對不同的文件系統(tǒng)的文件創(chuàng)建硬鏈接。
軟鏈接類似于windows的快捷方式,有獨立的inode??梢詫ξ募A或不同文件系統(tǒng)的文件創(chuàng)建軟鏈接。
硬鏈接和軟鏈接修改文件內(nèi)容都會同步到源文件,因為本質(zhì)上它們都是指向源文件的數(shù)據(jù)block。
以上是“l(fā)inux硬鏈接和軟鏈接的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享文章:linux硬鏈接和軟鏈接的示例分析
文章分享:http://jinyejixie.com/article12/iicegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、商城網(wǎng)站、企業(yè)網(wǎng)站制作、動態(tài)網(wǎng)站、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)