在linux 系統中,鏈接是一種文件共享的方式,它分為軟鏈接和硬鏈接,對應的命令是ln
什么是軟連接
軟鏈接又叫符號鏈接, 它類似于 windows系統中的快捷方式,常用于將目錄層次較深的文件鏈接到比較容易訪問的目錄中
創建軟鏈接
使用 ln -s 源文件 軟鏈接 命令就可以創建一個軟鏈接,軟鏈接可以對文件、目錄、跨文件系統的文件或目錄
- 創建文件的軟鏈接
[root@ecs-centos-7 tt]# stat a.txt | grep Links
Device: fd01h/64769d Inode: 131096 Links: 1
[root@ecs-centos-7 tt]# ln -s a.txt sa.txt
[root@ecs-centos-7 tt]# ls -il
total 4
131096 -rw-r--r-- 1 root root 15 Aug 25 20:19 a.txt
131100 lrwxrwxrwx 1 root root 5 Aug 25 20:22 sa.txt -> a.txt
[root@ecs-centos-7 tt]# stat a.txt | grep Links
Device: fd01h/64769d Inode: 131096 Links: 1
上面的例子中,創建了 a.txt 的軟鏈接 sa.txt ,創建成功之后,軟鏈接文件名后面會有一個 -> 符號指向原始文件
創建軟鏈接前后的 stat a.txt | grep Links 命令是查看原始文件 a.txt 的鏈接數量,從例子中可以看出,創建軟鏈接之后,文件鏈接數保持不變
- 創建目錄的軟鏈接
[root@ecs-centos-7 tt]# mkdir tmp
[root@ecs-centos-7 tt]# ln -s tmp/ stmp
[root@ecs-centos-7 tt]# ll
total 4
lrwxrwxrwx 1 root root 4 Aug 26 00:38 stmp -> tmp/
drwxr-xr-x 2 root root 4096 Aug 26 00:38 tmp
[root@ecs-centos-7 tt]# echo "1234" > stmp/a.txt
[root@ecs-centos-7 tt]# cat tmp/a.txt
1234
- 創建跨文件系統的軟連接
首先查看所有的文件系統,結果如下:
[root@ecs-centos-7 tt]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 909M 0 909M 0% /dev
tmpfs 919M 0 919M 0% /dev/shm
tmpfs 919M 8.7M 911M 1% /run
tmpfs 919M 0 919M 0% /sys/fs/cgroup
/dev/vda1 40G 20G 18G 53% /
tmpfs 184M 0 184M 0% /run/user/0
從上面的例子可以看到,目前有 devtmpfs, tmpfs, /dev/vda1 三種文件系統,我們選取 tmpfs 和 /dev/vda1來測試跨文件系統的軟鏈接,具體測試如下:
[root@ecs-centos-7 tt]# touch /run/test.txt
[root@ecs-centos-7 tt]# cat /run/test.txt
[root@ecs-centos-7 tt]# ln -s /run/test.txt /st.txt
[root@ecs-centos-7 tt]# echo "haha" > /st.txt
[root@ecs-centos-7 tt]# cat /run/test.txt
haha
上面的測試中,首先在tmpfs 文件系統的/run目錄中創建 test.txt 文件,此時文件是沒有內容的
然后,在/dev/vda1文件系統的/ 目錄創建 /run/test.txt 的軟鏈接 st.txt, 同時往 st.txt 中寫入字符串 haha
最后,查看原始文件 /run/test.txt, 內容和軟鏈接文件是相同的
修改、刪除軟鏈接
軟鏈接也是文件的一種,只要有權限,自然是可以修改的
- 修改軟鏈接
軟鏈接是原始文件的快捷方式,所以修改軟鏈接文件實際上修改的是原始文件,具體的請看以下實例
[root@ecs-centos-7 tt]# cat sa.txt
this is a file
[root@ecs-centos-7 tt]# cat a.txt
this is a file
[root@ecs-centos-7 tt]# echo "111" >> sa.txt
[root@ecs-centos-7 tt]# cat sa.txt
this is a file
111
[root@ecs-centos-7 tt]# cat a.txt
this is a file
111
例子中,對軟鏈接 sa.txt 進行了修改,原始文件 a.txt 的內容也跟著同步改變了
- 刪除原始文件

軟鏈接文件是原始文件的快捷方式,上面的例子中可以看到,刪除原始文件之后,軟鏈接文件后面的箭頭指向的原始文件 a.txt 在不停機的閃動,表示鏈接指向的原始文件已經失效了
通過cat sa.txt 命令查看鏈接內容時會提示文件不存在
什么是硬鏈接
硬鏈接可以看成文件的別名, 它和原始文件擁有相同的索引節點(關于索引節點的知識請查看 理解Linux中inodes)
刪除任何一處的文件,都不影響另一處文件的正常訪問,只有刪除最后一個文件之后,文件內容的數據塊才會被刪除
熟悉 c/c++ 指針的朋友可以把硬鏈接看成指向同一塊內存的多個指針變量,文件內容存儲在指針變量指向的內存塊中
指針變量超出其作用域時會被系統回收,此時不會回收它所指向的內存的,當所有的指針變量都被回收時,才會回收它們所指向的內存(這里假設應用程序能正確的處理堆內存的回收)
創建、修改、刪除硬鏈接
- 創建硬鏈接
創建硬鏈接命令: ln 源文件 硬鏈接
[root@ecs-centos-7 tt]# stat b.txt | grep Links
Device: fd01h/64769d Inode: 131096 Links: 1
root@ecs-centos-7 tt]# ln b.txt hb.txt
[root@ecs-centos-7 tt]# ls -li
total 8
131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 b.txt
131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 hb.txt
[root@ecs-centos-7 tt]# stat b.txt | grep Links
Device: fd01h/64769d Inode: 131096 Links: 2
上面的例子中,創建了 b.txt 的硬鏈接 hb.txt
創硬鏈接前后的 stat b.txt | grep Links 命令是查看 b.txt 的鏈接數量,從例子中可以看出,創建硬鏈接后文件鏈接數增加了
- 修改硬鏈接,刪除原始文件

從以上例子中可以看出,修改硬鏈接文件內容,原始文件也會同步修改,而刪除原始文件時,硬鏈接文件內容沒有任何變化
硬鏈接注意事項
- 無法跨文件系統創建硬鏈接
[root@ecs-centos-7 /]# ln /run/test.txt /htest.txt
ln: failed to create hard link ‘/htest.txt’ => ‘/run/test.txt’: Invalid cross-device link
- 不允許創建目錄的硬鏈接
[root@ecs-centos-7 tt]# ln tmp/ htmp
ln: ‘tmp/’: hard link not allowed for directory
總結
以上分別介紹了軟鏈接和硬鏈接,下面以圖表的形式總結下兩者的異同
鏈接索引節點號權限大小創建目錄鏈接跨文件系統原始文件的鏈接計數軟鏈接新的索引節點有自己的文件屬性和權限和原始文件不同能能不會增加硬鏈接和原始文件相同和原始文件相同和原始文件相同不能不能會增加
推薦閱讀
理解Linux中inodes