如何使用 cloud-init 配置交换分区?

How do you configure a swap partition using cloud-init?

我们有一个使用 cloudinit 进行初始实例化的实例,这个实例和 cloudinit 工作得很好。

我们想给这个实例添加交换,并且已经正确配置了合适的磁盘,但是我们无法弄清楚如何让 cloudinit 初始化交换磁盘,就像 cloudinit 对机器上的所有其他磁盘所做的那样。

我们的磁盘配置(包括交换)如下:

fs_setup:
  - label: vidi
    device: /dev/xvde
    filesystem: ext4
  - label: swap
    device: /dev/xvdg
    filesystem: swap
mounts:
- [ /dev/xvde, /var/lib/vidispine, ext4, defaults, 0, 0 ]
- [ /dev/xvdg, none, swap, sw, 0, 0 ]

这导致 /etc/fstab 如下:

LABEL=cloudimg-rootfs   /    ext4   defaults,discard    0 0
/dev/xvde   /var/lib/vidispine  ext4    defaults,comment=cloudconfig    0   0
/dev/xvdg   none    swap    sw,comment=cloudconfig  0   0

磁盘 /dev/xvde 在启动时被正确格式化。磁盘 /dev/xvdg 被忽略。

cloudinit 到 "mkswap" 和 "swapon" /dev/xvdg 磁盘需要哪些额外步骤?

回应"What addditional steps are required for cloudinit to 'mkswap' and 'swapon' the /dev/xvdg disk?",简短的回答是"nothing"。

较长的答案是您需要 运行 应用以下错误修复的 cloud-init 版本:

https://github.com/canonical/cloud-init/pull/143

修复了 运行 mkswap:

时的以下错误
mkswap: invalid block count argument: ''

最具体地说,Ubuntu 仿生图像 20200131 及更新版本可以正常工作。

旧版本的 cloudinit 需要在启动时将以下内容添加到 runcmd 脚本中以解决上述错误:

- mkswap /dev/xvdg
- swapon -a

解决方法: swap是磁盘上的一个space,当内存的物理内存量已满时使用,因此它可以避免系统崩溃由于内存不足异常。为了在 ubuntu 上使用 cloud-init 软件包应用交换分区,您需要在 /etc/fstab 上安装专用磁盘分区(在启动时)(配置 table 旨在减轻将文件系统安装和卸载到机器的负担)创建(使用 mkswap )并开始交换(使用 swapon )。

首先创建一个附加磁盘到您的机器,我正在使用 terraform 附加示例:

resource "aws_instance" "example" {

  ami ="<some-ami>"
  instance_type = "t3.micro"

  tags = {
    Name = "example"
  }

  // root
  root_block_device {
    volume_size           = 50
    volume_type           = "gp2"
    delete_on_termination = true
  }

  // swap partition
  ebs_block_device {
    device_name = "/dev/xvdb"
    volume_size = 20
    volume_type = "gp2"
    delete_on_termination = true
  }
    
}

其次 安装一个额外的磁盘并在 cloud-init:

的模板文件上切换交换功能
mounts:
  - [ /dev/nvme1n1, none, swap, sw, 0, 0 ]

bootcmd:
 - mkswap /dev/nvme1n1
 - swapon /dev/nvme1n1

对于验证: 在终端上输入:

swapon --show

#output: 
NAME         TYPE      SIZE USED PRIO
/dev/nvme1n1 partition  20G   0B   -2