GNU/Linux >> Belajar Linux >  >> Linux

Mulai gunakan systemd sebagai alat pemecahan masalah

Tidak ada yang benar-benar akan menganggap systemd sebagai alat pemecahan masalah, tetapi ketika saya mengalami masalah di server web saya, pengetahuan saya yang berkembang tentang systemd dan beberapa fiturnya membantu saya menemukan dan menghindari masalah.

Masalahnya adalah server saya, yorktown, yang menyediakan layanan nama, DHCP, NTP, HTTPD, dan layanan email SendMail untuk jaringan kantor rumah saya, gagal memulai daemon Apache HTTPD selama startup normal. Saya harus memulainya secara manual setelah saya menyadari bahwa itu tidak berjalan. Masalah telah berlangsung selama beberapa waktu, dan baru-baru ini saya mencoba memperbaikinya.

Beberapa dari Anda akan mengatakan bahwa systemd itu sendiri adalah penyebab masalah ini, dan berdasarkan apa yang saya ketahui sekarang, saya setuju dengan Anda. Namun, saya memiliki masalah serupa dengan SystemV. (Pada artikel pertama dalam seri ini, saya melihat kontroversi seputar systemd sebagai pengganti program init SystemV dan skrip startup lama. Jika Anda tertarik untuk mempelajari lebih lanjut tentang systemd, baca juga artikel kedua dan ketiga.) Tidak ada perangkat lunak yang sempurna, dan baik systemd maupun SystemV bukanlah pengecualian, tetapi systemd memberikan jauh lebih banyak informasi untuk pemecahan masalah daripada yang pernah ditawarkan SystemV.

Menentukan masalah

Langkah pertama untuk menemukan sumber masalah ini adalah menentukan status layanan httpd:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2020-04-16 11:54:37 EDT; 15min ago
     Docs: man:httpd.service(8)
  Process: 1101 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1101 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."
      CPU: 60ms

Apr 16 11:54:35 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 11:54:37 yorktown.both.org httpd[1101]: (99)Cannot assign requested address: AH00072: make_sock: could not bind to address 192.168.0.52:80
Apr 16 11:54:37 yorktown.both.org httpd[1101]: no listening sockets available, shutting down
Apr 16 11:54:37 yorktown.both.org httpd[1101]: AH00015: Unable to open logs
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Apr 16 11:54:37 yorktown.both.org systemd[1]: httpd.service: Failed with result 'exit-code'.
Apr 16 11:54:37 yorktown.both.org systemd[1]: Failed to start The Apache HTTP Server.
[root@yorktown ~]#

Informasi status ini adalah salah satu fitur systemd yang menurut saya jauh lebih berguna daripada apa pun yang ditawarkan SystemV. Jumlah informasi bermanfaat di sini membawa saya dengan mudah ke kesimpulan logis yang membawa saya ke arah yang benar. Semua yang pernah saya dapatkan dari chkconfig lama perintah adalah apakah layanan sedang berjalan atau tidak dan ID proses (PID) jika itu. Itu tidak terlalu membantu.

Entri kunci dalam laporan status ini menunjukkan bahwa HTTPD tidak dapat mengikat ke alamat IP, yang berarti tidak dapat menerima permintaan yang masuk. Ini menunjukkan bahwa jaringan tidak memulai cukup cepat untuk siap layanan HTTPD untuk mengikat ke alamat IP karena alamat IP belum ditetapkan. Ini seharusnya tidak terjadi, jadi saya menjelajahi file konfigurasi startup systemd layanan jaringan saya; semua tampak benar dengan pernyataan "setelah" dan "membutuhkan" yang benar. Berikut adalah /lib/systemd/system/httpd.service file dari server saya:

# Modifying this file in-place is not recommended, because changes                                                                                    
# will be overwritten during package upgrades.  To customize the                                                                                      
# behaviour, run "systemctl edit httpd" to create an override unit.                                                                                  
                                                                                                                                                     
# For example, to pass additional options (such as -D definitions) to                                                                                
# the httpd binary at startup, create an override unit (as is done by                                                                                
# systemctl edit) and enter the following:                                                                                                            
                                                                                                                                                     
