Ubuntu 16.04服务器VM映像显然每12个小时左右启动一次“ apt-daily.service”。此服务执行各种与APT相关的任务,例如刷新可用软件包列表,在需要时执行无人值守升级等。
从虚拟机“快照”启动时,该服务会立即触发,因为(我想)systemd很快意识到计时器应该早就关闭了。
但是,正在运行的APT会apt
锁定,因此会阻止其他进程运行/var/lib/dpkg
。指示此错误消息如下所示:
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
在Ansible完成机器设置(通常涉及安装软件包)之前,我需要禁用此自动APT任务。有关更多信息和上下文,请参见https://github.com/gc3-uzh-ch/elasticluster/issues/304。
我尝试了各种选项,通过的“用户数据”脚本禁用“无人值守的升级”功能cloud-init
,但是到目前为止,所有这些选项都失败了。
1.禁用系统任务
systemd任务apt-daily.service
由触发apt-daily.timer
。我试图通过以下命令的各种组合来禁用一个或另一个,或者两者都禁用。仍然apt-daily.service
是VM准备好接受SSH连接之后的启动时刻::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2.禁用配置选项 APT::Periodic::Enable
脚本/usr/lib/apt/apt.systemd.daily
读取一些APT配置变量。该设置APT::Periodic::Enable
将完全禁用该功能(第331--337行)。我尝试使用以下脚本禁用它:
#!/bin/bash
# cannot use /etc/apt/apt.conf.d/10periodic as suggested in
# /usr/lib/apt/apt.systemd.daily, as Ubuntu distributes the
# unattended upgrades stuff with priority 20 and 50 ...
# so override everything with a 99xxx file
cat > /etc/apt/apt.conf.d/99elasticluster <<__EOF
APT::Periodic::Enable "0";
// undo what's in 20auto-upgrade
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
__EOF
但是,尽管从命令行获取了APT::Periodic::Enable
值0
(请参阅下文),unattended-upgrades
程序仍在运行...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. /usr/lib/apt/apt.systemd.daily
完全移除
以下cloud-init
脚本完全删除了无人参与的升级脚本::
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
任务仍然运行,我可以在进程表中看到它!尽管如果从命令行进行探测,则文件不存在:
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
似乎cloud-init
脚本(以及SSH命令行)和root systemd进程在单独的文件系统和进程空间中执行...
问题
有什么明显的我想念的东西吗?还是发生了一些我不知道的名称空间魔术?
最重要的是:我怎么能禁止apt-daily.service
通过
cloud-init
脚本?
--now
标志systemctl disable
以便立即使更改生效。那是我的问题。
disable --now
对等于stop
后面disable
。