硬鏈接與軟鏈接的簡述

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

圖 1. 通過文件名打開文件

圖 1. 通過文件名打開文件

在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i。下圖.中使用命令 mv 移動并重命名文件 lyx.bak,其結果不影響文件的用戶數據及 inode 號,文件移動前后 inode 號均為:2685733735。

[root@centOS7-lyx ~]# stat /home/lyx/lyx.bak

  文件:"/home/lyx/lyx.bak"

  大小:0            塊:0          IO 塊:4096   普通空文件

設備:fd02h/64770d   Inode:268573735   硬鏈接:1

權限:(0664/-rw-rw-r–)  Uid:( 1003/     lyx)   Gid:( 1003/     lyx)

環境:unconfined_u:object_r:user_home_t:s0

最近訪問:2016-10-13 10:13:43.666774033 +0800

最近更改:2016-10-13 10:03:33.806798019 +0800

最近改動:2016-10-13 10:05:31.566793388 +0800

創建時間:-

[root@centOS7-lyx ~]# mv /home/lyx/lyx.bak /home/lyx/mage.bak

[root@centOS7-lyx ~]#

[root@centOS7-lyx ~]# ls -i -F /home/lyx/mage.bak

268573735 /home/lyx/mage.bak

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

              link oldfile newfile  ln oldfile newfile

圖 2.硬鏈接和軟鏈接的訪問

blob.png

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

1.文件有相同的 inode 及 data block;

2.只能對已存在的文件進行創建;

3.不能交叉文件系統(跨越設備和分區)進行硬鏈接的創建;

4.不能對目錄進行創建,只可對文件創建;

5.刪除一個硬鏈接文件并不影響其他有相同 inode 號的文件,只是文件的鏈接數遞減,所以當鏈接數遞減到0時,文件也就被刪除了。

