Arka plan işlemlerini ve servislerini başlatmadan paketleri kurma


43

Bazen bazı uygulamaların yüklenmesi, yükleme sırasında otomatik olarak çalışan uygulamadan bir işlem veya hizmeti başlatır. Onları başlatmadan nasıl yüklerim?


Bu tür bir konfigürasyon kullanarak çekirdek veya DKMS paketleri kurarken sistemi dengesiz bir durumda bırakmanın ne gibi bir potansiyel olduğunu merak ediyorum. Bu alan hakkında fazla bir şey bilmiyorum.
ændrük

@ ændrük Bu beni endişelendiriyor. Bir sürücüye en az Ubuntu taktığımı görüyorsunuz, daha sonra yeniden başlatmak yerine, chrootihtiyacım olan paketleri kurmak ve kurmak için bir Live CD / USB kullanıyorum . Tabii ki sürücüler, özellikle de GPU sürücüleri yok ve kurulmaları gerekiyor.
Oxwivi

Yanıtlar:


35

Otomatik yükleme komut dosyasında bir süredir kullandığım, bunu yapmak için biraz hack, ancak oldukça güvenilir bir yol var.

İlk önce, örneğin /root/fakearanacak sembolik bağlantıları içeren bir dizin oluşturun /bin/true:

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

Onlara hiçbir şey yapmayan ve basarılığını geri getiren bash scriptleri de yapabilirsin.

Ardından $PATHpaketleri kurarken önüne bu dizini ekleyin :

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

Bu sadece, zindanların başlatılmasını / yeniden başlatılmasını önlerken, initramfs oluşturmak gibi şeyler hala yapılmaktadır.

açıklama

Paket yükleme ve kaldırma işleminde yürütülen komut dosyaları, invoke-rc.dhizmetleri başlatmak ve durdurmak için belirtilen komutları veya diğerlerini yürütür . Ancak, onları mutlak yollarla çağırmazlar (en azından bununla karşılaşmadım).

Bu nedenle, sahte "işlem yok" komutlarını başlatarak $PATH, gerçek komutlar hiçbir zaman aranmaz.

Yalnızca hizmetleri başlatmak / durdurmak için kullanılan komutlar sahte olduğundan, her şeyi, özellikle de initramfs görüntülerini güncelleme / oluşturma gibi önemli görevler devam eder.


Sembolik bağlantılara pek aşina olmayan, attığınız tüm adımlara dikkat eder misiniz?
Oxwivi

İşaret bağlantısı, içeriği olmayan özel bir dosya türüdür, bunun yerine başka bir dosyaya (yol / ada göre) atıfta bulunur. Onlar ile oluşturulabilir ln -s, örneğin bu durumda, ln -s /bin/true /root/fake/initctl.
bseibold

Daemonların başlatılmasını / yeniden başlatılmasını nasıl önler? @ Psusi'nin cevabına invoke-rc.dgöre sorumludur.
Oxwivi

Dizini $PATHdeğişkenin başlangıcına sahte komutlarla yerleştirmek suretiyle, ödemeleri invoke-rc.dbaşlatmak ve durdurmak için kullanılabilecek tüm çağrılar sahte komutları kullanır. Yani, mutlak bir yolla çağrılmadıkları sürece, ama bununla hiç karşılaşmadım.
bseibold

Ah, şimdi nasıl çalıştığını görüyorum - temelde, sembolikler çıkmazlara yol açıyor. Ama tam olarak /bin/trueşey nedir? Ve paketlerde yer alan diğer komutlardan ne haber? Belirtilenler tarafından iz bırakılmazlar $PATHmı?
Oxwivi

27

Arkaplan daemonları ile başlatılır invoke-rc.d, eğer rc betiği mevcut sistem runlevel'inde çalıştırılmaması gerektiğini söylerse, daemonun başlatılmadığından emin olur. RUNLEVEL ortam değişkenini ayarlayarak mevcut sistem çalışma seviyesi fikrini geçersiz kılabilirsiniz. Hiçbir şey 0 ve 6 çalışma seviyelerinde çalışamaz, ancak invoke-rc.dbu çalışma seviyelerini kullanırsanız, buggy ve bir şekilde işleri yürütür görünmektedir . Çoğu daemonon runlevel 1'de çalışmaz, bu nedenle yükleme işlemine başlamalarını önleyebilirsiniz:

