Hotdry.
systems-engineering

集成 cloud-init 实现树莓派 OS 无头部署

通过 cloud-config YAML 注入 SSH 密钥、网络、用户和软件包配置,彻底告别 SD 卡镜像烧录与手动编辑。

树莓派(Raspberry Pi)作为热门的单板计算机,常用于物联网、家庭服务器等场景。传统无头(headless)部署需要烧录镜像后手动挂载 SD 卡分区,编辑 config.txt、cmdline.txt、创建 ssh 文件、wifi 配置等,过程繁琐且易出错。新版 Raspberry Pi OS(Bookworm 起)原生支持 cloud-init,允许通过简单 YAML 文件实现自动化 provisioning,注入 SSH 密钥、网络设置、用户账户、软件包安装等,完全消除 SD 卡编辑需求。

cloud-init 在 Raspberry Pi OS 中的工作原理

cloud-init 是云环境标准初始化工具,Raspberry Pi OS 通过 NoCloud 数据源集成它。在首次启动时,系统从 boot 分区(FAT32)的 user-data 和 meta-data 文件读取配置。user-data 使用 #cloud-config YAML 格式,支持模块化配置;meta-data 提供实例元数据如主机名。

优势显而易见:

  • 零触碰部署:烧录官方镜像后,仅添加两个文件,即可 headless 启动。
  • 可重复性:YAML 版本控制,易于批量部署多台设备。
  • 全面覆盖:网络(WiFi/Ethernet)、SSH 访问、用户 / 密码 / 密钥、NTP 时间同步、分区扩展、包管理、自定义脚本。

相比传统方法,首次引导时间稍长(~2-5 分钟),但后续重启跳过初始化。

快速上手步骤

  1. 下载镜像:使用 Raspberry Pi Imager 烧录最新 Raspberry Pi OS Lite(64-bit 推荐)。
  2. 准备文件
    • 在 boot 分区根目录创建 meta-data(纯文本):
      instance-id: rpi-cloudinit
      local-hostname: my-rpi-server
      
    • 创建 user-data(YAML):
      #cloud-config
      hostname: my-rpi-server
      manage_etc_hosts: true
      
      users:
        - name: pi
          sudo: ALL=(ALL) NOPASSWD:ALL
          ssh_authorized_keys:
            - ssh-rsa AAAAB3NzaC1yc2E... your-public-key-here
          shell: /bin/bash
      
      ssh:
        install-server: true
        authorized_keys:
          - ssh-rsa AAAAB3NzaC1yc2E... your-public-key-here
      
      network:
        version: 2
        ethernets:
          eth0:
            dhcp4: true
        wifis:
          wlan0:
            dhcp4: true
            access-points:
              "your-ssid":
                password: "your-wifi-password"
      
      packages:
        - htop
        - nginx
        - python3-pip
      
      runcmd:
        - [ systemctl, enable, nginx ]
        - [ timedatectl, set-timezone, Asia/Shanghai ]
        - echo "Cloud-init setup complete!" > /home/pi/setup.log
      
      resizefs: true
      
  3. 插入 SD 卡启动:设备自动配置,SSH 默认 pi@my-rpi-server 可用。

关键配置参数与最佳实践

用户与安全

  • 用户创建users 模块支持 gecos(全名)、groups、lock_passwd(禁用密码登录)。
  • SSH 密钥注入:优先使用 ssh_authorized_keys,避免密码登录。参数:ssh_pwauth: false 全局禁用密码认证。
  • root 访问disable_root: false,但不推荐生产环境。

网络配置

  • 支持 Netplan YAML(version: 2),静态 IP 示例:
    wifis:
      wlan0:
        addresses: [192.168.1.100/24]
        gateway4: 192.168.1.1
        nameservers:
          addresses: [8.8.8.8, 114.114.114.114]
    
  • WiFi 国密支持:SSID 密码需 UTF-8 编码,避免特殊字符。

包管理与脚本

  • packages:apt 安装列表,首次引导下载(确保网络先通)。
  • runcmd:Shell 命令数组,顺序执行。复杂逻辑用 bootcmd(早阶段)或 final_message
  • write_files:注入配置文件,例如:
    write_files:
      - path: /etc/nginx/sites-available/default
        content: |
          server {
            listen 80;
            root /var/www/html;
          }
    

高级模块

  • NTPntp: {enabled: true, servers: ['cn.pool.ntp.org']}
  • 分区扩展growpart: {devices: ['/']} + resizefs: true
  • 监控:首次启动日志 /var/log/cloud-init.logcloud-init-output.log。调试:cloud-init clean --logs 重置状态。

潜在风险与优化

  • 引导超时:复杂配置下首次启动 >10min,监控串口输出(dmesg | grep cloud-init)。
  • ARM 兼容:确保包名支持 arm64/aarch64。
  • 批量部署:结合 Ansible 生成 YAML,或 PXE/NoCloud HTTP 源(高级)。
  • 回滚:删除 user-data/meta-data 文件,退回默认引导。

参数阈值建议:

配置项 推荐值 说明
instance-id uuidgen 生成 唯一标识,避免重复初始化
runcmd 长度 <20 条 过多延时引导
packages <10 个 网络依赖,优先核心
WiFi timeout 默认 30s network: {config: disabled} 跳过

此方案已在 Pi 4/5 上验证,适用于边缘计算集群。相比 WSL 或虚拟机,物理部署更高效。

资料来源

(正文约 1200 字)

查看归档