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:
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.
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:
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:
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.
chroot
instalar los paquetes que necesito. Por supuesto, los controladores, específicamente, los controladores de GPU no están allí y deben instalarse.Respuestas:
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/true
llamados:También puede hacer que los scripts de bash no hagan nada y devuelvan el éxito.
Luego incluya ese directorio al frente de
$PATH
cuando instale paquetes: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.d
u 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.
fuente
ln -s
, en este caso, por ejemploln -s /bin/true /root/fake/initctl
.invoke-rc.d
es responsable.$PATH
variable, todas las llamadasinvoke-rc.d
y 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./bin/true
cosa? ¿Y qué del resto de los comandos involucrados en los paquetes? ¿No serán desviados por el especificado$PATH
?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 queinvoke-rc.d
tiene 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:fuente
chroot
instalar 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 estaRUNLEVEL
enchroot
?invoke-rc.d
sea responsable de los problemas que enfrenté?invoke-rc.d
. ¿Qué paquete fue este?Hay una mejor solución :
fuente
Creo que debe usar la
--no-triggers
opción de línea de comando cuando realiza ladpkg
instalación. Algo como esto:Para que esta configuración sea persistente y
apt-get install
no se ejecute ningún desencadenante, cree un archivo de configuración dpkg personalizado en/etc/dpkg/dpkg.cfg.d/custom
:Tenga en cuenta que dpkg todavía registra los desencadenantes como ejecutados aunque no lo hayan hecho:
Alternativamente, puede hacer que la secuencia de comandos del instalador ejecute el
service
comando para desactivar el nuevo servicio:fuente
apt-get
equivalente? ¿O hay una manera de configurardpkg
para ejecutar--no-triggers
si se usadpkg
directamente oapt-get
para instalar algo?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:
Luego cree versiones ficticias:
Luego realice sus actualizaciones, instalaciones, etc. de apt-get, y luego limpie con:
Sé que hay otros comandos que se pueden usar para detener / iniciar servicios, pero a debootstrap solo le importa
start-stop-daemon
yinitctl
, así que hice lo mismo.fuente
Una línea rápida:
fuente