Como você provavelmente sabe, por padrão, quando você instala um pacote em um sistema baseado no Debian ou Ubuntu, se o pacote contiver um serviço, esse serviço geralmente será ativado e iniciado automaticamente quando você instala o pacote.
Isso é um problema para mim.
Percebi que precisava gerenciar modelos para a construção de contêineres LXC. Existem vários contêineres, cada um correspondente a uma versão do Debian ou Ubuntu. (Também existem contêineres baseados na Red Hat, mas eles não são relevantes aqui.)
/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template
Ocasionalmente, descobrirei que os modelos estão com um pacote ausente ou precisam de alguma outra alteração, por isso vou fazer um chroot neles para instalar o pacote. Infelizmente, quando faço isso, acabo com várias cópias do serviço do pacote em execução!
A título de exemplo, eu achei que os modelos não tinham um daemon syslog, então instalei um:
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
chroot $template apt-get install rsyslog
done
E prontamente terminei com quatro cópias do rsyslog em execução. Sem mencionar duas cópias do exim4. Opa!
Eu li em algum lugar (embora não possa encontrá-lo novamente agora) que não deveria iniciar serviços ao executar um chroot, mas isso claramente não está acontecendo aqui.
Um hack desagradável potencialmente viável exige a substituição temporária dos vários comandos que realmente iniciam os serviços, como start-stop-daemon
e initctl
, embora isso seja muito mais trabalho do que eu realmente queria. Se eu não tenho outra escolha, no entanto ...
A solução ideal aqui seria que os sistemas baseados no Debian parassem de fazer essa porcaria, mas na falta disso, talvez uma opção de linha de comando obscura ou não documentada para apt-get
?
Caso não esteja claro, eu realmente quero manter qualquer coisa relacionada ao gerenciamento de modelos fora dos modelos, se possível.
fonte
Você pode fazer:
Não testei com chroot, mas deve funcionar. Inicialmente, define a variável de ambiente RUNLEVEL, para que os processos iniciados pelo apt-get não iniciem nenhum serviço, porque eles "pensam" que o sistema está sendo executado no modo único. Como o ambiente é modificado da maneira que pode afetar os comandos futuros, é necessário sair do shell quando o ambiente modificado não é mais necessário, isso é realizado pelo comando exit no final. Não pode ser alguns pacotes (raro?) Que não irá instalar corretamente no modo single (mas AFAIK isso não deve ser problema na maioria dos casos).
fonte
export RUNLEVEL=1
parte importante está aqui? O que exatamente isso causa?rsyslog
foi um dos pacotes "raros" que explodiu completamente ao tentar instalar dessa maneira. Isso ainda pode ser útil, embora, assim você pode manter o upvote :)