1. linux軟鏈接要怎麼看內容
有可能是你來的軟鏈接指向了源一個無效的地址。正常情況下是可以直接打開或查看的。
請使用以下命令查看軟連接的指向:
➜~ls-l
total2784
lrwxr-xr-x1adminstaff571315:05file1.lnk->file1
然後直接打開原來的文件,試試能不能打開。
2. 【技術分享】Linux實體鏈接與符號鏈接
在 Linux 系統中,鏈接文件主要有兩種:一種是類似於 Windows 系統中的快捷方式,可以快速鏈接到目標文件(或目錄);另一種是通過文件系統的 inode 鏈接來產生新文件名,而不是創建新文件,這種稱為實體鏈接(hard link)。
· Hard Link(實體鏈接,硬式鏈接或實際鏈接):
每個文件都會佔用一個 inode,文件內容由 inode 的記錄來指向。想要讀取該文件,必須要經過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取。
也就是說,文件名只與目錄有關,而文件內容則與 inode 有關。那麼,有沒有可能有多個文件名對應到同一個 inode 號碼呢?有的!這就是 hard link 的由來。簡單地講,hard link 只是在某個目錄下新增一筆文件名鏈接到某個 inode 號碼的關聯記錄而已。
舉個例子來說,假設系統中有 /root/crontab 是 /etc/crontab 的實體鏈接,也就是說這兩個文件名鏈接到同一個 inode,自然這兩個文件名的所有相關信息都會一模一樣(除了文件名之外)。
你可以發現兩個文件名都鏈接到 34474855 這個 inode 號碼,所以是否文件的許可權/屬性完全一樣呢?因為這兩個「文件名」其實是一模一樣的「文件」啦!而且你也會發現第二個欄位由原本的 1 變成 2 了!那個欄位稱為「鏈接」,這個欄位的意義為:「有多少個文件名鏈接到這個 inode 號碼」的意思。如果將讀取到正確數據的方式畫成示意圖,就類似如下畫面:
上圖的意思是,你可以通過 1 或 2 的目錄之 inode 指定的 block 找到兩個不同的文件名,而不管使用哪個文件名都可以指到 real 那個 inode 去讀取到最終數據!那這樣有什麼好處呢?最大的好處就是「安全」!如同上圖中,如果你將任何一個「文件名」刪除,其實 inode 與 block 都還是存在的!此時你可以通過另一個「文件名」來讀取到正確的文件數據喔!此外,不論你使用哪個「文件名」來編輯,最終的結果都會寫入到相同的 inode 與 block 中,因此均能進行數據的修改。
一般來說,使用 hard link 設置鏈接文件時,磁碟的空間與 inode 的數目都不會改變!我們還是由圖 7.2.1 來看,由圖中可以知道,hard link 只是在某個目錄下的 block 多寫入一個關聯數據而已,既不會增加 inode 也不會耗用 block 數量。
Tips hard link 的製作中,其實還是可能會改變系統的 block 的,那就是當你新增這筆數據卻剛好將目錄的 block 填滿時,就可能會新加一個 block 來記錄文件名關聯性,而導致磁碟空間的變化!不過,一般 hard link 所用掉的關聯數據量很小,所以通常不會改變 inode 與磁碟空間的大小。
其實我們也能夠知道,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不能跨文件系統才對!因為就是在同一個 filesystem 上嘛!所以 hard link 是有限制的:
· 不能跨 Filesystem;
· 不能 link 目錄。
不能跨 Filesystem 還好理解,那不能 hard link 到目錄又是怎麼回事呢?這是因為如果使用 hard link 鏈接到目錄時,鏈接的數據需要連同被鏈接目錄下面的所有數據都創建鏈接,舉例來說,如果你要將 /etc 使用實體鏈接創建一個 /etc_hd 的目錄時,那麼在 /etc_hd 下面的所有文件名同時都與 /etc 下面的文件名要創建 hard link 的,而不是僅鏈接到 /etc_hd 與 /etc 而已。並且,未來如果需要在 /etc_hd 下面創建新文件時,連帶的,/etc 下面的數據又得要創建一次 hard link ,因此造成環境相當大的復雜度。所以啰,目前 hard link 對於目錄暫時還是不支持的啊!
· Symbolic Link(符號鏈接,亦即是捷徑)
相對於 hard link,Symbolic link 就好理解多了,基本上,Symbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向它 link 的那個文件的文件名!由於只是利用文件來做為指向的動作,所以,當來源文件被刪除之後,symbolic link 的文件會「開不了」,會一直說「無法打開某文件!」。實際上就是找不到原始「文件名」而已啦!
舉例來說,我們先創建一個符號鏈接文件鏈接到 /etc/crontab 去看看:
由上表的結果我們可以知道兩個文件指向不同的 inode 號碼,當然就是兩個獨立的文件存在!而且鏈接文件的重要內容就是它會寫上目標文件的「文件名」,你可以發現為什麼上表中鏈接文件的大小為 12 Bytes 呢?因為箭頭(-->)右邊的文件名「/etc/crontab」總共有 12 個英文,每個英文佔用 1 個 Bytes ,所以文件大小就是 12Bytes了!
關於上述的說明,我們以如下圖示來解釋:
由 1 號 inode 讀取到鏈接文件的內容僅有文件名,根據文件名鏈接到正確的目錄去取得目標文件的 inode,最終就能夠讀取到正確的數據了。你可以發現的是,如果目標文件(/etc/crontab)被刪除了,那麼整個環節就會無法繼續進行下去,所以就會發生無法通過鏈接文件讀取的問題了!
這里還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給它劃上等號,由 Symbolic link 所創建的文件為一個獨立的新的文件,所以會佔用掉 inode 與 block。