2013-11-14 41 views
1

当厨师客户端尝试为大本地文件执行remote_resource时,出现奇怪的错误。 从堆栈跟踪我猜ruby复制文件本身。我的磁盘有很多可用空间。另外,var和tmp文件夹至少2 GB。如果我用cp命令自己做这个工作,或者我用执行一个替换remote_file资源,那没关系。设备上没有剩余空间 - 写厨师remote_file

厨师抱怨缺少磁盘空间。

此资源无法使用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 
+2

我认为我们需要更好的解释你想要做什么。 –

回答

1

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

由于/var只有2Gb的空间,并且该文件是4Gb大,所以正确地抛出了No space left on device错误。

+0

我不同意这是一个功能。中间步骤会产生很多开销。它使remote_file资源不被通用。我不得不重写它的默认提供者。但这是资源/提供者抽象的主要目的。 –

+0

我没有说这是一个功能,我说这是它是如何工作的,它是如何设计的。这对于**远程文件**是有意义的。我不希望在完整文件应该放在哪里的地方进行不完整的下载。无论哪种方式,我的答案是正确的,如果你接受它,我会深表感谢。 :) – cassianoleal

+0

哦,如果你认为这是一个,你当然欢迎你在http://tickets.opscode.com上提交一个bug。 – cassianoleal

1

9/20/2016:随着file_stating_uses_destdir默认为true,所以这应该不再是一个问题(远程文件,但它流到/ tmp可能仍然存在)的厨师12.0。

首先是一个真实的简单陈述:如果你在/ tmp中有一个4GB的文件,而你在/ tmp中只剩下2GB,那么显然复制4GB将会失败,没有任何东西可以帮到你。我假设你在/ tmp中至少有4GB,而在/ var中只剩下2GB,这是唯一有效的解决方案。

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

另外,看看df -i,看看你是否用尽了inode,也会抛出no space left on device错误。

您可以通过添加此全局设置厨师客户端使用的目标目录作为TMPDIR创建文件client.rb:

file_staging_uses_destdir true

那么如果你的目的地dir是“/ tmp目录”的临时文件将在那里创建,然后在目录中进行简单重命名以部署它。这确保了如果目标设备上有足够的空间来保存结果,那么资源应该始终成功写入临时文件。它还避免了/tmp和destdir位于不同文件系统上的问题,即要重命名和部署该文件的mv将被转换为可能以多种不同方式失败的copy-and-unlink-src操作。

@cassianoleal的回答在说明厨师客户始终使用/var/cache作为临时位置时不正确。更改file_cache_path也不会产生影响。这就将远程文件下载到chef file_cache_path目录的常见模式混淆了remote_file在内部的工作原理 - 这些都不是一回事。问题中没有file_cache_path,因此答案中不应该有任何file_cache_path。

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

1

谢谢@lamont的解释。要切入正题了一下,只为我工作的解决方案是下列任何调用之前,添加到我的厨师食谱,以remote_file

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

其中/mytmp是有足够的空间在卷上的目录保存我的文件。

增加的有前途的特点:

file_staging_uses_destdir true 

/etc/chef/client.rb目前不工作,由于这个错误:https://tickets.opscode.com/browse/CHEF-5311

相关问题