Apa perbedaan antara perintah-perintah ini untuk menjatuhkan server Linux?

65

Membaca "Apa perbedaan antara perintah Stop dan Shutdown?" , Saya umumnya memiliki ide apa yang dilakukan perintah shutdown, dengan atau tanpa opsi -h / -r.

Perintah "hentikan" melakukan matikan sistem untuk menjalankan level 0 sistem.

Perintah "shutdown" melakukan matikan sistem untuk menjalankan level 1 tanpa perintah -h atau -r.

Bagaimana dengan perintah "poweroff" yang digunakan untuk menjalankan level 0 atau 1? Apakah ini satu-satunya perbedaan utama antara ketiga perintah ini?

Win.T
sumber
Ini adalah beberapa hal yang berbeda secara signifikan untuk misalnya Solaris dan FreeBSD. (Di sana mereka biasanya (hampir) segera menghentikan / mematikan server, tanpa mengubah runlevel untuk mematikan barang terlebih dahulu)
Gert van den Berg

Jawaban:

120

Dan sekarang, jawaban systemd.

Anda menggunakan, per tag pada pertanyaan Anda, Red Hat Enterprise Linux. Sejak versi 7, yang telah menggunakan systemd. Tidak ada jawaban lain yang benar untuk dunia systemd; atau bahkan beberapa asumsi dalam pertanyaan Anda.

  • Lupakan runlevel ; mereka ada, tetapi hanya sebagai shims kompatibilitas. Dokumentasi systemd menyatakan bahwa konsep ini "usang". Jika Anda mulai mempelajari hal-hal ini pada sistem operasi systemd, jangan mulai dari sana.
  • Lupakan tentang halaman manual yang dikutip marcelm; itu bukan dari toolset yang benar sama sekali, dan merupakan deskripsi dari perintah toolset lain, salah untuk systemd. Ini satu-satunya untuk haltperintah dari utilitas "Sistem 5" van Smoorenburg init.
  • Abaikan pernyataan yang /sbin/haltmerupakan tautan simbolis ke /sbin/reboot; itu tidak benar dengan systemd. Tidak ada rebootprogram yang terpisah sama sekali.
  • Mengabaikan pernyataan yang haltatau rebootmemanggil shutdownprogram yang dengan argumen baris perintah; mereka juga tidak benar dengan systemd. Tidak ada shutdownprogram yang terpisah sama sekali.

Setiap perangkat manajemen sistem memiliki versi utilitas ini. systemd, pemula, nosh , van Smoorenburg init, dan BSD initsemua memiliki mereka sendiri halt, poweroffdan sebagainya. Pada masing-masing mekanisme mereka sedikit berbeda. Begitu juga halaman manual mereka.

Dalam toolset systemd halt, poweroff,reboot , telinit, dan shutdownadalah semua link simbolik ke /bin/systemctl. Mereka semua shims kompatibilitas mundur, yang hanya shorthands untuk menerapkan antarmuka baris perintah utama systemd ini: systemctl. Mereka semua memetakan (dan pada kenyataannya) program tunggal yang sama . (Secara konvensi, shell memberitahukan nama yang digunakan olehnya.)

target, bukan runlevel

Sebagian besar dari perintah itu adalah singkatan untuk mengatakan systemd, menggunakan systemctl, untuk mengisolasi target tertentu . Isolasi dijelaskan di systemctlhalaman manual (qv), tetapi dapat, untuk keperluan jawaban ini, dianggap sebagai memulai target dan menghentikan yang lain. Target standar yang digunakan dalam systemd tercantum pada systemd.specialhalaman manual (8).

Diagram pada bootuphalaman manual (7) di toold toolset, khususnya yang terakhir, menunjukkan bahwa ada tiga target "final" yang relevan di sini:

  • halt.target- Setelah sistem mencapai keadaan sepenuhnya mengisolasi target ini, itu akan disebut reboot(RB_HALT_SYSTEM)system call. Kernel akan berusaha memasuki program monitor ROM, atau hanya menghentikan CPU (menggunakan mekanisme apa pun yang sesuai untuk melakukannya).
  • reboot.target- Setelah sistem mencapai keadaan mengisolasi penuh target ini, ia akan memanggil reboot(RB_AUTOBOOT)system call (atau yang setara dengan baris perintah ajaib). Kernel akan berusaha memicu reboot.
  • poweroff.target- Setelah sistem mencapai keadaan sepenuhnya mengisolasi target ini, itu akan disebut reboot(RB_POWER_OFF)system call. Kernel akan berusaha untuk menghilangkan daya dari sistem, jika memungkinkan.

