Chroot içinde bir systemd servisi başlatın


38

İnit betikleriyle (veya openrc ile) her zaman farklı bir kurulum kökünden servisler çalıştırabilirim.
ama kaçtığımda chroot /somepath/to_root /usr/bin/systemctl start someservicekoştum:

Running in chroot, ignoring request.

Sistemi zorlamak ve hizmeti çalıştırmak için bir yol var mı?

Güncelleme:
Ana bilgisayar sistemimin init betiklerini veya openrc'yi çalıştırdığını, ancak hiç bir zaman sistematiğini çalıştırmadığımı ve chix'i, minimal bir kabuk bile başlatamayan Unix sistemlerinde sorun gidermek için kullandığımı söylemeyi unuttum.


1
Ayrıca hizmetleri bir chrootta çalıştırmam gerekiyor, her zaman openrc2'den önce çalıştı, şimdi imkansız görünüyor; (
neofutur

Yanlış sorunu çözmeye çalışıyorsun. OpenRC'niz varsa, sistem servisini bir OpenRC servisine dönüştürmeniz gerekir. Bunun için gerçekten bir yol yok.
Daniel B,

@DanielB: HAYIR! Daha önce hiç sistem kaydını duydunuz mu?
user2284570

Hayır. Ayrıca sorunuzla nasıl ilişkili olduğunu da anlamıyorum.
Daniel B

Yanıtlar:


29

Sistem dağıtımlarında bilinen bir problem (Arch Linux, OpenSUSE, Fedora).

Systemd, sysvinit'in yerini alır ve bu konuda büyük bir avantaj sağlar. Sysvinit'te, bir hizmetin başlatılmasını istediğinizde, ortam değişkenlerini, ulimitleri vb. İçeren betiği çağıran kişinin yürütme bağlamını devralır. Sistemd, bunun aksine, hizmeti iyi tanımlanmış, sağlıklı ve sürekli bir ortamda başlatacak bir cini bildirerek, hizmetlerin performanslarının tahmin edilmesinin çok daha kolay olduğu, çünkü her zaman çevre aynı olduğu için bunu iyileştirir.

Bu, systemctl'yi chroot içinden çağırdığımda chroot'un içinde olmamın önemsiz olduğu, miras alınacak ortamın şu anki benim değil PID 1 ile aynı olduğu anlamına gelir. Fakat bundan daha kötüsü olur: iletişim soketleri / run / systemd içine yerleştirildiği için, chroottaki bir işlem init sistemiyle konuşamaz!

Peki, sistem dağıtımlarında nasıl chroot'laşırsınız?

  1. Tek yapmanız gereken bir Linux konteynerine sahipseniz, bu Arch Wiki sayfası size bir Linux konteynerini 30 saniyeden daha kısa sürede nasıl kuracağınızı anlatır systemd-nspawn.

  2. Bunun yerine gerçekten chroot bir ortam istiyorsanız, bu güzel ve kristal netliğinde Web sayfası size iki çalışma çözümü sunar (ikincisi, # 1'de sunulanun değiştirilmiş bir versiyonudur).


Aradım systemd-nspawnama koşamam. Ve Hayır, bu bir konteyner için değildir, çünkü hizmetin hem ana bilgisayar hem de hedef mimari tarafından kullanılması gerekir.
user2284570,

2
Hostd sistem kökünde systemd kullanmıyorum. Benim durumumda systemd'i openrc ile karıştıramıyorum.
user2284570

1
@TwoD Bu işe yaramaz. Çalıştırma systemd-nspawn, "Sistemd sistemde çalışmıyor" ile başarısız oluyor. Ana bilgisayar da systemd kullanmıyorsa.
HVD

1
@TwoD Cevap verdim çünkü bana öyle gelmedi. :) "Çalıştıramıyorum", yürütülebilir dosyayı bulmakta sorun yaşıyorsanız söylemek için garip bir şey; bu nedenle, sorunumun yorumuma koyduğum şey olduğundan şüpheliyim: çalıştırmak, bu hata iletisini veriyor ve yararlı bir şey yapmayın. Fakat sorun ortaya çıksa bile, gerçekte nerede bulacağınız ortaya systemd-nspawnçıktıysa, o zaman yeni köke işaret etmek yardımcı olmaz. Ana bilgisayar zaten var (çünkü systemd çalışıyor), bu durumda ana bilgisayar sürümü kullanılabiliyor veya ana bilgisayar buna sahip değil, ancak yeni kökün sürümü çalışmıyor.
hvd

1
systemdçalıştırılmak üzere reddederchroot
Erkin Alp Güney'in

