Bagaimana systemd menggunakan skrip /etc/init.d?

120

Saya baru saja beralih ke debian jessie, dan sebagian besar hal berjalan baik-baik saja, termasuk manajer tampilan grafis saya wdm.

Masalahnya, saya hanya tidak mengerti bagaimana ini bekerja. Jelas /etc/init.d/wdmskrip saya dipanggil, karena ketika saya meletakkan awal exitdi sana, wdm tidak dimulai. Tetapi ketika saya secara alternatif mengganti nama direktori /etc/rc3.d (runlevel default saya dulu 3), maka wdm masih dimulai.

Saya tidak dapat menemukan bagaimana systemd menemukan skrip ini dan saya tidak mengerti apa fungsinya terhadap semua skrip init.d lainnya.

  • Kapan dan bagaimana systemd menjalankan skrip init.d?
  • Dalam jangka panjang, haruskah saya menyingkirkan semua skrip init.d?
Martin Drautzburg
sumber

Jawaban:

166

jawaban chaos adalah apa yang dikatakan beberapa dokumentasi. Tetapi sebenarnya bukan itu yang dilakukan systemd. (Hal ini tidak apa van Smoorenburg rclakukan, baik. Van Smoorenburgrc paling pasti tidak mengabaikan LSB header, yang insservdigunakan untuk menghitung orderings statis, untuk pemula.) The Freedesktop dokumentasi, seperti bahwa "Tidak kompatibel" halaman, sebenarnya salah, pada ini dan poin lainnya. (The HOMEvariabel lingkungan sebenarnya adalah sering diatur, misalnya. Hal ini berlangsung sepenuhnya didokumentasikan di mana saja untuk waktu yang lama. Ini sekarang didokumentasikan dalam manual, setidaknya, tapi itu halaman Freedesktop WWW masih belum diperbaiki.)

Format layanan asli untuk systemd adalah unit layanan . manajemen layanan systemd yang tepat hanya beroperasi dalam hal yang, yang dibaca dari salah satu dari direktori di mana (sistem-lebar) .servicefile dapat hidup. /etc/systemd/system, /run/systemd/system, /usr/local/lib/systemd/system, Dan /usr/lib/systemd/systemempat dari direktori tersebut.

Kompatibilitas dengan rcskrip van Smoorenburg dicapai dengan program konversi, bernama systemd-sysv-generator. Program ini terdaftar di /usr/lib/systemd/system-generators/direktori dan dengan demikian dijalankan secara otomatis oleh systemd di awal proses bootstrap di setiap boot, dan sekali lagi setiap kali systemd diperintahkan untuk memuat ulang konfigurasinya nanti.

Program ini adalah generator , sejenis utilitas tambahan yang tugasnya membuat file unit layanan dengan cepat, dalam tmpfs di mana tiga direktori lainnya (yang dimaksudkan hanya untuk digunakan oleh generator) berada. systemd-sysv-generatormenghasilkan unit layanan yang menjalankan rcskrip van Smoorenburg dari /etc/init.d, jika tidak menemukan unit layanan systemd asli dengan nama yang sudah ada di enam lokasi lainnya.

manajemen layanan systemd hanya tahu tentang unit layanan. Unit layanan yang dihasilkan secara otomatis ini ditulis untuk memohon rcskrip van Smoorenburg . Mereka memiliki, antara lain:

[Satuan]
SourcePath = / etc / init.d / wibble
[Layanan]
ExecStart = / etc / init.d / wibble mulai
ExecStop = / etc / init.d / wibble berhenti

Hikmat yang diterima adalah bahwa rcskrip van Smoorenburg harus memiliki header LSB, dan dijalankan secara paralel tanpa menghormati prioritas yang diberlakukan oleh /etc/rc?.d/sistem. Ini tidak benar di semua titik.

Bahkan, mereka tidak perlu memiliki LSB header, dan jika mereka tidak systemd-sysv-generatordapat mengenali header RedHat komentar berusia lebih terbatas ( description:, pidfile:, dan sebagainya). Selain itu, dengan tidak adanya header LSB akan jatuh kembali ke isi /etc/rc?.dtambak link simbolik, membaca prioritas yang disandikan ke dalam nama tautan dan membangun sebelum / setelah memesan dari mereka, membuat serial layanan. Tidak hanya header LSB bukan persyaratan, dan tidak hanya mereka sendiri menyandikan sebelum / setelah memesan yang membuat serial hal-hal sampai batas tertentu, perilaku mundur dalam ketidakhadiran lengkap mereka sebenarnya adalah operasi signifikan yang tidak paralel.

