5分鐘讓你明白“軟鏈接”和“硬鏈接”的區別

来源:https://www.cnblogs.com/fqnb001/archive/2018/04/10/8778790.html
-Advertisement-
Play Games

今天在知乎上看到一篇十分有趣的問題: 如何評價微軟高級工程師痴迷於soft link這一linux常見概念? 雖然又是知名撕逼王曾某的撕逼帖,但是我還是想就題目中鏈接的問題簡單地講講。 什麼是鏈接? 鏈接簡單說實際上是一種文件共用的方式,是 POSIX 中的概念,主流文件系統都支持鏈接文件。 它是用 ...


今天在知乎上看到一篇十分有趣的問題: 如何評價微軟高級工程師痴迷於soft link這一linux常見概念?

雖然又是知名撕逼王曾某的撕逼帖,但是我還是想就題目中鏈接的問題簡單地講講。

什麼是鏈接?

鏈接簡單說實際上是一種文件共用的方式,是 POSIX 中的概念,主流文件系統都支持鏈接文件。

它是用來乾什麼的?

你可以將鏈接簡單地理解為 Windows 中常見的快捷方式(或是 OS X 中的替身),Linux 中常用它來解決一些庫版本的問題,通常也會將一些目錄層次較深的文件鏈接到一個更易訪問的目錄中。在這些用途上,我們通常會使用到軟鏈接(也稱符號鏈接)。

軟鏈接和硬鏈接的區別是?

下麵我們進入正題,來探討一下軟硬兩種鏈接到底有什麼區別?

首先,從使用的角度講,兩者沒有任何區別,都與正常的文件訪問方式一樣,支持讀寫,如果是可執行文件的話也可以直接執行。

那區別在哪呢?在底層的原理上。

為瞭解釋清楚,我們首先在自己的一個工作目錄下創建一個文件,然後對這個文件進行鏈接的創建:

$ touch myfile && echo "This is a plain text file." > myfile
$ cat myfile

This is a plain text file.

現在我們創建了一個普通地不能再普通的文件了。然後我們對它創建一個硬鏈接,並查看一下當前目錄:

$ ln myfile hard
$ ls -li

25869085 -rw-r--r--  2 unixzii  staff  27  7  8 17:39 hard
25869085 -rw-r--r--  2 unixzii  staff  27  7  8 17:39 myfile

ls 結果的最左邊一列,是文件的 inode 值,你可以簡單把它想成 C 語言中的指針。它指向了物理硬碟的一個區塊,事實上文件系統會維護一個引用計數,只要有文件指向這個區塊,它就不會從硬碟上消失。

你也看到了,這兩個文件就如同一個文件一樣,inode 值相同,都指向同一個區塊。

然後我們修改一下剛纔創建的 hard 鏈接文件:

$ echo "New line" >> hard
$ cat myfile

This is a plain text file.
New line

可以看到,這兩個文件果真就是一個文件。 下麵我們看看軟鏈接(也就是符號鏈接)和它有什麼區別。

$ ln -s myfile soft
$ ls -li

25869085 -rw-r--r--  2 unixzii  staff  36  7  8 17:45 hard
25869085 -rw-r--r--  2 unixzii  staff  36  7  8 17:45 myfile
25869216 lrwxr-xr-x  1 unixzii  staff   6  7  8 17:47 soft -> myfile

誒,你會發現,這個軟鏈接的 inode 竟然不一樣啊,並且它的文件屬性上也有一個 l 的 flag,這就說明它與之前我們創建的兩個文件根本不是一個類型。

下麵我們試著刪除 myfile 文件,然後分別輸出軟硬鏈接的文件內容:

$ rm myfile
$ cat hard

This is a plain text file.
New line
$ cat soft

cat: soft: No such file or directory

之前的硬鏈接沒有絲毫地影響,因為它 inode 所指向的區塊由於有一個硬鏈接在指向它,所以這個區塊仍然有效,並且可以訪問到。 然而軟鏈接的 inode 所指向的內容實際上是保存了一個絕對路徑,當用戶訪問這個文件時,系統會自動將其替換成其所指的文件路徑,然而這個文件已經被刪除了,所以自然就會顯示無法找到該文件了。

為驗證這一猜想,我們再向這個軟鏈接寫點東西:

$ echo "Something" >> soft
$ ls

hard   myfile soft

可以看到,剛纔刪除的 myfile 文件竟然又出現了!這就說明,當我們寫入訪問軟鏈接時,系統自動將其路徑替換為其所代表的絕對路徑,並直接訪問那個路徑了。

總結

到這裡我們其實可以總結一下了:

  • 硬鏈接: 與普通文件沒什麼不同,inode 都指向同一個文件在硬碟中的區塊
  • 軟鏈接: 保存了其代表的文件的絕對路徑,是另外一種文件,在硬碟上有獨立的區塊,訪問時替換自身路徑。

    

    

      

        

贊助我一杯 ☕️ 吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:這是一個沒什麼鳥用的功能。不過也算是一種拓展。 通常在那些"一鍵化部署"的shell腳本中,可能需要使用ssh執行遠程命令來實現一些簡單的自動化,這些遠程命令可能需要執行一段時間才能結束(如yum命令)。例如,遠程ssh配置yum源,遠程ssh安裝軟體包。 為了讓腳本實現"並行"執行,這個遠程s ...
  • Installing tmux 2.3 on CentOS Prerequites libevent libevent devel libevent headers curl Installing tmux ...
  • 筆者使用的是華碩FX50J裝的雙系統,之前使用過Dell的游閘安裝過,但是沒有碰到那麼多問題。所以覺得有必要記錄下。安裝雙系統之前,電腦先安裝了win10(win10也崩過幾次)。下麵開始安裝雙系統步驟。 1.UltraISO安裝系統U盤 這一步應該不用過多講述,無論是安裝windows還是ubun ...
  • 添加-m參數 ...
  • 學習Linux 目錄操作 1、pwd 可以看當前目錄路徑 2、cd change directory 改變目錄,切換目錄 cd / 進入跟目錄 cd ..返回上級目錄 cd 進入用戶主目錄 cd ../.. 返回上兩級目錄 可以使用TAB鍵來快速輸入 3、ls 顯示所有目錄,ls 文件夾,為看此目錄 ...
  • 1.安裝jdk,配置jdk環境(此步驟略過) 2.下載安裝tomcat 百度網盤鏈接: https://pan.baidu.com/s/1Ieejo7TQyzRAVPhQft8Phw 密碼: dg2v 下載之後對tomcat壓縮包進行解壓 # tar xzf apache-tomcat-7.0.85 ...
  • 1. 右鍵點擊任務管理器 2.打開資源監視器 3.搜索任務,結束任務(可能會死機) ...
  • linux 在整個架構上可以看作是三層: 1.底層代碼, (引導層strip) 跟硬體溝通的那一層的代碼(可能是彙編+c), 驅動底層的; strain: n./v. 拉緊, 張力, 氣質, 風格, 樂曲(這個詞的意思很多): 中間層代碼, OS層,用來管理文件系統,記憶體,作業調度等. 裡面的實現包 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...