Azure Oracle Linux 8.4经cloud-init配置后重启swapfile未生成问题
异常原因
- 挂载依赖配置错误:你当前挂载参数中的
x-systemd.requires=cloud-init.service配置逻辑反向,要求临时磁盘挂载必须先等待cloud-init服务启动,导致第二次启动时cloud-init执行swap检查逻辑时,临时磁盘尚未挂载,读取的是系统盘/mnt/resource目录所在分区的剩余空间,并非临时磁盘的实际可用空间,因此计算出swap建议大小为0。 - cloud-init模块执行频率默认限制:
cc_mounts模块的swap创建逻辑默认仅在实例首次初始化时执行一次,后续重启(含解除分配后重启)默认不会重复触发swap创建流程,检测到原有swap条目不存在对应文件后会直接删除fstab中的swap配置。
解决方案
以下两种方案二选一即可:
方案1:修改cloud-init配置实现自动重建
调整挂载依赖并添加开机执行逻辑,完整cloud-init配置如下:
#cloud-config datasource_list: [ Azure ] # 调整挂载依赖,要求临时磁盘在cloud-init启动前完成挂载 mounts: - [ ephemeral0, /mnt/resource, auto, "defaults,nofail,x-systemd.required-by=cloud-init.service" ] mount_default_fields: [ None, None, "auto", "defaults,nofail", "0", "2" ] # 配置每次开机都检查重建swap bootcmd: - | if [ ! -f /mnt/resource/swap.img ]; then fallocate -l 4G /mnt/resource/swap.img chmod 600 /mnt/resource/swap.img mkswap /mnt/resource/swap.img fi swapon /mnt/resource/swap.img swap: filename: /mnt/resource/swap.img size: "auto" max_size: 17179869184
方案2:通过systemd服务实现(稳定性更高,不依赖cloud-init逻辑)
- 创建
/etc/systemd/system/swap-rebuild.service文件:
[Unit] Description=Rebuild swap file on Azure ephemeral disk After=mnt-resource.mount Requires=mnt-resource.mount [Service] Type=oneshot ExecStart=/bin/bash -c 'if [ ! -f /mnt/resource/swap.img ]; then fallocate -l 4G /mnt/resource/swap.img && chmod 600 /mnt/resource/swap.img && mkswap /mnt/resource/swap.img; fi && swapon /mnt/resource/swap.img' RemainAfterExit=yes [Install] WantedBy=multi-user.target
- 执行以下命令启用服务:
systemctl daemon-reload systemctl enable swap-rebuild.service
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