Alasan yang /etc/rc3.dtampaknya tidak penting adalah bahwa Anda mungkin mengaktifkan skrip tersebut melalui /etc/rc?.d/direktori lain . systemd-sysv-generatormenterjemahkan yang tercantum dalam salah satu /etc/rc2.d/, /etc/rc3.d/dan /etc/rc4.d/menjadi native Wanted-Byhubungan dengan systemd ini multi-user.target. Level run "usang" di dunia systemd, dan Anda bisa melupakannya.

Bacaan lebih lanjut

JdeBP
sumber
2
Di Debian direktori system-generator tidak tinggal di / usr / lib, tetapi / lib packages.debian.org/sid/amd64/systemd/filelist
Braiam
5
Ini adalah jawaban yang sangat bagus. Bagus, tuan.
petugas keamanan
1
Terima kasih, terima kasih, terima kasih untuk ini! Berurusan dengan campuran sistem Debian 8 dan RH / CentOS 7 telah membuat manajemen ketergantungan layanan SysVInit vs Systemd sedikit sakit kepala, tetapi penjelasan tentang apa yang dilakukan systemd telah sangat membantu pemahaman saya.
Toby
Generator ini berfungsi. Saya juga menyebutkan, untuk pengikut, bahwa jika Anda memiliki versi yang lebih lama systemddan skrip /etc/init.d tidak disetel ke "boot saat mulai" itu masih akan berfungsi seperti yang diharapkan tetapi tidak akan muncul di daftar show-units: unix.stackexchange.com/a/518894/8337
rogerdpack
Generator ini berfungsi. Saya juga menyebutkan, untuk pengikut, bahwa jika Anda memiliki skrip systemd dan /etc/init.d versi yang lebih lama yang tidak disetel ke "boot saat mulai" itu masih akan mulai / berhenti seperti yang diharapkan menggunakan systemctl tetapi menang tidak dapat muncul di daftar unit pertunjukan: unix.stackexchange.com/questions/517872/... juga NB bahwa Anda pada dasarnya "tidak dapat" mengontrol layanan ini dengan menjalankan /etc/init.d/xx secara langsung lagi atau systemd mendapat ... bingung apa yang sedang berjalan dan yang tidak: |
rogerdpack
17

Systemd kompatibel dengan skrip init SysV. Menurut LSB 3.1, skrip init harus memiliki Konvensi Komentar informasional , yang menentukan kapan skrip harus memulai / berhenti dan apa yang diperlukan agar skrip mulai / berhenti. Ini adalah sebuah contoh:

### BEGIN INIT INFO
# Provides: my-service
# Required-Start: $local_fs $network $remote_fs
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop service my-service
# Description: my-service blah blah ...
### END INIT INFO

Ini adalah bagian yang dikomentari yang diabaikan oleh SysV. Di sisi lain, systemd membaca informasi dependensi itu dan menjalankan skrip-skrip itu tergantung pada itu.

Tetapi ada satu titik, di mana systemd dan SysV berbeda dalam hal skrip init. SysV mengeksekusi skrip dalam urutan berurutan berdasarkan nomor mereka dalam nama file. Systemd tidak. Jika dependensi terpenuhi, systemd langsung menjalankan skrip, tanpa menghormati penomoran nama skrip. Beberapa dari mereka kemungkinan besar akan gagal karena pemesanan. Ada banyak ketidakcocokan lain yang harus dipertimbangkan.


Jika ada skrip init dan file .service untuk layanan yang sama, systemd akan menjalankan keduanya, segera setelah dependensi terpenuhi (dalam hal skrip init, yang ditentukan dalam header LSB).

kekacauan
sumber
Oke, tapi saya juga punya banyak file .service di / lib / systemd / system /. Apa yang sebenarnya dieksekusi oleh systemd? Apa pun yang ditentukan dalam file layanan (dalam urutan ketergantungan), skrip init.d atau keduanya?
Martin Drautzburg
@ MartinDrautzburg Saya menambahkan itu ke jawabannya
kekacauan
1
Sebagai catatan pinggir, Debian baru saja mengumumkan untuk membuang kompatibilitas LSB: article.gmane.org/gmane.linux.debian.devel.lsb/1103
Jan
systemd adalah apa saja TETAPI kompatibel dengan skrip SysV. Tidak hanya pernyataan itu salah, tetapi tautan yang direferensikan memperjelas bahwa itu hanya "sebagian besar kompatibel" dan jumlah upaya yang diperlukan untuk menghasilkan hasil yang sama sangat besar.
Julie di Austin