#       [Service]                                                                                                                                    
#       Environment=OPTIONS=-DMY_DEFINE                                                                                                              
                                                                                                                                                     
[Unit]                                                                                                                                                
Description=The Apache HTTP Server                                                                                                                    
Wants=httpd-init.service                                                                                                                              
After=network.target remote-fs.target nss-lookup.target httpd-init.service                                                                            
Documentation=man:httpd.service(8)                                                                                                                    
                                                                                                                                                     
[Service]                                                                                                                                            
Type=notify                                                                                                                                          
Environment=LANG=C                                                                                                                                    
                                                                                                                                                     
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND                                                                                                      
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful                                                                                                      
# Send SIGWINCH for graceful stop                                                                                                                    
KillSignal=SIGWINCH                                                                                                                                  
KillMode=mixed                                                                                                                                        
PrivateTmp=true                                                                                                                                      
                                                                                                                                                     
[Install]                                                                                                                                            
WantedBy=multi-user.target

httpd.service file unit secara eksplisit menetapkan bahwa itu harus dimuat setelah network.target dan httpd-init.service (diantara yang lain). Saya mencoba menemukan semua layanan ini menggunakan systemctl list-units perintah dan mencari mereka di aliran data yang dihasilkan. Semua hadir dan harus memastikan bahwa layanan httpd tidak dimuat sebelum alamat IP jaringan ditetapkan.

Solusi pertama

Selengkapnya tentang sysadmin

  • Aktifkan blog Sysadmin
  • Perusahaan Otomatis:panduan untuk mengelola TI dengan otomatisasi
  • eBook:Kemungkinan Otomatisasi untuk SysAdmins
  • Kisah dari lapangan:Panduan administrator sistem untuk otomatisasi TI
  • eBook:Panduan Kubernetes untuk SRE dan sysadmin
  • Artikel sysadmin terbaru

Sedikit pencarian di internet mengkonfirmasi bahwa orang lain telah mengalami masalah serupa dengan httpd dan layanan lainnya. Hal ini tampaknya terjadi karena salah satu layanan yang diperlukan menunjukkan kepada systemd bahwa ia telah menyelesaikan startupnya—tetapi sebenarnya ia melepaskan proses anak yang belum selesai. Setelah sedikit mencari, saya menemukan sebuah pengelakan.

Saya tidak tahu mengapa alamat IP membutuhkan waktu lama untuk ditetapkan ke kartu antarmuka jaringan. Jadi, saya pikir jika saya dapat menunda dimulainya layanan HTTPD dalam waktu yang wajar, alamat IP akan ditetapkan pada saat itu.

Untungnya, /lib/systemd/system/httpd.service file di atas memberikan beberapa arah. Meskipun dikatakan untuk tidak mengubahnya, ini menunjukkan bagaimana untuk melanjutkan:Gunakan perintah systemctl edit httpd , yang secara otomatis membuat file baru (/etc/systemd/system/httpd.service.d/override.conf ) dan membuka editor GNU Nano. (Jika Anda tidak terbiasa dengan Nano, pastikan untuk melihat petunjuk di bagian bawah antarmuka Nano.)

Tambahkan teks berikut ke file baru dan simpan:

[root@yorktown ~]# cd /etc/systemd/system/httpd.service.d/
[root@yorktown httpd.service.d]# ll
total 4
-rw-r--r-- 1 root root 243 Apr 16 11:43 override.conf
[root@yorktown httpd.service.d]# cat override.conf
# Trying to delay the startup of httpd so that the network is
# fully up and running so that httpd can bind to the correct
# IP address
#
# By David Both, 2020-04-16

[Service]
ExecStartPre=/bin/sleep 30

[Layanan] bagian dari file override ini berisi satu baris yang menunda dimulainya layanan HTTPD selama 30 detik. Perintah status berikut menunjukkan status layanan selama waktu tunggu:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: activating (start-pre) since Thu 2020-04-16 12:14:29 EDT; 28s ago
     Docs: man:httpd.service(8)
