Penyegerakan Masa Linux: NTP, Chrony dan systemd-timesyncd

Penyegerakan Masa Linux: NTP, Chrony dan systemd-timesyncd
Kebanyakan orang menjejaki masa. Kami bangun tepat pada masanya untuk menyelesaikan ritual pagi kami dan pergi bekerja, berehat makan tengah hari, memenuhi tarikh akhir projek, meraikan hari lahir dan cuti, menaiki kapal terbang, dan sebagainya.

Lebih-lebih lagi: sesetengah daripada kita taksub dengan masa. Jam tangan saya dikuasakan oleh tenaga suria dan mendapat masa yang tepat daripada Institut Piawaian dan Teknologi Kebangsaan (NIST) ke Fort Collins, Colorado melalui radio gelombang panjang WWVB. Isyarat masa disegerakkan dengan jam atom, juga terletak di Fort Collins. Fitbit saya sedang menyegerak dengan telefon saya yang sedang menyegerak dengan pelayan NTP, yang akhirnya disegerakkan dengan jam atom.

Peranti juga menjejaki masa

Terdapat banyak sebab mengapa peranti dan komputer kita memerlukan masa yang tepat. Contohnya, dalam perbankan, pasaran saham dan perniagaan kewangan lain, urus niaga mesti dijalankan dalam susunan yang betul, dan urutan masa yang tepat adalah penting untuk ini.

Telefon, tablet, kereta, sistem GPS dan komputer kami semuanya memerlukan tetapan masa dan tarikh yang tepat. Saya mahu jam pada desktop komputer saya menunjukkan masa yang betul. Saya mahu peringatan muncul pada kalendar tempatan saya pada masa yang sesuai. Masa yang betul juga memastikan bahawa cron dan kerja sistem berjalan pada masa yang betul.

Tarikh dan masa juga penting untuk pengelogan, jadi lebih mudah untuk mencari log tertentu berdasarkan tarikh dan masa. Sebagai contoh, saya pernah bekerja di DevOps (ia tidak dipanggil begitu pada masa itu) dan sedang menyediakan sistem e-mel di negeri Carolina Utara. Kami pernah memproses lebih 20 juta e-mel sehari. Menjejaki e-mel melalui satu siri pelayan, atau menentukan urutan peristiwa yang tepat menggunakan fail log pada hos yang tersebar secara geografi, boleh menjadi lebih mudah jika komputer masing-masing disegerakkan dalam masa.

Satu masa - berjam-jam

Hos Linux mesti mengambil kira bahawa terdapat masa sistem dan masa RTC. RTC (Jam Masa Sebenar) ialah nama yang agak pelik dan tidak begitu tepat untuk jam perkakasan.

Jam perkakasan berjalan secara berterusan walaupun komputer dimatikan, menggunakan bateri pada papan induk sistem. Fungsi utama RTC adalah untuk menyimpan masa apabila sambungan ke pelayan masa tidak tersedia. Pada zaman yang mustahil untuk menyambung ke pelayan masa melalui Internet, setiap komputer perlu mempunyai jam dalaman yang tepat. Sistem pengendalian perlu mengakses RTC pada masa but dan pengguna perlu menetapkan masa sistem secara manual menggunakan antara muka konfigurasi perkakasan BIOS untuk memastikan ia betul.

Jam perkakasan tidak memahami konsep zon waktu; RTC hanya menyimpan masa, bukan zon waktu atau mengimbangi daripada UTC (Coordinated Universal Time, juga dikenali sebagai GMT atau Greenwich Mean Time). Anda boleh memasang RTC menggunakan alat yang akan saya bincangkan kemudian dalam artikel ini.

Masa sistem ialah masa yang OS dipaparkan pada jam GUI pada desktop anda, dalam output arahan tarikh, dalam cap masa log. Ini juga terpakai apabila fail dibuat, diubah suai dan dibuka.

Pada halaman lelaki untuk rtc terdapat penerangan penuh tentang RTC dan jam sistem.

Ada apa dengan NTP?

