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:
- Pengujian Otomatis Pengaktifan BIOS (POST)
- Pemuat boot (GRUB2)
- Kernel
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.]