如何使用 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
我们有一个使用 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