Komputer di seluruh dunia menggunakan NTP (Network Time Protocol) untuk menyegerakkan masa mereka dengan jam rujukan standard melalui Internet menggunakan hierarki pelayan NTP. Pelayan masa utama berada di lapisan 1 dan ia disambungkan terus ke pelbagai perkhidmatan waktu kebangsaan di lapisan 0 melalui satelit, radio atau bahkan modem melalui talian telefon. Perkhidmatan masa lapisan 0 boleh menjadi jam atom, penerima radio yang ditala kepada isyarat yang dihantar oleh jam atom atau penerima GPS yang menggunakan isyarat jam sangat tepat yang dihantar oleh satelit GPS.

Sebilangan besar pelayan rujukan mempunyai beberapa ribu pelayan stratum 2 NTP awam terbuka kepada orang ramai. Banyak organisasi dan pengguna (termasuk saya sendiri) dengan banyak hos yang memerlukan pelayan NTP memilih untuk menyediakan pelayan masa mereka sendiri supaya hanya satu hos tempatan mengakses stratum 2 atau 3. Mereka kemudian mengkonfigurasi nod yang tinggal pada rangkaian untuk menggunakan tempatan pelayan masa. Dalam kes rangkaian rumah saya, ini adalah pelayan lapisan 3.

Pelbagai pelaksanaan NTP

Pelaksanaan asal NTP ialah ntpd. Ia kemudiannya disertai oleh dua yang lebih baharu, chronyd dan systemd-timesyncd. Ketiga-tiga menyegerakkan masa hos tempatan dengan pelayan masa NTP. Perkhidmatan systemd-timesyncd tidak boleh dipercayai seperti chronyd, tetapi ia cukup baik untuk kebanyakan tujuan. Jika RTC tidak segerak, ia boleh melaraskan masa sistem secara beransur-ansur untuk menyegerak dengan pelayan NTP apabila masa sistem tempatan melayang sedikit. Perkhidmatan systemd-timesync tidak boleh digunakan sebagai pelayan masa.

Chrony ialah pelaksanaan NTP yang mengandungi dua program: daemon chronyd dan antara muka baris arahan yang dipanggil chronyc. Chrony mempunyai beberapa ciri yang sangat diperlukan dalam banyak kes:

  • Chrony boleh menyegerakkan dengan pelayan masa lebih cepat daripada perkhidmatan ntpd lama. Ini bagus untuk komputer riba atau desktop yang tidak berfungsi sepanjang masa.
  • Ia boleh mengimbangi turun naik jam, seperti apabila hos tidur atau memasuki mod tidur, atau apabila jam berubah disebabkan lompat frekuensi, yang memperlahankan jam pada beban rendah.
  • Ia menyelesaikan masalah masa yang berkaitan dengan sambungan rangkaian yang tidak stabil atau kesesakan rangkaian.
  • Ia mengawal kelewatan rangkaian.
  • Selepas penyegerakan masa awal, Chrony tidak pernah menghentikan jam. Ini menyediakan slot masa yang stabil dan konsisten untuk banyak perkhidmatan dan aplikasi sistem.
  • Chrony boleh berfungsi walaupun tanpa sambungan rangkaian. Dalam kes ini, hos atau pelayan tempatan boleh dikemas kini secara manual.
  • Chrony boleh bertindak sebagai pelayan NTP.

Sekali lagi, NTP ialah protokol yang boleh dilaksanakan pada hos Linux menggunakan Chrony atau systemd-timesyncd.

RPM NTP, Chrony dan systemd-timesyncd tersedia dalam repositori Fedora standard. RPM systemd-udev ialah pengurus acara kernel yang dipasang secara lalai pada Fedora, tetapi adalah pilihan.

Anda boleh memasang ketiga-tiga dan bertukar antara mereka, tetapi ini akan menimbulkan sakit kepala tambahan. Jadi lebih baik tidak. Keluaran moden Fedora, CentOS dan RHEL telah berpindah ke Chrony sebagai pelaksanaan lalai, dan mereka juga mempunyai systemd-timesyncd. Saya mendapati Chrony berfungsi dengan baik, menyediakan antara muka yang lebih baik daripada perkhidmatan NTP, menyediakan lebih banyak maklumat dan kawalan, yang pasti akan dinikmati oleh pentadbir sistem.

Melumpuhkan Perkhidmatan NTP

Perkhidmatan NTP mungkin sudah berjalan pada hos anda. Jika ya, anda perlu melumpuhkannya sebelum beralih kepada sesuatu yang lain. Saya telah menjalankan chronyd jadi saya menggunakan arahan berikut untuk menghentikan dan melumpuhkannya. Jalankan arahan yang sesuai untuk mana-mana daemon NTP yang anda jalankan pada hos anda:

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

