默认交换大小是多少?

Ser*_*ret 16 default ubiquity swap

安装程序如何计算要创建的交换分区大小?大概是基于安装的 RAM 大小,但这是否取决于 RAM 大小?

Rin*_*ind 19

这将是相当技术性的,但很有趣,所以在这里......

  • 我找到了一个包dphys-swapfile,这里是源代码。选项setup用于设置它:
setup - 告诉 dphys-swapfile 计算最佳交换文件大小和
(重新)生成合适的交换文件。默认它是 RAM 大小的 2 倍。
这可以在启动时调用,因此文件始终保持
适合当前 RAM 的大小,或在 RAM 大小达到时手动运行
改变了。
  • 里面dphys-swapfile是一个conf_swapsize预定义大小的设置(在 Natty 中这是空的):
我们想要强制它的大小,默认(空)给出 2*RAM
CONF_SWAPSIZE=

和一个swapfactor...的设置

this is what we want, 2 times RAM size
SWAPFACTOR=2
Run Code Online (Sandbox Code Playgroud)
  • 实际大小计算得更远一点:

    if [ "${CONF_SWAPSIZE}" = ""] ; 然后
      # 计算自动最佳尺寸
      echo -n "计算大小, "
      # 这似乎是最接近物理内存的大小,缺少大约 60k
      KCORESIZE="`ls -l /proc/kcore | awk '{ print $5 }'`"
      # 使四舍五入的 MBytes 正好是 1 太少了,所以加 1
      MEMSIZE="`expr "${KCORESIZE}" / 1048576 + 1`"
      # 默认,不覆盖配置文件,swap=2*RAM
      CONF_SWAPSIZE="`expr "${MEMSIZE}" '*' "${SWAPFACTOR}"`"
    菲

正如您所看到的,他们在这个包中计算它的方式取决于 的大小/proc/kcore,然后除以 1048576,+1 将其四舍五入,然后乘以交换因子。从我的机器:

在此处输入图片说明

所以这个系统的默认值是 1065349120 / 1048576 = 1015+1 = 1016 * 2 = 2032 MB。


arr*_*nge 5

实际上dphys-swapfile默认的 Ubuntu 安装 CD 上没有程序,它不用于计算交换大小。

发生的情况是ubiquity安装程序使用partman-auto脚本和配置文件(称为recipes)来确定所有分区的大小。它是这样工作的:

  • Partman 根据计算机类型和用户选择的选项找到正确的配方文件。
  • 在那里它找到分区的最小和最大大小及其优先级。对于交换,它可以是 96(最小 - 以 MB 为单位)512(优先级)300%(最大)。
  • 然后它获取 RAM 大小(通过/proc/meminfo)。
  • 它使用自己的算法来计算大小。

细节:

一个配方文件可以是这样的:

1 1 1 free
    $iflabel{ gpt }
    method{ biosgrub } .

500 10000 -1 $default_filesystem
    $lvmok{ }
    method{ format }
    format{ }
    mountpoint{ / } .

96 512 300% linux-swap
    $lvmok{ }
    method{ swap }
    format{ } .
Run Code Online (Sandbox Code Playgroud)

计算大小的算法:

for(i=1;i<=N;i++) {
   factor[i] = priority[i] - min[i];
}
ready = FALSE;
while (! ready) {
   minsum = min[1] + min[2] + ... + min[N];
   factsum = factor[1] + factor[2] + ... + factor[N];
   ready = TRUE;
   for(i=1;i<=N;i++) {
      x = min[i] + (free_space - minsum) * factor[i] / factsum;
      if (x > max[i])
         x = max[i];
      if (x != min[i]) {
         ready = FALSE;
         min[i] = x;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

更多请见: