Installa i pacchetti senza avviare processi e servizi in background


43

A volte l'installazione di alcune applicazioni avvia un processo o un servizio dall'applicazione che viene eseguita automaticamente al momento dell'installazione. Come installo senza avviarli?


Mi chiedo quale sia il potenziale per lasciare un sistema in uno stato instabile durante l'installazione di pacchetti kernel o DKMS usando questo tipo di configurazione. Non ne so molto di quest'area.
ændrük,

@ ændrük Questo mi ha preoccupato. Vedi che sto installando Ubuntu minimale su un'unità, quindi invece di avviarlo, utilizzo un Live CD / USB chroote installo i pacchetti di cui ho bisogno. Naturalmente i driver, in particolare, i driver GPU non sono presenti e devono essere installati.
Oxwivi,

Risposte:


35

C'è un modo leggermente hacker, ma abbastanza affidabile per farlo, che sto usando da un po 'in uno script di installazione automatizzata.

Innanzitutto creare una directory, ad esempio /root/fake, che contenga collegamenti simbolici /bin/truechiamati:

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

Potresti anche farli scrivere script che non fanno nulla e restituiscono successo.

Quindi includere quella directory all'inizio di $PATHquando si installano i pacchetti:

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

Ciò impedisce solo l'avvio / il riavvio dei demoni, mentre sono ancora in corso operazioni come la creazione di un initramfs.

Spiegazione

Gli script che vengono eseguiti durante l'installazione e la rimozione del pacchetto vengono eseguiti invoke-rc.do altri comandi citati per avviare e arrestare i servizi. Tuttavia non li chiamano con percorsi assoluti (almeno non ne ho incontrato uno che lo faccia).

Quindi, inserendo i comandi falsi "nessuna operazione" all'inizio di $PATH, i comandi reali non vengono mai chiamati.

Poiché solo i comandi utilizzati per avviare / arrestare i servizi vengono falsificati, tutto il resto, in particolare le attività importanti come l'aggiornamento / la creazione di immagini initramfs, continuano a funzionare.


Non hai abbastanza familiarità con i collegamenti simbolici, puoi approfondire tutti i passaggi che fai?
Oxwivi,

Un collegamento simbolico è un tipo speciale di file che non ha contenuto, invece fa riferimento a un altro file (per percorso / nome). Possono essere creati con ln -s, in questo caso ad esempio ln -s /bin/true /root/fake/initctl.
Bseibold,

Come impedisce l'avvio / il riavvio dei demoni? Secondo la risposta di @ psusi invoke-rc.dè responsabile.
Oxwivi,

Posizionando la directory con i comandi falsi all'inizio della $PATHvariabile, tutte le chiamate ae invoke-rc.daltre che possono essere utilizzate per avviare e arrestare i daemon utilizzano i comandi falsi. Cioè, a meno che non vengano chiamati con un percorso assoluto, ma non l'ho mai incontrato.
bseibold,

Ah, ora vedo come funziona - in sostanza, i collegamenti simbolici portano a vicoli ciechi. Ma qual è esattamente la /bin/truecosa? E il resto dei comandi coinvolti nei pacchetti? Non verranno gettati fuori pista dal specificato $PATH?
Oxwivi,

27

I daemon in background vengono avviati invoke-rc.d, il che assicura che il demone non venga avviato se il suo script rc dice che non dovrebbe essere eseguito nel runlevel corrente del sistema. È possibile ignorare la sua idea del runlevel corrente del sistema impostando la variabile di ambiente RUNLEVEL. Nulla dovrebbe essere eseguito nei runlevel 0 e 6, ma sembra che invoke-rc.dsia difettoso e funzioni comunque se si usano questi runlevel. La maggior parte dei demoni non viene eseguita nel runlevel 1, quindi è possibile impedire l'avvio nell'installazione in questo modo:

sudo RUNLEVEL=1 apt-get install redis-server

Sto installando Ubuntu minimo su un'unità, quindi invece di avviarlo, utilizzo un Live CD / USB chroote installo i pacchetti di cui ho bisogno. A causa delle cose che iniziano a funzionare, a volte sono uscito dalla sessione ubuntu (live CD). In ogni caso, la cosa che voglio chiedere è, come posso utilizzare questo RUNLEVELin chroot?
Oxwivi,

@Oxwivi, allo stesso modo, ma dovrebbe rilevare automaticamente che sei in chroot e saltare i demoni di partenza.
psusi,

È possibile che il passeggino invoke-rc.dsia responsabile dei problemi che ho affrontato?
Oxwivi,

@Oxwivi, è possibile, ma è più probabile che un determinato pacchetto sia difettoso e non utilizzato invoke-rc.d. Che pacchetto era questo?
psusi,

Non ne ho idea, ho appena elencato tutti i pacchetti da installare e non ho pensato al terminale per visualizzare l'output.
Oxwivi,


5

Credo che sia necessario utilizzare l' --no-triggersopzione della riga di comando quando si esegue l' dpkginstallazione. Qualcosa come questo:

dpkg -i --no-triggers SomeBigPackage.deb

Per rendere persistente questa impostazione in modo che apt-get installnon esegua alcun trigger, creare un file di configurazione dpkg personalizzato in /etc/dpkg/dpkg.cfg.d/custom:

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

Si noti che dpkg registra ancora i trigger come eseguiti anche se non lo sono:

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

In alternativa, è possibile fare in modo che lo script del programma di installazione esegua il servicecomando per disattivare il nuovo servizio:

service name_of_service stop

1
Qualche apt-getequivalente? O c'è un modo per configurare dpkgl'esecuzione con --no-triggersl'utilizzo dpkgdiretto o apt-getl'installazione di qualcosa?
Oxwivi,

dan_linder, spero non ti dispiaccia se sto modificando una risposta alla domanda di @ Oxwivi. Sentiti libero di modificarlo / ripristinarlo se non è di tuo gradimento.
ændrük,

5
Questo non è corretto I trigger non hanno nulla a che fare con l'avvio dei demoni. I trigger sono un pacchetto che esegue alcune azioni per riconfigurarsi in risposta a un altro, ad esempio se si installa un pacchetto che aggiunge un hook initramfs, attiva il pacchetto initramfs-tools per ricostruire initramfs.
psusi,

3

Quello che ho finito è emulare ciò che fa debootstrap durante l'installazione dei pacchetti, tranne per il fatto che ho usato dpkg-divert:

Innanzitutto sposta i file reali di mezzo:

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

Quindi creare versioni fittizie:

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"

Quindi esegui gli aggiornamenti apt-get, le installazioni, ecc., Quindi ripulisci con:

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

So che ci sono altri comandi che possono essere utilizzati per arrestare / avviare i servizi, ma debootstrap si preoccupa solo di , start-stop-daemone initctlquindi ho seguito l'esempio.


3

Un veloce one-liner:

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

Per quanto riguarda la persona che ha messo il "quick one-liner", hai dimenticato di impostare /usr/sbin/policy-rc.d come eseguibile. Altrimenti verrà ignorato.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.