Semak bahawa perkhidmatan dihentikan dan dilumpuhkan:

[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 ~]#

Semakan status sebelum pelancaran

Status penyegerakan jam sistem membolehkan anda menentukan sama ada perkhidmatan NTP sedang berjalan. Memandangkan anda belum memulakan NTP lagi, arahan timesync-status akan membayangkan perkara ini:

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

Permintaan status langsung memberikan maklumat penting. Sebagai contoh, arahan timedatectl tanpa hujah atau pilihan melaksanakan subperintah status secara lalai:

[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 masa tempatan untuk hos anda, waktu UTC dan masa RTC. Dalam kes ini, masa sistem ditetapkan kepada zon waktu Amerika / New_York (TZ), RTC ditetapkan kepada masa dalam zon waktu tempatan dan perkhidmatan NTP tidak aktif. Masa RTC telah mula menyimpang sedikit daripada masa sistem. Ini adalah perkara biasa untuk sistem yang jamnya belum disegerakkan. Jumlah offset pada hos bergantung pada masa yang telah berlalu sejak sistem kali terakhir disegerakkan.

Kami juga menerima amaran tentang menggunakan waktu tempatan untuk RTC - ini terpakai pada perubahan zon waktu dan tetapan DST. Jika komputer dimatikan apabila perubahan perlu dibuat, RTC tidak akan berubah. Tetapi untuk pelayan atau hos lain yang berjalan sepanjang masa, ini tidak menjadi masalah sama sekali. Selain itu, mana-mana perkhidmatan yang menyediakan penyegerakan masa NTP akan melaraskan masa hos semasa fasa permulaan awal, jadi masa akan betul sekali lagi selepas permulaan selesai.

Menetapkan zon waktu

Biasanya, anda menentukan zon waktu semasa prosedur pemasangan dan anda tidak mempunyai tugas untuk menukarnya kemudian. Walau bagaimanapun, ada kalanya anda perlu menukar zon waktu. Terdapat beberapa alat yang boleh membantu. Linux menggunakan fail zon waktu untuk menentukan zon waktu setempat hos. Fail-fail ini berada dalam direktori /usr/share/zoneinfo. Secara lalai, untuk zon waktu saya, sistem menetapkan ini: /etc/localtime -> ../usr/share/zoneinfo/America/New_York. Tetapi anda tidak perlu mengetahui kehalusan sedemikian untuk menukar zon waktu.

Perkara utama ialah mengetahui nama zon waktu rasmi untuk lokasi anda dan arahan yang sepadan. Katakan anda ingin menukar zon waktu kepada 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>

Kini anda boleh menetapkan zon waktu. Saya menggunakan arahan tarikh untuk menyemak perubahan, tetapi anda juga boleh 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 ~]#

Kini anda boleh menukar zon waktu hos anda kembali kepada waktu tempatan.

systemd-timesyncd

Daemon timesync systemd menyediakan pelaksanaan NTP yang mudah diurus dalam konteks systemd. Ia dipasang secara lalai pada Fedora dan Ubuntu. Walau bagaimanapun, ia hanya bermula secara lalai pada Ubuntu. Saya tidak pasti tentang pengedaran lain. Anda boleh menyemak sendiri:

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

Mengkonfigurasi systemd-timesyncd

Fail konfigurasi untuk systemd-timesyncd ialah /etc/systemd/timesyncd.conf. Ini ialah fail ringkas dengan pilihan yang lebih sedikit didayakan daripada perkhidmatan NTP dan chronyd lama. Berikut ialah kandungan fail ini (tanpa pengubahsuaian lanjut) pada VM Fedora 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 bahagian yang terkandung di dalamnya, selain ulasan, ialah [Masa]. Semua baris lain diulas. Ini adalah nilai lalai dan tidak boleh diubah (melainkan anda mempunyai sebab untuk). Jika anda tidak mempunyai pelayan masa NTP yang ditakrifkan dalam baris NTP=, Fedora lalai kepada pelayan masa Fedora sandaran. Saya biasanya menambah pelayan masa saya:

NTP=myntpserver

Menjalankan timesync

Anda boleh memulakan dan menjadikan systemd-timesyncd aktif 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 ~]#

Menetapkan jam perkakasan

