在 Ubuntu Server 20.04 中,系统默认可能会安装 cloud-init。刚开始看到这个服务时,很多人会有点疑惑:自己明明是在物理机或普通虚拟机里安装的 Ubuntu,并不是云服务器,为什么启动时还会出现 cloud-init 的执行过程?

cloud-init 主要是为了云计算环境设计的。它可以在系统第一次启动时,根据云平台提供的 metadata 或 user-data 自动完成初始化配置,例如设置主机名、配置网络、写入 SSH keys、创建用户、安装软件包、执行初始化脚本等。

在云服务器、OpenStack、AWS、Azure、Proxmox 云镜像、自动化部署场景里,cloud-init 很有用。但如果是自己手动安装的 Ubuntu Server,尤其是普通物理机、家庭服务器、实验环境或固定用途的虚拟机,很多时候并不需要它继续存在。

我自己的场景是物理机或普通虚拟机安装 Ubuntu Server,不依赖云平台初始化配置,所以有时会选择禁用或直接删除 cloud-init。这样启动过程会更干净,也不会每次开机时看到相关初始化信息。

一、删除前需要注意什么 #

删除 cloud-init 之前,最好先确认这台机器是否真的不依赖它。

如果这台机器是云服务器,不建议随便删除 cloud-init。因为云平台可能会通过它完成一些重要配置,比如:

  • 初始化网络配置
  • 写入 SSH 公钥
  • 设置默认用户
  • 扩展磁盘分区
  • 应用云平台下发的 user-data
  • 执行首次启动脚本

如果是在云平台上运行的服务器,删除 cloud-init 后,后续重装、快照恢复、镜像复制、自动扩容或重新下发配置时可能会出现问题。

如果是自己安装的物理机,或者已经确认网络、用户、SSH、磁盘等配置都不依赖 cloud-init,那么删除它一般影响不大。

删除前建议先检查一下当前服务状态:

Bash
systemctl status cloud-init

也可以查看 cloud-init 是否已经完成初始化:

Bash
cloud-init status

如果显示已经完成,并且系统后续不再需要它,可以继续处理。

二、推荐做法:先禁用 cloud-init #

如果只是想让它不再开机运行,不一定必须马上卸载。更稳妥的做法是先禁用。

可以创建一个禁用文件:

Bash
sudo touch /etc/cloud/cloud-init.disabled

这个文件存在时,cloud-init 在启动阶段会检测到它,并跳过执行。

然后重启系统:

Bash
sudo reboot

重启后可以检查状态:

Bash
cloud-init status

或者查看启动过程中是否还出现 cloud-init 相关信息。

如果禁用后系统启动、网络、SSH 登录都正常,再考虑是否彻底删除。

三、重新配置 cloud-init #

如果决定彻底卸载,可以先执行重新配置命令:

Bash
sudo dpkg-reconfigure cloud-init

执行后会出现 cloud-init 的数据源选择界面。

这里可以取消其他选项,只保留:

TEXT
None

这样做的目的是让 cloud-init 不再尝试从云平台、配置盘、网络 metadata 等位置获取初始化数据。

如果是在纯物理机或普通虚拟机环境中,这一步可以减少它继续探测数据源的可能性。

四、卸载 cloud-init #

重新配置完成后,可以使用 apt purge 卸载 cloud-init:

Bash
sudo apt purge cloud-init

purge 和普通 remove 不太一样。remove 主要删除软件包本身,而 purge 会连同相关配置文件一起清理得更彻底一些。

如果系统提示还会删除相关依赖,建议先看清楚列表,确认没有误删自己需要的软件包。

卸载完成后,可以执行:

Bash
sudo apt autoremove

清理不再需要的依赖包。

五、删除残留目录 #

cloud-init 卸载后,系统里可能还会保留一些配置和运行数据目录。常见目录包括:

TEXT
/etc/cloud

以及:

TEXT
/var/lib/cloud

可以手动删除:

Bash
sudo rm -rf /etc/cloud /var/lib/cloud

这里要注意,rm -rf 是危险命令,路径一定要确认无误。不要复制时漏掉空格,也不要在不清楚路径含义的情况下执行。

这两个目录删除后,cloud-init 的配置文件和历史初始化数据基本就清理掉了。

六、重启并验证 #

删除完成后,建议重启系统:

Bash
sudo reboot

系统启动后,检查 cloud-init 是否还存在:

Bash
which cloud-init

如果没有输出,说明命令已经不存在。

也可以检查服务:

Bash
systemctl status cloud-init

如果提示找不到服务,说明 cloud-init 已经从系统中移除。

还可以检查软件包状态:

Bash
dpkg -l | grep cloud-init

如果没有相关结果,说明软件包已经清理完成。

七、如果删除后网络异常怎么办 #

删除 cloud-init 后,最需要关注的是网络配置。

有些系统安装时可能由 cloud-init 生成过 netplan 配置文件。如果删除 cloud-init 后网络异常,可以检查:

Bash
ls -l /etc/netplan/

查看里面是否有类似下面的配置文件:

TEXT
50-cloud-init.yaml

如果存在这个文件,不代表一定有问题,但需要确认里面的网络配置是否正确。

可以查看内容:

Bash
cat /etc/netplan/*.yaml

如果你希望以后网络配置完全由自己维护,可以新建一个更明确的 netplan 配置文件,例如:

TEXT
/etc/netplan/01-netcfg.yaml

然后根据自己的网卡、DHCP 或静态 IP 情况进行配置。

修改 netplan 后,可以测试应用:

Bash
sudo netplan apply

然后测试网络:

Bash
ping -c 4 8.8.8.8

以及测试 DNS:

Bash
ping -c 4 google.com

如果 IP 能 ping 通、域名不能 ping 通,通常说明 DNS 配置还需要继续检查。

八、完整命令整理 #

如果已经确认这台机器不需要 cloud-init,可以按下面流程操作:

Bash
sudo touch /etc/cloud/cloud-init.disabled
sudo dpkg-reconfigure cloud-init
sudo apt purge cloud-init
sudo apt autoremove
sudo rm -rf /etc/cloud /var/lib/cloud
sudo reboot

其中第一行是先禁用 cloud-init,属于更稳妥的处理方式。后面的 purge 和删除目录才是彻底清理。

九、什么时候不建议删除 #

以下情况不建议直接删除 cloud-init:

  • 服务器运行在公有云平台上
  • 使用云镜像批量创建虚拟机
  • 依赖 SSH 公钥自动写入
  • 依赖 user-data 初始化脚本
  • 使用 Proxmox、OpenStack 等平台的 cloud-init 功能
  • 不确定当前网络配置是否由 cloud-init 管理
  • 未来还需要通过模板克隆虚拟机

这些场景下,更建议保留 cloud-init,或者只在确认配置完成后使用禁用方式,而不是彻底卸载。

总结 #

Ubuntu Server 20.04 中的 cloud-init 主要用于云服务器和自动化初始化场景。如果是自己手动安装的物理机或普通虚拟机,并且不依赖云平台下发配置,可以考虑禁用或删除它。

比较稳妥的方式是先创建禁用文件:

Bash
sudo touch /etc/cloud/cloud-init.disabled

确认系统启动和网络都正常后,再执行:

Bash
sudo dpkg-reconfigure cloud-init
sudo apt purge cloud-init
sudo rm -rf /etc/cloud /var/lib/cloud

完成后重启系统,启动过程中就不会再看到 cloud-init 的初始化过程。

对普通自建服务器来说,删除 cloud-init 可以让系统更简洁;但对云服务器或依赖自动化初始化的环境来说,保留它会更安全。