Re: 硬連結的用途

看板Linux作者 (cuello)時間4年前 (2020/05/27 19:44), 編輯推噓4(4015)
留言19則, 4人參與, 4年前最新討論串2/2 (看更多)
※ 引述《HILL33LOVE (就是愛希爾)》之銘言: : 最近看軟連結跟硬連結的比較,有整理一下筆記資訊,對於硬連結的觀念是都使用同一個 : inode,省硬碟空間等等,但是對於”實務”上還是不是很了解大家平常都使用在那邊? : 再請大家給點指教,謝謝 我自己在實務上做過的, 是讓同一個可執行檔具有多種"操作模式". 這也是系統上常看見的"實務應用". 例如用以下指令列出 /bin/ 下面 link count 大於 1 的所有檔案: $ find /bin/ -type f -links +1 -exec stat -c "%h %i %n" '{}' \; | sort 2 7340502 /bin/gunzip 2 7340502 /bin/uncompress (...) 3 7340137 /bin/bunzip2 3 7340137 /bin/bzcat 3 7340137 /bin/bzip2 以 bunzip2 為例好了, 如果我要它解壓縮並送到 stdout 的話, 會做: $ bunzip2 -c 某檔.bz2 但是, 如果以 bzcat 叫它的話, 它會直接進入 "-c" 的操作模式: $ zcat 某檔.bz2 兩者結果是一樣的. 寫程式用過一陣子, 後來不知怎樣就不這麼玩了... 順便提一下 hard link 的基本觀念, 有問題請大家幫我訂正 所謂"檔案", 是個資料結構, 它唯一的 id 是 inode number, 而非檔名, 因為同一個"檔案"可以有很多檔名, 而且沒有先後之分! 所以, 想像中, "檔案", 比較是 inode, 而不是 "檔名". 如上, inode 7340137 指向一個可執行檔, 並具有三個平起平坐的檔名: /bin/bunzip2, /bin/bzcat, /bin/bzip2 (這三個名子完全"等價"!) hard link 的另一個用途是, 例如, 讓它用 /bin/bzip2 跟 /usr/bin/bzip2 都找得到. 但是我的 Debian 上的 /bin/ 現在是 /usr/bin/ 的 symbolic link... 另外, hard link 引申出一個 admin 必須小心的觀念, 例如 $ rm <一個檔案> 其實並不"消滅"<一個檔案>, 而是 unlink(2) <一個檔案>! 那個名字被 unlinked 的"檔案" 其實還在 只要它的 link-count 非 0 或被 opened 而有個 file descriptor. rm(1) 所消滅的是名字, 不是檔案 假設 admin 發現 /bin/sh "不乖", 於是找了新的版本, 他 # rm /bin/sh, # cp <新版> /bin/ 然後以為做完了. 那就麻煩了.... 因為舊的可能還存在: 1. 它還有 hard links 2. 它還被 opened (在 /proc/<pid>/fd/ 下找得到) 要徹底"消滅"這個 inode, 必須消滅以上兩點, 它才官方不存在 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.230.9.35 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1590579842.A.656.html

05/27 20:50, 4年前 , 1F
其實早期 GNU gzip 本身內建就支援一個單一程式檔案
05/27 20:50, 1F

05/27 20:51, 4年前 , 2F
具備壓縮解壓縮等功能,所以 gzip,gunzip本身都是
05/27 20:51, 2F

05/27 20:51, 4年前 , 3F
hard link, 程式執行期會依據自己被執行程式名稱決定
05/27 20:51, 3F

05/27 20:52, 4年前 , 4F
到底是要壓縮或是解壓縮。不過晚期 gzip 記得似乎已經
05/27 20:52, 4F

05/27 20:52, 4年前 , 5F
改掉這個了,gunzip 本身提供 script 等於呼叫 gzip -dc
05/27 20:52, 5F

05/27 20:53, 4年前 , 6F
不過我不確定各家 linux 發行版本是否有異動,得再確認
05/27 20:53, 6F

05/28 11:38, 4年前 , 7F
長知識了,謝謝原PO和樓上的解說
05/28 11:38, 7F

05/28 15:17, 4年前 , 8F
這用 symlink 符號連結也可以,不一定要用硬連結
05/28 15:17, 8F

05/28 15:18, 4年前 , 9F
至於這種用 argv[0] 來判斷動作的,還有 busybox 和
05/28 15:18, 9F

05/28 15:18, 4年前 , 10F
ssh-argv0 二個比較常見。
05/28 15:18, 10F

05/28 15:37, 4年前 , 11F
用 argv[0] 判斷有缺點,比方你要真的複製得到一個真實
05/28 15:37, 11F

05/28 15:37, 4年前 , 12F
的 gzip 解壓縮工具,名稱只能夠用 gunzip 這樣,無法
05/28 15:37, 12F

05/28 15:37, 4年前 , 13F
改名成為 abc 等於原本解壓縮功能,有好有壞。所以系統
05/28 15:37, 13F

05/28 15:37, 4年前 , 14F
上很多戲法可以玩
05/28 15:37, 14F

05/28 19:14, 4年前 , 15F
樓上有一招是 bash 的 exec -a ls /bin/busybox
05/28 19:14, 15F

05/28 22:55, 4年前 , 16F
的確可以。題外話 lvm 目前大多 linux 系統其下工具
05/28 22:55, 16F

05/28 22:56, 4年前 , 17F
應該大多都是用 symlink 然後連結到 lvm 主程式
05/28 22:56, 17F

05/28 23:34, 4年前 , 18F
原來
05/28 23:34, 18F

05/30 10:33, 4年前 , 19F
感謝分享
05/30 10:33, 19F
文章代碼(AID): #1UpbA2PM (Linux)
討論串 (同標題文章)
本文引述了以下文章的的內容:
18
78
完整討論串 (本文為第 2 之 2 篇):
18
78
4
19
文章代碼(AID): #1UpbA2PM (Linux)