设备错误上没有剩余空间,但 df 报告有更多可用空间

Kzq*_*qai 8 debian disk-space-utilization tmp inode session

我在使用 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
Run Code Online (Sandbox Code Playgroud)

当我尝试:

ls /tmp
Run Code Online (Sandbox Code Playgroud)

它只是永远挂起,所以这很糟糕。

但是当我检查可用空间并检查 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
Run Code Online (Sandbox Code Playgroud)

数字看起来不错。当然,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
Run Code Online (Sandbox Code Playgroud)

Gia*_*968 7

可能是/tmp/目录本身充满了未清理的陈旧 PHP 会话;这意味着问题的根源可能与/tmp/目录本身隔离。如果是这种情况,我会删除所有/tmp/sess_*文件。首先,列出所有sess_*文件,如下所示:

ls -la /tmp/sess_*
Run Code Online (Sandbox Code Playgroud)

或者你可以wc这样计算:

ls -la /tmp/sess_* | wc -l
Run Code Online (Sandbox Code Playgroud)

现在一旦你得到一些确认,那里有一些疯狂的文件,继续运行这个命令来删除/tmp/sess_*文件:

sudo rm -rf /tmp/sess_*
Run Code Online (Sandbox Code Playgroud)

短暂的会话文件将被吹走。

但是另一种蛮力(但相对安全)的方法是清除/tmp目录本身,重新创建/tmp目录并重新启动服务器。

由于/tmp目录基本上是缓存材料的编码笔,因此没有任何有效的内容应该在那里。所以我最好的建议是运行以下命令来删除和重新构建/tmp目录。

rm -rf /tmp && mkdir /tmp/ && chown root:root /tmp && chmod 1777 /tmp
Run Code Online (Sandbox Code Playgroud)

现在,一个内胆基本上是由连接shell命令的列表&&,将先删除/tmp,重新创建/tmp,更改的所有权/tmproot:root,然后设置适当的权限的/tmp目录。如果您愿意,如果您觉得这样做更安全,可以一个一个地运行每个命令。

sudo rm -rf /tmp 
sudo mkdir /tmp
sudo chown root:root /tmp
sudo chmod 1777 /tmp
Run Code Online (Sandbox Code Playgroud)

完成后,我建议重新启动服务器。事情应该平静了再清理。