Systemd agresif acil kabuk davranışı nasıl devre dışı bırakılır?


10

Varsayılan olarak systemd, en ufak bir hata ile bir acil durum kabuğuna düşer. Örneğin, fstab üzerindeki bağlantılardan biri herhangi bir nedenle başarısız olursa, sistem hemen önyükleme yapamaz hale gelir. Düzinelerce farklı üretim sistemini yönetiyorum ve bu davranışı çok zararlı buldum. (Aslında bunun büyük bir tasarım hatası olduğunu düşünüyorum, ancak bu kişisel bir görüş).

Sistem önyükleme direncini artırmak istiyorum. Optimal olarak, sistem her zaman önyükleme yapmalı, eksik sürücüler, bağlar, vb. Ne çalıştırılabilir, bu çalıştırılmalıdır.

Ben systemd otomatik olarak / etc / fstab * .mount dosyaları oluşturur biliyorum ve küçük x-systemd.device zaman aşımı ile nofail seçeneği kullanabilirsiniz (veya kendimi ilgili .mount dosyaları tanımlamak). Ancak sorunumu çözmezdi, sistemi daha dayanıklı hale getirmek istiyorum, her seferinde "yama" fstab çok uygun değil ve sistemimi önyükleme yapamayacak kadar kaç olası "sorun" olduğundan emin değilim bazı geliştiriciler bunun yeterince önemli olduğunu düşündüler.

Sıralı olarak, makinem üzerindeki kontrolü yeniden kazanmak ve sistemin hangi sorunun önyükleme sürecini ezecek kadar ciddi olduğuna karar vermesine izin vermem. Mümkün mü?


asıl sorun nedir btw? Ben iki farkındayım - ssh üzerinden giriş yapamıyorum ve sulogin istemi sadece kök, sudo kullanıcıları değil, acil modda erişim elde etmek için izin verir. Bunlar, yaşadığınız zararları kapsıyor mu?
sourcejedi

Aslında, bu iki hizmet başlatılacaksa sistem çok daha erişilebilir olurdu, evet. Optimal olarak sistem , eski SysV zamanlarında (acil durum kabuğu tarafından ağrılı ölüm yerine hata günlüğü) olduğu gibi başlatılabilecek her şeyi başlatmalı ve sadece ölümcül hata durumunda kabuğu başlatmalıdır.
goteguru

Yanıtlar:


7

Kelimenin tam anlamıyla sadece montaj hataları, değiştirmeniz gereken tek şey bu.

Bu nedenle, isteğinizin mektubu cevaplamak önemsiz olacaktır. Bir drop-in dosyası oluşturun:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

Bunun, kısmi başarısızlık senaryosuna izin vererek linux sysvinit'in zaten acı çektiğinin ötesinde yeni bir sorun eklemeyeceğine inanıyorum.


Bununla birlikte , belirtilen blok cihazların kullanılabilir olmasını beklemek için systemd'in ne kadar süre beklemesi gerektiğini de belirttiniz. Bir bütün olarak fstab jeneratörünü değiştirmeden bunu yapılandırmanın bir yolunu göremiyorum. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Buraya çok daha az yaygın olarak kullanılan bir kod dökerseniz, sistemin esnekliğini artırmanız olası görünmüyor. Bence en yakın çözüm mevcut fstab jeneratörünü düzeltmek olacak Çok karmaşık değil, bundan kurtulabileceğiniz / önemli değişikliklere ayak uydurabileceğinizden şüpheleniyorum.

Teknik olarak, dağıtımınızda bağımsız bir mountallsysvinit betiği varsa, bunu takmayı deneyebilirsiniz. Ancak, bu önyükleme işlemini önemli ölçüde değiştirecektir - aslında daha çok bir çatal. Ben bu yaklaşımı tavsiye etmem.


https://unix.stackexchange.com/a/393711/29483

Birim dosyaları arasında arama yaparsanız, önyüklemenin geri düşmesinin çok az yolu vardır emergency.target. Genellikle .mountyerel bir dosya sistemi için bir birim başarısız olduğunda başarısızlığa neden local-fs.target olur. Veya initramf'leriniz root dosya sistemini bağlayamazsa, initramf'leriniz systemd kullanıyorsa.

local-fs.targetvardır OnFailure=emergency.target. Ayrıca, yerel dosya sistemleri için birimler local-fs.target Gereken listesine otomatik olarak eklendiğinden başarısız olur DefaultDependencies=no.

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount

2
Sanırım [Unit]\nOnFailure= nofail.conf dosyama koymalıyım. /Etc/systemd/system.conf dosyasında bekleme süresini yapılandırmak mümkün görünüyor (jenerik DefaultTimeoutStartSec seçeneği ile). Sistemlerim genellikle yeterince hızlı, 90'lar zaten aşırıya kaçmış gibi görünüyor. Bu çözüm umut vericidir.
goteguru

Benim durumumda ben set OnFailure=içinde /lib/systemd/system/local-fs.targetyerine /etc/systemd(AWS üzerinde Ubuntu 16.04)
ThiagoAlves

Bunu yapmamalısınız, sistem yükseltmelerinin üzerine yazılacaktır. Cevaptaki talimatları izleyin veya açıklama isteyin :-).
sourcejedi

@sourcejedi Cevabı denedim ama benim için çalışmadı
ThiagoAlves

1
@ThiagoAlves Geri bildiriminiz için teşekkür ederiz. Cevabı daha az belirsiz hale getirdim, bu yüzden sorunun olup olmadığı konusunda daha net olabiliriz. Yani, daha [Unit]önce dahil ettiğinizden emin olup olmadığınızı merak ediyorum OnFailure=.
sourcejedi

0

Girişine bir noautobağlama seçeneği ekleyerek önyükleme işlemi için gerekli olmayan herhangi bir dosya sisteminin otomatik montajını kapatın /etc/fstab:

/dev/sdxy /u01 nfs defaults 0 0

için:

/dev/sdyx /u01 nfs noauto 0 0

ve ardından bir satır kullanarak dosya sistemini önyüklemeden sonra bağlayın /etc/rc.local:

mount /u01

Bu örnek NFS kullanır, ancak bir dosya sunucusundan içe aktarılan LUN'lar için de geçerlidir.


1
Evet, noauto'yu biliyorum, ama fstab'ı her seferinde değiştirirsem nofail daha iyi bir seçim olurdu. Yine de teşekkürler.
goteguru

0

Belki dene?

systemctl mask emergency.service
systemctl mask emergency.target

4
Bunu denedin mi? Acil durum hedefi maskelenmişken, sistem önyükleme sırasında bir hatayla karşılaştığında ne olur?
Stephen Kitt
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.