当chef-client试图为一个大的本地文件执行remote_resource时,我得到一个奇怪的错误。根据堆栈跟踪,我猜ruby会复制文件本身。我的磁盘有很多可用空间。此外,var和tmp文件夹至少有2 at。如果我自己用cp命令完成这项工作,或者我用execute one替换remote_file资源,这是可以的。
Chef抱怨磁盘空间不足。
对于4G大小的文件,此资源失败,并显示消息No space on device。
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发布于 2013-11-15 19:49:03
这是行不通的。remote_file将远程文件下载到/var/chef IIRC中的某个位置,然后复制到其目标位置。
由于/var只有2 4Gb的空间,而文件有4 4Gb大小,因此它正确地抛出了No space left on device错误。
发布于 2014-02-16 07:51:01
9/20/2016: Chef 12.0附带的file_stating_uses_destdir默认设置为true,因此这应该不再是问题( remote_file,但它流到/tmp的位置可能仍然存在)。
首先是真正简单的声明:如果你在/tmp中有一个4 4GB的文件,而在/tmp中只剩下2 4GB,那么很明显,复制4 4GB的文件将会失败,并且没有任何东西可以帮助你。我假设您的/tmp中至少有4 2GB,/var中只剩下2 2GB,这是唯一需要解决的有趣情况。
从11.6.0 (至少到11.10.2 )起,chef-client将使用ruby的Tempfile.new创建临时文件,并将内容复制到该临时文件中,然后将其mv到适当的位置。临时文件的位置将由ENV['TMPDIR']决定,并且根据您的操作系统发行版的不同而有所不同(例如,在类似于/var/folders/rs/wqwmj_1n59135dhhbvfdrlqh0001yj/T/的Mac上,而不仅仅是/tmp或甚至/var/tmp),因此在哪里创建中间临时文件可能并不明显。你可能会遇到这个问题。您应该能够从chef-client -l debug输出中看到chef正在使用的临时文件位置,如果您对该目录执行df -k操作,您可能会看到它是100%。
另外,查看df -i,看看是否以某种方式耗尽了inode,这也会抛出no space left on device错误。
您可以将chef-client全局设置为使用目标目录作为创建文件的tmpdir,方法是将以下内容添加到client.rb:
file_staging_uses_destdir true
然后,如果您的目标目录是'/tmp‘,那么将在那里创建临时文件,然后在目录中简单地重命名,以便部署它。这确保了如果目标设备上有足够的空间来保存结果,则资源应始终成功写入临时文件。它还避免了当/tmp和destdir位于不同的文件系统上时的问题,即重命名和部署文件的mv将被转换为复制和取消链接src操作,这可能会以几种不同的方式失败。
@cassianoleal的答案是不正确的,因为它指出chef-client总是使用/var/cache作为临时位置。更改file_cache_path也不会有任何影响。这混淆了将remote_files下载到Chef file_cache_path目录中的常见模式,以了解remote_file的内部工作方式--这不是一回事。问题中没有file_cache_path,因此答案中不应该有任何file_cache_path。
remote_file和file:// URL的行为有点重复,但这是因为它们对于所有其他URL都是必需的(正如@cassianoleal正确提到的那样)。然而,file_staging_uses_destdir的行为可能是正确的,因为您确实希望考虑到边缘条件,即空间耗尽并截断文件,或者服务器在复制操作过程中崩溃,并且您不希望留下一个填充了一半的文件。通过写入临时文件并关闭它,然后重命名,可以避免许多这样的边缘条件。
发布于 2016-03-24 05:35:08
感谢您@lamont的解释。直截了当地说,对我有效的唯一解决方案是在调用remote_file之前将以下代码添加到我的厨师食谱中
ENV['TMP'] = '/mytmp'
ENV['TMPDIR'] = '/mytmp'其中,/mytmp是卷上的一个目录,该卷有足够的空间来存放我的文件。
添加以下功能的前景看好:
file_staging_uses_destdir true由于这个错误:https://tickets.opscode.com/browse/CHEF-5311,to /etc/chef/client.rb目前不起作用。
https://stackoverflow.com/questions/19989650
复制相似问题