4

systemd sadece "servisleri" yok sayar, bu yüzden daemon komutlarını elle çalıştırırım.

Yani yerine

service sshd start

kullanırım

/usr/sbin/sshd -D &

Bu tüm servisler için işe yaramaz. Bazıları, Xorg gibi sistem servis başlatıcısının bir parçası olarak başlatılmayı gerektirir.
user2284570

startxiçin çalışacak Xorg.
Erkin Alp Güney

@ ErkinAlpGüney: chroot değil ... Dbus yüzünden.
user2284570,

4

Birkaç yıl süren konuşmacılar çoğu Systemd pratik sorununa yalnızca bir çözüm olduğunu kabul etmeliyim. Çünkü hata Systemd'in kendisidir.

Upstart veya Openrc gibi şeylerle hiç karşılaşmadığım problemlerim olduğundan gerçekten Systemd'den bıktım:

  • Yalnızca 24Mb ram olan ve yazılabilir depolama alanı olmayan gömülü sistemler için bile, cgroups gerektiren bir çekirdeğin zorlanması (isteğe bağlı ancak varsayılan olarak bir yapılandırma dosyası içinde etkin kılınması yerine) desteği .
  • Modüler olma iddiasına rağmen, çalışma zamanında bağımlılık cehennemi güçlü bir tanrı nesnesi haline getirir: tek bir reiser4 rootfs üzerinden önyükleme yapmak ister misiniz? Çok program gerektirir, çünkü mümkün değildir systemd-udevdgerektiren systemd-initgerektiren systemd-bootdaha aynı anda monte edilemez paketi grub2ne de reiser4 bölümünden çekirdek görüntüleri okuyabilir.
  • Çevirmeli Bluetooth aracılığıyla internete bağlanmak ister misiniz? Samsung java me telefonunuzla çalışmazsa, daha önce nedeniyle manuel olarak çalışan komut dosyalarını ve komut satırı yazılımını çalıştıramazsınız networkd.
  • En büyük sorunu fark etmeme rağmen, kendi Linux dağıtımınızı oluşturup sürdürüyorsanız: systemd init modülünün kendisi, farklı bir yükleme paketleri aracılığıyla başka bir init sistemi seçmeyi öneremeyeceğiniz kadar bağımlılığa sahiptir.
  • Sisteminizde chroot yapamıyorsanız veya libdb4.8'den yükselttiyseniz, günlükleri görüntülemede iyi şanslar (en azından en kötü durumda Microsoft'un xml biçiminde günlük dosyaları olması) .

Tek çözüm :

Systemd problemleri çözmek için gerekli olmayan bir komplekstir: ossv4 yerine alsa gibi. Yani systemd kullanan bir şey varsa, sadece tüm verileri silin:

dd if=/dev/urandom of=/dev/dm−0 bs=1M

ve OpenRc ile Gentoo benzeri SysV Init'in sorunlarını çözerken hiç kullanmayan bir şey yükleyin.
Soru sistemimle ilgili olarak Windows® kayıt defteri gibi şeyler ortaya çıkıyor: bir kısmı berbat olursa, o zaman biter.


3
Lütfen bir şeyin tasarımının bir cevap almayı gerçekten engelleyebileceğini ve böylece yanıtın işe yarayan bir şeye geçiş yapabileceğini unutmayın . Ve bu gerçek bir cevap.
user2284570

