Saya menyadari mengikuti utas dan seharusnya jawaban untuknya . Kecuali jawaban bukanlah jawaban dalam arti umum. Ini menceritakan apa masalahnya dalam satu kasus tertentu, tetapi tidak secara umum.
Pertanyaan saya adalah: apakah ada cara untuk men-debug siklus pemesanan dengan cara yang umum ? Misalnya: apakah ada perintah yang akan menggambarkan siklus dan apa yang menghubungkan satu unit ke unit lainnya?
Sebagai contoh, saya telah mengikuti journalctl -b
(tolong abaikan tanggal, sistem saya tidak memiliki RTC untuk menyinkronkan waktu dengan):
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
di mana cvol.service (yang diperkenalkan, dan yang memutus siklus) adalah:
[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
Menurut journalctl, cvol.service menginginkan basic.service, kecuali itu tidak, setidaknya tidak jelas. Apakah ada perintah yang akan menunjukkan dari mana tautan ini berasal? Dan secara umum, apakah ada perintah, yang akan menemukan siklus dan menunjukkan di mana setiap tautan dalam siklus berasal?
systemd-analyze verify UNIT
untuk memeriksa kebenaran unit. Di belakang layar, perintah ini membuat instance virtual systemd dan mencoba memuat UNIT yang diberikan sebagai transaksi awal (seolah-olah memang demikiandefault.target
). Ini tidak akan mengungkapkan informasi baru (dibandingkan dengan log), tetapi setidaknya Anda tidak perlu reboot dengan unit yang diaktifkan untuk melihat apakah itu gagal.Anda bisa memvisualisasikan siklus dengan perintah
systemd-analyze verify
,systemd-analyze dot
dan alat GraphVizdot
:Anda harus melihat sesuatu seperti ini:
Di sini Anda dapat melihat siklus:
c.service->b.service->a.service->c.service
Tautan:
sumber
systemd-analyze verify
tidak ada di sini pada instalasi debian 8.systemd-analyze verify
tersedia sejakv216
. cobasystemd-verify
. Apakah itu adasystemd-analyze verify default.target
sendiri melakukan pekerjaan yang layak dalam menunjukkan loop ...langkah 1: jalankan perintah verifikasi untuk default.target
langkah 2: amati layanan atau target mana yang disebutkan dalam pesan "systemd Memutus siklus pemesanan dengan menghapus pekerjaan" dan menampilkannya daftar ketergantungan lengkap
langkah 3: lihat grup "setelah" dan "sebelum" di dalam layanan atau file target yang biasanya didefinisikan dalam
dan menemukan layanan atau target yang dikenal sebagai berurutan tetapi dalam urutan keluar untuk yang satu ini.
contoh:
biasanya memasarkan "setelah"
tapi "sebelum"
ketergantungan seperti itu dapat dengan mudah diamati dengan menelepon
Namun jika file tersebut
mengandung garis seperti:
atau
atau keduanya secara bersamaan, berarti dbus.service didefinisikan keluar dan itu menyebabkan siklus tak berujung systemd.
yang menyembuhkan sederhana - perubahan kata "Setelah" untuk "Sebelum" dan sebaliknya jika diperlukan.
sumber