sistemde sıralama döngülerini hata ayıklamak için genel metodoloji


23

Ben farkındayım ipliği takip ve sözde bir buna cevap . Bir cevap dışında genel anlamda bir cevap değildir. Sorunun ne olduğunu belli bir durumda anlatıyor, ancak genel olarak değil.

Sorum şu: Sipariş döngülerini genel bir şekilde ayıklamanın bir yolu var mı? Örneğin: çevrimi tanımlayacak bir komut var mı ve bir birimi diğerine ne bağlar?

Örneğin, aşağıdakileri takip ettim journalctl -b(lütfen tarihi dikkate almayın, sistemimin zaman senkronize edebileceği bir RTC yok):

Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

cvol.service (tanıtılan ve çevrimi kıran):

[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***

[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount

Journalctl 'e göre, cvol.service basit bir hizmet istemiyor, ancak bunun dışında en azından belli değil. Bu bağlantının nereden kaynaklandığını gösteren bir komut var mı? Ve genel olarak, döngüleri bulabilecek ve döngüdeki her bağlantının nereden geldiğini gösterecek bir komut var mı?

Yanıtlar:


20

Bu bağlantının nereden kaynaklandığını gösteren bir komut var mı?

Yapabileceğiniz en yakın şey, systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.servicebelirli bir birim için sonuçta ortaya çıkan (etkili) bağımlılık listelerini göstermektir.

döngüleri bulup döngüdeki her bağlantının nereden kaynaklandığını gösteren bir komut var mı?

Bildiğim kadarıyla, böyle bir komut yoktur. Aslında systemd, hata ayıklama sipariş döngülerinde (iç çekiş) yardımcı olacak hiçbir şey sunmaz.

Journalctl 'e göre, cvol.service basit bir hizmet istemiyor, ancak bunun dışında en azından belli değil.

İlk olarak, gereksinim bağımlılıkları ( Wants=, Requires=, BindsTo=vs) sipariş bağımlılıklar (bağımsızdır Before=ve After=). Burada gördüğünüz, bir sipariş bağımlılığı döngüsüdür, yani bununla hiçbir ilgisi yoktur Wants=.

İkincisi, belirli tipteki birimler arasında yaratılmış bir dizi "varsayılan bağımlılık" vardır. Bölümde DefaultDependencies=direktif ile kontrol edilirler [Unit]( varsayılan olarak etkindirler ).

Özellikle, bu yönerge açıkça devre dışı bırakılmadıkça, herhangi bir tür .servicebirim tam olarak gördüğünüz gibi örtük Requires=basic.targetve After=basic.targetbağımlılıklar kazanır . Bu systemd.service (5) belgelenmiştir .


Aldığınız emir mükemmel bir şekilde çalıştı ve gerçekten basic.target'a olan bağımlılığı ortaya çıkardı. Bu systemctl için araç grubu bu yüzden eksik, ama oh, yeni bir proje bu bir utanç
galets

2
@galets: Tecrübelerime bakılırsa, bu kadar kıtlıktan çok az örnek var. Bu arada, aslında, systemd-analyze verify UNITünitenin doğruluğunu kontrol etmek için kullanabilirsiniz . Sahnelerin arkasında, bu komut sanal bir sistem örneği oluşturur ve verilen UNIT'i ilk işlem olarak (öyleymiş gibi) yüklemeye çalışır default.target. Bu herhangi bir yeni bilgiyi açığa çıkarmayacak (kayıtlara kıyasla), ancak en azından başarısız olup olmadığını görmek için ünite etkinken yeniden başlatmanız gerekmeyecek.
intelfx


20

Sen komutlarla döngüsü görselleştirmek systemd-analyze verify, systemd-analyze dotve GraphViz dot aracı:

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

Böyle bir şey görmelisin:

görüntü tanımını buraya girin

Burada çevrimi görebilirsiniz: c.service->b.service->a.service->c.service

Color legend: 
    black     = Requires
    dark blue = Requisite
    dark grey = Wants
    red       = Conflicts
    green     = After

Bağlantılar:


systemd-analyze verifyBurada bir debian 8 kurulumunda mevcut değil.
sjas

@sjas, o zamandan beri systemd-analyze verify mevcutv216 . dene systemd-verify. Var mı
Evgeny Vereshchagin


1
systemd-analyze verify default.targetkendi başına döngüyü göstermek için iyi bir iş çıkarıyor ...
Gert van den Berg

0

1. adım: default.target için doğrulama komutunu çalıştırın

systemd-analyze verify default.target

Adım 2: "systemd İşi silerek sipariş döngüsünü sonlandırma" mesajında ​​belirtilen servis veya hedefi gözlemleyin ve bağımlılık listesini görüntüleyin

systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After <service or target name mentioned in the "breaking cycle" message>

Adım 3: Genelde tanımlanmış olan servis veya hedef dosya içindeki gruplardan "sonra" ve "önce" 'ye bakın.

/lib/systemd/system

ve sırayla iyi bilinen, ancak bunun için giden sırada olan hizmetleri veya hedefleri bulun.

örnek:

dbus.service

genellikle "sonra" pazar

multi-user.target

ama "önce"

sockets.target

böyle bir bağımlılık arayarak kolayca gözlenebilir

systemctl list-dependencies default.target

ancak eğer dosya

/lib/systemd/system/dbus.service

gibi satırları içerir:

Before=multi-user.target

veya

After=sockets.target

veya aynı anda her ikisi de, dbus.service'in giden olarak tanımlandığı ve sistemin sonsuz bir döngüye neden olduğu anlamına gelir.

kür basittir - değişiklik sözcüğü "Sonra" için "Önce" ve tersi gerekirse.

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.