Cntrl PID: 1102 (sleep)
    Tasks: 1 (limit: 38363)
   Memory: 260.0K
      CPU: 2ms
   CGroup: /system.slice/httpd.service
           └─1102 /bin/sleep 30

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.
[root@yorktown ~]#

Dan perintah ini menunjukkan status layanan HTTPD setelah penundaan 30 detik berakhir. Layanan aktif dan berjalan dengan benar:

[root@yorktown ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/httpd.service.d
           └─override.conf
           /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running) since Thu 2020-04-16 12:15:01 EDT; 1min 18s ago
     Docs: man:httpd.service(8)
  Process: 1102 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS)
 Main PID: 1567 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
    Tasks: 213 (limit: 38363)
   Memory: 21.8M
      CPU: 82ms
   CGroup: /system.slice/httpd.service
           ├─1567 /usr/sbin/httpd -DFOREGROUND
           ├─1569 /usr/sbin/httpd -DFOREGROUND
           ├─1570 /usr/sbin/httpd -DFOREGROUND
           ├─1571 /usr/sbin/httpd -DFOREGROUND
           └─1572 /usr/sbin/httpd -DFOREGROUND

Apr 16 12:14:29 yorktown.both.org systemd[1]: Starting The Apache HTTP Server...
Apr 16 12:15:01 yorktown.both.org systemd[1]: Started The Apache HTTP Server.

Saya bisa bereksperimen untuk melihat apakah penundaan yang lebih pendek akan berhasil juga, tetapi sistem saya tidak terlalu kritis, jadi saya memutuskan untuk tidak melakukannya. Ini bekerja dengan andal sebagaimana adanya, jadi saya senang.

Karena saya mengumpulkan semua informasi ini, saya melaporkannya ke Red Hat Bugzilla sebagai Bug 1825554. Saya percaya bahwa melaporkan bug jauh lebih produktif daripada mengeluhkannya.

Solusi yang lebih baik

Beberapa hari setelah melaporkan ini sebagai bug, saya menerima tanggapan yang menunjukkan bahwa systemd hanyalah manajer, dan jika httpd perlu dipesan setelah beberapa persyaratan terpenuhi, itu perlu dinyatakan dalam file unit. Tanggapan mengarahkan saya ke httpd.service halaman manual. Saya berharap saya telah menemukan ini lebih awal karena ini adalah solusi yang lebih baik daripada yang saya buat. Solusi ini secara eksplisit ditargetkan ke unit target prasyarat daripada penundaan yang agak acak.

Dari httpd.service halaman manual:

Memulai layanan saat boot

Unit httpd.service dan httpd.socket dinonaktifkan secara default. Untuk memulai layanan httpd saat boot, jalankan:systemctl enable httpd.service . Dalam konfigurasi default, daemon httpd akan menerima koneksi pada port 80 (dan, jika mod_ssl diinstal, koneksi TLS pada port 443) untuk alamat IPv4 atau IPv6 yang dikonfigurasi.

Jika httpd dikonfigurasi untuk bergantung pada alamat IP tertentu (misalnya, dengan perintah "Listen") yang mungkin hanya tersedia selama start-up, atau jika httpd bergantung pada layanan lain (seperti daemon database), layanan harus dikonfigurasi untuk memastikan pemesanan awal yang benar.

Misalnya, untuk memastikan httpd hanya berjalan setelah semua antarmuka jaringan yang dikonfigurasi dikonfigurasi, buat file drop-in (seperti dijelaskan di atas) dengan bagian berikut:

[Unit]

After=network-online.target

Wants=network-online.target

Saya masih menganggap ini bug karena cukup umum—setidaknya menurut pengalaman saya—menggunakan Dengarkan direktif di httpd.conf berkas konfigurasi. Saya selalu menggunakan Dengar direktif, bahkan pada host dengan hanya satu alamat IP, dan ini jelas diperlukan pada host dengan beberapa kartu antarmuka jaringan (NIC) dan alamat protokol internet (IP). Menambahkan baris di atas ke /usr/lib/systemd/system/httpd.service file default tidak akan menyebabkan masalah untuk konfigurasi yang tidak menggunakan Dengar direktif dan akan mencegah masalah ini bagi mereka yang melakukannya.