Ini adalah hal-hal yang Anda harus pikirkan ketika sistem terakhir menyatakan, bukan menjalankan level. Perhatikan dari diagram bahwa systemd sistem target itu sendiri mengkodekan hal-hal yang, dalam sistem lain, tersirat daripada eksplisit: seperti gagasan bahwa masing-masing target akhir ini mencakup shutdown.targettarget, sehingga seseorang menggambarkan layanan yang harus dihentikan sebelum shutdown oleh memiliki mereka bertentangan dengan para shutdown.targetsasaran.

systemctlmencoba mengirim permintaan systemd-logindketika pengguna panggilan bukan superuser. Itu juga melewati shutdown tertunda ke systemd-shutdownd. Dan beberapa steno memicu wallnotifikasi. Selain kerumitan itu, yang akan membuat jawaban ini beberapa kali lebih lama, dengan asumsi bahwa Anda saat ini adalah pengguna super dan tidak meminta tindakan yang dijadwalkan:

  • systemctl isolate halt.target memiliki singkatan:
    • shutdown -H now
    • systemctl halt
    • polos tanpa hiasan halt
  • systemctl isolate reboot.target memiliki singkatan:
    • shutdown -r now
    • telinit 6
    • systemctl reboot
    • polos tanpa hiasan reboot
  • systemctl isolate poweroff.target memiliki singkatan:
    • shutdown -P now
    • telinit 0
    • shutdown now
    • systemctl poweroff
    • polos tanpa hiasan poweroff
  • systemctl isolate rescue.target memiliki singkatan:
    • telinit 1
    • systemctl rescue
  • systemctl isolate multi-user.target memiliki singkatan:
    • telinit 2
    • telinit 3
    • telinit 4
  • systemctl isolate graphical.target memiliki singkatan:
    • telinit 5

Setelah menguraikan berbagai sintaks baris perintah yang berbeda, semua ini akhirnya berakhir di jalur kode yang sama di dalam systemctlprogram.

Catatan:

  • Perilaku tradisional opsi-kurang shutdown nowadalah beralih ke mode pengguna tunggal . Ini tidak terjadi dengan systemd. rescue.target- mode single-user diubah namanya menjadi mode penyelamatan di systemd - tidak dapat dijangkau dengan shutdownperintah.
  • telinit benar-benar sepenuhnya mengabaikan semua itu dan tautan simbolik dalam sistem file yang dijelaskan halaman manual. Pemetaan yang sudah ada sebelumnya telah tertanam dalam program, dalam sebuah tabel.runlevelN.targetdefault.targetsystemctl
  • systemd tidak memiliki gagasan tentang level run saat ini . Pengoperasian perintah-perintah ini tidak tergantung pada "jika Anda berada di run-level N ".
  • The --forcepilihan untuk halt, rebootdan poweroffperintah adalah sama dengan mengatakan --force --forcekepada systemctl halt, systemctl reboot, dan systemctl poweroffperintah. Ini membuat systemctlmencoba menelepon reboot()langsung. Biasanya itu hanya mencoba untuk mengisolasi target.
  • telinittidak sama dengan init. Mereka adalah program yang berbeda di dunia systemd, yang terakhir menjadi nama lain untuk systemdprogram, bukan untuk systemctlprogram. The systemdProgram tidak selalu disusun dengan kompatibilitas van Smoorenburg sama sekali, dan pada beberapa sistem operasi systemd mengeluh tentang yang dipanggil tidak benar jika salah satu upaya .init N

Bacaan lebih lanjut

