A imagem da VM do servidor Ubuntu 16.04 aparentemente inicia o "apt-daily.service" a cada 12 horas ou mais; esse serviço executa várias tarefas relacionadas ao APT, como atualizar a lista de pacotes disponíveis, executar atualizações autônomas, se necessário, etc.
Ao iniciar a partir de um "instantâneo" da VM, o serviço é acionado imediatamente , pois (presumo) o systemd percebe rapidamente que o cronômetro deveria ter sido desativado há muito tempo.
No entanto, um APT em execução impede a execução de outros apt
processos, pois mantém um bloqueio /var/lib/dpkg
. A mensagem de erro indicando isso é assim:
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?
Preciso desativar essa tarefa automatizada do APT até que o Ansible conclua a configuração da máquina (que normalmente envolve a instalação de pacotes); consulte https://github.com/gc3-uzh-ch/elasticluster/issues/304 para obter mais informações e contexto.
Eu tentei várias opções para desativar o recurso "atualizações autônomas" por meio de um script "dados do usuário" cloud-init
, mas todas elas falharam até agora.
1. Desative a tarefa systemd
A tarefa systemd apt-daily.service
é acionada por apt-daily.timer
. Tentei desativar um ou outro, ou ambos, com várias cobinações dos seguintes comandos; ainda assim, ele apt-daily.service
é iniciado momentos após a VM estar pronta para aceitar conexões SSH:
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Desativar opção de configuração APT::Periodic::Enable
O script /usr/lib/apt/apt.systemd.daily
lê algumas variáveis de configuração do APT; a configuração APT::Periodic::Enable
desativa completamente a funcionalidade (linhas 331--337). Eu tentei desativá-lo com o seguinte script:
#!/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
No entanto, apesar de APT::Periodic::Enable
ter valor 0
na linha de comando (veja abaixo), o unattended-upgrades
programa ainda é executado ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Remova /usr/lib/apt/apt.systemd.daily
completamente
O cloud-init
script a seguir remove completamente o script de atualizações autônomas:
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Ainda assim, a tarefa é executada e eu posso vê-la na tabela de processos! embora o arquivo não exista se analisado na linha de comando:
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Parece que o cloud-init
script (junto com a linha de comando SSH) e o processo root systemd são executados em sistemas de arquivos e espaços de processo separados ...
Questões
Há algo óbvio que estou perdendo? Ou existe alguma mágica de espaço para nome que eu não conheço?
Mais importante ainda: como posso desativar o apt-daily.service
através de um
cloud-init
script?
--now
bandeira no systemctl disable
comando para efetivar a alteração imediatamente. Esse foi o meu problema.
disable --now
é equivalente a stop
seguido por disable
.