linux中核心會為檔案分配inode節點,而硬鏈結和軟鏈結的一大不同就是是否重新分配inode,這裡我們就來做乙個linux中檔案與目錄對應的硬鏈結與軟鏈結方式總結,需要的朋友可以參考下
硬鏈結
新建的檔案是已經存在的檔案的乙個別名,當原檔案刪除時,新建的檔案仍然可以使用。
硬鏈結特徵:
1、擁有相同的 i節點 和相同的儲存block快,可以看做是同乙個檔案
2、可通過i節點識別,i節點號相同
3、不能跨分割槽
4、不能針對目錄使用
5、刪除檔案,硬鏈結正常使用
軟鏈結
另外一種連線稱之為符號連線(symbolic link),也叫軟連線。軟鏈結檔案有類似於windows的快捷方式。它實際上是乙個特殊的檔案。在符號連線中,檔案實際上是乙個文字檔案,其中包含的有另一檔案的位置資訊。
軟鏈結特徵:
1、類似windows快捷方式
2、軟鏈結擁有自己的i節點和block快,但是資料塊中只儲存原檔案的檔名和i節點號,並沒有實際的檔案資料
3、lrwxrwxrwx l軟鏈結,軟鏈結檔案許可權都為rwxrwxrwx,但具體看原檔案的許可權
4、修改任意檔案,另乙個都改變
5、刪除原檔案,軟鏈結不能使用
6、建立軟鏈結一定要寫絕對路徑
注意軟鏈結的檔案許可權為777 但是最終許可權有原始檔決定 l表示軟鏈結檔案。
一旦原始檔刪除,軟鏈結將不能使用。(這是和硬鏈結的主要區別)
注:建立軟鏈結時,原始檔要始終使用絕對路徑,否則,若建立的軟鏈結和原始檔不在同乙個目錄時,會找不到原始檔。(硬鏈結不會有這種情況)
限制少,更靈活,推薦使用。
補充:
linux系統中的硬連線有兩個限制:不能跨越檔案系統和不允許普通使用者對目錄作硬連線。至於第乙個限制,很好理解,而第二個就不那麼好理解 了。 對任何乙個目錄用ls -l 命令都可以看到其連線數至少是2,這也說明了系統中是存在硬連線的,而且命令ln -d 也可以讓超級使用者對目錄作硬連線,這些都說明了系統限制對目錄進行硬連線只是乙個硬性規定,並不是邏輯上不允許或技術上的不可行。那麼作業系統為什麼要進 行限制呢?答案可能有兩個。
先來說第乙個,如果引入了對目錄的硬連線就有可能在目錄中引入迴圈,那麼在目錄遍歷的時候系統就會陷入無限迴圈當中。也許您會說,符號連線不也可以引入循 環嗎,那麼為什麼不限制目錄的符號連線呢?原因就在於在linux系統中,每個檔案(目錄也是檔案)都對應著乙個inode結構,其中inode資料結構 中包含了檔案型別(目錄,普通檔案,符號連線檔案等等)的資訊,也就是說作業系統在遍歷目錄時可以判斷出符號連線,既然可以判斷出符號連線當然就可以採取 一些措施來防範進入過大的迴圈了,系統在連續遇到8個符號連線後就停止遍歷,這就是為什麼對目錄符號連線不會進入死迴圈的原因了。但是對於硬連線,由於操 作系統中採用的資料結構和演算法限制,目前是不能防範這種死迴圈的。
在說明第二個原因之前,先來看看檔案的dentry結構在系統空間中長什麼樣子和它們是怎麼存放在系統空間的。dentry結構主要包含了檔名,檔案的inode號,指向父目錄dentry結構的指標和其他一些與本次討論無關的指標,這裡關鍵是那個指向父目錄的指標;系統中所有的dentry結構都 是按雜湊值存放在雜湊表中的,這裡的雜湊演算法很重要,它是取檔名和檔案的父目錄dentry結構的位址一起雜湊運算出雜湊值的。現在假設有兩個目錄 /a和/b,其中/b是我們通過ln -d命令建立起來的對/a的硬連線。這個時候核心空間中就會存在乙個/a的dentry結構和乙個/b的dentry結構,由上面的知識可知,/a和/b 目錄下面的每乙個檔案或目錄都各自有對應的dentry結構(因為雖然/a目錄下面的檔名沒有改變,但是因為dentry結構有指向父目錄dentry 的指標和計算雜湊值時考慮了父目錄dentry結構的位址,這個時候dentry結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的檔案,這樣 下來就會浪費很多系統空間了,特別是如果被硬連線的目錄中存在大量檔案和子目錄的時候就更加明顯了。這也許是第二個原因。
ln是linux中又乙個非常重要命令,它的功能是為某乙個檔案在另外乙個位置建立乙個同不的鏈結,這個命令最常用的引數是-s,具體用法是:ln –s 原始檔 目標檔案。
當我們需要在不同的目錄,用到相同的檔案時,我們不需要在每乙個需要的目錄下都放乙個必須相同的檔案,我們只要在某個固定的目錄,放上該檔案,然後在 其它的目錄下用ln命令鏈結(link)它就可以,不必重複的占用磁碟空間。例如:ln –s /bin/less /usr/local/bin/less
-s 是代號(symbolic)的意思。
這裡有兩點要注意:第一,ln命令會保持每一處鏈結檔案的同步性,也就是說,不論你改動了哪一處,其它的檔案都會發生相同的變化;第二,ln的鏈結又 軟鏈結和硬鏈結兩種,軟鏈結就是ln –s ** **,它只會在你選定的位置上生成乙個檔案的映象,不會占用磁碟空間,硬鏈結ln ** **,沒有引數-s, 它會在你選定的位置上生成乙個和原始檔大小相同的檔案,無論是軟鏈結還是硬鏈結,檔案都保持同步變化。
如果你用ls察看乙個目錄時,發現有的檔案後面有乙個@的符號,那就是乙個用ln命令生成的檔案,用ls –l命令去察看,就可以看到顯示的link的路徑了。
指令詳細說明
指令名稱 : ln
使用許可權 : 所有使用者
使用方式 : ln [options] source dist,其中 option 的格式為 :
[-bdfinsvf] [-s backup-suffix] [-v ]
[--help] [--version] [--]
說明 : linux/unix 檔案系統中,有所謂的鏈結(link),我們可以將其視為檔案的別名,而鏈結又可分為兩種 : 硬鏈結(hard link)與軟鏈結(symbolic link),硬鏈結的意思是乙個檔案可以有多個名稱,而軟鏈結的方式則是產生乙個特殊的檔案,該檔案的內容是指向另乙個檔案的位置。硬鏈結是存在同乙個檔 案系統中,而軟鏈結卻可以跨越不同的檔案系統。
ln source dist 是產生乙個鏈結(dist)到 source,至於使用硬鏈結或軟鏈結則由引數決定。
不論是硬鏈結或軟鏈結都不會將原本的檔案複製乙份,只會占用非常少量的磁碟空間。
-f : 鏈結時先將與 dist 同檔名的檔案刪除
-d : 允許系統管理者硬鏈結自己的目錄
-i : 在刪除與 dist 同檔名的檔案時先進行詢問
-n : 在進行軟鏈結時,將 dist 視為一般的檔案
-s : 進行軟鏈結(symbolic link)
-v : 在鏈結之前顯示其檔名
-b : 將在鏈結時會被覆寫或刪除的檔案進行備份
-s suffix : 將備份的檔案都加上 suffix 的字尾
-v method : 指定備份的方式
--help : 顯示輔助說明
--version : 顯示版本
範例 :
將檔案 yy 產生乙個 symbolic link : zz
ln -s yy zz
將檔案 yy 產生乙個 hard link : zz
ln yy xx
一天一條Linux指令 cd
嵌入式開發需要不斷積累linux相關知識,所以在此天天不厭其煩 日積月累。cd change directory 命令是linux中最常用命令之一,我覺得另乙個應該是ls 後續介紹 主要功能是跳轉到cd命令指定目錄。cd命令格式 cd l p dir 常用cd命令 1.跳轉到指定目錄 cd dir ...
一天一條Linux指令 apt
由於昨天去assem公司除錯電路,接觸linux下依賴包的安裝大牛,遂整理了一下apt命令。apt get命令本身並不具有管理軟體包功能,只是提供了乙個軟體包管理的命令列平台。在這個平台上使用更豐富的子命令,完成具體的管理任務。apt get命令的一般語法格式為 apt get subcommand...
一天一條Linux指令 find
前言 我們為什麼要學會使用find命令?每一種作業系統都有成千上萬的檔案組成,對於linux這樣 一切皆檔案 的作業系統來說更不例外,大家應該都能很輕鬆使用windows下的檔案查詢功能,但是對linux這一功能可能並不是很熟悉,其實想玩linux的你更要牢牢掌握這個命令,因為linux不像wind...