JdeBP
sumber
1
Ini sangat umum untuk sebagian besar sistem Linux modern jadi misalnya menjawab wiert.me/2012/12/30/... Setelah bertahun-tahun bertanya-tanya, akhirnya saya mengerti apa yang terjadi dan mengapa.
Jeroen Wiert Pluimers
systemctl rebootharus setara dengan systemctl start reboot.target --job-mode=replace-irreversible. Menggunakan mode pekerjaan lain kurang kuat. unix.stackexchange.com/questions/381739/…
sourcejedi
1
Saya membaca seluruh tanggapan Anda, dan menyerap apa yang saya bisa. Masih ada satu pertanyaan, yang sama dengan yang saya datangi di sini, adalah systemctl rebootcara "aman" untuk mem-boot ulang, mis. init 6Dengan cara apa kita akan mem-boot ulang dengan aman?
Brian Thomas
25
  • haltmenginstruksikan perangkat keras untuk menghentikan semua fungsi CPU , tetapi membiarkannya dalam kondisi aktif. Ini biasanya berarti seseorang harus menyalakan ulang atau mematikan mesin secara manual dengan menekan tombol daya sesudahnya. Cara spesifik untuk mencapai ini adalah arsitektur khusus, tetapi misalnya set instruksi x86 memberikan HLTinstruksi yang menghentikan unit pemrosesan pusat (CPU) sampai interupsi eksternal berikutnya dipecat.

  • poweroff, seperti halt, menghentikan CPU tetapi juga mengirimkan sinyal perangkat keras ACPI yang akan menginstruksikan sistem untuk memulai dengan shutdown yang lengkap dan langsung. Ini kira-kira sama dengan menekan tombol daya pada komputer desktop biasa.

Keduanya haltdan poweroffbiasanya merupakan tautan simbolis ke rebootexecutable, yang biasanya akan memanggil shutdownalat dengan argumen yang sesuai ( -h, -Patau r) tergantung pada apakah halt, poweroffatau rebootdigunakan untuk memanggil alat. Namun, Ketika --forceopsi diteruskan ke reboot, atau ketika di runlevel 0 atau 6, rebootakan memanggil reboot()sistem panggilan dengan kode perintah yang sesuai itu sendiri.

Thomas Nyman
sumber
Thomas, terima kasih banyak telah menjelaskan. Saya tertarik untuk mengetahui bagaimana melakukan #init 0, tidak ada banyak perbedaan, kan?
Menangkan.
@ Win.T Beralih ke runlevel 0 menggunakan eg /sbin/init 0atau /sbin/telinit 0harus sama dengan menghentikan sistem, meskipun langkah-langkah spesifik yang diambil akan tergantung pada sistem init yang dimaksud, seperti System-V init , pemula atau systemd . Jika Anda menjalankan RHEL, Anda akan menggunakan systemd.
Thomas Nyman
4
Catatan untuk diri sendiri: setiap kali seseorang mengeluh tentang panggilan API Win32 yang misterius, perlihatkan mereka reboot (2).
user253751
@ Imibis Tapi reboot sengaja misterius. Membutuhkan bendera sihir sehingga sangat sulit dilakukan secara tidak sengaja.
Kevin Cox
4
@KevinCox Itulah argumen untuk meminta bendera ajaib. Ini bukan argumen untuk menerima 4 nilai yang berbeda untuk magic2, atau untuk berperilaku berbeda di dalam namespace PID, atau untuk menggabungkan beberapa operasi yang hampir tidak terkait (seperti mengatur perilaku reboot-on-Ctrl-Alt-Delete) menjadi satu fungsi.
user253751
1

halt, poweroffdan shutdown -hsepenuhnya setara. Kenyataannya, berhenti dan mati daya tidak melakukan apa-apa selain menelepon shutdown -h. Dari halaman stop / poweroff:

Jika berhenti atau reboot dipanggil ketika sistem tidak dalam runlevel 0 atau 6, dengan kata lain ketika berjalan normal, shutdown akan dipanggil sebagai gantinya (dengan flag -h atau -r). Untuk info lebih lanjut lihat halaman shutdown (8).

Shutdown kemudian dilanjutkan untuk mematikan sistem dengan beralih ke runlevel 0.

Berhenti dan matikan (dan reboot) melakukan peran ganda; ketika dieksekusi dalam proses mematikan (yaitu, di runlevel 0 atau 6), mereka melakukan operasi tingkat rendah yang diperlukan untuk secara fisik menghentikan, mematikan, atau me-reboot mesin, seperti yang dijelaskan dalam jawaban lain.

marcelm
sumber
2
Versi RHEL mana yang Anda gunakan? Biasanya ada perbedaan antara berhenti dan poweroff (meskipun untuk sementara waktu itu tidak terjadi di banyak distribusi, tapi itu bug).
Bruno