İlişkili hizmetlerine başlamadan paketleri nasıl kurabilirim?


13

Muhtemelen bildiğiniz gibi, varsayılan olarak Debian veya Ubuntu tabanlı bir sisteme bir paket yüklediğinizde, paket bir hizmet içeriyorsa, paketi yüklediğinizde bu hizmet genellikle etkinleştirilir ve otomatik olarak başlatılır.

Bu benim için bir problem.

Kendimi LXC kapları oluşturmak için şablonları yönetmeye ihtiyaç duyduğumu gördüm. Her biri bir Debian veya Ubuntu sürümüne karşılık gelen birkaç kap vardır. (Ayrıca Red Hat tabanlı kaplar da vardır, ancak bunlar burada alakalı değildir.)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

Bazen şablonların eksik bir pakete sahip olduğunu veya başka bir değişikliğe ihtiyaç duyduğunu göreceğim, bu yüzden paketi yüklemek için bunlara gireceğim. Ne yazık ki bunu yaptığımda, paketin hizmetinin birkaç kopyasını tamamlıyorum!

Örnek olarak, şablonların bir syslog arka plan programı olmadığını gördüm, bu yüzden birini yükledim:

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

Ve derhal rsyslog çalışan dört kopya ile yara. Exim4'ün iki kopyasından bahsetmiyorum bile. Hata!


Bir yerde okudum (şimdi tekrar bulamıyorum), bir chroot içinde çalışırken hizmet başlatması gerekmediğini, ancak bu açıkça gerçekleşmediğini okudum.

Bir potansiyel açıdan kötü kesmek geçici aslında gibi hizmetler, başlangıç çeşitli komutlar değiştirilmesi için çağrılar start-stop-daemonve initctlbu gerçekten yapmak istediğim çok daha fazla iş olsa. Başka seçeneğim yoksa ...

Buradaki ideal çözüm, Debian tabanlı sistemlerin bu saçmalığı yapmayı bırakması olabilir, ancak belki de belirsiz veya belgesiz bir komut satırı seçeneğinin başarısız olması apt-get?

Açıkça görülmüyorsa, mümkünse şablonları şablonların dışında yönetmeyle ilgili her şeyi tutmak istiyorum .

Yanıtlar:


23

Debian için bunu policy-rc.d ile yapabilirsiniz . İşte bir açıklama :

Bir paketin bakım komut dosyalarının başlatma sistemi ile yalnızca invoke-rc.d, update-rc.d ve LSB init komut dosyası üstbilgileri aracılığıyla arabirim oluşturması beklenir ... invoke-rc.d, harekete geçmeden önce, /usr/sbin/policy-rc.d çalıştırılabilir, komut satırında ilgili hizmet adı ve geçerli çalışma düzeyi numarası ile çağırır ve çıkış koduna göre davranır. Örneğin, 101 dönüş değeri, planlanan eylemin gerçekleştirilmesini önleyecektir. Bu, paketin yüklenmesinden sonra hizmetin otomatik olarak başlatılmasını ve paketin kaldırılması sırasında hizmetin durdurulmasını içerir ve paket yükseltmeleri sırasında hizmetin eski sürümünü çalıştırabilecek yükseltme işlemini gerçekleştirmeye kadar yükseltme-yeniden başlatma-yeniden başlatma ritüelini azaltır.

Hiçbir hizmetin başlamasını istemediğiniz için policy-rc.d komut dosyanız basitçe

#!/bin/sh
exit 101

Bu, inşaatçı ve Docker'ın mkimage-debootstrap gibi araçlar tarafından kullanılan tekniktir .

Ne yazık ki, bu teknik Ubuntu krootlarıyla çalışmaz. Kuruluş sırasında invoke-rc.d yerine upstart init system call / usr / sbin / initctl ile entegre olan paketler ve initctl, policy-rc.d dosyasına başvurmaz. UPSStart'ın yazarına göre , geçici çözüm / sbin / initctl yerine bir chroot içinde / bin / true sembolik işaretini koymaktır. Bunu mkimage-debootstrap'de de görebilirsiniz,

dpkg-divert --local --rename --add /sbin/initctl
ln -sf /bin/true sbin/initctl

Bu oldukça temiz görünüyor, ancak şablondan bir kap oluşturmadan önce kaldırılması gerekecek.
Michael Hampton

1
Bunun için teşekkürler. Sadece Docker'ın mkimage-debootstrap betiğini sökmek zorunda kalabilirim, çünkü bu sorunu çoğunlukla çözdüler.
Michael Hampton

4

Yapabilirsin:

export RUNLEVEL=1
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done
exit

Bunu chroot ile test etmedim, ama işe yarayacak. İlk başta RUNLEVEL ortam değişkenini ayarlar, bu nedenle apt-get tarafından başlatılan işlemler herhangi bir hizmeti başlatmaz , çünkü sistemin tek modda çalıştığını düşünürler. Ortam, gelecekteki komutları etkileyebilecek şekilde değiştirildiği için, değiştirilmiş ortama artık ihtiyaç duyulmadığında kabuktan çıkmak gerekir; bu, sonunda çıkış komutu ile gerçekleştirilir . Orada olabilir tek modunda (ancak AFAIK çoğu durumda bu olmamalı sorun) düzgün yüklenmez bazı (nadir?) Paketler.


export RUNLEVEL=1önemli bölümü burada? Tam olarak ne oluyor?
Michael Hampton

@MichaelHampton RUNLEVEL çevresel değişkeninin mevcut çalışma seviyesini sağlayacağına inanıyorum. Bu durumda sadece üzerine yazıyor, böylece herhangi bir uygulama 1 üzerinde çalıştığını düşünecek. Bu bir çeşit "çamur" ama yeterli olmalı.
WinkyWolly

Orijinal cevaba açıklama eklendi. Temelde bu @WinkyWolly dedi.
DavisNT

Ne yazık ki rsyslog, bu şekilde yüklemeye çalışırken tamamen patlayan "nadir" paketlerden biri oldu. Yine de bu yine de yararlı olabilir, bu yüzden oyunuzu koruyabilirsiniz :)
Michael Hampton
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.