Instalar paquetes sin iniciar procesos y servicios en segundo plano


43

A veces, la instalación de algunas aplicaciones iniciará un proceso o servicio desde la aplicación que se ejecuta automáticamente en la instalación. ¿Cómo instalo sin iniciarlos?


Me pregunto qué potencial hay para dejar un sistema en un estado inestable al instalar kernel o paquetes DKMS utilizando este tipo de configuración. No sé mucho sobre esta área.
ændrük el

@ ændrük Eso me tiene preocupado. Verá que estoy instalando un mínimo de Ubuntu en una unidad, luego, en lugar de arrancarlo, uso un Live CD / USB para chrootinstalar los paquetes que necesito. Por supuesto, los controladores, específicamente, los controladores de GPU no están allí y deben instalarse.
Oxwivi

Respuestas:


35

Hay una forma un poco hackear, pero bastante confiable de hacer esto que he estado usando durante un tiempo en un script de instalación automatizada.

Primero cree un directorio, por ejemplo /root/fake, que contenga enlaces simbólicos a los /bin/truellamados:

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

También puede hacer que los scripts de bash no hagan nada y devuelvan el éxito.

Luego incluya ese directorio al frente de $PATHcuando instale paquetes:

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

Esto solo evita que los demonios se inicien / reinicien, mientras que cosas como crear un initramfs todavía se están haciendo.

Explicación

Los scripts que se ejecutan en la instalación y eliminación de paquetes se ejecutan invoke-rc.du otros de los comandos mencionados para iniciar y detener servicios. Sin embargo, no los llaman con rutas absolutas (al menos no he encontrado uno que sí lo haga).

Entonces, al insertar los comandos falsos de "no operación" al principio de $PATH, nunca se llama a los comandos reales.

Dado que solo los comandos utilizados para iniciar / detener servicios están siendo falsificados, todo lo demás, en particular tareas importantes como actualizar / crear initramfs-images todavía funcionan.


No está muy familiarizado con los enlaces simbólicos, ¿puede elaborar con todos los pasos que da?
Oxwivi

Un enlace simbólico es un tipo especial de archivo que no tiene contenido, sino que se refiere a otro archivo (por ruta / nombre). Se pueden crear con ln -s, en este caso, por ejemplo ln -s /bin/true /root/fake/initctl.
bseibold

¿Cómo evita que los demonios se inicien / reinicien? Según la respuesta de @ psusi invoke-rc.des responsable.
Oxwivi

Al colocar el directorio con los comandos falsos al comienzo de la $PATHvariable, todas las llamadas invoke-rc.dy otros que se pueden usar para iniciar y detener demonios usan los comandos falsos. Es decir, a menos que se llamen con una ruta absoluta, pero nunca me he encontrado con esto.
bseibold

Ah, ahora veo cómo funciona: básicamente, los enlaces simbólicos conducen a callejones sin salida. Pero, ¿qué es exactamente la /bin/truecosa? ¿Y qué del resto de los comandos involucrados en los paquetes? ¿No serán desviados por el especificado $PATH?
Oxwivi

27

Se inician los demonios en segundo plano invoke-rc.d, lo que garantiza que el demonio no se inicie si su script rc dice que no debe ejecutarse en el nivel de ejecución del sistema actual. Puede anular su idea del nivel de ejecución del sistema actual estableciendo la variable de entorno RUNLEVEL. No se supone que nada se ejecute en los niveles de ejecución 0 y 6, pero parece que invoke-rc.dtiene errores y ejecuta las cosas de todos modos si usa estos niveles de ejecución. La mayoría de los demonios no se ejecutan en el nivel de ejecución 1, por lo que puede evitar que se inicien en la instalación de esta manera:

sudo RUNLEVEL=1 apt-get install redis-server

Estoy instalando un mínimo de Ubuntu en una unidad, luego, en lugar de iniciarlo, uso un Live CD / USB para chrootinstalar los paquetes que necesito. Debido a las cosas que comienzan a ejecutarse, a veces me desconectan de la sesión de ubuntu (live CD). De todos modos, lo que quiero preguntar es, cómo se utiliza esta RUNLEVELen chroot?
Oxwivi

@Oxwivi, de la misma manera, pero se supone que detecta automáticamente que estás en un chroot y omite los demonios iniciales.
psusi

¿Es posible que el buggy invoke-rc.dsea ​​responsable de los problemas que enfrenté?
Oxwivi

@Oxwivi, es posible, pero es más probable que un paquete en particular tenga errores y no se esté utilizando invoke-rc.d. ¿Qué paquete fue este?
psusi

No tengo idea, acabo de enumerar todos los paquetes para instalar y no me importó más el terminal para ver la salida.
Oxwivi


5

Creo que debe usar la --no-triggersopción de línea de comando cuando realiza la dpkginstalación. Algo como esto:

dpkg -i --no-triggers SomeBigPackage.deb

Para que esta configuración sea persistente y apt-get installno se ejecute ningún desencadenante, cree un archivo de configuración dpkg personalizado en /etc/dpkg/dpkg.cfg.d/custom:

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

Tenga en cuenta que dpkg todavía registra los desencadenantes como ejecutados aunque no lo hayan hecho:

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

Alternativamente, puede hacer que la secuencia de comandos del instalador ejecute el servicecomando para desactivar el nuevo servicio:

service name_of_service stop

1
Cualquier apt-getequivalente? ¿O hay una manera de configurar dpkgpara ejecutar --no-triggerssi se usa dpkgdirectamente o apt-getpara instalar algo?
Oxwivi

dan_linder, espero que no te importe que edite una respuesta a la pregunta de @ Oxwivi. Siéntase libre de modificarlo / revertirlo si no es de su agrado.
ændrük el

55
Esto es incorrecto. Los disparadores no tienen nada que ver con iniciar demonios. Los desencadenantes son un paquete que realiza alguna acción para reconfigurarse en respuesta a otro, por ejemplo, si instala un paquete que agrega un enlace initramfs, activa el paquete initramfs-tools para reconstruir sus initramfs.
psusi el

3

Lo que terminé haciendo es emular lo que debootstrap hace al instalar paquetes, excepto que usé dpkg-divert:

Primero mueva los archivos reales fuera del camino:

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

Luego cree versiones ficticias:

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"

Luego realice sus actualizaciones, instalaciones, etc. de apt-get, y luego limpie con:

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

Sé que hay otros comandos que se pueden usar para detener / iniciar servicios, pero a debootstrap solo le importa start-stop-daemony initctl, así que hice lo mismo.


3

Una línea rápida:

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

Con respecto a la persona que puso el "one-liner rápido", olvidó establecer /usr/sbin/policy-rc.d como ejecutable. Será ignorado de lo contrario.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.