在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
似乎太脆弱了。
答案 0 :(得分:6)
至少在我遇到同样的问题时,你已经走上正确的日常服务。但apt-daily会立即触发无人值守升级,这可能就是为什么你的睡眠循环没有做任何事情。几点想法:
如果你正在构建自己的流浪盒,这里是如何解决这个问题:
在基本框上创建一个新文件:
/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
这就是我所做的,因为我建造了自己的流浪盒,我可以确认它有效。
使用此xenial图像
https://github.com/geerlingguy/packer-ubuntu-1604
Geerlingguy通过禁用无人值守升级解决了这个问题。你可以在这里看到讨论
https://github.com/geerlingguy/packer-ubuntu-1604/issues/3#issue-154560190