【LINUX】使用lsof處理檔案恢復、控制程式碼以及空間釋放問題
曾經在生產上遇到過一個df 和 du出現的結果不一致的問題,為了排查到底是哪個程式佔用了檔案控制程式碼,導致空間未釋放,首先在linux上面,一切皆檔案,這個問題可以使用lsof這個BT的命令來處理(這個哈還可以來查詢檔案控制程式碼洩露問題,應用程式的程式未關閉檔案控制程式碼)
1.檔案控制程式碼以及空間釋放問題
- 注:在生產環境常見的問題就是,有維護人員或者開發同事使用tail命令實時檢視日誌。然後另外的人使用rm命令刪除,這有就好導致磁碟空間不會真正的釋放,因為你要刪除的檔案,還有程式在使用,檔案控制程式碼沒有釋放,即tail
模擬場景1:
你建立一個檔案testfile
touch testfile
然後使用tail命令一直檢視
tail testfile
這個時候另外一個同事使用rm命令來刪除了該檔案
rm testfile
正式使用lsof命令排查
如果你知道檔名,那就可以直接使用如下命令
lsof |grep testfile
但是如果你不知道是哪個檔案,或者是很多檔案都有這樣的情況,那你需要使用如下命令
lsof |grep deleted 注:這個deleted表示該已經刪除了的檔案,但是檔案控制程式碼未釋放,這個命令會把所有的未釋放檔案控制程式碼的程式列出來
注:有些系統你沒有配置環境變數的話,直接lsof是會報錯沒有該命令,你可以直接/usr/bin/lsof 或者是/usr/sbin/lsof,根據你的系統環境自己檢視
然後上面命令出來的結果會出來如下結果
root 123 12244 0 14:47 pts/1 01:02:03 tail testfile
然後你可以使用kill 命令來釋放檔案控制程式碼從而釋放空間
kill 123
2. 檔案恢復問題
在說明問題之前,先介紹下一些檔案的基本概念:
- 檔案實際上是一個指向inode的連結, inode連結包含了檔案的所有屬性, 比如許可權和所有者, 資料塊地址(檔案儲存在磁碟的這些資料塊中). 當你刪除(rm)一個檔案, 實際刪除了指向inode的連結, 並沒有刪除inode的內容. 程式可能還在使用. 只有當inode的所有連結完全移去, 然後這些資料塊將可以寫入新的資料.
- proc檔案系統可以協助我們恢復資料. 每一個系統上的程式在/proc都有一個目錄和自己的名字, 裡面包含了一個fd(檔案描述符)子目錄(程式需要開啟檔案的所有連結). 如果從檔案系統中刪除一個檔案, 此處還有一個inode的引用:
/proc/程式號/fd/檔案描述符
- 你需要知道開啟檔案的程式號(pid)和檔案描述符(fd). 這些都可以透過lsof工具方便獲得, lsof的意思是”list open files, 列出(程式)開啟的檔案”. 然後你將可以從/proc複製出需要恢復的資料.
1.建立一個測試檔案並且備份下,方面後續驗證
touch testfile
cp testfile testfile.backup.2014
2.檢視檔案的相關資訊
stat testfile
File: 'testfile' Size: 343545 Blocks: 241 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 361579 Links: 1 Access: (0664/-rw-rw-r–) Uid: ( 505/ zhaoke) Gid: ( 505/ zhaoke)
Access: 2014-11-09 15:00:38.000000000 +0800 Modify: 2014-11-09 15:00:34.000000000 +0800 Change: 2014-04-09 15:00:34.000000000 +0800
沒問題, 繼續下面工作:
3.刪除檔案
rm testfile
4.檢視檔案
ls: testfile: No such file or directory
ls -l testfile
stat testfile stat: cannot stat 'testfile': No such file or directory
testfile檔案刪除了,但不要終止仍在使用檔案的程式, 因為一旦終止, 檔案將很難恢復.
現在我們開始找回資料之旅,先使用lsof命令檢視下
lsof | grep testfile
tail 5317 root 4r REG 253,0 343545 361579 /root/testfile (deleted)
-
第一個縱行是程式的名稱(命令名), 第二縱行是程式號(PID), 第四縱行是檔案描述符
-
現在你知道5317程式仍有開啟檔案, 檔案描述符是4. 那我們開始從/proc裡面複製出資料.
-
你可能會考慮使用cp -a, 但實際上沒有作用, 你將複製的是一個指向被刪除檔案的符號連結:
ls -l /proc/5317/fd/4 lr-x—— 1 root root 64 09 15:00 /proc/5317/fd/4 -> /root/testfile (deleted)
使用cp -a命令測試恢復
cp -a /proc/5317/fd/4 testfile.backup
使用ls命令來檢視
ls -l testfile.backup
lrwxrwxrwx 1 root root 29 09 15:02 testfile.backup -> /roor/testfile (deleted)
透過上面的命令我們發現,使用cp -a命令,其恢復的是一個指向被刪除檔案的符號連結
使用file命令分別檢視檔案和檔案描述符
- 1.檢視檔案
file testfile.backup
testfile.backup: broken symbolic link to '/root/testfile (deleted)'
- 2.檢視檔案描述符
file /proc/5317/fd/4 /proc/5317/fd/4: broken symbolic link to '/root/myfile (deleted)'
根據上面的file結果,可以使用cp複製出檔案描述符資料到一個檔案中,如下:
5317/fd/4 testfile.new
cp /proc/使用上面的命令恢復後,我們需要最終確認一下檔案是否恢復,以及檔案內容是否正確:
new
ls -l testfile.
然後把新舊的兩個檔案對比
diff testfile.new myfile.backup
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-2058618/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 處理Linux刪除檔案後空間未釋放的問題Linux
- Linux檔案刪除但空間不釋放問題篇Linux
- lsof |grep deleted 釋放磁碟空間delete
- drop表空間以及對應的資料檔案後空間不釋放的問題
- 刪除正在使用的檔案,空間不釋放的問題
- Linux下使用lsof恢復刪除的檔案Linux
- 解決linux刪除檔案後空間沒有釋放問題Linux
- linux下檔案刪除之後,空間沒有釋放問題Linux
- Linux檔案刪除空間未釋放Linux
- 使用lsof恢復誤刪除的檔案
- Linux下資料檔案刪除檔案系統空間不釋放的問題Linux
- 解決linux下刪除檔案或oracle表空間後空間不釋放的問題LinuxOracle
- lsof恢復誤刪的檔案
- Linux 刪除檔案後空間不釋放Linux
- Linux rm掉檔案空間不釋放原因Linux
- solaris下使用lsof恢復刪除的檔案
- ZT:使用lsof恢復誤刪除的檔案
- 刪除檔案後,磁碟空間沒有釋放的處理記錄
- rman恢復資料檔案 恢復表空間
- (轉載)刪除檔案後硬碟空間不釋放的問題硬碟
- oracle系統預設臨時表空間以及redo日誌檔案問題處理Oracle
- RMAN恢復表空間,資料檔案,歸檔檔案,控制檔案等介紹
- lsof恢復oracle誤刪除檔案Oracle
- 使用rman恢復控制檔案
- 系統表空間檔案丟失無備份用控制程式碼的辦法恢復
- 歸檔日誌物理刪除後閃回恢復區空間未釋放
- 控制檔案恢復—從trace檔案中恢復
- RM刪除檔案空間釋放詳解
- hpux刪除檔案後空間不釋放UX
- SYSAUX表空間使用率高問題處理UX
- Linux下誤刪資料檔案從檔案控制程式碼恢復資料檔案Linux
- 恢復之丟失全部控制檔案以及備份中的控制檔案
- 表空間不完全恢復(全備--備份控制檔案--刪除表空間andy--日誌檔案)
- sysaux 表空間不足問題處理UX
- system表空間檔案損壞----完全恢復
- UNDO 表空間檔案損壞的恢復
- 解決刪除檔案後 WSL2 磁碟空間不釋放的問題
- 使用舊的控制檔案備份來恢復控制檔案