Inilah keadaan yang kelihatan selepas 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    

Pada mulanya, perbezaan antara RTC dan waktu tempatan (EDT) adalah kurang daripada satu saat, dan percanggahan meningkat beberapa saat lagi dalam beberapa hari akan datang. Oleh kerana tiada konsep zon waktu dalam RTC, arahan timedatectl mesti melakukan perbandingan untuk menentukan zon waktu yang betul. Jika waktu RTC tidak betul-betul sepadan dengan waktu tempatan, maka ia juga tidak sepadan dengan zon waktu tempatan.

Mencari maklumat lanjut, saya menyemak status systemd-timesync dan mendapati 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 mesej log yang mengatakan masa sistem belum ditetapkan atau telah ditetapkan semula. Perkhidmatan Timesync menetapkan masa sistem berdasarkan cap waktu. Cap masa dikekalkan oleh daemon timesync dan dibuat pada setiap penyegerakan yang berjaya.

Perintah timedatectl tidak mempunyai cara untuk mengambil nilai jam perkakasan daripada jam sistem. Ia hanya boleh menetapkan masa dan tarikh daripada nilai yang dimasukkan pada baris arahan. Anda boleh menetapkan RTC kepada nilai yang sama dengan masa sistem menggunakan arahan 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

Pilihan --localtime memberitahu jam perkakasan untuk menunjukkan waktu tempatan, bukan UTC.

Mengapa anda memerlukan RTC sama sekali?

Sebarang pelaksanaan NTP akan menetapkan jam sistem pada masa permulaan. Dan kenapa pula RTC? Ini tidak sepenuhnya benar: ini hanya akan berlaku jika anda mempunyai sambungan rangkaian ke pelayan masa. Walau bagaimanapun, banyak sistem tidak selalu mempunyai akses kepada sambungan rangkaian, jadi jam perkakasan berguna untuk Linux digunakan untuk menetapkan masa sistem. Ini lebih baik daripada menetapkan masa secara manual, walaupun ia mungkin menyimpang dari masa nyata.

Kesimpulan

Artikel ini telah menyemak beberapa alatan untuk memanipulasi tarikh, masa dan zon masa. Alat systemd-timesyncd menyediakan klien NTP yang boleh menyegerakkan masa pada hos tempatan dengan pelayan NTP. Walau bagaimanapun, systemd-timesyncd tidak menyediakan perkhidmatan pelayan, jadi jika anda memerlukan pelayan NTP pada rangkaian anda, anda mesti menggunakan sesuatu yang lain, seperti Chrony, untuk bertindak sebagai pelayan.

Saya lebih suka mempunyai satu pelaksanaan untuk mana-mana perkhidmatan pada rangkaian saya, jadi saya menggunakan Chrony. Jika anda tidak memerlukan pelayan NTP tempatan, atau jika anda tidak keberatan menggunakan Chrony sebagai pelayan dan systemd-timesyncd sebagai klien SNTP. Lagipun, tidak perlu menggunakan ciri tambahan Chrony sebagai pelanggan jika anda berpuas hati dengan fungsi systemd-timesyncd.

Nota lain: anda tidak perlu menggunakan alat systemd untuk melaksanakan NTP. Anda boleh menggunakan versi lama ntpd, Chrony atau pelaksanaan NTP yang lain. Lagipun, systemd terdiri daripada sejumlah besar perkhidmatan; kebanyakannya adalah pilihan, jadi anda boleh mematikannya dan menggunakan sesuatu yang lain. Ini bukan raksasa monolitik yang besar. Anda mungkin tidak menyukai systemd atau sebahagian daripadanya, tetapi anda harus membuat keputusan termaklum.

Saya suka pelaksanaan NTP systemd, tetapi saya lebih suka Chrony kerana ia lebih sesuai dengan keperluan saya. Ia Linux, sayang -)

Sebagai iklan

Tawaran VDSina pelayan untuk sebarang tugas, pilihan besar sistem pengendalian untuk pemasangan automatik, adalah mungkin untuk memasang mana-mana OS dari anda sendiri ISO, selesa panel kawalan pembangunan sendiri dan bayaran harian. Ingat bahawa kami mempunyai pelayan abadi yang pastinya abadi πŸ˜‰

Penyegerakan Masa Linux: NTP, Chrony dan systemd-timesyncd

Sumber: www.habr.com

Tambah komen