Sinkronisasi Waktu Linux: NTP, Chrony dan systemd-timesyncd

Sinkronisasi Waktu Linux: NTP, Chrony dan systemd-timesyncd
Kebanyakan orang melacak waktu. Kami bangun tepat waktu untuk menyelesaikan ritual pagi kami dan pergi bekerja, istirahat makan siang, memenuhi tenggat waktu proyek, merayakan ulang tahun dan liburan, naik pesawat, dan sebagainya.

Apalagi: sebagian dari kita terobsesi dengan waktu. Jam tangan saya ditenagai oleh energi matahari dan mendapatkan waktu yang akurat dari National Institute of Standards and Technology (NIST) ke Fort Collins, Colorado melalui radio gelombang panjang WWVB. Sinyal waktu disinkronkan dengan jam atom, juga terletak di Fort Collins. Fitbit saya sedang disinkronkan dengan ponsel saya yang sedang disinkronkan dengan server NTP, yang akhirnya disinkronkan dengan jam atom.

Perangkat melacak waktu juga

Ada banyak alasan mengapa perangkat dan komputer kita membutuhkan waktu yang akurat. Misalnya, di perbankan, pasar saham, dan bisnis keuangan lainnya, transaksi harus dilakukan dalam urutan yang benar, dan urutan waktu yang akurat sangat penting untuk hal ini.

Ponsel, tablet, mobil, sistem GPS, dan komputer kita semuanya memerlukan pengaturan waktu dan tanggal yang akurat. Saya ingin jam di desktop komputer saya menunjukkan waktu yang tepat. Saya ingin pengingat muncul di kalender lokal saya pada waktu yang tepat. Waktu yang tepat juga memastikan bahwa tugas cron dan systemd berjalan pada waktu yang tepat.

Tanggal dan waktu juga penting untuk pencatatan, jadi sedikit lebih mudah untuk menemukan catatan tertentu berdasarkan tanggal dan waktu. Misalnya, saya pernah bekerja di DevOps (saat itu tidak disebut demikian) dan menyiapkan sistem email di negara bagian Carolina Utara. Kami biasa memproses lebih dari 20 juta email sehari. Melacak e-mail melalui serangkaian server, atau menentukan urutan peristiwa yang tepat menggunakan file log pada host yang tersebar secara geografis, akan jauh lebih mudah jika masing-masing komputer disinkronkan tepat waktu.

Satu kali - berjam-jam

Host Linux harus memperhitungkan bahwa ada waktu sistem dan waktu RTC. RTC (Real Time Clock) adalah nama yang agak aneh dan tidak terlalu akurat untuk jam perangkat keras.

Jam perangkat keras bekerja terus menerus bahkan saat komputer dimatikan, menggunakan baterai pada motherboard sistem. Fungsi utama RTC adalah menyimpan waktu saat koneksi ke server waktu tidak tersedia. Pada hari-hari ketika tidak mungkin terhubung ke server waktu melalui Internet, setiap komputer harus memiliki jam internal yang akurat. Sistem operasi harus mengakses RTC saat boot dan pengguna harus mengatur waktu sistem secara manual menggunakan antarmuka konfigurasi perangkat keras BIOS untuk memastikannya benar.

Jam perangkat keras tidak memahami konsep zona waktu; RTC hanya menyimpan waktu, bukan zona waktu atau offset dari UTC (Coordinated Universal Time, juga dikenal sebagai GMT atau Greenwich Mean Time). Anda dapat menginstal RTC menggunakan alat yang akan saya bahas nanti di artikel ini.

Waktu sistem adalah waktu yang ditampilkan OS pada jam GUI di desktop Anda, di keluaran perintah tanggal, di stempel waktu log. Ini juga berlaku saat file dibuat, dimodifikasi, dan dibuka.

Di halaman pria untuk rtc ada deskripsi lengkap tentang RTC dan jam sistem.

Ada apa dengan NTP?

