1. 程式人生 > >Linux中刪除檔案,磁碟空間未釋放問題追蹤

Linux中刪除檔案,磁碟空間未釋放問題追蹤

    在客戶使用我們產品後,發現一個問題:在刪除了檔案後,磁碟空間卻沒有釋放。是有程序在開啟這個檔案,還是其他情況?我們一起來看看一下兩個場景

一. 場景一:程序開啟此檔案

    當一個檔案正在被一個程序使用時,使用者刪除此檔案,檔案只會從目錄結構中刪除,但並沒有從磁碟刪除。當使用這個檔案的程序結束後,檔案才會真正的從磁碟刪除,釋放佔有的空間。

    我們發現剩餘磁碟空間比較少時,回去刪除一些大的臨時檔案或者log檔案,如果刪除之後會發現磁碟空間並未減少,那麼可以通過“lsof”命令去檢視正在使用該檔案的程序,然後再重啟該程序或者服務。

    【例子】

    現在發現磁碟空間的佔用了99%,剩餘空間只剩下522M。

SUSE11X64-001:/test # df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda2                         29G   27G  522M  99% /
devtmpfs                         972M  116K  972M   1% /dev
tmpfs                            972M     0  972M   0% /dev/shm

     找到一個檔案"vmcore"佔用了接近900M空間,但這個檔案不需要再使用了,於是採用“rm

”命令刪除此檔案,可是刪除後,發現磁碟空間並沒有真正的減少。

SUSE11X64-001:/test # rm vmcore 
SUSE11X64-001:/test # df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda2                         29G   27G  522M  99% /
devtmpfs                         972M  116K  972M   1% /dev
tmpfs                            972M     0  972M   0% /dev/shm
//10.204.16.2/home/splx/iceking  6.3T  1.6T  4.7T  25% /mnt/iceking
    也就是說很有可能有其他程序正在使用這個檔案,使用“lsof”命令去檢視正在使用該檔案的程序。
SUSE11X64-001:/test # lsof | grep vmcore
a.out      2610       root    3r      REG                8,2 941331144    1643779 /test/vmcore (deleted)
    程序號為2610(程序名為"a.out")的程序,正在使用vmcore檔案,也可以看到其後有“deleted”:其表示正在使用的檔案被刪除,但並沒有真正從磁碟上移除。

    現在我們刪除這個程序,並檢視磁碟空間此時佔用率降低為95%,剩餘空間增加到1.4G。

SUSE11X64-001:/test # df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda2                         29G   26G  1.4G  95% /
devtmpfs                         972M  116K  972M   1% /dev
tmpfs                            972M     0  972M   0% /dev/shm

二. 場景二:核心模組Bug

    在檔案系統處理檔案需要的資訊都存放在索引節點(inode)中,如果在刪除檔案的時候索引節點的引用計數不為0(表示檔案正在被使用),則不會在磁碟中真正的刪除檔案,從而保證正在使用此檔案的程序能夠正常的處理檔案。

    首先我們一起來看一下核心中關於檔案系統的一些關鍵資料結構的關聯,當一個程序開啟一個檔案後,便會在核心中建立一個file物件,這個物件主要描述了程序如何與檔案進行互動。file物件中將指向一個dentry結構(目錄項),目錄項中描述了目錄項名稱,父目錄項資訊,子目錄項資訊等。而dentry中的d_inode所指向的inode節點中則包含了實際的檔案儲存在磁碟上的資訊。


    當多個程序開啟同一個檔案時,核心中變會建立相應的file物件,但是他們都公用同一個dentry,只不過每一次開啟檔案dentry的引用計數d_count加1。並且對於開啟的同一個檔案而言,inode也是唯一的,inode的引用計數i_count一般為檔案硬連結的數目。看過一些中文部落格,說“同一個檔案,每開啟一次,則inode中引用計數i_count則加1”,這種說法通過我的驗證結果是錯誤的。實驗結果是:對於同一個檔案,每開啟一次,則inode中的引用計數不變,但相應的dentry引用計數加1.

    這次客戶在刪除檔案後,磁碟空間沒有釋放,通過"lsof"命令也沒有找到正在佔用此檔案的程序。於是再次懷疑這是由於產品的核心模組早成的。後經分析得到:在上一篇博文《Linux Kernel模組記憶體洩露查詢 (2)》中解釋過由於在產品核心模組中,對dentry引用,並使用完之後並沒有對其引用計數減1,從而造成記憶體洩露。在這種情況下,dentry不會被釋放,則inode也就一直被引用著,從而也導致了即使刪除檔案,也不會從磁碟刪除。

    而且針對以上的問題和分析,如果不能及時給客戶修這個問題,那也只能讓其重新啟動OS,空閒的磁碟空間才會釋放出來。

