如何摆脱 cloud-init?

我正在使用Ubuntu 14.04镜像作为我的vagrant基础盒子。不幸的是,这个基础盒子包含了cloud-init,在启动机器时会引起很多问题:https://github.com/mitchellh/vagrant/issues/3860 我并没有在云端使用我的机器,所以我实际上并不需要它。我尝试过输入:
sudo apt-get remove cloud-init

会解决我的问题,但机器启动时仍花费约3分钟来配置我不需要的东西。

我可以看到在/etc/init目录下有一些与cloud-init相关的文件(例如cloud-init.confcloud-final.confcloud-config.conf等)。我可以删除它们,但我不确定这是否安全。

我还安装了rcconf来检查所有的启动脚本,但我找不到与cloud-init相关的任何内容。有什么想法吗?

4个回答

一个更简单的方法可能是直接禁用它 - 根据cloud-init文档,禁用它的方法是:
sudo touch /etc/cloud/cloud-init.disabled

或者在内核命令行上设置cloud-init=disabled,如果已经启用了该方式。


截至2020年5月,"cloud-init=disabled"不起作用。 - HelpNeeder
@Pierz 你愿意重新表达你的回答,以便按照问题的要求来回答吗?也许可以先给出如何移除的答案,然后再提供一个禁用的替代方法。 - null

这对我在Ubuntu Server 18.04.1 LTS上有效。

  1. $ echo 'datasource_list: [ None ]' | sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg

  2. $ sudo apt-get purge cloud-init

  3. $ sudo rm -rf /etc/cloud/; sudo rm -rf /var/lib/cloud/

  4. $ reboot

祝好运。


7真的吗?改变一个文件,然后两步后删除它?看起来你可以跳过第一步。 - Enno Gröper
2似乎混合使用是关键:触摸 /etc/cloud/cloud-init.disabled 然后重新启动以停止它。然后按照上面Lion的回答中的步骤2-3,永远摆脱它。 - Tim
1它也在Ubuntu Server 20.04.2上运行良好...谢谢 - Andras

在14.04版本中,您可以使用dpkg-reconfigure来禁用cloud-init,具体步骤如下:
echo 'datasource_list: [ None ]' | sudo -s tee /etc/cloud/cloud.cfg.d/90_dpkg.cfg
sudo dpkg-reconfigure -f noninteractive cloud-init

或者只需使用sudo dpkg-reconfigure cloud-init以交互方式执行。

你是否愿意重新措辞以回答所提问的问题?也许可以首先给出如何删除的答案,然后再提供一个禁用的解决方法? - null

Cloud Init用于配置网络,可以在不同的阶段停止。在最近的版本中,您可以通过确保以下文件存在来在第一阶段禁用 Cloud Init:
/etc/cloud/cloud-init.disabled

或者在以后的阶段,通过确保文件/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg存在,并包含以下内容来完成。
network: {config: disabled}

你可以使用这个命令来完成它:
$ sudo echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

这些信息可以在/etc/netplan/50-cloud-init.yaml的标题注释中找到,其部分内容如下:

# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
这是来自Ubuntu 18.04 LTS的文件,很可能也适用于以后的版本。

在我看来,它只是禁用了网络配置部分。因此这还不够。 - Ludovic Kuty
@LudovicKuty 这正是cloud-init的目的所在:配置事物。因此,如果你让它停止尝试配置事物,你已经达到了你的目标,它就足够不再干扰你。如果你坚持认为这还不够,那么请详细解释一下什么是"足够"。 - code_dredd
它可能仍然尝试配置除了网络之外的其他内容。在我看来,原帖作者想要完全禁用它。请注意,这种细粒度在其他情况下可能会很有趣。 - Ludovic Kuty
@LudovicKuty 你的评论听起来有些推测性(“依我看”,“可能会...”等)。除非你能证明文档是错误的,并且在被告知不要尝试后它确实继续尝试,否则我认为这个问题没有更多可讨论的了。如果是这种情况,你最好向他们报告一个错误。每次我在我的服务器上这样做都足够了。 - code_dredd
去查看https://cloudinit.readthedocs.io/en/latest/topics/boot.html和https://cloudinit.readthedocs.io/en/latest/topics/network-config.html。你在批评我的“依我之见”和“可能”,并且你写了“禁用Cloud Init的正确方法是使用这个命令”,但你应该加上“依我之见”,因为这不是正确的做法。 - Ludovic Kuty
@LudovicKuty 并且它提到了这一点:"可以通过在 /etc/cloud/cloud.cfg 中使用以下配置来完全禁用网络配置network: {config: disabled}。请问您对我帖子的哪个具体部分以及文档的哪个具体部分有异议?请提供具体细节,因为我更愿意避免去猜测您的想法。 - code_dredd
对我来说,“禁用cloud-init”和“禁用cloud-init的网络配置部分”是不同的。这就是为什么我首先发表评论的原因,但我应该更具体一些。 - Ludovic Kuty
@LudovicKuty 我已经更新了帖子。我添加了一些信息并使一些措辞更加明确。鉴于 cloud-init 存在以生成网络配置,任何能让 cloud-init 停止干扰网络配置的解决方案都可以接受。 - code_dredd
是的。我对cloud-init不太了解,但它似乎可以设置默认区域设置、设置主机名、生成SSH私钥、设置临时挂载点(从文档中复制),但它确实更专注于云和网络。我猜一旦禁用网络,cloud-init可能就没什么用了,但我可能错了。但对我来说没关系,我不想争论。 - Ludovic Kuty
@LudovicKuty 我只是在讨论以澄清,而不是争论。我在文档中没有看到你提到的其他事情,而且我不认为 cloud-init 会尝试做这些事情。例如,SSH 密钥对是在安装 SSH 守护程序时由它生成的。主机名是在安装操作系统时由您设置的,或者使用 hostname 命令进行设置等等。我觉得你可能认为 cloud-init 做了比实际更多的事情。 - code_dredd
也许吧。我查看了https://cloud-init.io/和https://help.ubuntu.com/community/CloudInit,并且介绍的文字让我觉得它可以完全配置服务器,而不仅仅是网络部分,因为它被设计用于在云中自动运行实例。这就是`/etc/cloud/cloud.cfg`中的样子。 - Ludovic Kuty
1@code_dredd 问题在于你需要移除“Cloud Init用于配置网络,可以在不同阶段停止。” cloud-init可以配置主机的任何方面。网络配置只是其中一个方面。OP的问题是如何禁用cloud-init。答案是sudo touch /etc/cloud/cloud-init.disabled并且应该标记为这样。禁用它,重新启动,然后删除它。禁用cloud-init的网络部分是有效的任务,而此问题中提供的方法可能有效,但与问题本身无关。“如何禁用cloud-init” - Jeter-work
在实例启动时,cloud-init将识别正在运行的云平台,从云平台读取提供的元数据,并相应地初始化系统。这可能涉及到网络和存储设备的设置、配置SSH访问密钥以及系统的其他众多方面。...https://cloudinit.readthedocs.io/en/latest/你的答案声称cloud-init的唯一目的是设置网络配置。这是不正确的。 - Jeter-work
@Jeter-work:我的回答是在6年前发布的。我不记得当时它的功能如何,但我相信他们自那时以来已经做了更多的工作。 - code_dredd