Komputer di seluruh dunia menggunakan NTP (Network Time Protocol) untuk menyinkronkan waktu mereka dengan jam referensi standar melalui Internet menggunakan hierarki server NTP. Server waktu utama berada di lapisan 1 dan terhubung langsung ke berbagai layanan waktu nasional di lapisan 0 melalui satelit, radio, atau bahkan modem melalui saluran telepon. Layanan waktu lapisan 0 dapat berupa jam atom, penerima radio yang disetel ke sinyal yang dikirimkan oleh jam atom, atau penerima GPS yang menggunakan sinyal jam sangat akurat yang dikirimkan oleh satelit GPS.

Sebagian besar server referensi memiliki beberapa ribu server NTP strata 2 publik yang terbuka untuk umum. Banyak organisasi dan pengguna (termasuk saya sendiri) dengan banyak host yang membutuhkan server NTP memilih untuk mengatur server waktu mereka sendiri sehingga hanya satu host lokal yang mengakses strata 2 atau 3. Mereka kemudian mengonfigurasi node yang tersisa di jaringan untuk menggunakan lokal pelayan waktu. Dalam kasus jaringan rumah saya, ini adalah server layer 3.

Berbagai implementasi NTP

Implementasi asli NTP adalah ntpd. Itu kemudian bergabung dengan dua yang lebih baru, chronyd dan systemd-timesyncd. Ketiganya menyinkronkan waktu host lokal dengan server waktu NTP. Layanan systemd-timesyncd tidak dapat diandalkan seperti chronyd, tetapi cukup baik untuk sebagian besar tujuan. Jika RTC tidak sinkron, secara bertahap dapat menyesuaikan waktu sistem untuk melakukan sinkronisasi dengan server NTP ketika waktu sistem lokal sedikit bergeser. Layanan systemd-timesync tidak dapat digunakan sebagai server waktu.

Kroni adalah implementasi NTP yang berisi dua program: daemon chronyd dan antarmuka baris perintah yang disebut chronyc. Chrony memiliki beberapa fitur yang sangat diperlukan dalam banyak kasus:

  • Chrony dapat menyinkronkan dengan server waktu jauh lebih cepat daripada layanan ntpd lama. Ini bagus untuk laptop atau desktop yang tidak berfungsi sepanjang waktu.
  • Ini dapat mengkompensasi fluktuasi jam, seperti ketika tuan rumah tidur atau memasuki mode tidur, atau ketika jam berubah karena frekuensi melompat, yang memperlambat jam pada beban rendah.
  • Ini memecahkan masalah waktu yang terkait dengan koneksi jaringan yang tidak stabil atau kemacetan jaringan.
  • Ini mengatur penundaan jaringan.
  • Setelah sinkronisasi waktu awal, Chrony tidak pernah menghentikan jam. Ini memberikan slot waktu yang stabil dan konsisten untuk banyak layanan dan aplikasi sistem.
  • Chrony dapat bekerja bahkan tanpa koneksi jaringan. Dalam hal ini, host atau server lokal dapat diperbarui secara manual.
  • Chrony dapat bertindak sebagai server NTP.

Sekali lagi, NTP adalah protokol yang dapat diimplementasikan pada host Linux menggunakan Chrony atau systemd-timesyncd.

RPM NTP, Chrony, dan systemd-timesyncd tersedia di repositori Fedora standar. Systemd-udev RPM adalah event manager kernel yang diinstal secara default di Fedora, tetapi bersifat opsional.

Anda dapat menginstal ketiganya dan beralih di antara mereka, tetapi ini akan membuat sakit kepala ekstra. Jadi lebih baik jangan. Rilis modern Fedora, CentOS, dan RHEL telah dipindahkan ke Chrony sebagai implementasi default, dan mereka juga memiliki systemd-timesyncd. Menurut saya Chrony berfungsi dengan baik, memberikan antarmuka yang lebih baik daripada layanan NTP, memberikan lebih banyak informasi dan kontrol, yang pasti akan dinikmati oleh administrator sistem.

Menonaktifkan Layanan NTP

