修复mac OS X的Docker: No Space Left on Device

mac os x的docker现在比较好用,虽然macOS都是POSIX系统。但是多少都和linux系统有点不一样。所以我实验一些新软件系统的时候很多时候还是需要linux系统,以前多数使用虚拟机进行。现在喜欢用docker了。虽然mac上的docker也是运行在虚拟机上的。但是运行效果和在linux上没有什么区别。但有一个问题困扰了我很久。就是经常出现No Space Left on Device。明明我的磁盘还有很多空间。就是老出现这句提示。原来的处理方式,是删除一些不需要的image。最近由于剩下的images都是需要的,删无可删了。

只能上网找解决方法。发现这个问题还是不好处理的。最后虽然成功处理了。大家发觉处理的方式和网上说的有点不一样,所以记录下来。不能说别人的方法错误,只能说明我更加黑仔。

首先,这个不够磁盘空间的问题产生有几种情况的。

1 虚拟机的虚拟磁盘空间不够了。

2 是虚拟机的磁盘分区导致空间不够。(估计大部分人都是这个问题,我就是这个问题导致的。)都不知道为什么docker这么傻逼,生成一个虚拟磁盘是64G的。但是在这个磁盘上在分配一个18G的分区进行使用,超过18G就不能用了。超级傻逼。

现在讲处理方法。

需要安装工具qemu

brew install qemu
qemu-img info  ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
image: /Users/daozhao/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
file format: qcow2
virtual size: 64G (68719476736 bytes)
disk size: 44G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

这个命令用于查看你的虚拟磁盘是多大的。好像我这里看到磁盘空间是64G的。现在已经使用的44G空间。我原来显示是已经使用了18G空间的。docker已经报磁盘空间不足了。如果你的磁盘空间和虚拟大小不一样大就报空间不足了,可以肯定是虚拟磁盘分区问题导致的。
你如果想保留原有数据无损修复这个问题,首先需要备份~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2这个文件。然后去这里下载个镜像 http://gparted.org/download.php,我下载和使用的是gparted-live-0.28.1-1-amd64这个版本。需要退出docker运行。

cd ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/
#下边这个命令是修复虚拟磁盘的磁盘错误。不是必须的。
qemu-img check -r all  ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2
启动虚拟机,并开启图形界面的分区调整软件。
qemu-system-x86_64 -drive file=Docker.qcow2 -m 512 -cdrom ~/Downloads/gparted-live-0.28.1-1-amd64.iso -boot d -device usb-mouse -usb

这里你可以看到,虚拟磁盘的分区。你可以直接在这里调整大小。有文章介绍这里可以直接调整,但是我试验过是不行的。调整后docker是启动不了。你可以关闭图形分区软件的界面,然后在虚拟机内启动console,使用fdisk进行调整。虽然这样调整我可以成功,但是之前的数据都没有了。

我最后使用的方法是,重新启动docker(启动docker前需要把gparted-live虚拟机关闭)。

通过screen命令进行docker虚拟机的命令行。
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
fdisk /dev/vda
按照下边的顺序分别键入:
p
d
1
n
1
enter
enter
w
在这个写操作中,我的写入有出错信息,不清楚原因。
reboot

重启后,通过screen,键入命令df查看磁盘空间大小。发觉/dev/vda1的磁盘空间依然是18G的大小。
再次通过gparted-live进入图形界面(需要关闭docker)。查看到分区大小已经是64G了。但是磁盘信息有错误。然后在图像界面操作检查错误并修复。修复完成后。退出虚拟机。重新启动docker。再次进入screen,键入命令df查看。/dev/vda1的磁盘空间已经扩容了,有64G大小了。而且原有数据也在。

这次的操作参考了下边的帖子。我是综合了这3个帖子进行操作。我的操作方法你不一定成功。可能你只需按照他们其中一个方式就可以。

http://phutchins.com/blog/2017/01/04/fixing-docker-no-space-left-on-device/
https://forums.docker.com/t/consistently-out-of-disk-space-in-docker-beta/9438/46
https://rui.sh/fix-docker-for-mac-no-space-left-on-device-error.html

另外,如果你的问题不是分区做成的,而是真的磁盘空间不够,需要对虚拟磁盘扩容。那么请键入。

/Applications/Docker.app/Contents/MacOS/qemu-img resize ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2 +10G

 

《修复mac OS X的Docker: No Space Left on Device》有一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注