GNU/Linux >> Belajar Linux >  >> Linux

Mengganti rc.local di systemd sistem Linux

Baru-baru ini saya menemukan dua masalah berbeda pada dua host Linux yang berbeda. Masing-masing membutuhkan pengelakan yang unik karena saya belum menemukan solusi nyata. Namun, metode untuk mengirimkan setiap pengelakan adalah sama:Jalankan perintah selama atau segera setelah startup Linux.

rc.local file adalah—dan dalam beberapa kasus masih—tempat bagi sysadmin Linux untuk meletakkan perintah yang perlu dijalankan saat startup. Penggunaan rc.local file tidak hanya usang tetapi setelah beberapa jam upaya, tidak berfungsi dalam hal apa pun. Ini terlepas dari fakta bahwa systemd dokumentasi menyebutkan penggunaan "generator" yang menghasilkan systemd layanan dari rc.local file jika ada. (Sepertinya itu cara yang baik untuk menegakkan penghentian—membuatnya tidak berhasil.)

Detail masalah spesifik saya tidak terlalu relevan dengan diskusi ini, jadi saya akan menggunakan perintah sederhana dan mudah dilacak sebagai konten file startup lokal kami. Kami akan menambahkan baris tanggal ke file log lokal untuk memverifikasi bahwa program Bash yang perlu kami jalankan saat startup benar-benar berfungsi.

Boot vs. startup

Memahami proses boot dan startup Linux penting untuk mengonfigurasi Linux dan menyelesaikan masalah startup. Pada kenyataannya, ada dua urutan kejadian yang diperlukan untuk mem-boot komputer Linux dan membuatnya dapat digunakan:boot dan startup. Urutan boot dimulai saat komputer dihidupkan dan selesai saat kernel diinisialisasi dan systemd diluncurkan. Proses startup kemudian mengambil alih dan menyelesaikan tugas untuk membuat komputer Linux ke status operasional.

Secara keseluruhan, proses boot dan startup Linux cukup sederhana untuk dipahami. Ini terdiri dari langkah-langkah berikut, yang akan dijelaskan nanti secara lebih rinci:

  1. Pengujian Otomatis Pengaktifan BIOS (POST)
  2. Pemuat boot (GRUB2)
  3. Kernel
  4. systemd

Untuk deskripsi yang lebih rinci tentang urutan boot dan startup, lihat artikel saya, Pengantar proses boot dan startup Linux.

Startup lokal

Sysadmin terkadang menambahkan perintah ke urutan startup yang berguna secara lokal. Penambahan ini mungkin bertujuan untuk memulai atau menjalankan proses lokal yang bukan merupakan bagian dari systemd standard standar memulai. Dimungkinkan untuk menambahkan systemd baru unit layanan untuk meluncurkan setiap program yang diperlukan saat startup, tetapi rc.local old yang lama metode menyediakan satu file yang dapat dieksekusi untuk setiap dan semua kebutuhan startup lokal. Kami juga dapat menggunakan pendekatan file tunggal ini dengan systemd . Keanggunan dari solusi ini adalah memudahkan untuk menambahkan lebih banyak perintah startup di lain waktu, tanpa perlu menambahkan lebih banyak unit layanan ke systemd .

Solusi kami adalah membuat satu systemd unit layanan dan tempatkan perintah Linux yang diperlukan ke dalam file yang dapat dieksekusi. Ada dua bagian untuk solusi ini. Salah satunya jelas:Kami membutuhkan file yang dapat dieksekusi. Dan dua, kita perlu membuat unit layanan untuk systemd yang menjalankan file yang dapat dieksekusi.

Buat file yang dapat dieksekusi

Ini adalah latihan sepele untuk setiap sysadmin yang akrab dengan pemrograman Bash. Sebenarnya, kita akan membuat program Bash dan menempatkannya di lokasi Linux Filesystem Hierarchical Standard (FHS) untuk file lokal yang dapat dieksekusi, /usr/local/bin . Argumen dapat dibuat untuk menempatkan file yang dapat dieksekusi ini di lokasi lain, tetapi /usr/local/bin adalah salah satu yang paling masuk akal bagi saya karena lokasi ini memudahkan sysadmin untuk menjalankan skrip dari baris perintah jika perlu. /usr/local/bin direktori selalu ada di $PATH setiap pengguna , termasuk pengguna root.

Buat mystartup.sh file yang ditampilkan di sini dan letakkan di /usr/local/bin (pastikan untuk membuatnya dapat dieksekusi). Pastikan untuk menggunakan lokasi untuk Bash yang benar untuk distribusi Anda. Misalnya, distribusi berbasis Debian menempatkan Bash di /bin/bash .

