裸机实例默认集成cloud-init,核心是确保其正确触发并执行#cloud-config;需验证镜像预装、datasource识别,用growpart/resizefs扩展磁盘,runcmd加载驱动,packages预装软件,并按云平台规范注入user-data。

在公有云环境下,裸机(Bare Metal)通常指物理服务器而非虚拟机,但当前主流公有云(如阿里云、腾讯云、AWS EC2 Bare Metal、Azure Azure Dedicated Host)提供的“裸机”实例,底层仍由云平台统一纳管,并**默认集成 cloud-init 服务**。因此,实现自动化初始化与环境预装,核心不是“从零部署 cloud-init”,而是确保它被正确触发、识别元数据,并执行你定义的 #cloud-config 配置。
确认云平台已启用 cloud-init 并识别为裸机实例
公有云裸机实例一般基于定制化镜像启动,需确认两点:
- 所用镜像是否预装 cloud-init:主流云厂商公共镜像(Ubuntu Server、CentOS Stream、RHEL、Alibaba Cloud Linux 等)均默认包含且启用 cloud-init;若使用自定义镜像,需提前安装并启用(
sudo systemctl enable --now cloud-init) - 实例是否被正确识别为裸机类型:cloud-init 会自动探测 datasource(如
DataSourceEc2或DataSourceAliYun),无需手动配置。验证命令:sudo cloud-init status --long—— 应显示status: done且各阶段(init、config、final)为successjournalctl -u cloud-init -n 30 --no-pager | grep DataSource—— 应输出类似DataSourceAliYun或DataSourceEc2
编写符合裸机场景的 user-data 配置
裸机初始化常涉及硬件感知操作(如磁盘分区、RAID、内核模块加载),#cloud-config 本身不直接执行低层硬件命令,但可通过 runcmd 或 bootcmd 安全调用系统工具。注意以下关键点:
- 优先使用
growpart+resizefs模块自动扩展系统盘(裸机常配大容量本地盘):growpart: {mode: auto, devices: ["/"]}resize_rootfs: true - 用
runcmd执行裸机特有操作,例如加载驱动或配置 RAID:runcmd:- [modprobe, nvme]- [sh, -c, "echo 'options nvme_core default_ps_max_latency_us=0' > /etc/modprobe.d/nvme.conf"]- [udevadm, trigger, --subsystem-match=block] - 避免依赖网络初始化过早的操作:裸机网卡可能需加载专有驱动(如 Mellanox、Intel X710),建议将网络相关配置(如静态 IP、bonding)放在
network-config文件中,通过network: {config: ...}字段声明,而非在runcmd中硬编码ip link - 环境预装推荐用
packages而非runcmd + apt/yum:更幂等、可审计、支持离线缓存packages:- docker-ce- nvidia-cuda-toolkit- smartmontools
平台级注入方式与注意事项
不同云厂商对裸机实例的 user-data 注入机制略有差异,需按平台规范操作:
-
阿里云 ECS 裸金属实例:控制台创建实例时,在“系统配置”页填写“用户数据”,内容为纯文本
#cloud-config(无需 base64);CLI 使用aliyun ecs RunInstances --UserData,值需 base64 编码 -
腾讯云 CVM 裸金属:控制台“高级配置 → 用户数据”支持直接粘贴 YAML;API 参数为
UserData,同样需 base64 编码 -
AWS EC2 Bare Metal:必须通过 Launch Template 或 CLI 的
--user-data传入,且内容需 base64 编码(CLI 自动处理);注意 IAM 实例角色需授予访问 SSM Parameter Store 权限(若需拉取密钥) -
重要限制:裸机实例的 user-data 大小上限普遍为 16 KB(阿里云/腾讯云)或 16384 bytes(AWS),超长配置请拆分至
write_files+runcmd调用,或改用cloud-init的 vendor-data 加载远程脚本
验证初始化结果与排错要点
裸机初始化失败常因硬件兼容性或 datasource 延迟导致,调试需聚焦日志和时机:
- 检查初始化完成状态:
sudo cloud-init status --long,若卡在init阶段,大概率是 datasource 未就绪(如 DHCP 超时、元数据服务不可达) - 查看裸机专属日志:
sudo cat /var/log/cloud-init-output.log | tail -50—— 此文件记录所有 stdout/stderr 输出,能快速定位runcmd报错(如modprobe: FATAL: Module nvme not found) - 确认磁盘扩展是否生效:
lsblk和df -h对比启动前后根分区大小;若未扩展,检查/var/lib/cloud/instance/sem下是否有cloud-init-peronce-growpart锁文件残留 - 裸机网络配置失败常见原因:cloud-init 默认等待 DHCP 获取 IP 后才读取元数据,若裸机使用静态 IP 或 PXE 引导,需在内核参数中显式指定 datasource,例如:
ds=nocloud;s=http://192.168.1.100/cloud-init/(仅适用于私有裸机集群)


















