Debian

設備錯誤上沒有剩餘空間,但 df 報告有更多可用空間

  • July 17, 2015

我使用 Apache2 在我的 Debian 網路伺服器上的 PHP 會話mod_php似乎隨機失敗,說沒有空間來編寫它們:

sudo tail -60 /var/log/apache2/error.log
[Fri Jan 30 15:55:35 2015] [error] [client xxx.xxx.xxx.xxx] PHP Warning:  session_start() [<a href='function.session-start'>function.session-start</a>]: open(/tmp/sess_555555555555555555, O_RDWR) failed: No space left on device (28) in /path/to-first-session-use/core/bootstrap.php on line 18

當我嘗試:

ls /tmp

它只是永遠掛起,所以這很糟糕。

但是當我檢查可用空間並檢查 inode 使用是否合理時……

$ df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             150G  121G   22G  85% /
tmpfs                 2.0G     0  2.0G   0% /lib/init/rw
udev                   10M   16K   10M   1% /dev
tmpfs                 2.0G  4.0K  2.0G   1% /dev/shm

$ df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            19922944 11143605 8779339   56% /
tmpfs                 513524       4  513520    1% /lib/init/rw
udev                  513524     135  513389    1% /dev
tmpfs                 513524       3  513521    1% /dev/shm

數字看起來不錯。當然,85% 比我想要的多,但不是 99% 或任何東西。

我懷疑這是一個問題,因為 5 年沒有重新啟動機器,並且可能創建了很多小文件,但我得到的 inode 資訊有點矛盾。我應該在哪裡調查?

編輯:

ls -l /

drwxrwxrwt   4 root root 692M Feb  1 11:09 tmp/
drwxr-xr-x  10 root root 4.0K Jan  1  2013 usr/
drwxr-xr-x  14 root root 4.0K Oct  7  2010 var/
...etc

可能是/tmp/目錄本身充滿了未清理的陳舊 PHP 會話;這意味著問題的根源可能與/tmp/目錄本身隔離。如果是這種情況,我會刪除所有/tmp/sess_*文件。首先,列出所有sess_*文件,如下所示:

ls -la /tmp/sess_*

或者你可以wc這樣計數:

ls -la /tmp/sess_* | wc -l

現在,一旦您確認那裡有一些瘋狂的文件,請繼續執行以下命令來刪除/tmp/sess_*文件:

sudo rm -rf /tmp/sess_*

短暫的會話文件將被吹走。

但是另一種蠻力(但相對安全)的處理方式是清除/tmp目錄本身,重新創建/tmp目錄並重新啟動伺服器。

由於該/tmp目錄基本上是記憶體材料的編碼筆,因此那裡沒有任何有效的內容。所以我最好的建議是執行以下命令來刪除和重新建構/tmp目錄。

rm -rf /tmp && mkdir /tmp/ && chown root:root /tmp && chmod 1777 /tmp

現在一個襯里基本上是一個由它連接的 shell 命令列表&&,它將首先刪除/tmp、重新創建/tmp、將所有權更改/tmproot:root,然後為/tmp目錄設置適當的權限。如果您願意,如果您覺得這樣做更安全,您可以一個一個地執行每個命令。

sudo rm -rf /tmp 
sudo mkdir /tmp
sudo chown root:root /tmp
sudo chmod 1777 /tmp

完成後,我建議重新啟動伺服器。事情應該再次平靜下來。

引用自:https://serverfault.com/questions/663824