標籤:
1 永久連結概念
永久連結是指通過索引節點(Inode)來進行連結,在Linux(ext2,ext3)檔案系統中,儲存在磁碟分割中的檔案不管是什麼類型都會給它分配一個編號,這個編號被稱為索引節點編號(Inode Index)簡稱Inode,即在系統中檔案的編號。
在Linux檔案系統中,多個檔案名稱指向同一個索引節點(Inode)是正常且允許的。這種情況的檔案就稱為永久連結,永久連結的作用之一是允許一個檔案擁有多個有效路徑名(多個入口),這樣使用者就可以建立永久連結到重要的檔案,以防止“誤刪”來源資料(很多硬體儲存如netapp儲存中的快照功能就應用了這個原理,增加一個快照就多了一個永久連結。)為什麼一個檔案建立了永久連結會防止誤刪呢?
因為檔案系統(ext2)的原理是,只要檔案的索引節點還有一個及一個以上的連結。只刪除其中一個永久連結,並不影響索引節點本身和其它的連結,只有當檔案的最後一個連結被刪除後,此時如果有新資料要儲存到硬碟上時或都系統通過以fsck做磁碟檢查的時候,被刪除檔案的資料區塊及目錄的連結都會被釋放,空間被新資料佔用並覆蓋。此時,資料就再也無法找回了,也就是說,在linux系統中,刪除檔案(目錄也是檔案)的條件是與之相關的所有永久連結均被刪除;
提示:永久連結相當於檔案的另外一個入口
2 查看永久連結數
此圖下面標紅的顯示為永久連結數,表示已有幾個永久連結數;
註:目錄不可建立永久連結
建立一個永久連結,查看變化。
建立的永久連結檔案,他們的Inode節點是相同的。
3 軟連結
軟體連結相當於windos的捷徑
Linux裡的軟連結檔案是一個特殊的檔案。在軟連結中,軟連結檔案實際上就是一個文字檔,這個檔案中包含有軟連結指向另一源檔案檔案的位置資訊內容,因此,通過訪問這個“捷徑”就可以迅速定位到軟連結所指向的源檔案實體。
建立的軟連結,他們的inode節點不相同。
4 小結:4.1 永久連結小結:
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查看到有“..”對應上一目錄的永久連結)
5 Linux系統檔案刪除及還原原理:
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兩個計數器決定。
5.1 Web伺服器磁碟滿故障案例分析:
參考資料:http://oldboy.blog.51cto.com/2561410/612351
5.2 案例:類比Web伺服器磁碟滿故障環境
1)yum安裝httpd
[[email protected] ~]# yum -y install httpd
2)更改httpd.conf設定檔訪問日誌路徑
[[email protected] ~]# sed -i "[email protected]#CustomLog /app/log/access_log [email protected] /app/log/access_log [email protected]" /etc/httpd/conf/httpd.conf
3)建立類比磁碟
[[email protected] ~]# dd if=/dev/zero of=/dev/sdc bs=8K count=10
記錄了10+0 的讀入
記錄了10+0 的寫出
81920位元組(82 kB)已複製,0.000898885 秒,91.1 MB/秒
[[email protected] ~]# ll /dev/sdc
-rw-r--r-- 1 root root 81920 9月 24 16:02 /dev/sdc
[[email protected] ~]# mkfs.ext3 /dev/sdc
4)掛載查看
[[email protected] ~]# mount /dev/sdc /app/log/
mount: /dev/sdc is not a block device (maybe try `-o loop‘?)
[[email protected] ~]# mount -o loop /dev/sdc /app/log/
[[email protected] ~]# df -h
/dev/sda1 485M 76M 384M 17% /boot
/dev/sdc 73K 14K 55K 21% /app/log
5)啟動http並查看
[[email protected] ~]# /etc/init.d/httpd start
[[email protected] ~]# 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 命令查看檔案的三種時間
6.2 通過ls命令各參數分別查看檔案時間戳記
1) 通過預設的ls (ls -lt)顯示的是最後修改時間
2) 通過ls –lc 顯示的是狀態改變時間
3) 通過ls –lu 顯示的是最後訪問時間
6.3 改變時間戳記的幾種情況
1)Touch一個已經存在的檔案時會使該檔案的三個時間戳記都改變
2)查看檔案時會改變檔案的訪問時間(以及其他的一些對檔案屬性的修改,都會便時間戳記有相應的變動)
6.4 通過ls兩種方法顯示檔案時間長格式
1)通過ls 的 –time-style=long-iso命令
[[email protected] ~]# 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命令
[[email protected] ~]# 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
linux系統檔案屬性