设备上没有空间 - 写主厨remote_file

时间:2013-11-14 22:20:56

标签: ruby copy chef cookbook

当chef-client尝试为大型本地文件执行remote_resource时,我收到一个奇怪的错误。 从堆栈跟踪我猜ruby复制文件本身。我的磁盘有很多可用空间。 var和tmp文件夹的格式也只有2 GB。如果我自己用cp命令完成这项工作,或者我用执行一个替换remote_file资源就可以了。

Chef抱怨磁盘空间不足。

对于4G大小的文件,此资源失败,并且设备上没有空格消息。

remote_file "/tmp/copy.img" do
    source "file://tmp/origin.img"
    action :create
end

我使用bash资源进行了解决方法,但它确实有效。

execute "disk-image" do
    command "cp /tmp/origin.img /tmp/copy.img" 
    not_if "cmp /tmp/origin.img /tmp/copy.img"
end

3 个答案:

答案 0 :(得分:1)

它不会起作用。 remote_file将远程文件下载到/var/chef IIRC内的某个位置,然后复制到目的地。

由于/var只有2Gb的空间且文件大小为4Gb,因此它会正确抛出No space left on device错误。

答案 1 :(得分:1)

9/20/2016:主菜12.0附带的file_stating_uses_destdir默认为true,因此这应该不再是一个问题(remote_file但它流到/ tmp的地方可能仍然存在)。

首先是真正的简单陈述:如果你在/ tmp中有一个4GB的文件而你在/ tmp中只有2GB,那么显然复制4GB会失败,没有什么可以帮到你。我假设你/ tmp至少有4GB,而/ var只剩2GB,这是唯一有趣的案例。

从11.6.0开始(至少11.10.2),chef-client将使用ruby的Tempfile.new创建一个临时文件,并将内容复制到该临时文件,然后将其复制到位。临时文件位置将由ENV['TMPDIR']确定,并且根据您的O / S发行版而有所不同(例如,在类似/var/folders/rs/wqwmj_1n59135dhhbvfdrlqh0001yj/T/的Mac上,而不仅仅是/tmp甚至{{1因此,创建中间临时文件的位置可能并不明显。您可能遇到了这个问题。您应该能够从/var/tmp输出中看到Chef正在使用的tempfile位置,如果您chef-client -l debug该目录,您可能会看到它是100%。

另外,请查看df -k以查看您是否以某种方式耗尽了inode,这也会导致df -i错误。

您可以全局设置chef-client,将目标目录用作创建文件的tmpdir,方法是将其添加到client.rb:

no space left on device

然后,如果您的目标目录是'/ tmp',那么将在那里创建临时文件,然后只需在目录中重命名以便部署它。这确保了如果目标设备上有足够的空间来保存结果,那么资源应该总是成功写入临时文件。如果 file_staging_uses_destdir true 和destdir位于不同的文件系统上,重命名和部署文件的mv将被转换为copy-and-unlink-src操作,这可能会以多种不同的方式失败,这也避免了这个问题。

@cassianoleal的回答并不正确,说明chef-client总是使用/tmp作为临时位置。更改/var/cache也不起作用。这使得将remote_files下载到Chef file_cache_path目录中的常见模式混淆了remote_file如何在内部工作 - 这些并不是一回事。问题中没有file_cache_path,因此答案中不应该有任何file_cache_path。

带有file:// URL的remote_file的行为有点圆,但这是因为它们对于所有其他URL都是必需的(正如@cassianoleal正确提到的那样)。然而,使用file_cache_path的行为可能是正确的,因为您确实需要考虑边缘条件,在这种情况下,您的空间不足并截断文件或服务器在复制操作过程中崩溃而您不会想要留下一个半填充的文件。通过写入临时文件并关闭它然后重命名很多这些边缘条件是可以避免的。

答案 2 :(得分:1)

谢谢@lamont的解释。为了减少追逐,对我有用的唯一解决方案是在调用remote_file之前将以下内容添加到我的Chef配方中:

ENV['TMP'] = '/mytmp'
ENV['TMPDIR'] = '/mytmp'

其中/mytmp是卷上的目录,有足够的空间来容纳我的文件。

添加的有希望的功能:

file_staging_uses_destdir true
由于此错误,

/etc/chef/client.rb目前无法正常工作:https://tickets.opscode.com/browse/CHEF-5311