sudo RUNLEVEL=1 apt-get install redis-server

Bir sürücüye en az Ubuntu kuruyorum, sonra yeniden başlatmak yerine, chrootihtiyacım olan paketleri kurmak ve kurmak için bir Live CD / USB kullanıyorum . Koşmaya başlayan şeyler yüzünden bazen ubuntu (canlı CD) oturumundan çıkarıldım. Neyse, sormak istiyorum şey, bunu nasıl kullanabilirim edilir RUNLEVELiçinde chroot?
Oxwivi

@Oxwivi, aynı şekilde, ancak bir chroot içinde olduğunuzu otomatik olarak algılamanız ve başlangıçtaki zıplamaları atlamanız gerekiyor.
psusi

Karşılaştığım invoke-rc.dsorunlardan arabanın sorumlu olması mümkün mü ?
Oxwivi

@Oxwivi, mümkündür, ancak belirli bir paketin buggy olduğu ve kullanmadığı daha muhtemeldir invoke-rc.d. Hangi paket bu?
psusi

Hiçbir fikrim yok, kurmak için sadece tüm paketleri listeledim ve çıktıyı görüntülemek için terminale daha fazla aldırmadım.
Oxwivi


5

Kurulumu --no-triggersyaparken komut satırı seçeneğini kullanmanız gerektiğine inanıyorum dpkg. Bunun gibi bir şey:

dpkg -i --no-triggers SomeBigPackage.deb

Bu ayarı kalıcı kılmak için apt-get installtetikleyicileri çalıştırmayacak şekilde, içinde özel bir dpkg yapılandırma dosyası oluşturun /etc/dpkg/dpkg.cfg.d/custom:

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

Dpkg'nin hala tetiklememiş olsalar bile tetikleyicileri çalıştırdığını kaydeder.

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

Alternatif olarak, serviceyeni hizmeti kapatmak için yükleyici komut dosyasının komutu çalıştırmasını sağlayabilirsiniz:

service name_of_service stop

1
Herhangi bir apt-geteşdeğeri? Veya doğrudan kullanmaya ya da bir şey kurmaya dpkgçalışacak şekilde çalışacak şekilde yapılandırmanın bir yolu var --no-triggersmı ? dpkgapt-get
Oxwivi

dan_linder, umarım @ Oxwivi'nin sorusuna cevap yazarken sakıncası yoktur. İsteğinize göre değilse değiştirmek / geri almak için çekinmeyin.
ændrük

5
Bu yanlış. Tetikleyicilerin, başlangıçtaki şeytanlarla hiçbir ilgisi yok. Tetikleyiciler, bir initramfs kancası ekleyen bir paket yüklerseniz, initramfs araç paketini, initramfs'ınızı yeniden oluşturmak için tetikler.
psusi

3

Yaptığım iş, paketleri kurarken debootstrap'in ne yaptığını taklit etmek, dpkg-divert kullanmam dışında:

İlk önce gerçek dosyaları yoldan çıkarın:

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

Sonra kukla sürümleri oluşturun:

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"

Sonra apt-get yükseltmelerinizi, kurulumlarınızı vb. Yapın ve ardından şunları temizleyin:

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

Servisleri durdurmak / başlatmak için kullanılabilecek başka komutlar olduğunu biliyorum, ancak debootstrap sadece umursuyor start-stop-daemonve initctlben de bu yüzden buna uydum.


3

Hızlı bir astar:

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

"Hızlı bir-astar" koyan kişi ile ilgili olarak, /usr/sbin/policy-rc.d dosyasını çalıştırılabilir olarak ayarlamayı unuttunuz. Aksi takdirde göz ardı edilir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.