Vim 启动时出现的错误“OSError: No space left on device”解决方法

By | 最新修改:2024-08-17

本文解决的问题

本文解决 Vim 启动时出现的 OSError: [Errno 28] No space left on device.You may need to increase the inotify limits on your system, via /proc/sys/fs/inotify/max_user_* 错误。

此错误表示 Vim 的某个插件,或者程序本身占用的太多的文件系统资源所导致 Inotify 监控的目录数量已经超过上限,需要调整一下相关的数值。

之所以本文要着重介绍 Inotify,是因为引起该错误的根本原因出在这里。知其然,更知其所以然。

no space left on device


什么是 Inotify

Inotify 是 Linux 系统内核用来作为实时监控文件(目录)变更的工具,它集成在 Linux 系统内核中;但也可以被应用程序所用,它有 API 可以让应用程序的代码开发者将它应用到程序上来。


为什么会超出上限参数值

Inotify 不但让开发者用来监控普通用户的文件,也用来监控系统内核的实时变更,随着内核文件增多,以及同一个系统上普通用户使用它的频繁度增加,需要它监控的文件数量也在不断增加,因此,Inotify 设置的默认文件和实例的上限也不够用了,所以要调整那些上限值来避免系统错误的发生。


如何设定 Inotify 能对文件进行监控的数量上限

Inotify 主要有以下三个值来限制其能监控文件的数量。

三个内核参数值

/proc/sys/fs/inotify/ 目录下相关的文件决定 Inotify 能够监控文件的数量的限制,其中:

  1. max_user_watches:表示同一用户同时可以添加的监控的目录数量上限;
  2. max_user_instances:设定每个用户可创建的 Inotify 实例的数量上限;

  3. max_queued_events:限制 Inotify 文件队列中排队的最大文件数量。

通常,设置得越大越好,毕竟会避免一些系统方面的错误;但是假设 Inotify 的实例和监控的目录数量过于大,意味着这些限制越大,消耗的系统计算资源(CPU和内存)就越大。

临时改变上限参数值

打开命令行终端,然后执行以下的命令,一条命令修改 Inotify 的内核参数上限值:

sudo bash -c 'echo 9999999 > /proc/sys/fs/inotify/max_user_watches
echo 2048 > /proc/sys/fs/inotify/max_user_instances
echo 65535 > /proc/sys/fs/inotify/max_queued_events'

三个参数分别设为以上值,一般情况下应该够用了。

如果遇到数值过大的问题,可酌情减小上述的值。

以上方法是临时改变参数值,重启系统后会还原为默认值。

永久地改变上限参数值

以下方式可永久地改变 Inotify 的三个系统内核参数值,即重启系统也有效:

sudo bash -c 'cat >> /etc/sysctl.conf <<EOF
fs.inotify.max_user_watches=9999999
fs.inotify.max_user_instances=2048
fs.inotify.max_queued_events=65535
EOF'
sudo sysctl -p


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com