Instalar pacotes sem iniciar processos e serviços em segundo plano

43

Às vezes, a instalação de alguns aplicativos inicia um processo ou serviço a partir do aplicativo sendo executado automaticamente na instalação. Como instalo sem iniciá-los?

Oxwivi
fonte
Gostaria de saber qual é o potencial de deixar um sistema instável ao instalar pacotes de kernel ou DKMS usando esse tipo de configuração. Não sei muito sobre essa área.
ændrük
@ ændrük Isso me preocupou. Você vê que estou instalando o Ubuntu mínimo em uma unidade e, em vez de inicializá-lo, uso um Live CD / USB para chrootinstalar os pacotes necessários. É claro que os drivers, especificamente, os drivers da GPU não estão lá e precisam ser instalados.
Oxwivi

Respostas:

35

Existe uma maneira um pouco hackeada, mas bastante confiável, de fazer isso que venho usando há algum tempo em um script de instalação automatizada.

Primeiro, crie um diretório, por exemplo /root/fake, que contenha links simbólicos /bin/truechamados:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

Você também pode fazê-los bash scripts que não fazem nada e retornam sucesso.

Em seguida, inclua esse diretório na frente $PATHao instalar pacotes:

PATH=/root/fake:$PATH apt-get install whatever

Isso apenas impede que os daemons sejam iniciados / reiniciados, enquanto coisas como a criação de um initramfs ainda estão sendo feitas.

Explicação

Os scripts que estão sendo executados na instalação e remoção do pacote executar invoke-rc.dou outros dos comandos mencionados para iniciar e parar serviços. No entanto, eles não os chamam com caminhos absolutos (pelo menos eu não encontrei um que o faça).

Assim, ao inserir os comandos falsificados "no operation" no início de $PATH, os comandos reais nunca são chamados.

Como apenas os comandos usados ​​para iniciar / parar serviços estão sendo falsificados, todo o resto, em particular tarefas importantes como atualizar / criar initramfs-images ainda funcionam.

bseibold
fonte
Não familiarizado com links simbólicos, você pode elaborar todas as etapas que você executa?
Oxwivi
Um link simbólico é um tipo especial de arquivo que não possui conteúdo; em vez disso, refere-se a outro arquivo (por caminho / nome). Eles podem ser criados com ln -s, neste caso, por exemplo ln -s /bin/true /root/fake/initctl.
bseibold
Como impede que os daemons sejam iniciados / reiniciados? De acordo com a resposta da @ psusi, invoke-rc.dé responsável.
Oxwivi
Ao colocar o diretório com os comandos falsificados no início da $PATHvariável, todas as chamadas para invoke-rc.de outras que podem ser usadas para iniciar e parar daemons usam os comandos falsos. Ou seja, a menos que sejam chamados com um caminho absoluto, mas nunca o encontrei.
bseibold
Ah, agora eu vejo como funciona - basicamente, os links simbólicos levam a becos sem saída. Mas o que exatamente é a /bin/truecoisa? E o restante dos comandos envolvidos nos pacotes? Eles não serão jogados para fora da pista pelo especificado $PATH?
Oxwivi
27

Os daemons em segundo plano são iniciados invoke-rc.d, o que garante que o daemon não seja iniciado se seu script rc disser que não deve ser executado no nível de execução do sistema atual. Você pode substituir sua ideia do nível de execução do sistema atual configurando a variável de ambiente RUNLEVEL. Nada deve ser executado nos níveis de execução 0 e 6, mas parece que invoke-rc.dhá erros e executa as coisas de qualquer maneira, se você usar esses níveis de execução. A maioria dos daemons não é executada no nível de execução 1, portanto, você pode impedir que eles sejam iniciados na instalação assim:

sudo RUNLEVEL=1 apt-get install redis-server
psusi
fonte
Estou instalando o Ubuntu mínimo em uma unidade e, em vez de inicializá-lo, uso um Live CD / USB para chrootinstalar os pacotes necessários. Por causa das coisas que começam a correr, às vezes eu saio da sessão do ubuntu (live CD). Enfim, a coisa que eu quero perguntar é: como faço para usar esta RUNLEVELem chroot?
Oxwivi
@Oxwivi, da mesma maneira, mas é suposto detectar automaticamente que você está em um chroot e pular daemons iniciais.
Psusi
É possível que o buggy invoke-rc.dseja responsável pelos problemas que enfrentei?
Oxwivi
@ Oxwivi, é possível, mas é mais provável que um pacote específico esteja com erros e não esteja usando invoke-rc.d. Que pacote foi esse?
Psusi
Não tenho idéia, acabei de listar todos os pacotes para instalar e não me importei com o terminal para ver a saída.
precisa saber é o seguinte
20

Existe uma solução melhor :

cat > /usr/sbin/policy-rc.d <<EOF
#!/bin/sh
exit 101
EOF
chmod a+x /usr/sbin/policy-rc.d
GnunuX
fonte
5

Eu acredito que você precisa usar a --no-triggersopção de linha de comando ao fazer a dpkginstalação. Algo assim:

dpkg -i --no-triggers SomeBigPackage.deb

Para tornar essa configuração persistente para que apt-get installnão execute nenhum gatilho, crie um arquivo de configuração personalizado do dpkg em /etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

Observe que o dpkg ainda registra os acionadores como executados, mesmo que não:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

Como alternativa, você pode fazer com que o script do instalador execute o servicecomando para desativar o novo serviço:

service name_of_service stop
dan_linder
fonte
1
Qualquer apt-getequivalente? Ou existe uma maneira de configurar dpkgpara executar --no-triggersusando dpkgdiretamente ou apt-getpara instalar alguma coisa?
Oxwivi 7:11
dan_linder, espero que você não se importe em editar uma resposta à pergunta de @ Oxwivi. Sinta-se livre para modificá-lo / revertê-lo, se não for do seu agrado.
ændrük
5
Isto está incorreto. Os gatilhos não têm nada a ver com os daemons iniciais. Triggers são um pacote que executa alguma ação para se reconfigurar em resposta a outro, como se você instalar um pacote que adicione um gancho initramfs, ele acionará o pacote initramfs-tools para reconstruir o initramfs.
Psusi
3

O que acabei de fazer é emular o que o debootstrap faz ao instalar pacotes, exceto pelo uso do dpkg-divert:

Primeiro, mova os arquivos reais para fora do caminho:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

Em seguida, crie versões fictícias:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

Em seguida, faça as atualizações, instalações etc. do apt-get e limpe com:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

Eu sei que existem outros comandos que podem ser usados ​​para interromper / iniciar serviços, mas o debootstrap só se importa start-stop-daemone initctl, por isso, segui o exemplo.

Tal
fonte
3

Uma rápida linha única:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d
pl1nk
fonte
Com relação à pessoa que colocou o "one-liner rápido", você esqueceu de definir /usr/sbin/policy-rc.d como executável. Caso contrário, será ignorado.