相關推薦

Linux刪除檔案磁碟空間釋放問題追蹤

    在客戶使用我們產品後,發現一個問題:在刪除了檔案後,磁碟空間卻沒有釋放。是有程序在開啟這個檔案,還是其他情況?我們一起來看看一下兩個場景 一. 場景一:程序開啟此檔案     當一個檔案正在被一個程序使用時,使用者刪除此檔案,檔案只會從目錄結構中刪除,但並沒有從磁

Linux磁碟被佔用找不到佔用檔案磁碟空間釋放

 新公司的測試機磁碟空間空餘很小,日誌很多,也很大,做個日誌壓縮指令碼,在夜裡4:30自動執行,第二天後發現磁碟空間又滿了,只好刪除沒用的日誌,清空空間,可詭異的是怎麼刪除沒用的檔案,空間還是佔用很大。如圖 用du 根目錄下,發現這些檔案加一塊也達不到佔用的空間

解決刪除檔案磁碟空間釋放問題

今天有一位同學碰到了這樣一個問題: du命令檢視空間只佔用19G df命令檢視卻佔用43G 網上說明:解決刪除檔案後磁碟空間不釋放問題     du命令會對統計檔案逐個呼叫fstat這個系統呼叫,獲取檔案大小。它的資料是基於檔案獲取,可以跨多個分割槽操作

inode引起的Linux無法建立新檔案磁碟空間不足

  df -h,判斷硬碟空間是否已經滿了,佔用率達100% ,就可以斷定該分割槽滿了。   df -ia,佔用率達100%,也會導致無法建立新檔案。一般都是存在大量小檔案引起的。     inode包含檔案的元資訊,具體來說有以下內容:   * 檔案的位元組數

Linux檔案處理-拷貝刪除和移動

複製檔案/目錄(命令:cp) 命令 解釋 (file表示檔案,dir表示目錄) cp file1 file2 拷貝 file1 為 file2 cp file1

Linux恢復誤刪刪除檔案釋放刪除空間

參考網址https://www.cnblogs.com/z-sm/p/6108689.html 鍵入命令:lsof |grep deleted 找到刪除的檔案。 恢復程序號為1464的檔案 需要先建立路徑/home/hadoop/zktmp/version-2 cat /

重新啟動postgre報錯時解決方案 ( 由備份檔案佔用空間太大造成 ) (linux 命令 df -h 檢視磁碟空間)

在這裡使用了一個liunx下的命令檢視磁碟空間 常用引數:df -h ------------------------------------- 1.在Linux下重新啟動postgre pg_ctl restart (postgres 使用者) 今天遇到的問題 由於匯

LINUX刪除檔案磁碟空間釋放的原因

這幾天做LINUX實驗的時候,發覺自己刪除了一個大檔案後用  df -h 指令檢測磁碟空間,發現空間並沒有減少,後來仔細查詢,總結出以下三種不釋放記憶體的可能: 一、該檔案已經建立硬連結 這個原因很簡單,hardlink是指多個檔名指向同一索引點(inode),只要其中仍然

Linux檔案刪除空間釋放

