Tampaknya systemd adalah sistem init baru panas di blok, sama seperti Upstart beberapa tahun yang lalu. Apa pro / kontra untuk masing-masing? Juga, bagaimana masing-masing dibandingkan dengan sistem init lainnya?
Tampaknya systemd adalah sistem init baru panas di blok, sama seperti Upstart beberapa tahun yang lalu. Apa pro / kontra untuk masing-masing? Juga, bagaimana masing-masing dibandingkan dengan sistem init lainnya?
Jawaban:
Sebagian besar jawaban di sini berusia lima tahun sehingga sudah waktunya untuk beberapa pembaruan.
Ubuntu digunakan untuk menggunakan pemula baru secara default tetapi mereka meninggalkannya tahun lalu demi systemd - lihat:
Karena itu ada artikel bagus Systemd untuk Pengguna Baru di Ubuntu wiki - perbandingan yang sangat terperinci antara pemula dan systemd dan panduan transisi dari pemula ke systemd.
(Perhatikan bahwa menurut wiki Ubuntu Anda masih dapat menjalankan pemula pada versi saat ini dari Ubuntu secara default dengan menginstal upstart-sysv
dan menjalankan sudo update-initramfs -u
tetapi mempertimbangkan ruang lingkup proyek systemd saya tidak tahu cara kerjanya dalam praktik, atau apakah systemd atau tidak mungkin untuk dihapus.)
Sebagian besar info di bagian Perintah dan Skrip di bawah ini diadaptasi dari beberapa contoh yang digunakan dalam artikel itu (yang dilisensikan dengan mudah seperti kontribusi pengguna Stack Exchange di bawah Lisensi Creative Commons Attribution-ShareAlike 3.0 ).
Berikut ini adalah perbandingan cepat dari perintah umum dan skrip sederhana, lihat bagian di bawah ini untuk penjelasan terperinci. Jawaban ini membandingkan perilaku lama sistem berbasis pemula dengan perilaku baru sistem berbasis systemd, seperti yang ditanyakan dalam pertanyaan, tetapi perhatikan bahwa perintah yang ditandai sebagai "pemula" tidak selalu khusus-pemula - mereka sering perintah yang adalah umum untuk setiap sistem Linux dan Unix non-system.
su
machinectl shell
(lihat bagian "penggantian perintah su" di bawah)
screen
systemd-run --user --scope screen
(lihat bagian "Pembunuhan proses latar belakang yang tidak terduga" di bawah)
tmux
systemd-run --user --scope tmux
(lihat bagian "Pembunuhan proses latar belakang yang tidak terduga" di bawah)
start foo
systemctl start foo
stop foo
systemctl stop foo
restart foo
systemctl restart foo
initctl list
systemctl status
init-checkconf /etc/init/foo.conf
systemd-analyze verify /lib/systemd/system/foo.service
initctl list-env
systemctl show-environment
initctl set-env foo=bar
systemctl set-environment foo=bar
initctl unset-env foo
systemctl unset-environment foo
Di pemula, log adalah file teks normal di direktori / var / log / pemula, sehingga Anda dapat memprosesnya seperti biasa:
cat /var/log/upstart/foo.log
tail -f /var/log/upstart/foo.log
Dalam systemd log disimpan dalam format biner internal (bukan sebagai file teks) sehingga Anda perlu menggunakan journalctl
perintah untuk mengaksesnya:
sudo journalctl -u foo
sudo journalctl -u foo -f
Contoh skrip pemula yang ditulis dalam /etc/init/foo.conf
:
description "Job that runs the foo daemon"
start on runlevel [2345]
stop on runlevel [016]
env statedir=/var/cache/foo
pre-start exec mkdir -p $statedir
exec /usr/bin/foo-daemon --arg1 "hello world" --statedir $statedir
Contoh skrip systemd ditulis dalam /lib/systemd/system/foo.service
:
[Unit]
Description=Job that runs the foo daemon
Documentation=man:foo(1)
[Service]
Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}
[Install]
WantedBy=multi-user.target
Sebuah su
pengganti perintah dilebur ke systemd di tarik permintaan # 1022:
karena, menurut Lennart Poettering, "su benar-benar konsep yang rusak" .
Dia menjelaskan bahwa "Anda dapat menggunakan su dan sudo seperti sebelumnya, tetapi jangan berharap itu akan bekerja secara penuh " .
Cara resmi untuk mencapai su
perilaku seperti sekarang adalah:
machinectl shell
Ini telah dijelaskan lebih lanjut oleh Lennart Poettering dalam diskusi untuk mengeluarkan # 825:
"Yah, sudah ada diskusi panjang tentang ini, tetapi masalahnya adalah apa yang seharusnya dilakukan su sangat tidak jelas. [...] Singkat cerita: su benar-benar konsep yang rusak. Ini akan memberi Anda semacam shell , dan tidak apa-apa menggunakannya untuk itu, tapi itu bukan login penuh, dan tidak boleh salah dengan itu. " - Lennart Poettering
Lihat juga:
Perintah seperti:
tidak lagi berfungsi seperti yang diharapkan . Misalnya, nohup
adalah perintah POSIX untuk memastikan bahwa proses terus berjalan setelah Anda keluar dari sesi Anda. Tidak lagi berfungsi pada systemd. Juga program-program seperti screen
dan tmux
perlu dipanggil dengan cara khusus atau jika tidak , proses yang Anda jalankan dengan mereka akan terbunuh (sementara proses-proses tersebut tidak terbunuh biasanya merupakan alasan utama menjalankan layar atau tmux di tempat pertama).
Ini bukan kesalahan, itu adalah keputusan yang disengaja, sehingga tidak mungkin diperbaiki di masa depan. Ini adalah apa yang Lennart Poettering mengatakan tentang masalah ini:
Dalam pandangan saya itu sebenarnya cukup aneh dari UNIX bahwa secara default biarkan kode pengguna yang sewenang-wenang tetap tidak dibatasi setelah keluar. Sudah dibahas sejak lama di antara banyak orang OS, bahwa ini seharusnya mungkin tetapi tentu saja bukan default, tetapi tidak ada yang berani sejauh ini untuk membalik saklar untuk mengubahnya dari default ke opsi. Tidak membersihkan sesi pengguna setelah logout tidak hanya jelek dan agak meretas tetapi juga masalah keamanan. systemd 230 sekarang akhirnya membalik saklar dan akhirnya secara default membersihkan semuanya dengan benar ketika pengguna logout.
Untuk info lebih lanjut, lihat:
Dengan cara systemd bekerja mundur - dalam pekerjaan pemula mulai segera setelah mereka bisa dan dalam pekerjaan systemd mulai ketika mereka harus. Pada akhirnya, pekerjaan yang sama dapat dimulai oleh kedua sistem dan dalam urutan yang hampir sama, tetapi Anda memikirkannya dengan melihat dari arah yang berlawanan.
Berikut ini penjelasan Systemd untuk Pengguna Baru :
Upstart Model 's untuk memulai proses (pekerjaan) adalah 'serakah acara berbasis', pekerjaan yaitu semua tersedia yang startup peristiwa terjadi dimulai sedini mungkin. Selama boot, pemula mulai mensintesis beberapa peristiwa awal seperti startup atau rcS sebagai "root pohon", layanan awal dimulai, dan layanan kemudian mulai ketika yang pertama berjalan. Pekerjaan baru hanya perlu menginstal file konfigurasinya ke / etc / init / untuk menjadi aktif.
model systemd untuk memulai proses (unit) adalah "berbasis ketergantungan malas", yaitu sebuah unit hanya akan mulai jika dan ketika beberapa unit awal lainnya bergantung padanya. Selama boot, systemd memulai "root unit" (default.target, dapat ditimpa di grub), yang kemudian diperluas secara transparan dan memulai dependensinya. Unit baru perlu menambahkan dirinya sebagai ketergantungan dari unit dari urutan boot (biasanya multi-user.target) agar menjadi aktif.
Sekarang beberapa data terbaru menurut Wikipedia:
(Lihat Wikipedia untuk informasi terkini)
Di masa lalu, garpu Debian telah diusulkan untuk menghindari systemd . The Devuan GNU + Linux diciptakan - garpu dari Debian tanpa systemd (terima kasih kepada fpmurphy1 untuk menunjuk keluar di komentar).
Untuk info lebih lanjut tentang kontroversi ini, lihat:
Seperti yang mungkin sudah Anda ketahui, suara Debit GR Init yang dipromosikan oleh Ian Jackson tidak berguna untuk melindungi warisan Debian dan penggunanya dari longsoran systemd.
Situasi ini prospek kunci dalam dependensi systemd yang secara de facto mengancam kebebasan pembangunan dan memiliki konsekuensi serius bagi Debian, hulu dan hilirnya.
CTTE berhasil menukar ketergantungan dan memberi kami waktu lebih banyak daripada pemasangan halus systemd daripada sysvinit, tetapi bahkan proses ini melelahkan dan penuh drama. Akhirnya, seminggu yang lalu, Ian Jackson mengundurkan diri. [...]
Saya mengundurkan diri dari Komite Teknis dengan efek langsung.
Meskipun penting bahwa pandangan 30-40% dari proyek yang setuju dengan saya harus terus diwakili dalam TC, saya sendiri jelas terlalu kontroversial pada saat ini. Saya harus minggir untuk mencoba mengurangi sejauh mana percakapan tentang tata kelola proyek dipersonalisasi. [...]
Devuan lahir dari kontroversi atas keputusan untuk menggunakan sebagai sistem init default untuk Debian. The posisi resmi Debian pada systemd penuh klaim yang lain telah debunked . Pembaca yang tertarik dapat terus membahas topik hangat ini dalam kontroversi The systemd . Namun kami mendorong Anda untuk tetap tenang dan suara Anda sopan. Di Devuan kami lebih tertarik memprogram kesalahan mereka daripada melihat ke belakang. [...]
Beberapa situs web dan artikel yang didedikasikan untuk kontroversi systemd telah dibuat:
Ada banyak diskusi menarik tentang Hacker News:
Kecenderungan serupa di distro lain dapat diamati juga:
pemula mengikuti filosofi Unix dari DOTADIW - "Do One Thing and Do It Well." Ini adalah pengganti daemon init tradisional. Itu tidak melakukan apa pun selain memulai dan menghentikan layanan. Tugas-tugas lain didelegasikan ke subsistem khusus lainnya.
systemd melakukan lebih dari itu. Selain memulai dan menghentikan layanan, ia juga mengelola kata sandi, login, terminal, manajemen daya, pengaturan ulang pabrik, pemrosesan log, titik pemasangan sistem file, jaringan dan banyak lagi - lihat file BERITA untuk beberapa fitur.
Menurut Perspektif untuk systemd Apa yang Telah Dicapai, dan presentasi What Lies Ahead oleh Lennart Poettering pada tahun 2014 di GNOME.asia, berikut adalah tujuan utama dari systemd, area yang sudah dicakup dan yang masih dalam proses:
Tujuan kami
- Mengubah Linux dari sekumpulan bit menjadi Sistem Operasi Tujuan Umum yang kompetitif.
- Membangun OS Generasi Berikutnya Internet. Memersatukan perbedaan yang tidak ada artinya antara distribusi
Membawa inovasi kembali ke OS inti
Desktop, Server, Wadah, Tertanam, Mobile, Cloud, Cluster,. . . Area-area ini lebih dekat daripada yang Anda kira
- Mengurangi kompleksitas administrator, keandalan tanpa pengawasan
- Segalanya bisa ditinjau
- Penemuan otomatis, plug and play adalah kuncinya
- Kami memperbaiki hal-hal di mana mereka rusak, tidak pernah menempel padanya
Apa yang sudah kita bahas:
sistem init, jurnal logging, manajemen login, manajemen perangkat, manajemen file sementara dan volatile, registrasi format biner, penyimpanan / pengembalian cahaya latar, penyimpanan / pengembalian rfkill, bootchart, readahead, pengaturan penyimpanan terenkripsi, penemuan partisi EFI / GPT, mesin / wadah virtual pendaftaran, manajemen wadah minimal, manajemen hostname, manajemen lokal, manajemen waktu, manajemen benih acak, manajemen variabel sysctl, manajemen konsol,. . .
Apa yang sedang kami kerjakan:
- manajemen jaringan
- systemd-networkd
- Tembolok DNS lokal, penjawab mDNS, penjawab LLMNR, verifikasi DNSSEC
- IPC di kernel
- kdbus, sd-bus
- Sinkronisasi waktu dengan NTP
- systemd-timesyncd
- Lebih banyak integrasi dengan wadah
- Layanan Pengamplasan
- Sandboxing Aplikasi
- Format Gambar OS
- Format gambar wadah
- Format gambar aplikasi
- GPT dengan penemuan otomatis
- Sistem tanpa kewarganegaraan, sistem instantiatable, reset pabrik
- / usr adalah OS
- / etc adalah konfigurasi (opsional)
- / var adalah status (opsional)
- Inisialisasi dan pembaruan simpul atom
- Integrasi dengan cloud
- Manajemen layanan lintas node
- Gambar OS yang dapat diverifikasi
- Semua jalan ke firmware
- Boot Sedang Memuat
Seperti dicatat fpmurphy1 dalam komentar, "Harus ditunjukkan bahwa systemd telah memperluas cakupan kerjanya selama bertahun-tahun jauh lebih dari sekadar startup sistem."
Saya mencoba memasukkan sebagian besar info yang relevan di sini. Di sini saya membandingkan fitur umum dari Upstart dan systemd ketika digunakan sebagai sistem init seperti yang ditanyakan dalam pertanyaan dan saya hanya menyebutkan fitur systemd yang melampaui ruang lingkup sistem init karena itu tidak dapat dibandingkan dengan Startup, tetapi keberadaannya penting untuk memahami perbedaan antara kedua proyek tersebut. Dokumentasi yang relevan harus diperiksa untuk informasi lebih lanjut.
Info lebih lanjut dapat ditemukan di:
The LinOxide Tim telah menciptakan systemd vs SysV Init Linux Cheatsheet .
service <foo> start/stop/restart/status
masih berfungsi dengan baik. Seperti kebanyakan perangkat lunak unix, systemd menyediakan kompatibilitas perintah dengan standar yang sudah diketahui.
Baik pemula dan systemd adalah upaya untuk memecahkan beberapa masalah dengan keterbatasan sistem init SysV tradisional. Sebagai contoh, beberapa layanan harus memulai setelah layanan lain (misalnya, Anda tidak dapat me-mount sistem file NFS sampai jaringan berjalan), tetapi satu-satunya cara di SysV untuk mengatasinya adalah dengan mengatur tautan di direktori rc # .d sedemikian rupa sehingga yang satu di depan yang lain. Tambahkan itu, Anda mungkin perlu memberi nomor ulang semuanya nanti ketika dependensi ditambahkan atau diubah. Pemula dan Systemd memiliki pengaturan yang lebih cerdas untuk mendefinisikan persyaratan. Juga, ada masalah dengan fakta bahwa semuanya adalah semacam skrip shell, dan tidak semua orang menulis skrip init terbaik. Itu juga berdampak pada kecepatan startup.
Beberapa kelebihan systemd yang bisa saya lihat:
Satu kekurangan yang saya tahu adalah bahwa untuk mengambil keuntungan dari preallokasi socket / FH systemd, banyak daemon harus ditambal agar FH diteruskan kepada mereka oleh systemd.
Saw systemd
disebutkan di Arch General ML hari ini. Jadi bacalah tentang itu. H Online seperti biasa adalah sumber yang bagus untuk Teknologi Linux dan di sinilah saya menemukan tempat saya untuk mulai meneliti Systemd sebagai alternatif SysV Init dan Pemula . Namun artikel H Online (dalam hal ini) bukan merupakan bacaan yang sangat berguna, penggunaan sebenarnya di balik itu adalah memberikan tautan ke bacaan yang bermanfaat.
Jawaban sebenarnya ada di pengumuman systemd . Yang memberikan beberapa poin penting tentang apa yang salah dengan SysV initd, dan apa yang perlu dilakukan sistem baru
Untuk memulai lebih sedikit.
Dan untuk memulai lebih banyak secara paralel.
Rencana utamanya untuk memulai ini adalah memulai layanan hanya sesuai kebutuhan, dan memulai soket untuk layanan itu, sehingga layanan yang memerlukannya dapat terhubung ke soket yang dibuat jauh sebelum daemon sepenuhnya online. Rupanya sebuah socket akan menyimpan sejumlah kecil data buffer yang berarti bahwa tidak ada data yang hilang selama lag, itu akan ditangani segera setelah daemon online.
Bagian lain dari rencana ini tampaknya bukan membuat sistem file berseri, tetapi me-mount-kan mereka yang diminta juga, dengan cara itu Anda tidak menunggu Anda /home/
, dll (jangan dikacaukan dengan /etc
) untuk melakukan mount, dan / atau fsck
ketika Anda bisa mulai daemon sebagai /
dan /var/
lain - lain, sudah terpasang. Dikatakan akan menggunakan autofs untuk tujuan ini.
Ini juga memiliki tujuan untuk menciptakan .desktop
deskriptor init gaya sebagai pengganti skrip. Ini akan mencegah banyak sh
proses lambat dan bahkan lebih banyak proses dari hal-hal seperti sed
dan grep
yang sering digunakan dalam skrip shell.
Mereka juga berencana untuk tidak memulai beberapa layanan sampai diminta, dan mungkin bahkan mematikannya jika tidak diperlukan lagi, modul bluetooth, dan daemon hanya diperlukan saat Anda menggunakan perangkat bluetooth misalnya. Contoh lain yang diberikan adalah daemon ssh. Ini adalah jenis hal yang mampu dilakukan inetd. Secara pribadi saya tidak yakin saya suka ini, karena itu mungkin berarti latensi ketika saya membutuhkannya, dan dalam kasus ssh saya pikir itu berarti kerentanan keamanan yang mungkin, jika inetd saya dikompromikan, seluruh sistem akan menjadi. Namun, saya telah diberitahu bahwa menggunakan ini untuk melanggar sistem ini tidak mungkin dan bahwa jika saya ingin, saya dapat menonaktifkan fitur ini per layanan dan dengan cara lain.
Fitur lain tampaknya akan menjadi kemampuan untuk memulai berdasarkan peristiwa waktu, baik pada interval yang dijadwalkan secara teratur atau pada waktu tertentu. Ini mirip dengan apa crond
dan atd
lakukan sekarang. Meskipun saya diberitahu itu tidak akan mendukung pengguna "cron". Secara pribadi ini terdengar seperti hal yang paling tidak berguna. Saya pikir ini ditulis / dipikirkan oleh orang-orang yang tidak bekerja di lingkungan multiuser, tidak ada banyak tujuan untuk pengguna cron jika Anda satu-satunya pengguna pada sistem, selain tidak berjalan sebagai root. Saya bekerja pada sistem multiuser setiap hari, dan aturannya selalu menjalankan skrip pengguna sebagai pengguna. Tapi mungkin saya tidak memiliki pandangan ke depan yang mereka lakukan, dan itu tidak akan berhasil sehingga saya tidak dapat menjalankan crond
atau atd
, jadi itu tidak menyakiti siapa pun kecuali pengembang saya kira.
Kerugian besar dari systemd adalah bahwa beberapa daemon harus dimodifikasi untuk memanfaatkannya sepenuhnya. Mereka akan bekerja sekarang, tetapi mereka akan bekerja lebih baik jika mereka ditulis khusus untuk model soketnya.
Tampaknya sebagian besar masalah orang-orang systemd dengan pemula adalah sistem acara, dan mereka percaya itu tidak masuk akal atau tidak perlu. Mungkin kata-kata mereka yang terbaik.
Atau untuk membuatnya lebih sederhana: fakta bahwa pengguna baru saja memulai D-Bus sama sekali bukan indikasi bahwa NetworkManager juga harus dimulai (tetapi inilah yang akan dilakukan oleh pemula). Itu benar sebaliknya: ketika pengguna meminta NetworkManager, itu pasti indikasi bahwa D-Bus juga harus dimulai (yang tentunya apa yang diharapkan sebagian besar pengguna, kan?).
Sistem init yang baik harus memulai hanya apa yang dibutuhkan, dan sesuai permintaan. Baik malas atau paralel dan di muka. Namun itu tidak boleh dimulai lebih dari yang diperlukan, terutama tidak semua yang diinstal yang dapat menggunakan layanan itu.
Seperti yang sudah saya katakan ini dibahas jauh lebih komprehensif dalam pengumuman systemd .
Nah satu hal yang sebagian besar dari Anda lupa adalah organisasi proses dalam cgroup .
Jadi jika systemd memulai sesuatu, itu akan menempatkan hal ini dalam kelompok sendiri dan tidak ada (tidak terselamatkan) berarti bagi proses untuk melarikan diri kelompok itu. Inilah konsekuensi dari itu:
Untuk tampilan yang sangat terperinci pada systemd, dimulai dengan draf desain pertama (dan kritik terperinci tentang sistem init yang ada, termasuk pemula, dan bagaimana systemd mengusulkan untuk memperbaikinya), buka beranda . Seiring waktu, ada beberapa artikel tentang startup yang diterbitkan di LWN . Harap diperhatikan bahwa penyebutan systemd (atau pulseaudio) di sana memicu flamewar yang tidak pernah berakhir.
IMVHO (dan sebagai pengguna Fedora) saya sangat senang dengannya. Sesuatu di baris ini sudah lama tertunda untuk menangani kompleksitas sistem Linux saat ini. Fedora menggunakan pemula baru untuk sementara waktu, tetapi tidak pernah keluar dari tahap menjadi pengganti mewah untuk sysvinit, menjalankan skrip init sebagian besar tidak berubah. Janji untuk menyederhanakan konfigurasi boot dikenakan biaya lagisecara manual mengatur saling ketergantungan, dan itu tidak berfungsi. angka-angka systemd dependecies dengan sendirinya (atau hanya memungkinkan hal-hal mulai tanpa memperhatikan dependensi, mereka memilah diri mereka sendiri). Keuntungan besar lainnya (ada yang mengatakan itu adalah kerugian yang parah) adalah bahwa ia mengeksploitasi fitur spesifik Linux ke gagangnya (terutama cgroup memungkinkan mengisolasi daemon dan semua turunannya, sehingga mudah untuk memantau, membatasi sumber daya, atau membunuh mereka sebagai sebuah kelompok; ada banyak lainnya).
Penjurnalan - Systemd secara harfiah seperti folder WinSXS ketika datang ke hal-hal logging, itu menciptakan salinan salinan kecuali jika Anda secara manual menghapus atau mengurangi ukuran file itu akan terus menggerogoti drive Anda. Saya menyebutnya boot loader cookie.