Layanan NTP mungkin sudah berjalan di host Anda. Jika demikian, Anda perlu menonaktifkannya sebelum beralih ke yang lain. Saya menjalankan chronyd jadi saya menggunakan perintah berikut untuk menghentikan dan menonaktifkannya. Jalankan perintah yang sesuai untuk setiap daemon NTP yang Anda jalankan di host Anda:

[root@testvm1 ~]# systemctl disable chronyd ; systemctl stop chronyd
Removed /etc/systemd/system/multi-user.target.wants/chronyd.service.
[root@testvm1 ~]#

Periksa apakah layanan dihentikan dan dinonaktifkan:

[root@testvm1 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
     Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:chronyd(8)
             man:chrony.conf(5)
[root@testvm1 ~]#

Pemeriksaan status sebelum diluncurkan

Status sinkronisasi jam sistem memungkinkan Anda menentukan apakah layanan NTP sedang berjalan. Karena Anda belum memulai NTP, perintah timesync-status akan mengisyaratkan hal ini:

[root@testvm1 ~]# timedatectl timesync-status
Failed to query server: Could not activate remote peer.

Permintaan status langsung memberikan informasi penting. Misalnya, perintah timedatectl tanpa argumen atau opsi mengeksekusi subperintah status secara default:

[root@testvm1 ~]# timedatectl status
           Local time: Fri 2020-05-15 08:43:10 EDT  
           Universal time: Fri 2020-05-15 12:43:10 UTC  
                 RTC time: Fri 2020-05-15 08:43:08      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: no                          
              NTP service: inactive                    
          RTC in local TZ: yes                    

Warning: The system is configured to read the RTC time in the local time zone.
         This mode cannot be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@testvm1 ~]#

Ini akan memberi Anda waktu lokal untuk host Anda, waktu UTC, dan waktu RTC. Dalam hal ini, waktu sistem diatur ke zona waktu Amerika / New_York (TZ), RTC diatur ke waktu di zona waktu lokal, dan layanan NTP tidak aktif. Waktu RTC sudah mulai sedikit menyimpang dari waktu sistem. Ini normal untuk sistem yang jamnya belum disinkronkan. Jumlah offset pada host bergantung pada waktu yang telah berlalu sejak sistem terakhir disinkronkan.

Kami juga menerima peringatan tentang penggunaan waktu lokal untuk RTC - ini berlaku untuk perubahan zona waktu dan pengaturan DST. Jika komputer dimatikan saat perubahan perlu dilakukan, RTC tidak akan berubah. Tetapi untuk server atau host lain yang beroperasi sepanjang waktu, ini tidak menjadi masalah sama sekali. Selain itu, setiap layanan yang menyediakan sinkronisasi waktu NTP akan menyesuaikan waktu host selama fase startup awal, sehingga waktu akan menjadi benar kembali setelah startup selesai.

Mengatur zona waktu

Biasanya, Anda menentukan zona waktu selama prosedur penginstalan dan Anda tidak memiliki tugas untuk mengubahnya nanti. Namun, ada kalanya Anda perlu mengubah zona waktu. Ada beberapa alat yang dapat membantu. Linux menggunakan file zona waktu untuk menentukan zona waktu lokal sebuah host. File-file ini ada di direktori /usr/berbagi/zoneinfo. Secara default, untuk zona waktu saya, sistem mengatur ini: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Tetapi Anda tidak perlu mengetahui seluk-beluk seperti itu untuk mengubah zona waktu.

Hal utama adalah mengetahui nama zona waktu resmi untuk lokasi Anda dan perintah yang sesuai. Katakanlah Anda ingin mengubah zona waktu ke Los Angeles:


[root@testvm2 ~]# timedatectl list-timezones | column
<SNIP>
America/La_Paz                  Europe/Budapest
America/Lima                    Europe/Chisinau
America/Los_Angeles             Europe/Copenhagen
America/Maceio                  Europe/Dublin
America/Managua                 Europe/Gibraltar
America/Manaus                  Europe/Helsinki
<SNIP>

Sekarang Anda dapat mengatur zona waktu. Saya menggunakan perintah tanggal untuk memeriksa perubahan, tetapi Anda juga dapat menggunakan timedatectl:

[root@testvm2 ~]# date
Tue 19 May 2020 04:47:49 PM EDT
[root@testvm2 ~]# timedatectl set-timezone America/Los_Angeles
[root@testvm2 ~]# date
Tue 19 May 2020 01:48:23 PM PDT
[root@testvm2 ~]#

Sekarang Anda dapat mengubah zona waktu host Anda kembali ke waktu setempat.

systemd-timesyncd

Daemon timesync systemd menyediakan implementasi NTP yang mudah dikelola dalam konteks systemd. Itu diinstal secara default di Fedora dan Ubuntu. Namun, ini hanya dimulai secara default di Ubuntu. Saya tidak yakin tentang distribusi lain. Anda dapat memeriksa sendiri:

[root@testvm1 ~]# systemctl status systemd-timesyncd

Mengkonfigurasi systemd-timesyncd

File konfigurasi untuk systemd-timesyncd adalah /etc/systemd/timesyncd.conf. Ini adalah file sederhana dengan lebih sedikit opsi yang diaktifkan daripada layanan NTP dan chronyd lama. Berikut isi file ini (tanpa modifikasi lebih lanjut) di Fedora VM saya:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Satu-satunya bagian di dalamnya, selain komentar, adalah [Waktu]. Semua baris lainnya dikomentari. Ini adalah nilai default dan tidak boleh diubah (kecuali jika Anda memiliki alasan untuk itu). Jika Anda tidak memiliki server waktu NTP yang ditentukan di baris NTP=, Fedora secara default menggunakan server waktu Fedora cadangan. Saya biasanya menambahkan server waktu saya:

NTP=myntpserver

Menjalankan sinkronisasi waktu

Anda dapat memulai dan mengaktifkan systemd-timesyncd seperti ini:

[root@testvm2 ~]# systemctl enable systemd-timesyncd.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.timesync1.service β†’ /usr/lib/systemd/system/systemd-timesyncd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service β†’ /usr/lib/systemd/system/systemd-timesyncd.service.
[root@testvm2 ~]# systemctl start systemd-timesyncd.service
[root@testvm2 ~]#

Mengatur jam perangkat keras

Inilah situasinya setelah menjalankan timesyncd:

[root@testvm2 systemd]# timedatectl
               Local time: Sat 2020-05-16 14:34:54 EDT  
           Universal time: Sat 2020-05-16 18:34:54 UTC  
                 RTC time: Sat 2020-05-16 14:34:53      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: no    

Awalnya, perbedaan antara RTC dan waktu lokal (EDT) kurang dari satu detik, dan perbedaan tersebut meningkat beberapa detik lagi selama beberapa hari berikutnya. Karena tidak ada konsep zona waktu di RTC, perintah timedatectl harus melakukan perbandingan untuk menentukan zona waktu yang benar. Jika waktu RTC tidak sama persis dengan waktu lokal, maka waktu tersebut juga tidak cocok dengan zona waktu lokal.

Mencari informasi lebih lanjut, saya memeriksa status systemd-timesync dan menemukan ini:

[root@testvm2 systemd]# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
     Loaded: loaded (/usr/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2020-05-16 13:56:53 EDT; 18h ago
       Docs: man:systemd-timesyncd.service(8)
   Main PID: 822 (systemd-timesyn)
     Status: "Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
      Tasks: 2 (limit: 10365)
     Memory: 2.8M
        CPU: 476ms
     CGroup: /system.slice/systemd-timesyncd.service
             └─822 /usr/lib/systemd/systemd-timesyncd

May 16 09:57:24 testvm2.both.org systemd[1]: Starting Network Time Synchronization...
May 16 09:57:24 testvm2.both.org systemd-timesyncd[822]: System clock time unset or jumped backwards, restoring from recorded timestamp: Sat 2020-05-16 13:56:53 EDT
May 16 13:56:53 testvm2.both.org systemd[1]: Started Network Time Synchronization.
May 16 13:57:56 testvm2.both.org systemd-timesyncd[822]: Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org).
[root@testvm2 systemd]#

