linux系统-软链接与硬链接区别
目錄
引言
硬盤
軟、硬鏈接方式
硬鏈接
軟鏈接
問(wèn)題
引言
在介紹硬鏈接和軟鏈接之前,首先介紹下硬盤相關(guān)的知識(shí),主要是了解下 inode 。
硬盤
硬盤設(shè)備是由大量的扇區(qū)組成的。以 MBR 分區(qū)為例。每個(gè)扇區(qū)的容量為 512 字節(jié)。其中第一個(gè)扇區(qū)最重要。它里面保存著主引導(dǎo)記錄與分區(qū)表信息。就第一個(gè)扇區(qū)來(lái)講,主引導(dǎo)記錄需要占用 446 字節(jié),分區(qū)表為 64 字節(jié),結(jié)束符占用 2 字節(jié)。其中分區(qū)表每記錄一個(gè)分區(qū)信息就需要 16 字節(jié),這樣一來(lái),最多就只有4個(gè)分區(qū)信息可以寫到第一扇區(qū)中,這4個(gè)分區(qū)就是4個(gè)主分區(qū)。
第一個(gè)扇區(qū)最多只能創(chuàng)建出4個(gè)分區(qū) ?
為了解決分區(qū)個(gè)數(shù)不夠的問(wèn)題,可以將第一個(gè)扇區(qū)的分區(qū)表中16個(gè)字節(jié)(原本要寫入主分區(qū)信息)的空間(稱之為擴(kuò)展分區(qū))拿出來(lái)指向另一個(gè)分區(qū)。
也就是說(shuō),擴(kuò)展分區(qū)并不是一個(gè)真正的分區(qū),而像是有一個(gè)占用 16 字節(jié)的分區(qū)表空間的指針,一個(gè)指向另外一個(gè)分區(qū)的指針。這樣一來(lái),用戶一般會(huì)選擇使用3個(gè)主分區(qū)+1個(gè)擴(kuò)展分區(qū)的方法,然后在擴(kuò)展分區(qū)中創(chuàng)建無(wú)數(shù)個(gè)邏輯分區(qū),從而來(lái)滿足多分區(qū)(大于4個(gè))的需求。
Linux 系統(tǒng)中有一個(gè)名為 superblock 的 “硬盤地圖”。 Linux 并不是把文件內(nèi)容直接寫入到 superblock 中,而是在里面記錄著整個(gè)文件系統(tǒng)的信息。
Linux 把每個(gè)文件的權(quán)限與屬性記錄在 inode("索引節(jié)點(diǎn):index node ") 中,而且每個(gè)文件占用一個(gè)獨(dú)立的 inode 表格,該表格的默認(rèn)大小為 128 字節(jié)。
里面記錄著如下信息 :
文件的訪問(wèn)權(quán)限(read、write、execute)
該文件的所有者與所屬組(owner、group)
該文件的大小(size)
該文件的創(chuàng)建或內(nèi)容修改時(shí)間(ctime)
該文件的最后一次訪問(wèn)時(shí)間(atime)
該文件的修改時(shí)間(mtime)
文件的特殊權(quán)限(SUID、SGID、SBIT)
該文件的真實(shí)數(shù)據(jù)地址(point)。
在 Linux 系統(tǒng)中 ,inode 號(hào)才是文件的唯一標(biāo)識(shí)而非文件名。文件名只是為了方便人們的記憶和適用。
ls -li total xx 533124 drwxr-xr-x 9 apple apple 4096 May ?4 10:22 apache-tomcat-8.5.41 360908 -rw-rw-r-- 1 apple apple ? 18 Jun ?1 23:50 helloWolrd 360974 drwxr-xr-x 4 apple apple 4096 Jun ?3 10:15 hi-cat 393217 drwxrwxr-x 6 apple apple 4096 May 28 09:37 program 518079 drwxrwxr-x 3 apple apple 4096 Mar ?4 11:31 project如上述命令 “l(fā)s -li” 結(jié)果中的第一列就是文件的 inode 號(hào)。系統(tǒng)是通過(guò) inode 號(hào)尋找正確的文件數(shù)據(jù)塊。
文件的實(shí)際內(nèi)容則保存在 block 中(大小可以是 1KB、2KB 或 4KB),一個(gè) inode 的默認(rèn)大小為 128B (在 Ext3 文件系統(tǒng)中),記錄一個(gè) block 則消耗 4B 。當(dāng)文件的 inode 被寫滿后,Linux 系統(tǒng)會(huì)自動(dòng)分配出一個(gè) Block 塊,專門用于像 innode 那樣記錄其他 block 塊的信息,這樣能把各個(gè) block 塊的內(nèi)容串到一起,就能夠讓用戶讀到完整的文件內(nèi)容了。
對(duì)于存儲(chǔ)文件內(nèi)容的的 Block 塊,有以下兩種常見情況,以 4KB 的 block 大小為例說(shuō)明情況 :
文件很小(1KB) , 但依然會(huì)占用一個(gè) block ,因此會(huì)潛在占用 3kb。
文件很大(5kb) , 那么會(huì)占用兩個(gè) block。
總結(jié) :
superBlock : 存儲(chǔ)整個(gè)文件系統(tǒng)的信息。
inode : 存儲(chǔ)文件的權(quán)限與屬性。
data block : 真正存儲(chǔ)文件內(nèi)容。
軟、硬鏈接方式
在 Windows 系統(tǒng)中,快捷方式是指向原始文件的一個(gè)鏈接文件??梢宰層脩魪牟煌奈恢脕?lái)訪問(wèn)原始的文件;原文件一旦被刪除或剪切到其他地方后,會(huì)導(dǎo)致鏈接文件失效。
但是在 Linux 系統(tǒng)中,"快捷方式"就不太一樣 。在 Linux 系統(tǒng)存在硬鏈接和軟鏈接兩種文件。
硬鏈接
硬鏈接(hard link) : 可以將它理解為一個(gè) “指向原始文件 inode 的指針”,系統(tǒng)不為它分配獨(dú)立的 inode 和 文件。所以,硬鏈接文件與原始文件其實(shí)是同一個(gè)文件,只是名字不同。我們每添加一個(gè)硬鏈接,該文件的 innode 連接數(shù)就會(huì)增加 1 ; 而且只有當(dāng)該文件的 inode 連接數(shù)為 0 時(shí),才算徹底被將它刪除。因此即便刪除原始文件,依然可以通過(guò)硬鏈接文件來(lái)訪問(wèn)。需要注意的是,我們不能跨分區(qū)對(duì)文件進(jìn)行鏈接。(我第一次看硬鏈接的時(shí)候,滿臉都是問(wèn)號(hào),大家不要糾結(jié)概念,看下面圖。)
舉個(gè)例子,磁盤上個(gè)有文件。
此時(shí)新建一個(gè)硬鏈接
ln fileName newFileName從上圖中可以看出,fileName 和 newFileName 都指向同一個(gè)文件,因此,無(wú)論你編輯哪一個(gè)文件,另一個(gè)文件也會(huì)做相應(yīng)的改變。比如
echo "helloWorld" >> newFileName? vim ?fileName ?// 此時(shí)原文件中也多出了 helloWorld。我相信大家產(chǎn)生疑惑的地方是刪除文件。如果此時(shí)我們刪除原文件,如下圖:
用代碼表示:
rm fileName ?// 刪除源文件 vim newFileName ?// 文件仍然存在,我們刪除的僅僅是一個(gè)指向真實(shí)文件的指針而已?;蛘哒f(shuō)只是讓 inode 連接數(shù) -1 。或者刪除硬鏈接文件 :
用代碼表示:
我們可以這樣理解,在 Linux 系統(tǒng)中,文件名本身就相當(dāng)于硬鏈接,文件名僅僅是一個(gè)指針。
軟鏈接
軟鏈接(symbolic link) : 等同于 Windows 系統(tǒng)下的快捷方式。僅僅包括所含鏈接文件的路徑名字。因此能鏈接目錄,也能跨文件系統(tǒng)鏈接。但是,當(dāng)刪除原始文件后,鏈接文件也將失效。
ln - 新建鏈接
ln 用于創(chuàng)建軟或硬鏈接。
| -s | 創(chuàng)建軟鏈接(如果不帶 -s 參數(shù),默認(rèn)創(chuàng)建硬鏈接) |
| -f | 強(qiáng)制創(chuàng)建文件或目錄的鏈接 |
| -i | 覆蓋前先詢問(wèn) |
| -v | 顯示創(chuàng)建鏈接的過(guò)程 |
軟鏈接示例 :
[apple@VM_0_8_centos ~]$ echo "hello world" > helloWorld [apple@VM_0_8_centos ~]$ ln -s helloWorld sHelloWorld [apple@VM_0_8_centos ~]$ cat helloWorld hello world [apple@VM_0_8_centos ~]$ cat sHelloWorld hello world [apple@VM_0_8_centos ~]$ rm helloWorld [apple@VM_0_8_centos ~]$ cat sHelloWorld cat: sHelloWorld: No such file or directory硬鏈接示例 :
[apple@VM_0_8_centos ~]$ echo "hello world" > helloWorld [apple@VM_0_8_centos ~]$ ln helloWorld hardHelloWorld [apple@VM_0_8_centos ~]$ cat helloWorld hello world [apple@VM_0_8_centos ~]$ cat hardHelloWorld hello world [apple@VM_0_8_centos ~]$ ls -lhi hardHelloWorld helloWorld 360888 -rw-rw-r-- 2 apple apple 12 Jun 4 17:10 hardHelloWorld // 第一列為 inode 號(hào),第三列為 inode 連接數(shù) 360888 -rw-rw-r-- 2 apple apple 12 Jun 4 17:10 helloWorld // 兩個(gè)文件的 inode 號(hào)是一樣的。 [apple@VM_0_8_centos ~]$ rm helloWorld [apple@VM_0_8_centos ~]$ cat hardHelloWorld hello world問(wèn)題
硬鏈接占據(jù)空間嗎 ? 比如我有一個(gè) 1G 的文件,現(xiàn)在我給這個(gè)文件建了一個(gè)硬鏈接。那么會(huì)占據(jù) 2G 空間嗎?
不會(huì),之前我們說(shuō)了硬鏈接是一個(gè)指針或者說(shuō)是文件的引用。只占一點(diǎn)點(diǎn)空間。
原文鏈接:https://blog.csdn.net/stupid56862/article/details/90785420
總結(jié)
以上是生活随笔為你收集整理的linux系统-软链接与硬链接区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql查询数据不变_mysql之de
- 下一篇: python如何关闭multiproce