硬鏈接是指通過索引節點(Inode)來進行鏈接,在Linux(ext2,ext3)文件系統中,保存在磁盤分區中的文件不管是什么類型都會給它分配一個編號,這個編號被稱為索引節點編號(Inode Index)簡稱Inode,即在系統中文件的編號。
在Linux文件系統中,多個文件名指向同一個索引節點(Inode)是正常且允許的。這種情況的文件就稱為硬鏈接,硬鏈接的作用之一是允許一個文件擁有多個有效路徑名(多個入口),這樣用戶就可以建立硬鏈接到重要的文件,以防止“誤刪”源數據(很多硬件存儲如netapp存儲中的快照功能就應用了這個原理,增加一個快照就多了一個硬鏈接。)為什么一個文件建立了硬鏈接會防止誤刪呢?
因為文件系統(ext2)的原理是,只要文件的索引節點還有一個及一個以上的鏈接。只刪除其中一個硬鏈接,并不影響索引節點本身和其它的鏈接,只有當文件的最后一個鏈接被刪除后,此時如果有新數據要存儲到硬盤上時或都系統通過以fsck做磁盤檢查的時候,被刪除文件的數據塊及目錄的鏈接都會被釋放,空間被新數據占用并覆蓋。此時,數據就再也無法找回了,也就是說,在linux系統中,刪除文件(目錄也是文件)的條件是與之相關的所有硬鏈接均被刪除;
提示:硬鏈接相當于文件的另外一個入口
2 查看硬鏈接數此圖下面標紅的顯示為硬鏈接數,表示已有幾個硬鏈接數;
注:目錄不可創建硬鏈接

創建一個硬鏈接,查看變化。

創建的硬鏈接文件,他們的Inode節點是相同的。

軟件鏈接相當于windos的快捷方式
Linux里的軟鏈接文件是一個特殊的文件。在軟鏈接中,軟鏈接文件實際上就是一個文本文件,這個文件中包含有軟鏈接指向另一源文件文件的位置信息內容,因此,通過訪問這個“快捷方式”就可以迅速定位到軟鏈接所指向的源文件實體。
創建的軟鏈接,他們的inode節點不相同。

1)通過ls –li參數查看硬鏈接數
2)同一個文件可以同時有多個硬鏈接,但只對文件生效,硬鏈接不能用于目錄。
3)同一個文件的多個硬鏈接文件inode節點相同
4)刪除一個文件的一個硬鏈接文件,不會影響其他硬鏈接文件;只有刪除所有硬鏈接文件和源文件,數據才會被刪除。
5)當所有的硬鏈接文件和源文件都被刪除后,再存放新的數據會占用這個文件的空間,或者磁盤fsck檢查的時候,數據也會被回收。
6)硬鏈接是一個文件的多個入口。
7)和復制不一樣的是,硬鏈接的文件指向的都是同一個源文件,所以在任何硬鏈接文件做更改,直接會影響到每一個硬鏈接文件中。相當于時時同步。
8)目錄不支持創建硬鏈接
4.2 軟鏈接小結:1)軟鏈接相當于windos的快捷方式
2)軟鏈接和源文件的inode值不同
3)可以在不同分區對文件或目錄進行創建軟鏈接
4)通過readlink命令查看軟鏈接文件對應的實質源文件
5)刪除軟鏈接源文件對軟鏈接會直接影響
6)軟鏈接和源文件是不同類型的文件,也是不同的文件。
7)雖然目錄不能創建硬鏈接,但通過ls查看屬性時還可以看到顯示硬鏈接數的那一行并非為1,而是大于1的數;原因在于,每創建一個目錄時,其自動給自己創建一硬鏈接(可查看隱藏文件),并且在目錄下每創建一個子目錄,都會使硬鏈接數加1(創建文件不增加)。

這個只在目錄下創建子目錄才有效,如果在子目錄下創建子目錄就無效(原理是子目錄下通過ls –al查看到有“..”對應上一目錄的硬鏈接)


1. 一個文件有兩部分組成,分別為i_link和i_count。
2. i_link為硬鏈接數;i_count為調用文件進程數
3. 當i_link為0時(即刪除所有硬鏈接和源文件),且沒被其他進程調用,此文件就被刪除。
4. 當i_link為0時,但被其他進程調用時,說明i_count不為0,則文件可還原。
所以文件是否真的被刪除,看i_link和i_count兩個計數器決定。
參考資料:http://oldboy.blog.51cto.com/2561410/612351
5.2 案例:模擬Web服務器磁盤滿故障環境1)yum安裝httpd
[root@baiguin ~]# yum -y install httpd
2)更改httpd.conf配置文件訪問日志路徑
[root@baiguin ~]# sed -i "s@#CustomLog /app/log/access_log combined@CustomLog /app/log/access_log combined@" /etc/httpd/conf/httpd.conf
3)創建模擬磁盤
[root@baiguin ~]# dd if=/dev/zero of=/dev/sdc bs=8K count=10
記錄了10+0 的讀入
記錄了10+0 的寫出
81920字節(82 kB)已復制,0.000898885 秒,91.1 MB/秒
[root@baiguin ~]# ll /dev/sdc
-rw-r--r-- 1 root root 81920 9月 24 16:02 /dev/sdc
[root@baiguin ~]# mkfs.ext3 /dev/sdc
4)掛載查看
[root@baiguin ~]# mount /dev/sdc /app/log/
mount: /dev/sdc is not a block device (maybe try `-o loop'?)
[root@baiguin ~]# mount -o loop /dev/sdc /app/log/
[root@baiguin ~]# df -h
/dev/sda1 485M 76M 384M 17% /boot
/dev/sdc 73K 14K 55K 21% /app/log
5)啟動http并查看
[root@baiguin ~]# /etc/init.d/httpd start

[root@baiguin ~]# ll /app/log/
-rw-r--r-- 1 root root 4524 9月 24 16:11 access_log
drwx------ 2 root root 12288 9月 24 16:04 lost+found
6)多次打開網頁,讓磁盤占滿,并刪除日志文件,查看磁盤是否還占滿。

刪除后發現磁盤未減小

7)通過lsof | grep del 查看文件被占用情況
8)重啟httpd服務釋放正在寫入的日志并查看

生產場景:最佳解決方案
1)刪除文件,重啟服務。
2)清空文件里的內容,無需重啟服務。
3)不要刪除當天的被進程占用的文件,刪以前的。
6 文件時間類型6.1 GNU/Linux的文件有3種類型的時間戳:可通過stat 命令查看文件的三種時間
1) 通過默認的ls (ls -lt)顯示的是最后修改時間

2) 通過ls –lc 顯示的是狀態改變時間

3) 通過ls –lu 顯示的是最后訪問時間

1)Touch一個已經存在的文件時會使該文件的三個時間戳都改變
2)查看文件時會改變文件的訪問時間(以及其他的一些對文件屬性的修改,都會便時間戳有相應的變動)
1)通過ls 的 –time-style=long-iso命令
[root@baiguin ~]# ls -l --time-style=long-iso wang.txt
-rw-r--r-- 1 root root 46 2014-09-25 10:43 wang.txt
2)通過ls –time-style=full-iso命令
[root@baiguin ~]# ls -l --time-style=full-iso wang.txt
-rw-r--r-- 1 root root 46 2014-09-25 10:43:13.081973883 +0800 wang.txt
新聞熱點
疑難解答