azure - 使用 cloud-init 重新启动后未创建交换文件
问题描述
我的配置
我正在尝试使用 Oracle Linux 映像(版本 8.4,第 2 代)在 Azure 中部署虚拟机。我们将 Azure 临时磁盘 (ephemeral0) 的挂载点更改为/mnt/resource
. 此外,我在临时磁盘上创建了一个交换文件。我在部署期间使用以下自定义 cloud-init 脚本:
#cloud-config
datasource_list: [ Azure ]
mounts:
- [ ephemeral0, /mnt/resource, auto, "defaults,nofail,x-systemd.requires=cloud-init.service" ]
mount_default_fields: [ None, None, "auto", "defaults,nofail", "0", "2" ]
swap:
filename: /mnt/resource/swap.img
size: "auto" # or size in bytes
max_size: 17179869184 # 16GB
在虚拟机创建后第一次启动时,一切(ephemeral0 和交换)都按预期工作。如果我看一下,/var/log/cloud-init.log
您会看到以下条目:
[root@test01 ~]# cat /var/log/cloud-init.log | grep swap
2021-08-16 08:19:29,814 - cc_mounts.py[DEBUG]: Attempting to determine the real name of swap
2021-08-16 08:19:29,814 - cc_mounts.py[DEBUG]: changed default device swap => None
2021-08-16 08:19:29,814 - cc_mounts.py[DEBUG]: Ignoring nonexistent default named mount swap
2021-08-16 08:19:29,815 - cc_mounts.py[DEBUG]: suggest 4096.0 MB swap for 7672.03125 MB memory with '17018.25390625 MB' disk given max=None [max=4254.5634765625 MB]'
2021-08-16 08:19:29,815 - cc_mounts.py[DEBUG]: Creating swapfile in '/mnt/resource/swap.img' on fstype 'xfs' using 'fallocate'
2021-08-16 08:19:29,815 - subp.py[DEBUG]: Running command ['fallocate', '-l', '4096M', '/mnt/resource/swap.img'] with allowed return codes [0] (shell=False, capture=True)
2021-08-16 08:19:29,849 - subp.py[DEBUG]: Running command ['mkswap', '/mnt/resource/swap.img'] with allowed return codes [0] (shell=False, capture=True)
2021-08-16 08:19:29,887 - util.py[DEBUG]: Setting up swap file took 0.072 seconds
2021-08-16 08:19:29,893 - cc_mounts.py[DEBUG]: Changes to fstab: ['+ /dev/disk/cloud/azure_resource-part1 /mnt/resource auto defaults,nofail,x-systemd.requires=cloud-init.service,comment=cloudconfig 0 2', '+ /mnt/resource/swap.img none swap sw,comment=cloudconfig 0 0']
2021-08-16 08:19:29,893 - subp.py[DEBUG]: Running command ['swapon', '-a'] with allowed return codes [0] (shell=False, capture=True)
2021-08-16 08:19:29,929 - cc_mounts.py[DEBUG]: Activate mounts: PASS:swapon -a
如您所见,cloud-init 建议将 4096 MB 作为交换大小。
在/etc/fstab
以下条目中添加:
/dev/disk/cloud/azure_resource-part1 /mnt/resource auto defaults,nofail,x-systemd.requires=cloud-init.service,comment=cloudconfig 0 2
/mnt/resource/swap.img none swap sw,comment=cloudconfig 0 0
还swapon -s
指出正确配置了交换:
Filename Type Size Used Priority
/mnt/resource/swap.img file 4194300 0 -2
问题
现在,如果我取消分配虚拟机并重新启动它,临时磁盘将按预期删除并重新创建。它再次安装在下面,/mnt/resource
但不再创建交换。/var/log/cloud-init.log
状态:
2021-08-16 08:29:33,331 - cc_mounts.py[DEBUG]: Attempting to determine the real name of swap
2021-08-16 08:29:33,331 - cc_mounts.py[DEBUG]: changed default device swap => None
2021-08-16 08:29:33,331 - cc_mounts.py[DEBUG]: Ignoring nonexistent default named mount swap
2021-08-16 08:29:33,331 - util.py[DEBUG]: Reading from /proc/swaps (quiet=False)
2021-08-16 08:29:33,331 - util.py[DEBUG]: Read 37 bytes from /proc/swaps
2021-08-16 08:29:33,331 - cc_mounts.py[DEBUG]: swap file /mnt/resource/swap.img exists, but not in /proc/swaps
2021-08-16 08:29:33,332 - cc_mounts.py[DEBUG]: suggest 0.0 MB swap for 7672.03125 MB memory with '12889.515625 MB' disk given max=None [max=3222.37890625 MB]'
2021-08-16 08:29:33,332 - cc_mounts.py[DEBUG]: Not creating swap: suggested size was 0
2021-08-16 08:29:33,337 - cc_mounts.py[DEBUG]: Changes to fstab: ['- /mnt/resource/swap.img none swap sw,comment=cloudconfig 0 0']
根据我的理解cc_mounts
,cloud-init 模块建议交换大小为 0 MB,因为它确定临时磁盘只剩下大约 12 GB 空间。这似乎是错误的,因为 (a) 磁盘由于解除分配而为空,并且 (b)df -h
声明它有大约 15 GB 可用:
[root@test01 ~]# df -h /mnt/resource/
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 16G 45M 15G 1% /mnt/resource
我在这里错过了什么吗?任何人都可以解释为什么 cloud-init 会有这样的行为以及如何为每次重新启动正确创建交换文件吗?
解决方案
• 您的问题是由于配置错误导致 Azure Linux 代理和云初始化代理尝试配置交换文件。当 cloud-init 负责配置时,交换文件必须由 cloud-init 配置为仅启用一个代理(cloud-init 或 waagent)进行配置。由于 waagent 守护程序的启动时间,此问题可能是间歇性的。
• 您可以通过禁用磁盘格式化然后在 waagent 配置文件(即 /etc/waagent.conf)中交换配置并确保 azure linux 代理没有挂载临时磁盘来解决此问题,因为这应该由云初始化代理。为此,请设置以下参数: -
#vi /etc/waagent.conf
#资源盘挂载点
ResourceDisk.MountPoint=/mnt
#在资源盘上创建并使用swapfile
ResourceDisk.EnableSwap=n
#交换文件的大小
ResourceDisk.SwapSizeMB=0
• 重新启动 Azure Linux 代理并确保将 VM 配置为通过 cloud init 创建交换文件。此外,将以下脚本添加到“/var/lib/cloud/scripts/per-boot”并使用“# chmod +x create_swapfile.sh”命令使文件可执行: -
#!/bin/sh
if [ ! -f '/mnt/swapfile' ]; then
fallocate --length 2GiB /mnt/swapfile
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile
swapon -a
else
swapon /mnt/swapfile; fi
• 完成后,停止并启动VM 并检查是否启用了交换。下面是它的例子。此外,比较 /var/log/waagent.log 和 /var/log/cloud-init.log 中的日志以了解重启时间范围。要完全避免这种情况,请在预配期间使用交换配置自定义数据部署 VM。
请查找以下文档以获取更多信息:-
https://docs.microsoft.com/en-us/azure/virtual-machines/extensions/update-linux-agent
感谢您,
推荐阅读
- mysql - JPA、distinct、order by、null 值和 ONLY_FULL_GROUP_BY sql 模式
- python-3.x - 根据一系列条件创建动态位置
- python - 如何以感知均匀性对 HSV 空间进行采样
- python - 将数据附加到linux上的配置文件
- ansible - Ansible 在世界可写目录 (/vagrant) 中运行,忽略它作为 ansible.cfg 源
- php - 在 BigCommerce HTML href 中回显 PHP(自引用 hreflang 标签)
- java - 线程 java.lang.IllegalStateException 中的异常:密码未初始化
- keyboard - 仅当键本身被按住时,按下停止键或发送键事件
- java - QueueConfiguration 的 JavaDoc 在哪里?
- javascript - Angular:将服务/组件移动到另一个文件夹(在文件夹结构中,而不是在代码中)