smi*_*lli 3 ubuntu upstart provisioning virtual-machine apt-get
这在Ubuntu 14.04下并不是什么大问题,但是由于切换到16.04,事情变得有点乱:
当我使用工具启动新VM并运行配置脚本(想想Vagrant或Packer)时,脚本所做的第一件事就是apt-get update/ upgrade/ installdance.我注意到,自从切换到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/
Run Code Online (Sandbox Code Playgroud)
和
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?
Run Code Online (Sandbox Code Playgroud)
如果我sleep 30在脚本的开头抛出一个或类似的东西,它似乎安定下来.如果我在循环中尝试每个命令重试,直到退出状态为止,它也可以工作0.我能说的最好,有一些第一启动任务在我的配置器同时运行apt-get.
我觉得这很明显,就像apt-daily服务一样.但添加以下等待循环无效; 它永远不会等待任何事情:
while systemctl status apt-daily.service > /dev/null 2>&1; do
sleep 0.5
done
Run Code Online (Sandbox Code Playgroud)
我知道我可以按照这个问题中的想法来检查特定的锁定,但是我更感兴趣的是,如果有一个更通用和防弹的方法来确定新VM何时完全出现.做一个盲人sleep似乎太脆弱了.
小智 6
至少当我遇到同样的问题时,你正在使用apt-daily服务走上正轨.但apt-daily立即触发无人值守升级,这可能就是为什么你的睡眠循环没有做任何事情.几点想法:
如果您正在构建自己的流浪盒,以下是如何解决此问题:
在基本框上创建一个新文件:
/etc/systemd/system/apt-daily.timer.d/apt-daily.timer.conf
[Timer]
Persistent=false
Run Code Online (Sandbox Code Playgroud)
这将覆盖默认的systemd计时器,该计时器触发apt-daily在引导时立即运行(默认的persistent = true表示如果在系统关闭时错过了该作业,则它将在引导时立即运行).此文件将覆盖此文件中的默认设置:
/lib/systemd/system/apt-daily.timer
这就是我做的,因为我建立了自己的流浪盒,我可以确认它是有效的.
使用此xenial图像
https://github.com/geerlingguy/packer-ubuntu-1604
Geerlingguy通过禁用无人值守升级解决了这个问题.你可以在这里看到讨论
https://github.com/geerlingguy/packer-ubuntu-1604/issues/3#issue-154560190
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |