在 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,那么删除它一般影响不大。
删除前建议先检查一下当前服务状态:
systemctl status cloud-init也可以查看 cloud-init 是否已经完成初始化:
cloud-init status如果显示已经完成,并且系统后续不再需要它,可以继续处理。
二、推荐做法:先禁用 cloud-init #
如果只是想让它不再开机运行,不一定必须马上卸载。更稳妥的做法是先禁用。
可以创建一个禁用文件:
sudo touch /etc/cloud/cloud-init.disabled这个文件存在时,cloud-init 在启动阶段会检测到它,并跳过执行。
然后重启系统:
sudo reboot重启后可以检查状态:
cloud-init status或者查看启动过程中是否还出现 cloud-init 相关信息。
如果禁用后系统启动、网络、SSH 登录都正常,再考虑是否彻底删除。
三、重新配置 cloud-init #
如果决定彻底卸载,可以先执行重新配置命令:
sudo dpkg-reconfigure cloud-init执行后会出现 cloud-init 的数据源选择界面。
这里可以取消其他选项,只保留:
None这样做的目的是让 cloud-init 不再尝试从云平台、配置盘、网络 metadata 等位置获取初始化数据。
如果是在纯物理机或普通虚拟机环境中,这一步可以减少它继续探测数据源的可能性。
四、卸载 cloud-init #
重新配置完成后,可以使用 apt purge 卸载 cloud-init:
sudo apt purge cloud-initpurge 和普通 remove 不太一样。remove 主要删除软件包本身,而 purge 会连同相关配置文件一起清理得更彻底一些。
如果系统提示还会删除相关依赖,建议先看清楚列表,确认没有误删自己需要的软件包。
卸载完成后,可以执行:
sudo apt autoremove清理不再需要的依赖包。
五、删除残留目录 #
cloud-init 卸载后,系统里可能还会保留一些配置和运行数据目录。常见目录包括:
/etc/cloud以及:
/var/lib/cloud可以手动删除:
sudo rm -rf /etc/cloud /var/lib/cloud这里要注意,rm -rf 是危险命令,路径一定要确认无误。不要复制时漏掉空格,也不要在不清楚路径含义的情况下执行。
这两个目录删除后,cloud-init 的配置文件和历史初始化数据基本就清理掉了。
六、重启并验证 #
删除完成后,建议重启系统:
sudo reboot系统启动后,检查 cloud-init 是否还存在:
which cloud-init如果没有输出,说明命令已经不存在。
也可以检查服务:
systemctl status cloud-init如果提示找不到服务,说明 cloud-init 已经从系统中移除。
还可以检查软件包状态:
dpkg -l | grep cloud-init如果没有相关结果,说明软件包已经清理完成。
七、如果删除后网络异常怎么办 #
删除 cloud-init 后,最需要关注的是网络配置。
有些系统安装时可能由 cloud-init 生成过 netplan 配置文件。如果删除 cloud-init 后网络异常,可以检查:
ls -l /etc/netplan/查看里面是否有类似下面的配置文件:
50-cloud-init.yaml如果存在这个文件,不代表一定有问题,但需要确认里面的网络配置是否正确。
可以查看内容:
cat /etc/netplan/*.yaml如果你希望以后网络配置完全由自己维护,可以新建一个更明确的 netplan 配置文件,例如:
/etc/netplan/01-netcfg.yaml然后根据自己的网卡、DHCP 或静态 IP 情况进行配置。
修改 netplan 后,可以测试应用:
sudo netplan apply然后测试网络:
ping -c 4 8.8.8.8以及测试 DNS:
ping -c 4 google.com如果 IP 能 ping 通、域名不能 ping 通,通常说明 DNS 配置还需要继续检查。
八、完整命令整理 #
如果已经确认这台机器不需要 cloud-init,可以按下面流程操作:
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 主要用于云服务器和自动化初始化场景。如果是自己手动安装的物理机或普通虚拟机,并且不依赖云平台下发配置,可以考虑禁用或删除它。
比较稳妥的方式是先创建禁用文件:
sudo touch /etc/cloud/cloud-init.disabled确认系统启动和网络都正常后,再执行:
sudo dpkg-reconfigure cloud-init
sudo apt purge cloud-init
sudo rm -rf /etc/cloud /var/lib/cloud完成后重启系统,启动过程中就不会再看到 cloud-init 的初始化过程。
对普通自建服务器来说,删除 cloud-init 可以让系统更简洁;但对云服务器或依赖自动化初始化的环境来说,保留它会更安全。