//硬鏈接特性展示

 # ls -li

 total 0

  // 只能對已存在的文件創建硬連接

 # link old.file hard.link

 link: cannot create link `hard.link' to `old.file': No such file or directory

 # echo "This is an original file" > old.file

 # cat old.file

 This is an original file

 # stat old.file

  File: `old.file'

  Size: 25            Blocks: 8          IO Block: 4096   regular file

 Device: 807h/2055d   Inode: 123456      Links: 2

 Access: (0644/-rw-r–r–)  Uid: (    0/    root)   Gid: (    0/    root)

 …

 // 文件有相同的 inode 號以及 data block

 # link old.file hard.link | ls -li

 total 8

 123456 -rw-r–r– 2 root root 25 Sep  1 17:44 hard.link

 123456 -rw-r–r– 2 root root 25 Sep  1 17:44 old.file

  // 不能交叉文件系統

 # ln /dev/input/event5   /root/bfile.txt

 ln: failed to create hard link `/root/bfile.txt' => `/dev/input/event5':

 Invalid cross-device link

  // 不能對目錄進行創建硬連接

 # mkdir -p old.dir/test

 # ln old.dir/ hardlink.dir

 ln: `old.dir/': hard link not allowed for directory

 # ls -iF

 123456 hard.link  54321 old.dir/  123456 old.file

硬鏈接不能對目錄創建是受限于文件系統的設計。 Linux 文件系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。查看這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬鏈接(注意目錄 /mnt/lost+found/ 的 inode 號)。若系統允許對目錄創建硬鏈接,則會產生目錄無限循環。

軟鏈接與硬鏈接不同,若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接有著自己的 inode 號以及用戶數據塊(見 圖 2.)。因此軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:

1.軟鏈接有自己的文件屬性及權限等(inode號),文件大小為指向路徑的字符所占字節大小

  2.可對不存在的文件或目錄創建軟鏈接;

  3.軟鏈接可交叉文件系統(跨分區,跨設備);

  4.軟鏈接可對文件或目錄創建;

  5.創建軟鏈接時,鏈接計數 i_nlink 不會增加;

  6.刪除軟鏈接并不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。

//軟鏈接特性展示

 # ls -li

 total 0

  // 可對不存在的文件創建軟鏈接

 # ln -s old.file soft.link

 # ls -liF

 total 0

 234567 lrwxrwxrwx 1 root root 8 Sep  1 18:00 soft.link -> old.file

  // 由于被指向的文件不存在,此時的軟鏈接 soft.link 就是死鏈接

 # cat soft.link

 cat: soft.link: No such file or directory

  // 創建被指向的文件 old.file,soft.link 恢復成正常的軟鏈接

 # echo "This is an original file_A" >> old.file

 # cat soft.link

 This is an original file_A

  // 對不存在的目錄創建軟鏈接

 # ln -s old.dir soft.link.dir

 # mkdir -p old.dir/test

 # tree . -F –inodes

 .

├── [ 456789]  old.dir/

│   └── [ 456788]  test/

├── [ 23456]  old.file

├── [ 23456]  soft.link -> old.file

└── [ 456789]  soft.link.dir -> old.dir/

當然軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。但需注意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。使用相對路徑創建的軟鏈接被移動后該軟鏈接文件將成為一個死鏈接(如下所示的軟鏈接 a 使用了相對路徑,因此不宜被移動),因為鏈接數據塊中記錄的亦是相對路徑指向。

當然軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。但需注意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。使用相對路徑創建的軟鏈接被移動后該軟鏈接文件將成為一個死鏈接,因為鏈接數據塊中記錄的亦是相對路徑指向。

原創文章,作者:lyx,如若轉載,請注明出處:http://www.www58058.com/53257

(0)
lyxlyx
上一篇 2016-10-20 21:01
下一篇 2016-10-20 21:06

相關推薦

  • Linux-raid的工作原理與管理

    本章內容:        1、RAID詳細描述        2、mdadm 工具        3、創建raid        4、磁盤陣列的管理 RAID描述:     &nb…

    2017-06-24
  • VIM 文 本 編 輯 工 具-20160808

    VIM 文 本 編 輯 工 具 §·學習大綱   一·使用vi和vim的三種主要模式 二·擴展模式下基本操作 三·命令模式下基本操作 四·編輯模式下基本操作 五·VIM寄存器 六·編輯二進制文件 七·可視化模式 八·多文件模式 九·使用多個“窗口” 十·定制vim的工作特性 十一·VIM了解更多 十二·練習題     §·使用v…

    Linux干貨 2016-08-10
  • 第十二周:httpd和lamp

    看了一下作業內容,發現所有的都在51cto上寫過了。這里就不在做了。 畢竟當時幾篇博客寫下來,還是非常繁瑣的,不想在寫。 文檔地址:RHEL6.8編譯安裝LAMP環境:httpd-2.4+mysql5.6+php5.5;基于LAMP環境部署WordPress: http://afterdawn.blog.51cto.com/7503144/1876171 配…

    Linux干貨 2016-12-09
  • linux開篇六式

    第一式. Linux上的文件管理類命令,其常用的使用方法及其相關示例。       mkdir, 創建目錄       rmdir,刪除目錄       tree, 顯示目錄層級       cat和tac均用于查看文件,cat是從文件首向…

    Linux干貨 2016-10-13
  • vim編輯器

    在使用Linux的管理過程中有很多的工作就是要修改或設置某些重要軟件的配置文件,這些配置文件都是以ASCLL的純文本格式存在的,所以能夠學好一個文本編輯器就至關重要了,vim作為高級版的vi編輯器不僅可以用不同的顏色來高亮顯示某些重要關鍵字或字符還能進行如shell腳本的編寫,c程序的編輯等功能。 vim編輯器和nano編輯器是一個全屏的編輯器。vim打開文…

    Linux干貨 2016-12-20
  • N25-第二周博客作業

    第二周博客作業 1.Linux上的文件管理類命令都有哪些,其常用的使用方法和演示 2.bash的工作特性之命令執行狀態返回值和命令行展開所涉及內容演示及其實例 3.請使用命令行展開功能完成以下練習;    (1)創建/tmp的目錄下a_c,a_d,b_c,b_d     (2) 創建/tmp/mylinux目錄下的 4…

    Linux干貨 2016-12-11
欧美性久久久久