歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

硬鏈接和軟鏈接

UNIX 系統中除進程之外的一切皆是文件,而 Linux 保持了這一特性。為了便於文件的管理,Linux 還引入了目錄(有時亦被稱為文件夾)這一概念。目錄使文件可被分類管理,且目錄的引入使 Linux 的文件系統形成一個層級結構的目錄樹。清單 1.所示的是普通 Linux 系統的頂層目錄結構,其中 /dev 是存放了設備相關文件的目錄。 清單 1. Linux 系統的頂層目錄結構
 /              根目錄
├── bin     存放用戶二進制文件
├── boot    存放內核引導配置文件
├── dev     存放設備文件
├── etc     存放系統配置文件
├── home    用戶主目錄
├── lib     動態共享庫
├── lost+found 	文件系統恢復時的恢復文件
├── media   可卸載存儲介質掛載點
├── mnt     文件系統臨時掛載點
├── opt     附加的應用程序包
├── proc    系統內存的映射目錄,提供內核與進程信息
├── root    root 用戶主目錄
├── sbin    存放系統二進制文件
├── srv     存放服務相關數據
├── sys     sys 虛擬文件系統掛載點
├── tmp     存放臨時文件
├── usr     存放用戶應用程序
└── var     存放郵件、系統日志等變化文件

Linux 與其他類 UNIX 系統一樣並不區分文件與目錄:目錄是記錄了其他文件名的文件。使用命令 mkdir 創建目錄時,若期望創建的目錄的名稱與現有的文件名(或目錄名)重復,則會創建失敗。

# ls -F /usr/bin/zi* 
 /usr/bin/zip*       /usr/bin/zipgrep*  /usr/bin/zipnote* 
 /usr/bin/zipcloak*  /usr/bin/zipinfo*  /usr/bin/zipsplit* 

 # mkdir -p /usr/bin/zip 
 mkdir: cannot create directory `/usr/bin/zip': File exists

 

Linux 將設備當做文件進行處理,清單 2.展示了如何打開設備文件 /dev/input/event5 並讀取文件內容。文件 event5 表示一種輸入設備,其可能是鼠標或鍵盤等。查看文件 /proc/bus/input/devices 可知 event5 對應設備的類型。設備文件 /dev/input/event5 使用 read() 以字符流的方式被讀取。結構體 input_event 被定義在內核頭文件 linux/input.h 中。

清單 2. 打開並讀取設備文件
 int fd; 
 struct input_event ie; 
 fd = open("/dev/input/event5", O_RDONLY); 
 read(fd, &ie, sizeof(struct input_event)); 
 printf("type = %d  code = %d  value = %d\n", 
			 ie.type, ie.code, ie.value); 
 close(fd);

硬鏈接的特性

我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。圖 1.展示了程序通過文件名獲取文件內容的過程。

圖 1. 通過文件名打開文件 圖 1. 通過文件名打開文件
軟鏈接 VS. 硬鏈接:快速解析
清單 3. 移動或重命名文件
[root@gvtv svnmanager]# stat config.php
  File: "config.php"
  Size: 2556            Blocks: 8          IO Block: 4096   ???¨????
Device: 802h/2050d      Inode: 11804169    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-10-31 10:10:23.490475413 +0800
Modify: 2013-10-31 10:08:40.868475483 +0800
Change: 2013-10-31 10:08:40.917475486 +0800
[root@gvtv svnmanager]# mv config.php config.php.linux
[root@gvtv svnmanager]# stat config.php.linux
  File: "config.php.linux"
  Size: 2556            Blocks: 8          IO Block: 4096   ???¨????
Device: 802h/2050d      Inode: 11804169    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-10-31 10:10:23.490475413 +0800
Modify: 2013-10-31 10:08:40.868475483 +0800
Change: 2013-10-31 11:47:20.973471459 +0800
[
在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i(若是 AIX 系統,則使用命令 istat)。清單 3.中使用命令 mv 移動並重命名文件 glibc-2.16.0.tar.xz,其結果不影響文件的用戶數據及 inode 號,文件移動前後 inode 號均為:11804169。

為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。

 link oldfile newfile 
 ln oldfile newfile

由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:

  • 文件有相同的 inode 及 data block;
  • 只能對已存在的文件進行創建;
  • 不能交叉文件系統進行硬鏈接的創建;
  • 不能對目錄進行創建,只可對文件創建;
  • 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。

    當你創建一個硬鏈接時,你創建的是指向數據位置的另一個指針,而不是指向現有文件的指針。這意味著編輯一個文件的硬鏈接等價於編輯該文件的原始實例。

    軟鏈接的特性

    軟鏈接與硬鏈接不同,若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接有著自己的 inode 號以及用戶數據塊(見 圖 2.)。因此軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:
    • 軟鏈接有自己的文件屬性及權限等;
    • 可對不存在的文件或目錄創建軟鏈接;
    • 軟鏈接可交叉文件系統;
    • 軟鏈接可對文件或目錄創建;
    • 創建軟鏈接時,鏈接計數 i_nlink 不會增加;
    • 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。圖 2. 軟鏈接的訪問 圖 2. 軟鏈接的訪問
      軟鏈接 VS. 硬鏈接:快速解析
Copyright © Linux教程網 All Rights Reserved