#!/usr/bin/bash

################################################################################
# mystartup.sh
#
# This shell program is for testing a startup like rc.local using systemd.
# By David Both
# Licensed under GPL V2
#
################################################################################

# This program should be placed in /usr/local/bin

################################################################################
# This is a test entry

echo `date +%F" "%T` "Startup worked" >> /root/mystartup.log

Catatan: Komentar dalam file yang disertakan memberi tahu Anda di mana mereka harus ditempatkan.

Pastikan untuk menguji executable ini dengan menjalankannya dari baris perintah. Saat pertama kali menjalankan skrip shell ini, Anda akan melihat file baru, /root/mystartup.log , dengan waktu dan tanggal beserta teksnya, "Startup worked" . Kami membuat file log ini dan menambahkan baris ke dalamnya setiap kali skrip dijalankan sebagai pengujian sederhana untuk memastikan bahwa skrip kami berfungsi.

Jalankan skrip beberapa kali lagi. Hasil Anda harus serupa dengan yang ada di sini:

[root@testvm1 ~]#  mystartup.sh

[root@testvm1 ~]#  cat mystartup.log

2019-09-12 19:58:00 Startup worked

2019-09-12 19:58:17 Startup worked

2019-09-12 19:58:54 Startup worked

2019-09-12 19:59:00 Startup worked

2019-09-12 20:01:08 Startup worked

2019-09-12 20:04:01 Startup worked

2019-09-12 20:04:13 Startup worked

2019-09-12 20:06:11 Startup worked

2019-09-12 20:06:28 Startup worked

2019-09-16 09:51:21 Startup worked

2019-09-16 09:51:51 Startup worked

Hanya itu yang perlu kita lakukan untuk membuat file yang pada akhirnya mungkin berisi perintah startup lokal kita. Cukup tambahkan apa pun yang perlu dijalankan saat startup ke file ini.

Buat layanan systemd

Unit layanan yang sekarang akan kita buat adalah systemd standar berkas unit layanan. File sederhana ini hanya digunakan untuk menjalankan mystartup.sh skrip saat startup.

Buat file baru, /usr/local/lib/systemd/system/mystartup.service , dan tambahkan konten yang ditunjukkan di bawah ini:

################################################################################
# mystartup.service
#
# This service unit is for testing my systemd startup service
# By David Both
# Licensed under GPL V2
#
################################################################################
# This program should be placed in /usr/local/lib/systemd/system/.
# Create a symlink to it from the /etc/systemd/system directory.
################################################################################

[Unit]

Description=Runs /usr/local/bin/mystartup.sh

  
[Service]

ExecStart=/usr/local/bin/mystartup.sh


[Install]

WantedBy=multi-user.target

File ini tidak perlu dieksekusi. File ini juga dapat ditemukan di /etc/systemd/system , tetapi sebagai file lokal lebih baik ditempatkan di /usr/local cabang dari struktur direktori, dengan tautan ke sana dari /etc/systemd.system .

Sekarang, buka /etc/systemd/system dan buat tautan simbolis di file unit layanan:

[root@testvm1 system]#  ln -s /usr/local/lib/systemd/system/mystartup.service

Uji unit layanan

Kita harus menguji file unit layanan terakhir sebelum me-reboot host Linux untuk pengujian terakhir. Pertama, mari kita verifikasi bahwa systemd melihat layanan:

[root@testvm1 ~]#  systemctl status mystartup

● mystartup.service - Runs /usr/local/bin/mystartup.sh

Loaded: loaded (/usr/local/lib/systemd/system/mystartup.service; linked; vendor preset: disabled)

Active: inactive (dead)

[root@testvm1 ~]#

Hasil ini memberi tahu kita bahwa layanan tersebut dikenali oleh systemd . Sekarang, mari kita mulai layanannya. Melakukannya akan menjalankan skrip tetapi tidak akan mengonfigurasi layanan baru untuk dijalankan saat boot:

[root@testvm1 ~]#  systemctl start mystartup

Periksa konten file log untuk memverifikasi bahwa baris baru telah ditambahkan.

Aktifkan layanan

Yang tersisa hanyalah mengaktifkan layanan agar berjalan saat startup:

[root@testvm1 ~]#  systemctl enable mystartup

Created symlink /etc/systemd/system/multi-user.target.wants/mystartup.service →

/usr/local/lib/systemd/system/mystartup.service.

