Rails 5 无法写入 RHEL7 上的 NFS 挂载操作不受支持 copy_file_range

Rails 5 unable to write to NFS mount on RHEL7 Operation not supported copy_file_range

我正在编写一个 Rails 5 应用程序,它将部署到使用 NFS 挂载进行存储的 RHEL7 主机。

该应用程序使用 CarrierWave 插件将上传的文件写入 RHEL7 主机上的 NFS 安装。

class ExampleUploader < CarrierWave::Uploader::Base

  # Choose what kind of storage to use for this uploader:
  storage :file

  def store_dir
    "#{Rails.root.to_s}/#{model.class.to_s.underscore}/#{model.id}"
  end

end

该代码在本地开发环境(在笔记本电脑上)中工作,但是,相同的代码在部署到 RHEL7 服务器时停止工作。

Puma caught this error: Operation not supported - copy_file_range (Errno::EOPNOTSUPP)
/usr/local/lib/ruby/2.5.0/fileutils.rb:1293:in `copy_stream'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1293:in `block (2 levels) in copy_file'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1292:in `open'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1292:in `block in copy_file'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1291:in `open'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1291:in `copy_file'
/usr/local/lib/ruby/2.5.0/fileutils.rb:432:in `copy_file'
/usr/local/lib/ruby/2.5.0/fileutils.rb:359:in `block in cp'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1463:in `block in fu_each_src_dest'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1479:in `fu_each_src_dest0'
/usr/local/lib/ruby/2.5.0/fileutils.rb:1461:in `fu_each_src_dest'
/usr/local/lib/ruby/2.5.0/fileutils.rb:358:in `cp'
/usr/local/bundle/gems/carrierwave-0.11.2/lib/carrierwave/sanitized_file.rb:213:in `copy_to'

根据我的研究,copy_file_range 函数在 RHEL7 中被禁用,这是 Ruby 应该用来写入文件的低级函数。所以这意味着 Ruby 无法写入 RHEL7 主机上的 NFS 装载。

最近似乎进行了更新,但只是更改了错误消息的类型,并没有真正解决问题。

问题:我们有哪些选择可以让它发挥作用? Ruby 有可用的补丁吗?或者我们是否需要在 RHEL7 之外的其他操作系统上部署它?如果是这样,什么 OS 实际上支持 Ruby 写入 NFS 挂载?

将主机操作系统更新到最新版本的 RHEL7 后已修复此问题。