ᕕ( ᐛ )ᕗ Jimyag's Blog

如何解决 no space left on device

首先确保磁盘还有剩余的空间 du 会估计使用了多少的空间

sudo du -sh / 

➜  libexec git:(stable) du -sh src
115M	src

df 分析剩余的空间多少

sudo df -h

➜  libexec git:(stable) df -h
Filesystem                               Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk3s1s1                          460Gi  8.3Gi  365Gi     3%  348574 3826533320    0%   /
devfs                                   207Ki  207Ki    0Bi   100%     716          0  100%   /dev
/dev/disk3s6                            460Gi  4.0Gi  365Gi     2%       4 3826533320    0%   /System/Volumes/VM
/dev/disk3s2                            460Gi  4.4Gi  365Gi     2%     797 3826533320    0%   /System/Volumes/Preboot
/dev/disk3s4                            460Gi  1.8Mi  365Gi     1%      42 3826533320    0%   /System/Volumes/Update
/dev/disk1s2                            500Mi  6.0Mi  481Mi     2%       1    4926200    0%   /System/Volumes/xarts
/dev/disk1s1                            500Mi  6.1Mi  481Mi     2%      23    4926200    0%   /System/Volumes/iSCPreboot
/dev/disk1s3                            500Mi  2.1Mi  481Mi     1%      52    4926200    0%   /System/Volumes/Hardware
/dev/disk3s5                            460Gi   78Gi  365Gi    18% 1163022 3826533320    0%   /System/Volumes/Data
map auto_home                             0Bi    0Bi    0Bi   100%       0          0  100%   /System/Volumes/Data/home
/dev/disk4s1                            230Mi  139Mi   91Mi    61%    1100 4294966179    0%   /Volumes/Moonlight
/dev/disk5s1                            660Mi  439Mi  222Mi    67%    8881 4294958398    0%   /Volumes/Logseq
/dev/disk6                              918Ki  918Ki    0Bi   100%       0          0  100%   /Volumes/Dropbox Installer
/Volumes/Dropbox Installer/Dropbox.app  918Ki  918Ki    0Bi   100%    4711          0  100%   /private/var/folders/2_/t87_57ys3rq_35f46ptmp0l00000gn/T/AppTranslocation/4ED3F3D9-7D3F-4F14-A3B6-7288FFC17267

为什么会有 No Space Left on Device 报错

尽管磁盘上有足够的可用空间,但如果您看到上述错误消息,则不是硬件有问题。找出错误的确切原因可能需要一些故障排除。

方法1,重启正在使用已经删除文件的进程

“No Space Left on Device” 错误的最可能原因是进程仍在使用已删除的文件。只需要重新启动进程即可释放保留的存储空间 要查找有问题的进程,需要使用 lsofgrep 命令。 lsof 命令将提供运行进程使用的所有打开文件的列表,grep 可以将选择范围缩小到被删除的文件。因此输入sudo lsof / | grep delete,其中/是基本目录,| 是一个用于将 lsofs 的输出链接到 grep 的管道。 可以使用 sudo systemctl restart service_name命令重新启动受影响的进程,其中服务名称是在搜索中出现的服务的名称。 如果有多个这样的进程,或者不想费心寻找特定的服务,可以使用 sudo systemctl daemon-reload命令重置它们。这将重新生成所有依赖项,同时考虑到文件系统中的任何更改。 在此之后,进程所占用的存储空间应该再次可用,允许编写文件而不会遇到任何错误。

方法2,Check Inodes

虽然每个驱动器有大量的 inode,但它是有限的。如果您的系统中散布着数量惊人的文件,那么在驱动器的存储容量耗尽之前就有可能达到这个限制。这就是为什么拥有大文件比拥有太多小文件要好的原因。 您可以通过将 -i 标志与 df 命令一起使用来轻松检查 inode 的可用性。像这样:

sudo df -i

Filesystem     512-blocks      Used Available Capacity iused      ifree %iused  Mounted on
/dev/disk3s1s1  965595304  17323912 761308648     3%  348574 3806543240    0%   /
devfs                 414       414         0   100%     718          0  100%   /dev
/dev/disk3s6    965595304  10485800 761308648     2%       5 3806543240    0%   /System/Volumes/VM
/dev/disk3s2    965595304   9130192 761308648     2%     797 3806543240    0%   /System/Volumes/Preboot
/dev/disk3s4    965595304      3736 761308648     1%      42 3806543240    0%   /System/Volumes/Update
/dev/disk1s2      1024000     12328    985240     2%       1    4926200    0%   /System/Volumes/xarts
/dev/disk1s1      1024000     12496    985240     2%      23    4926200    0%   /System/Volumes/iSCPreboot
/dev/disk1s3      1024000      4216    985240     1%      52    4926200    0%   /System/Volumes/Hardware
/dev/disk3s5    965595304 165536304 761308648    18% 1166452 3806543240    0%   /System/Volumes/Data
map auto_home           0         0         0   100%       0          0  100%   /System/Volumes/Data/home
/dev/disk4s1       470960    285040    185920    61%    1100 4294966179    0%   /Volumes/Moonlight
/dev/disk5s1      1352624    898936    453688    67%    8881 4294958398    0%   /Volumes/Logseq

这将清楚地告诉文件系统中存在的 inode 总数,以及当前正在使用的数量。如果您的系统上没有剩余的空闲 inode,这就是“设备上没有剩余空间”错误的来源。 由于 inode 仅在第一次格式化驱动器时创建,因此无法生成更多 inode。您所能做的就是删除任何不需要的文件,为以后的文件释放索引节点。

方法3 标记坏的块

数据损坏是任何硬盘不可避免的。虽然新驱动器不会遇到此问题,但旧硬盘会逐渐开始“损坏”。 这意味着,即使文件系统仍然认为硬盘驱动器的某些部分具有功能性,但它们仍然无法使用。这些坏块错误地膨胀了驱动器上表面上的可用空间,而实际上没有文件可以写入它们。这会导致“设备上没有剩余空间”错误,因为操作系统试图在这些位置存储任何数据,但是失败了。 没有解决此问题的真正方法,因为坏扇区是硬盘驱动器物理磨损的结果。您唯一可以做的就是标记坏扇区,以便文件系统不再引用它们。 这样做需要从 Live CD 启动,因为您无法在正在运行的驱动器中执行文件系统检查。完成后,只需使用以下命令:

sudo fsck -vcck /dev/sda

这将用要修复的驱动器的路径替换/dev/sda。这将自动检测到驱动器上的所有坏块,并将它们标记为不可用。但是,它不会给你任何额外的存储容量,所以请准备清理一些无用的文件,以释放驱动器上的空间。