[root@testvm1 ~]#

Ujian akhir

Sebelum kita reboot, mari kita lihat journalctl perintah dan bagaimana kita dapat menggunakannya untuk melihat entri jurnal yang berhubungan dengan mystartup.service . Kita juga dapat menggunakan journalctl perintah untuk memverifikasi ini karena systemd membuat jurnal dari semua yang dilakukannya.

Pada perintah berikut, -u opsi hanya menampilkan entri untuk mystartup satuan:

[root@testvm1 ~]#  journalctl -u mystartup

-- Logs begin at Mon 2019-04-15 22:50:27 EDT, end at Mon 2019-09-16 11:44:30 EDT. --

Sep 16 11:09:28 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.

[root@testvm1 ~]#

Sekarang, reboot host Linux dan periksa file log untuk memastikan bahwa baris baru telah ditambahkan:

[root@testvm1 ~]#  systemctl status mystartup

● mystartup.service - Runs /usr/local/bin/mystartup.sh

Loaded: loaded (/usr/local/lib/systemd/system/mystartup.service; enabled; vendor preset: disabled)

Active: inactive (dead) since Mon 2019-09-16 11:45:59 EDT; 1min 30s ago

Process: 819 ExecStart=/usr/local/bin/mystartup.sh (code=exited, status=0/SUCCESS)

Main PID: 819 (code=exited, status=0/SUCCESS)


Sep 16 11:45:55 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.

[root@testvm1 ~]#  journalctl -u mystartup

-- Logs begin at Mon 2019-04-15 22:50:27 EDT, end at Mon 2019-09-16 11:47:45 EDT. --

Sep 16 11:09:28 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.

-- Reboot --

Sep 16 11:45:55 testvm1 systemd[1]: Started Runs /usr/local/bin/mystartup.sh.

[root@testvm1 ~]#

Kesimpulan

Skrip Bash shell yang telah kami buat untuk eksperimen ini berjalan sekali saat startup dan kemudian keluar. Itu tidak tetap dalam memori sebagai daemon karena tidak dirancang untuk melakukannya.

Jika Anda tidak menyadarinya, prosedur yang kami gunakan untuk membuat layanan startup lokal kami juga dapat digunakan untuk membuat layanan baru untuk systemd . Tidak terlalu sulit jika kita tahu caranya.

Perbarui

Segera setelah artikel ini diterbitkan, saya menerima email dari Tom Murphy yang memberi tahu saya tentang keberadaan rc-local layanan yang merupakan bagian dari systemd . Saya menghargai email itu karena saya tidak mengetahui layanan itu, jadi saya belajar sesuatu yang baru.

Dimungkinkan untuk menambahkan dukungan untuk rc.local yang lama file dengan mengaktifkan layanan dengan perintah, systemctl enable rc-local . Perintah dalam file rc.local akan dijalankan pada boot berikutnya. Tentu saja, Anda dapat menggunakan systemctl enable rc-local untuk menjalankan rc.local segera.

Namun, masih benar bahwa rc.local sudah usang. Halaman manual untuk systemd-rc-local-generator menyatakan, “Dukungan untuk /etc/rc.local disediakan untuk kompatibilitas dengan sistem Sistem V tertentu saja. Namun, sangat disarankan untuk menghindari penggunaan skrip ini hari ini, dan sebagai gantinya berikan file unit yang tepat dengan dependensi yang sesuai untuk skrip apa pun untuk dijalankan selama proses boot.”

Sumber daya

  • Buku Data Standar Hirarki Sistem File Linux (FHS) untuk Linux

  • Informasi GNU GRUB

  • Panduan GNU GRUB

  • Catatan Boot Master

  • Spesifikasi multiboot

  • informasi sistem

  • proses booting systemd

  • indeks halaman manual systemd

  • Pengantar proses boot dan startup Linux

[Ingin mencoba Red Hat Enterprise Linux? Unduh sekarang secara gratis.]


Linux
  1. Kelola startup menggunakan systemd

  2. Memahami systemd saat startup di Linux

  3. Linux - Mengganti spasi pada nama file

  1. Cara Memigrasi Sistem File Ext2/Ext3 ke Ext4 di Linux

  2. Pengeditan jarak jauh dengan editor lokal (Linux)

  3. Sistem file apa di Linux yang menyimpan waktu pembuatan?

  1. Linux – Sistem File Apa di Linux yang Menyimpan Waktu Pembuatan?

  2. Linux – Semuanya Adalah File?

  3. Sistem File Linux:Ext2 vs Ext3 vs Ext4