如何确保新启动的VM已准备好进行配置?

时间:2016-04-27 17:25:55

标签: ubuntu virtual-machine provisioning apt-get upstart

在Ubuntu 14.04下这不是一个大问题,但是由于切换到16.04,事情变得有些混乱:

当我使用工具启动新VM并运行配置脚本(想想Vagrant或Packer)时,脚本所做的第一件事就是apt-get update / upgrade / {{1}跳舞。自从切换到Ubuntu Xenial以来,我注意到这些脚本会抛出许多非确定性错误,例如

install

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/

如果我在脚本的开头抛出E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? 或类似物,它似乎安定下来。如果我在循环中尝试每个命令重试,直到退出状态为sleep 30,它也会起作用。我能想到的最好,有一些第一启动任务在我的配置器同时运行apt-get。

我认为这很明显,就像apt-daily服务一样。但添加以下等待循环无效;它永远不会等待任何事情:

0

我知道我可以按照this question中的想法专门检查一个特定的锁定,但是如果有一个更通用且更加防范的方法来确定新VM何时拥有,我会更感兴趣完全来。盲目while systemctl status apt-daily.service > /dev/null 2>&1; do sleep 0.5 done 似乎太脆弱了。

1 个答案:

答案 0 :(得分:6)

至少在我遇到同样的问题时,你已经走上正确的日常服务。但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

使用此xenial图像

https://github.com/geerlingguy/packer-ubuntu-1604

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

https://github.com/geerlingguy/packer-ubuntu-1604/issues/3#issue-154560190