No space left on device錯誤解決筆記 今天准備重啟下數據庫(linux oracle11g) conn /as sysdba; 出現這樣的錯誤No space left on device 一看 沒有足夠的空間 郁悶! 看看空間大小 df -h 空間只用了10%不到呢。 重啟計算機不能解決; 於是google baidu一下,總結:inode耗盡導致No space left on device; 解決:刪除 var的一個子目錄下一些沒用的臨時文件和日志文件;通過刪除大量的小文件得以解決 或者:ipcs -s | grep nobody | perl -e 'while (
) { @a=split(/\s+/); print `ipcrm sem $a[1]`}' 刪除信號量 至於為什么呢? 鏈接看看1,http://www.zeali.net/entry/480 為了防止鏈接死掉: 轉下來更深刻的去了解 “--” 看到這個錯誤,第一個反應是磁盤空間滿了;但 df 一看,每個分區的空間都還富余的很。從 munin 的監控圖表上看 Filesystem usage 也很平穩,但下面的 Inode usage 就有問題了,其中一個分區的 usage 已經到了100%。趕緊跑到服務器上 df -i 檢查,果然是 Inode 耗盡。原來這個分區是用來扔各種日志和臨時文件的,其中有某個程序產生的臨時文件又小又多,又沒有進行定時回滾,造成在磁盤空間耗盡之前文件系統的 Inode 就被用光了。 Linux/Unix like OS 的文件系統中每個目錄樹中的節點並不是像 Windows 那樣直接包含文件的具體信息,而只包含了文件名和 Inode number 。通過 Inode number 所找到對應於文件名的 Inode 節點中才真正記錄了文件的大小/物理地址/所有者/訪問權限/時間戳/被硬鏈接的次數等實際的 metadata 。因此你可以在 Linux 系統中通過硬鏈接( hard link ) 的方式給某個文件創建無數個位於不同目錄下的文件名,而實際的文件數據只需要一份拷貝。 但也正因為這種文件系統的結構,當你在 Linux 中進行 IO 操作的時候,需要的資源除了磁盤空間以外,還要有剩余的 Inode 才行。缺省情況下, Linux 在系統安裝過程中按照1個 Inode 對應 2k 磁盤空間來計算每個分區的最大 Inode 數。一旦文件系統創建之后,每個分區可用 Inode 數就無法進行動態調整。 正常來說,一般不太會出現某個分區的 Inode 耗盡而磁盤空間尚余的情況,除非像我碰到的這樣垃圾小文件瘋長而又沒進行有效的清理。但如果確實需要的話,可以在創建文件系統(比如用 mke2fs )的時候根據實際需要來調整這個參數(比如分區如果用於存放超大視頻文件的話 Inode 的數量可以少一些;如果打算存放的文件是大量小於 2k 的迷你文件的話就要考慮多創建一些 Inode)。 附:Inode Definition by The Linux Information Project 其它人碰到的 No space left on device 原因: 超出系統中同時運行的最大 message queue 個數限制 : 在 root 下用 sysctl kernel.msgmni 檢查該參數, sysctl -w kernel.msgmni=XXX 重新設定即可。