树莓派(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 分钟),但后续重启跳过初始化。
快速上手步骤
- 下载镜像:使用 Raspberry Pi Imager 烧录最新 Raspberry Pi OS Lite(64-bit 推荐)。
- 准备文件:
- 在 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
- 在 boot 分区根目录创建
- 插入 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; }
高级模块
- NTP:
ntp: {enabled: true, servers: ['cn.pool.ntp.org']} - 分区扩展:
growpart: {devices: ['/']}+resizefs: true - 监控:首次启动日志
/var/log/cloud-init.log、cloud-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 或虚拟机,物理部署更高效。
资料来源:
- Raspberry Pi 官方新闻:https://www.raspberrypi.com/news/cloud-init-on-raspberry-pi-os/
- cloud-init 文档:https://cloud-init.readthedocs.io/en/latest/topics/examples.html
(正文约 1200 字)