如何解决 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 报错
尽管磁盘上有足够的可用空间,但如果您看到上述错误消息,则不是硬件有问题。找出错误的确切原因可能需要一些故障排除。
- 最近删除的文件:出现此错误的最常见原因是最近删除了文件。通常一个文件在一个进程仍在使用它时被删除,即使文件已经消失也保留空间
- 没有足够的Inodes :另一个常见的原因是没有足够的 inode。Inode 是 Unix 文件系统的索引页,保存存储上每个文件的元数据。但是,inode 并不是无限的,在存储空间用完之前就会出现“设备上没有剩余空间”错误
- 硬盘驱动器故障:那么当然有可能是硬盘驱动器出现故障,并且大部分明显的可用空间都被坏扇区占用了。由于系统无法将任何文件写入这些位置,因此会抛出错误
方法1,重启正在使用已经删除文件的进程
“No Space Left on Device” 错误的最可能原因是进程仍在使用已删除的文件。只需要重新启动进程即可释放保留的存储空间
要查找有问题的进程,需要使用 lsof
和grep
命令。
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。这将自动检测到驱动器上的所有坏块,并将它们标记为不可用。但是,它不会给你任何额外的存储容量,所以请准备清理一些无用的文件,以释放驱动器上的空间。