国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

linux硬鏈接和軟鏈接的示例解析

2024-08-27 23:55:00
字體:
供稿:網(wǎng)友
  這篇文章主要介紹linux硬鏈接和軟鏈接的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
 
  前言
  最近前端包管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之后,發(fā)現(xiàn)pnpm整個架構(gòu)都是基于硬鏈接和軟鏈接組織的,但我對這兩個概念比較模糊,所以想研究一下。
 
  眾所周知,Unix/Linux系統(tǒng)中一切皆文件。可見,文件在Linux系統(tǒng)中非常重要。我們平常比較直觀的對于文件的感受肯定是文件名和文件內(nèi)容。但在Linux的文件系統(tǒng)中,除了文件名和文件內(nèi)容,還有一個很重要的概念,就是inode。
 
  linux硬鏈接和軟鏈接的示例分析
 
  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)的硬盤位置進(jìn)行讀寫操作。
 
  linux硬鏈接和軟鏈接的示例分析
 
  硬鏈接
  一般來說,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可以這樣表示:
 
  linux硬鏈接和軟鏈接的示例分析
 
  創(chuàng)建硬鏈接后:
 
  linux硬鏈接和軟鏈接的示例分析
 
  可以看到,test_hard.txt的inode跟源文件test.txt使用的是同一個,只是現(xiàn)在鏈接數(shù)變成2了。
 
  我們可以執(zhí)行l(wèi)s -li查看一下。
 
  linux硬鏈接和軟鏈接的示例分析
 
  第一列是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,并指向源文件。可以理解軟鏈接就是windows系統(tǒng)中的桌面快捷方式。
 
  創(chuàng)建軟鏈接的命令和硬鏈接很像,多了-s參數(shù):ln -s <origin> <destination>:
 
  ln -s test.txt test_symbolic.txt
  對應(yīng)的nodejs的fs.symlink方法。
 
  創(chuàng)建軟鏈接之后:
 
  linux硬鏈接和軟鏈接的示例分析
 
  源文件inode的鏈接數(shù)還是1,創(chuàng)建了新的inode,軟鏈接指向源文件。
 
  執(zhí)行l(wèi)s -li看一下:
 
  linux硬鏈接和軟鏈接的示例分析
 
  可以看到,軟鏈接的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)建鏈接
  軟鏈接可以跨不同的文件系統(tǒng)創(chuàng)建,但是硬鏈接不行,因為硬鏈接是共用一個inode,而不同的文件系統(tǒng)有不同的inode table。
 
  應(yīng)用場景
  硬鏈接
  文件備份:為了防止重要的文件被誤刪,文件備份是一種好的辦法,但拷貝文件會帶來磁盤空間的消耗。硬鏈接能不占用磁盤空間實現(xiàn)文件備份。
  文件共享:多人共同維護(hù)同一份文件時,可以通過硬鏈接的方式,在私人目錄里創(chuàng)建硬鏈接,每個人的修改都能同步到源文件,但又避免某個人誤刪就丟掉了文件的問題。
  文件分類:不同的文件資源需要分類,比如某個電影即是的分類是外國、懸疑,那我們可以在外國的文件夾和懸疑的文件夾里分別創(chuàng)建硬鏈接,這樣可以避免重復(fù)拷貝電影浪費磁盤空間。有人可能說,使用軟鏈接不也可以嗎?是的,但不太好。因為一旦源文件移動位置或者重命名,軟鏈接就失效了。
  軟鏈接
  快捷方式:對于路徑很深的文件,查找起來不太方便。利用軟鏈接在桌面創(chuàng)建快捷方式,可以迅速打開并編輯文件。
  靈活切換程序版本:對于機(jī)器上同時存在多個版本的程序,可以通過更改軟鏈接的指向,從而迅速切換程序版本。這里提到了python版本的切換可以這么做。
  動態(tài)庫版本管理:不是很懂,具體可以看這里。
  總結(jié)
  Linux系統(tǒng)通過inode管理文件,inode存儲著文件字節(jié)數(shù)、文件權(quán)限、鏈接數(shù)、數(shù)據(jù)block位置等信息。
 
  硬鏈接與源文件共用inode,除了文件名不同,其他與源文件一樣。不能對文件夾創(chuàng)建硬鏈接,不能對不同的文件系統(tǒng)的文件創(chuàng)建硬鏈接。
 
  軟鏈接類似于windows的快捷方式,有獨立的inode。可以對文件夾或不同文件系統(tǒng)的文件創(chuàng)建軟鏈接。
 
  硬鏈接和軟鏈接修改文件內(nèi)容都會同步到源文件,因為本質(zhì)上它們都是指向源文件的數(shù)據(jù)block。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 顺昌县| 巴彦淖尔市| 会宁县| 万州区| 华宁县| 徐水县| 松潘县| 马山县| 黔江区| 九江县| 龙泉市| 绥棱县| 普洱| 营山县| 富平县| 崇阳县| 黑山县| 周至县| 修水县| 宜章县| 阿坝| 鹤峰县| 永德县| 东光县| 麦盖提县| 本溪| 木兰县| 英德市| 昭通市| 南郑县| 顺平县| 手游| 凌海市| 黄陵县| 新田县| 公主岭市| 滦南县| 利川市| 广州市| 峨边| 云林县|