1
Aynı düşünceye sahiptim, şimdi biraz daha dengeli bir bakış açısına sahibim. Systemd, öldürülmesi gerekenleri gerçekten öldürebilmesi için çok büyük bir avantaja sahiptir . Bunun nedeni, çekirdek çatal grubu özelliğiyle tüm çatal alt işlemlerini izlemesidir. Eski araçların hiçbiri bunu yapamaz. Dahası, /etc/init/*.sh?I içindeki senaryoların saçmalıklarını da hatırlıyor musunuz, ama bugün benim için sadece kötü bir anı. Systemd servis dosyaları temiz ve yaklaşık 10 satır uzunluğunda yapılandırmalar var . 200 satır uzunluğunda komut dosyaları değil . Bu büyük avantajlar sisteme sahip, diğer tüm özelliklerinin dezavantajlı olduğuna katılıyorum.
peterh Monica

Btw, cevabınızı oy kullandım, çünkü avantajlarının yanı sıra, tam da bu tür eleştirmenler, tam olarak bu tonda, sistem geliştirmenin iyileştirmesi gereken şey budur. Örneğin, chroot'ta postgresql başlatmaya çalıştım ve bunu yapmak için kök sistemimi yıkmak zorunda kaldım. Çok, çok berbat şey hala orada, doğru.
peterh, Monica

@peterh: Maalesef herkes paylaşmıyor, gönderiyi silme demek istiyorum. Bu, Systemd'ye karşı SysV init ile ilgili değil, Openrc ve hatta Upstart gibi şeylere karşı daha fazladır (kısa başlatma komut dosyalarının yanı sıra paralel hizmet başlangıcı için izin verir). En azından bir şey öğrendim: Darwin çoğunlukla Apple ™ Windows Microsoft Microsoft Linux ve Linux tasarım çoğunlukla kırmızı şapka ile çalıştırılıyor. SysV init daha yavaş olsa da, çalışma zamanında yapabilecekleriniz konusunda sizi kısıtlamıyor.
user2284570

OpenRC kullandığınızda @peterh Hizmetleri komut dosyaları da çok açık. Systemd'de cgroup'un sorunu, Systemd'nin Darwin veya NetBSD gibi şeyleri çalıştırmasını engelleyen bir seçenek değildir.
user2284570

3

Hayır. Servisler doğrudan sistemctl ile değil (sadece bir başlangıç ​​isteği gönderir) ve systemd chroot'un dışında çalıştığından servisd.

Her ne kadar teknik olarak bunu gerçekleştirmek mümkün olsa da (systemctl'i bir şekilde kökünden sistemd'e geçirerek), tam kaplar oluşturmak için bir araç zaten bulunduğundan, olması muhtemel değildir systemd-nspawn /somepath/to_root. Yine de posta listesine her zaman ulaşabilirsiniz .


1
Güzel, ama benim ana bilgisayar sistemim oepnrc kullandığından beri systemctl kullanmam gerekiyor. Tam bağımsız bir çözüm istiyorum
user2284570

3
Söyleyerek suları çamurlayacağım: Psst! Mansiyon RootDirectory=bu kadar tehlikeli kısa upvotes ait olduğundan da. (-:
JdeBP

@JdeBP: değişken beetween (sonuçların vadede) fark nedir RootDirectoryve chrootkomuta?
user2284570,

@grawity: Öyleyse pid 1init ise ne ekler ?
user2284570

1

Bu sorunla karşılaştığınızda, ağ yapılandırmasını kullanarak chroot'tan ağ yapılandırmasını kullanarak kurtarma modunda ağı açmaya çalıştım. Sonunda bu benim için çalışıyor:

service --skip-redirect <service> restart

veya:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

Güzel. Ancak yalnızca eski Init uyumlu servislerle çalışır (Fedora rawhide'de ağ oluşturma için çalışmaz) . Cevabımda dediğim gibi asıl çözüm, systemd kullanan her şeyi mahvetmek.
user2284570

0

Soket etkinleştirme ile inetd tarzı bir servis başlatıyorsanız, hem chroot hem de binary'inizi inetd tarzı bir başlatma hedefi olarak belirten bir yapılandırma dosyasıyla stunnel başlatmayı düşünün.

SELINUX sorunları olabileceğini unutmayın. Oracle Linux 7.1 sisteminde, okumak için gereken stunnel'ın tüm dosyalarında "chcon -v --type = stunnel_etc_t" yazmam gerekti.

Soketin istemci tarafında TLS şifrelemesini kullanmanız gerekir (örn., Config içinde "client = yes" olan başka bir sersem). Bu konuda daha fazla ayrıntı istersen haberim olsun.


Hayır d-bus gibi şeyler hakkında. Hedef chroot'taki sorunları teşhis etmek için yapıyorum.
user2284570 14:15

-1

nohupChroot'ta servisleri başlatmak için komutu kullanabilirsiniz . httpdMesela servisi başlatmak için böyle yaparım.

nohup httpd /dev/null &

durdurmak için pkill httpd


Sadece yüklü ikili sistemd betiği tarafından başlatılabilen Dbus gibi hizmetler ne durumda?
user2284570,

Bu tür hizmetleri start komutuyla dizinden başlatabilirsiniz.
ellooku

Hangi systemctl'ye karşı bir sembolik bağlantıdır. Yani işe yaramıyor.
user2284570,

Bunu her zaman Fedora'da Android'imde çalışarak yapıyorum. Belki de senin sorunun ne bilmiyorum.
ellooku

Sonucu bu mesajı şöyledir: Running in chroot, ignoring request.. Chroot olsa her zaman yaptığını sanmıyorum. Gerçekten, başlangıç ​​betiği systemd gerektirir.
user2284570,
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.