Sementara itu, saya akan menggunakan solusi yang disarankan.

Langkah selanjutnya

Artikel ini menjelaskan masalah yang saya alami dengan memulai layanan Apache HTTPD di server saya. Ini menuntun Anda melalui langkah-langkah penentuan masalah yang saya ambil dan menunjukkan bagaimana saya menggunakan systemd untuk membantu. Saya juga membahas pengelakan yang saya terapkan menggunakan systemd dan solusi yang lebih baik yang mengikuti dari laporan bug saya.

Seperti yang saya sebutkan di awal, kemungkinan besar ini adalah akibat dari masalah dengan systemd, khususnya konfigurasi untuk startup httpd. Namun demikian, systemd memberi saya alat untuk menemukan kemungkinan sumber masalah dan untuk merumuskan dan menerapkan pengelakan. Tidak ada solusi yang benar-benar menyelesaikan masalah untuk kepuasan saya. Untuk saat ini, akar penyebab masalah masih ada dan harus diperbaiki. Jika itu hanya menambahkan baris yang direkomendasikan ke /usr/lib/systemd/system/httpd.service file, itu akan berhasil untuk saya.

Salah satu hal yang saya temukan selama ini adalah proses bahwa saya perlu belajar lebih banyak tentang mendefinisikan urutan di mana segala sesuatunya dimulai. Saya akan membahasnya di artikel saya berikutnya, yang kelima dalam seri ini.

Sumber daya

Ada banyak informasi tentang systemd yang tersedia di internet, tetapi banyak yang singkat, tumpul, atau bahkan menyesatkan. Selain sumber daya yang disebutkan dalam artikel ini, halaman web berikut menawarkan informasi yang lebih mendetail dan andal tentang startup systemd.

  • Proyek Fedora memiliki panduan praktis yang baik untuk systemd. Ini memiliki hampir semua yang perlu Anda ketahui untuk mengonfigurasi, mengelola, dan memelihara komputer Fedora menggunakan systemd.
  • Proyek Fedora juga memiliki lembar contekan bagus yang merujuk silang perintah SystemV lama ke perintah systemd yang sebanding.
  • Untuk informasi teknis terperinci tentang systemd dan alasan pembuatannya, lihat deskripsi Freedesktop.org tentang systemd.
  • "Lebih banyak sistem menyenangkan" dari Linux.com menawarkan informasi dan tips sistem yang lebih canggih.

Ada juga serangkaian artikel yang sangat teknis untuk sysadmin Linux oleh Lennart Poettering, perancang dan pengembang utama systemd. Artikel-artikel ini ditulis antara April 2010 dan September 2011, tetapi masih relevan sekarang seperti dulu. Banyak hal bagus lainnya yang telah ditulis tentang systemd dan ekosistemnya didasarkan pada makalah ini.

  • Memikirkan kembali PID 1
  • systemd untuk Administrator, Bagian I
  • systemd untuk Administrator, Bagian II
  • systemd untuk Administrator, Bagian III
  • systemd untuk Administrator, Bagian IV
  • systemd untuk Administrator, Bagian V
  • systemd untuk Administrator, Bagian VI
  • systemd untuk Administrator, Bagian VII
  • systemd untuk Administrator, Bagian VIII
  • systemd untuk Administrator, Bagian IX
  • systemd untuk Administrator, Bagian X
  • systemd untuk Administrator, Bagian XI

Linux
  1. 5 perintah Linux yang akan saya mulai gunakan

  2. MySQL Gagal Mulai Menggunakan systemctl Pada Distribusi Linux systemd

  3. systemd:SIGTERM segera setelah start

  1. Menggunakan jurnal systemd untuk memecahkan masalah sementara

  2. Skrip mulai systemd postgresql

  3. menggunakan pengatur waktu systemd, bukan cron

  1. Kelola startup menggunakan systemd

  2. Menggunakan perintah systemctl untuk mengelola unit systemd

  3. Menggunakan Alat Tangkapan Layar GNOME di Linux Seperti Pro