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?
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.
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:
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.
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:
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:
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.
chroot
instalar os pacotes necessários. É claro que os drivers, especificamente, os drivers da GPU não estão lá e precisam ser instalados.Respostas:
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/true
chamados:Você também pode fazê-los bash scripts que não fazem nada e retornam sucesso.
Em seguida, inclua esse diretório na frente
$PATH
ao instalar pacotes: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.d
ou 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.
fonte
ln -s
, neste caso, por exemploln -s /bin/true /root/fake/initctl
.invoke-rc.d
é responsável.$PATH
variável, todas as chamadas parainvoke-rc.d
e 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./bin/true
coisa? E o restante dos comandos envolvidos nos pacotes? Eles não serão jogados para fora da pista pelo especificado$PATH
?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 queinvoke-rc.d
há 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:fonte
chroot
instalar 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 estaRUNLEVEL
emchroot
?invoke-rc.d
seja responsável pelos problemas que enfrentei?invoke-rc.d
. Que pacote foi esse?Existe uma solução melhor :
fonte
Eu acredito que você precisa usar a
--no-triggers
opção de linha de comando ao fazer adpkg
instalação. Algo assim:Para tornar essa configuração persistente para que
apt-get install
não execute nenhum gatilho, crie um arquivo de configuração personalizado do dpkg em/etc/dpkg/dpkg.cfg.d/custom
:Observe que o dpkg ainda registra os acionadores como executados, mesmo que não:
Como alternativa, você pode fazer com que o script do instalador execute o
service
comando para desativar o novo serviço:fonte
apt-get
equivalente? Ou existe uma maneira de configurardpkg
para executar--no-triggers
usandodpkg
diretamente ouapt-get
para instalar alguma coisa?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:
Em seguida, crie versões fictícias:
Em seguida, faça as atualizações, instalações etc. do apt-get e limpe com:
Eu sei que existem outros comandos que podem ser usados para interromper / iniciar serviços, mas o debootstrap só se importa
start-stop-daemon
einitctl
, por isso, segui o exemplo.fonte
Uma rápida linha única:
fonte