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?
fonte
--now
bandeira nosystemctl disable
comando para efetivar a alteração imediatamente. Esse foi o meu problema.disable --now
é equivalente astop
seguido pordisable
.Respostas:
Sim, havia algo óbvio que estava faltando.
Systemd é tudo sobre início simultâneo de serviços, de modo que o
cloud-init
script é executado ao mesmo tempo oapt-daily.service
é acionado. Quandocloud-init
chega a hora de executar a carga útil especificada pelo usuário,apt-get update
já está em execução. Portanto, as tentativas 2. e 3. falharam não por causa de alguma mágica do espaço para nome, mas porque alteraram o sistema tarde demais paraapt.systemd.daily
captar as alterações.Isso também significa que basicamente não há como impedir a
apt.systemd.daily
execução - só é possível matá-lo após o início.Este script "dados do usuário" segue esta rota:
Ainda existe uma janela de tempo durante a qual os logins SSH são possíveis e ainda
apt-get
não serão executados, mas não consigo imaginar outra solução que funcione na imagem de nuvem do Ubuntu 16.04.fonte
apt-get -o Acquire::http::AllowRedirect=false update
Nota: Infelizmente, parte da solução abaixo não funciona nos sistemas Ubuntu 16.04 (como o do questionador) porque a
systemd-run
chamada sugerida funciona apenas no Ubuntu 18.04 e superior (veja os comentários para detalhes ). Deixarei a resposta aqui porque esta pergunta ainda é um sucesso popular, independentemente da versão do Ubuntu que você está usando ...No Ubuntu 18.04 (ou superior), pode haver até dois serviços envolvidos no tempo de inicialização para atualizar / atualizar. O primeiro
apt-daily.service
atualiza a lista de pacotes. No entanto, pode haver um segundoapt-daily-upgrade.service
que realmente instala pacotes críticos de segurança. Uma resposta para a pergunta "Terminar e desativar / remover a atualização autônoma antes do retorno do comando" fornece um excelente exemplo de como aguardar a conclusão de ambos (copiada aqui por conveniência):(observe que isso deve ser executado como root). Se você estiver tentando desativar esses serviços em futuras botas, precisará mascarar AMBOS os serviços:
Como alternativa, você pode
systemctl disable
ambos os serviços e seus temporizadores associados (ieapt-daily.timer
eapt-daily-upgrade.timer
).Observe que as técnicas de mascaramento / desativação nesta resposta impedem apenas a atualização / atualização em futuras botas - elas não serão interrompidas se já estiverem em execução na inicialização atual.
fonte
systemd-run
no Ubuntu 16.04 é muito antigo para suportar a--wait
opção, mas não deve ser realmente necessário para o propósito em questão. (De acordo com a página do homem,--wait
aguarda o término de uma unidade, mas é suficiente para esperar o seu início que é o comportamento padrãosystemd-run
.)systemd-run
encantamento dado não funciona no Ubuntu 16.04; morre com mensagem de erro Atribuição desconhecida Depois = apt-daily.service apt-daily-upgrade.service . Parece que algumas propriedades da unidade não estavam disponíveissystemd-run
, veja, por exemplo, aquiVocê pode desativar isso através do módulo cloud-init "bootcmd". Isso é executado antes da rede ser criada, o que é necessário antes que o apt update possa ter a chance de ser executado.
Depois de fazer o ssh na instância, você também deve aguardar o término das fases finais do cloud-init, pois ele move as fontes / listas apt.
Isso também é útil para ver com que antecedência o bootcmd é executado:
Você pode verificar se funcionou da seguinte maneira:
fonte
Não seria mais fácil mascarar a unidade
?
fonte
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
os dados estão vazios.sudo dpkg-reconfigure -plow unattended-upgrades
e a proibi. Portanto, o status da unidade apt-daily.service está morto.apt-daily.service
partir de umcloud-init
script e antes de iniciar após a reinicialização da VM: isso significa: (1) isso deve ser feito de forma não interativa, (2) deve ser feito antes doapt-daily.service
disparo pela primeira vez. (Se o meu entendimento do systemd está correta, (2) não pode realmente ser realizado comocloud-init
eapt-daily
executados simultaneamente -. Ver minha própria resposta para mais)Isso espera 1 segundo em um loop completo e verifica se o bloqueio foi liberado.
fonte