【问题标题】:Vagrant - how to detect windows host RAM and CPUVagrant - 如何检测 Windows 主机 RAM 和 CPU
【发布时间】:2016-01-17 11:57:43
【问题描述】:

我希望我的 vagrantfile 根据主机规格自动设置 CPU 和 RAM。

我找到了这个 sn-p:

 config.vm.provider "virtualbox" do |v|
      host = RbConfig::CONFIG['host_os']
      # Give VM 1/4 system memory & access to all cpu cores on the host
      if host =~ /darwin/
        cpus = `sysctl -n hw.ncpu`.to_i
        # sysctl returns Bytes and we need to convert to MB
        mem = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4
      elsif host =~ /linux/
        cpus = `nproc`.to_i
        # meminfo shows KB and we need to convert to MB
        mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4
      else # sorry Windows folks, I can't help you
        cpus = 2
        mem = 1024
      end

      v.customize ["modifyvm", :id, "--memory", mem]
      v.customize ["modifyvm", :id, "--cpus", cpus]
end

但它不支持 Windows(而是设置默认值 2 和 1024)。

有人知道怎么做吗?

【问题讨论】:

    标签: vagrant virtualbox vagrantfile vagrant-windows


    【解决方案1】:

    在您下载的脚本中:

    抱歉,Windows 人员,我帮不了你

    else # sorry Windows folks, I can't help you
        cpus = 2
        mem = 1024
      end
    

    因此您可以更改这些默认值,但不幸的是 windows 不提供易于使用的命令来检索这些信息

    现在如果你想自己做的话,应该是可以的,看看wmic这个命令,可以得到很多,而且只需很少的解析就应该有必要的信息——例如

    C:\Users\fhenri>wmic os get freephysicalmemory
    FreePhysicalMemory
    1564244
    
    C:\Users\fhenri>wmic.exe cpu get NumberOfCores
    NumberOfCores
    1
    

    您也可以查看systeminfo,它非常冗长且特定于语言环境,因此可能更难解析

    【讨论】:

      【解决方案2】:

      我设法将其识别为我们的并将其集成到 Git repo 中。

      代码:

      cpus = `wmic cpu get NumberOfCores`.split("\n")[2].to_i
      mem = `wmic OS get TotalVisibleMemorySize`.split("\n")[2].to_i / 1024 /4
      

      【讨论】:

        【解决方案3】:

        要将上述答案统一为一个完整的示例,您的 vagrant 文件应包含此配置部分:

        请注意 mem_ratiocpu_exec_cap 变量,您可以使用它们来调整要分配给 VM 的主机 RAM 和 CPU 周期。

        config.vm.provider "virtualbox" do |v|
          mem_ratio = 3/4
          cpu_exec_cap = 75
          host = RbConfig::CONFIG['host_os']
          # Give VM 3/4 system memory & access to all cpu cores on the host
          if host =~ /darwin/
            cpus = `sysctl -n hw.ncpu`.to_i
            # sysctl returns Bytes and we need to convert to MB
            mem = `sysctl -n hw.memsize`.to_i / 1024^2 * mem_ratio
          elsif host =~ /linux/
            cpus = `nproc`.to_i
            # meminfo shows KB and we need to convert to MB
            mem = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 * mem_ratio
          else # Windows folks
            cpus = `wmic cpu get NumberOfCores`.split("\n")[2].to_i
            mem = `wmic OS get TotalVisibleMemorySize`.split("\n")[2].to_i / 1024 * mem_ratio
          end
        
          puts "Provisioning VM with #{cpus} CPU's (at #{cpu_exec_cap}%) and #{mem/1024} GB RAM."
        
          v.customize ["modifyvm", :id, "--memory", mem]
          v.customize ["modifyvm", :id, "--cpus", cpus]
        
          v.customize ["modifyvm", :id, "--cpuexecutioncap", cpu_exec_cap]
        end
        

        【讨论】:

        • 在我的系统 (Windows 10) 上,mem = /`wmic OS get TotalVisibleMemorySize/`.split("\n")[2].to_i / 1024 * mem_ratio 行评估为 0,因此我将 mem_ratio = 3/4 更改为 mem_ratio = 0.75 并将 .round 添加到 mem = (`wmic OS get TotalVisibleMemorySize`.split("\n")[2].to_i / 1024 * mem_ratio).round。这现在适用于 WIndows 10,但我不确定它会对其他操作系统产生什么影响。
        猜你喜欢
        • 2010-10-25
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多