You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让EC2实例每次启动时运行cloud-init的disk_setup模块?

解决EC2临时磁盘cloud-init重启后不执行格式化的问题

我之前也碰到过一模一样的坑——cloud-init默认的执行策略对临时磁盘这种「每次启动都要重置」的场景确实不太友好。你之前改cloud.cfg和Python模块没解决,大概率是没找对正确的配置姿势,或者误解了模块执行频率的控制逻辑。

问题根源

cloud-init的disk_setup和mounts模块默认是once-per-instance的执行频率:实例第一次启动后,cloud-init会在本地标记这些模块已经执行过,哪怕后续重启时临时磁盘消失了,它也不会再触发这些模块。修改Python源码完全是走偏了,cloud-init的执行逻辑是由配置文件主导的,源码改动不仅不持久,还会被后续的cloud-init更新覆盖。

解决方案一:调整cloud-init模块的执行频率

直接修改全局配置/etc/cloud/cloud.cfg,把disk_setup和mounts的执行频率改成always,这样每次启动实例都会重新处理磁盘:

  1. 打开配置文件:
sudo vi /etc/cloud/cloud.cfg
  1. 找到对应的模块配置段(通常是cloud_config_modules或cloud_final_modules),添加或修改频率设置:
cloud_config_modules:
  - disk_setup:
      frequency: always
  - mounts:
      frequency: always
  1. 保存文件后,下次启动实例时,cloud-init就会自动重新格式化并挂载临时磁盘了。

解决方案二:用runcmd手动处理(更灵活)

如果不想改动全局cloud-init配置,也可以在user-data里用runcmd模块,每次启动时手动检查并处理临时磁盘:

#cloud-config
runcmd:
  # 检查磁盘是否存在且已格式化,未格式化则执行mkfs
  - "[ -b /dev/nvme1n1 ] && blkid /dev/nvme1n1 || mkfs.ext4 /dev/nvme1n1 -L ephemeral0"
  # 创建挂载目录(确保目录存在)
  - mkdir -p /mnt/ephemeral
  # 通过LABEL挂载磁盘(避免设备名变化的问题)
  - mount LABEL=ephemeral0 /mnt/ephemeral
  # 写入fstab,确保后续重启自动挂载(可选)
  - grep -q "LABEL=ephemeral0" /etc/fstab || echo 'LABEL=ephemeral0 /mnt/ephemeral ext4 defaults 0 0' >> /etc/fstab

小提示:临时磁盘的设备名可能因实例类型不同而变化,比如旧款实例可能是/dev/sdb,你可以通过AWS元数据确认准确路径:

curl http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0

为什么之前的修改没生效?

  • 修改cloud.cfg时,可能把频率配置加错了模块段(比如把disk_setup加到了cloud_final_modules而不是cloud_config_modules);
  • 直接改Python源码是无效操作,cloud-init会优先读取配置文件的规则,而且源码更新后你的改动会被直接覆盖。

内容的提问来源于stack exchange,提问作者kashian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:21:13