Ubuntu 如何确保新启动的VM已准备好进行资源调配?

Ubuntu 如何确保新启动的VM已准备好进行资源调配?,ubuntu,virtual-machine,provisioning,apt-get,upstart,Ubuntu,Virtual Machine,Provisioning,Apt Get,Upstart,在Ubuntu 14.04下,这不是什么大问题,但自从切换到16.04后,事情变得有点混乱: 当我使用一个工具启动一个新的VM并运行一个配置脚本(想想Vagrant或Packer)时,脚本首先要做的一件事就是更新/升级/安装舞蹈。我注意到,自从切换到Ubuntu Xenial之后,这些脚本抛出了很多不确定的错误,比如 Reading package lists... E: Could not get lock /var/lib/apt/lists/lock - open (11: Resourc

在Ubuntu 14.04下,这不是什么大问题,但自从切换到16.04后,事情变得有点混乱:

当我使用一个工具启动一个新的VM并运行一个配置脚本(想想Vagrant或Packer)时,脚本首先要做的一件事就是更新
/
升级
/
安装
舞蹈。我注意到,自从切换到Ubuntu Xenial之后,这些脚本抛出了很多不确定的错误,比如

Reading package lists...
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/

如果我在脚本开始时抛出一个
sleep 30
或类似的命令,它似乎会稳定下来。如果我在循环中尝试每个命令,直到退出状态为
0
,它也会起作用。据我所知,在我的provisioner运行apt get的同时,还有一些第一次启动任务

我认为这是显而易见的,比如apt的日常服务。但是添加下面的等待循环没有效果;它从不等待任何事情:

while systemctl status apt-daily.service > /dev/null 2>&1; do
    sleep 0.5
done

我知道我可以按照这些想法专门检查apt锁,但我更感兴趣的是,是否有一种更通用、更可靠的方法来确定新VM何时完全出现。做一个盲人睡眠看起来太脆弱了。

你在apt日常服务方面做得对,至少当我遇到同样的问题时。但apt daily会立即触发无人值守升级,这可能就是为什么您的睡眠循环没有做任何事情的原因。两个想法:

选择1 如果您正在建造自己的流浪者箱,以下是解决此问题的方法:

在基本框上创建新文件:

/etc/systemd/system/apt-daily.timer.d/apt-daily.timer.conf

[Timer]
Persistent=false
这将覆盖默认的systemd计时器,该计时器触发apt daily在引导时立即运行(默认的persistent=true意味着如果在系统关闭时作业丢失,那么它将在引导时立即运行)。此文件将覆盖此文件中的默认设置:

/lib/systemd/system/apt-daily.timer

这是我做的,因为我建立了自己的流浪者箱,我可以确认它的工作

选择2 使用此图像

Geerlingguy通过禁用无人值守升级解决了这个问题。你可以在这里看到讨论


两年后-是否发现了解决此问题的新方法?我正在尝试做与OP相同的操作,但此框:
[Timer]
Persistent=false