當系統空間使用量過大需要清理空間或者清理某個檔案時,有時會出現執行了刪除命令之後磁碟空間並沒有釋放,很多人首次遇到該情況時會比較困惑,在考慮是不是像windows系統的回收站一樣,刪除只是邏輯刪除到回收站一樣?其實不然,linux的回收站功能想了解的可以與我溝通或查資料瞭解一下,也是個比較實用的方法,此處我們

linux檢視cpu型號記憶體大小磁碟空間的命令

轉自:http://www.jb51.net/article/97157.htm 1 檢視CPU 1.1 檢視CPU個數 #cat /proc/cpuinfo | grep “physical id” | uniq | wc -l 2 uniq命令:刪除重複行;wc –l命令

處理Linux系統下已刪除檔案繼續佔用空間問題

在Linux中,當我們使用rm在linux上刪除了大檔案,但是如果有程序打開了這個大檔案,卻沒有關閉這個檔案的控制代碼,那麼linux核心還是不會釋放這個檔案的磁碟空間,最後造成磁碟空間佔用100%,整個系統無法正常執行。這種情況下,通過df和du命令查詢的磁碟空間,兩者是無法匹配的,可能df顯示磁

ORACLE ASM環境刪除和建立表空間、增加表空間資料檔案

 1、列出表空間 SQL> select name from v$tablespace; 刪除表空間,包括屬於它的資料檔案(物理上也同時刪除) SQL> drop tablespace qiu including contents and datafiles

linux檔案和資料夾的新建、查詢、刪除

新建資料夾 使用的mkdir命令可以新建資料夾。 mkdir filename 這樣就建立了一個叫做filename資料夾。 新建一個檔案 新建的檔案可以包括任何副檔名,.txt/.cpp/.csv 使用的是vi命令。 vi a.txt 這

linux c刪除檔案指定內容行或指定行

用C語言來操作檔案內容還是有點煩的(尤其是刪除內容,或者是修改非等長度的內容),沒有現成的API呼叫,只能自己手動寫; 網上查了下資料基本就兩個方案: 1、增加個臨時檔案;把原始檔內容逐個位元組或者逐行讀取出來,然後修改或者丟棄,放到臨時檔案中,當把原始檔中所有內容過濾後,

從git永久刪除檔案以節省空間

在使用版本管理工具的過程中我們會碰到這樣的問題:不小心把一個不該加入版本管理的檔案加進去了,有時候這個檔案很大,也許我們整個版本庫才幾百 K,但加進去這個沒用的檔案卻有好幾百M,我可不想因為這麼個破爛東西把整個版本庫整個碩大無比,以後維護備份都不方便;還有時候是不小心把一

oracle11g卸載出錯 無法刪除檔案檔案正在使用

 在解除安裝oracle11g時 停止服務後,執行C:\myoracle\think\product\11.2.0\dbhome_2\deinstall 中的 deinstall.bat 可以在cmd中直接輸入 deinstall.bat ,也可以直接雙擊開啟,也可以直接雙

linux搜尋檔案或目錄(whichwhereislocatefind)

[[email protected] ~]# locate passwd /home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passw

linux詳細檢視所佔空間大小及檔案個數

統計某資料夾下檔案的個數 ls -l |grep "^-"|wc -l 統計某資料夾下目錄的個數 ls -l |grep "^d"|wc -l 統計資料夾下檔案的個數,包括子資料夾裡的 ls -lR|grep "^-"|wc -l 如統計/home/han目錄(包含子目錄)下的所有js檔案則: ls -lR

Linux學習筆記_系統分割槽資訊磁碟空間及inode佔用檢視(dffdisk)

環境:centos7 需求:檢視系統分割槽表資訊,磁碟空間及inode佔用 方法: df 命令 fdisk命令 [[email protected]_PC ~]# which df /u

Linux下tomcat部署的專案應用下載到專案檔案無法下載會報404找不到檔案的錯誤

將專案部署到linux系統中的tomcat下,上下文路徑為demo,結構如下: |--tomcat-webapps-demo ....|--js ....|--WEB-INF ....|--META-INF ....|--html ....|--export .......