Perhatikan pesan log yang mengatakan waktu sistem belum disetel atau telah disetel ulang. Layanan Timesync menetapkan waktu sistem berdasarkan stempel waktu. Stempel waktu dikelola oleh daemon timesync dan dibuat pada setiap sinkronisasi yang berhasil.

Perintah timedatectl tidak memiliki cara untuk mengambil nilai jam perangkat keras dari jam sistem. Itu hanya dapat mengatur waktu dan tanggal dari nilai yang dimasukkan pada baris perintah. Anda dapat mengatur RTC ke nilai yang sama dengan waktu sistem menggunakan perintah hwclock:

[root@testvm2 ~]# /sbin/hwclock --systohc --localtime
[root@testvm2 ~]# timedatectl
               Local time: Mon 2020-05-18 13:56:46 EDT  
           Universal time: Mon 2020-05-18 17:56:46 UTC  
                 RTC time: Mon 2020-05-18 13:56:46      
                Time zone: America/New_York (EDT, -0400)
System clock synchronized: yes                          
              NTP service: active                      
          RTC in local TZ: yes

Opsi --localtime memberi tahu jam perangkat keras untuk menampilkan waktu lokal, bukan UTC.

Mengapa Anda membutuhkan RTC sama sekali?

Setiap implementasi NTP akan mengatur jam sistem pada waktu startup. Dan mengapa kemudian RTC? Ini tidak sepenuhnya benar: ini hanya akan terjadi jika Anda memiliki koneksi jaringan ke server waktu. Namun, banyak sistem tidak selalu memiliki akses ke koneksi jaringan, sehingga jam perangkat keras berguna bagi Linux untuk mengatur waktu sistem. Ini lebih baik daripada mengatur waktu secara manual, meskipun mungkin menyimpang dari waktu nyata.

Kesimpulan

Artikel ini telah mengulas beberapa alat untuk memanipulasi tanggal, waktu, dan zona waktu. Alat systemd-timesyncd menyediakan klien NTP yang dapat menyinkronkan waktu di host lokal dengan server NTP. Namun, systemd-timesyncd tidak menyediakan layanan server, jadi jika Anda memerlukan server NTP di jaringan, Anda harus menggunakan yang lain, seperti Chrony, untuk bertindak sebagai server.

Saya lebih suka memiliki implementasi tunggal untuk layanan apa pun di jaringan saya, jadi saya menggunakan Chrony. Jika Anda tidak memerlukan server NTP lokal, atau jika Anda tidak keberatan menggunakan Chrony sebagai server dan systemd-timesyncd sebagai klien SNTP. Lagi pula, tidak perlu menggunakan fitur tambahan Chrony sebagai klien jika Anda puas dengan fungsionalitas systemd-timesyncd.

Catatan lain: Anda tidak diharuskan menggunakan alat systemd untuk mengimplementasikan NTP. Anda dapat menggunakan versi lama ntpd, Chrony, atau implementasi NTP lainnya. Lagi pula, systemd terdiri dari sejumlah besar layanan; banyak dari mereka bersifat opsional, sehingga Anda dapat mematikannya dan menggunakan yang lain sebagai gantinya. Ini bukan monster monolitik besar. Anda mungkin tidak menyukai systemd atau bagiannya, tetapi Anda harus membuat keputusan yang tepat.

Saya suka implementasi NTP systemd, tapi saya lebih suka Chrony karena lebih sesuai dengan kebutuhan saya. Ini Linux, sayang -)

Tentang Hak Periklanan

VDSina menawarkan server untuk tugas apa pun, banyak pilihan sistem operasi untuk penginstalan otomatis, dimungkinkan untuk menginstal OS apa pun dari OS Anda sendiri ISO, nyaman panel kontrol pengembangan sendiri dan pembayaran harian. Ingatlah bahwa kami memiliki server abadi yang pasti abadi πŸ˜‰

Sinkronisasi Waktu Linux: NTP, Chrony dan systemd-timesyncd

Sumber: www.habr.com

Tambah komentar