مزامنة وقت Linux: NTP و Chrony و systemd-timeyncd

مزامنة وقت Linux: NTP و Chrony و systemd-timeyncd
معظم الناس يتتبعون الوقت. نستيقظ في الوقت المحدد لإكمال طقوسنا الصباحية والذهاب إلى العمل ، وأخذ استراحة غداء ، والوفاء بالمواعيد النهائية للمشروع ، والاحتفال بأعياد الميلاد والعطلات ، وركوب الطائرة ، وما إلى ذلك.

علاوة على ذلك: البعض منا مهووس بالوقت. ساعتي تعمل بالطاقة الشمسية وتحصل على وقت دقيق من المعهد الوطني للمعايير والتكنولوجيا (نيست) إلى فورت كولينز ، كولورادو عبر راديو الموجة الطويلة WWVB. تتم مزامنة إشارات الوقت مع الساعة الذرية الموجودة أيضًا في Fort Collins. يتزامن تطبيق Fitbit الخاص بي مع هاتفي الذي يتزامن مع الخادم NTP، والتي تتزامن في النهاية مع الساعة الذرية.

الأجهزة تتبع الوقت أيضًا

هناك العديد من الأسباب التي تجعل أجهزتنا وأجهزة الكمبيوتر تحتاج إلى وقت دقيق. على سبيل المثال ، في البنوك وأسواق الأوراق المالية والأعمال المالية الأخرى ، يجب تنفيذ المعاملات بالترتيب الصحيح ، والتسلسل الزمني الدقيق أمر بالغ الأهمية لتحقيق ذلك.

تتطلب جميع الهواتف والأجهزة اللوحية والسيارات وأنظمة GPS وأجهزة الكمبيوتر الخاصة بنا إعدادات دقيقة للوقت والتاريخ. أريد أن تعرض الساعة على سطح مكتب الكمبيوتر الخاص بي الوقت الصحيح. أريد أن تظهر التذكيرات في التقويم المحلي الخاص بي في الوقت المناسب. يضمن الوقت الصحيح أيضًا تشغيل مهام cron و systemd في الوقت الصحيح.

يعد التاريخ والوقت مهمين أيضًا للتسجيل ، لذلك من الأسهل قليلاً العثور على سجلات معينة بناءً على التاريخ والوقت. على سبيل المثال ، عملت ذات مرة في DevOps (لم يكن يطلق عليه ذلك في ذلك الوقت) وكنت أقوم بإعداد نظام بريد إلكتروني في ولاية كارولينا الشمالية. اعتدنا على معالجة أكثر من 20 مليون بريد إلكتروني يوميًا. يمكن أن يكون تتبع البريد الإلكتروني من خلال سلسلة من الخوادم ، أو تحديد التسلسل الدقيق للأحداث باستخدام ملفات السجل على مضيفين موزعين جغرافيًا ، أسهل بكثير إذا تمت مزامنة أجهزة الكمبيوتر المعنية في الوقت المناسب.

مرة واحدة - عدة ساعات

يجب أن يأخذ مضيفو Linux في الاعتبار أن هناك وقتًا للنظام ووقت RTC. RTC (Real Time Clock) هو اسم غريب قليلاً وغير دقيق للغاية لساعة الجهاز.

تعمل ساعة الجهاز بشكل مستمر حتى عند إيقاف تشغيل الكمبيوتر ، وذلك باستخدام البطارية الموجودة على اللوحة الأم للنظام. تتمثل الوظيفة الرئيسية لـ RTC في تخزين الوقت عند عدم توفر الاتصال بخادم الوقت. في الأيام التي كان من المستحيل فيها الاتصال بخادم الوقت عبر الإنترنت ، كان يجب أن يكون لكل كمبيوتر ساعة داخلية دقيقة. كان على أنظمة التشغيل الوصول إلى RTC في وقت التمهيد وكان على المستخدم ضبط وقت النظام يدويًا باستخدام واجهة تكوين أجهزة BIOS للتأكد من صحتها.

لا تفهم ساعات الأجهزة مفهوم المناطق الزمنية ؛ يقوم RTC بتخزين الوقت فقط ، وليس المنطقة الزمنية أو الإزاحة من UTC (التوقيت العالمي المنسق ، المعروف أيضًا باسم GMT أو توقيت غرينتش). يمكنك تثبيت RTC باستخدام أداة سأغطيها لاحقًا في هذه المقالة.

وقت النظام هو الوقت الذي يعرضه نظام التشغيل على ساعة واجهة المستخدم الرسومية على سطح المكتب ، في إخراج أمر التاريخ ، في الطوابع الزمنية للسجلات. ينطبق هذا أيضًا على وقت إنشاء الملفات وتعديلها وفتحها.

على الصفحة رجل RTC يوجد وصف كامل لـ RTC وساعة النظام.

ما مع NTP؟

تستخدم أجهزة الكمبيوتر في جميع أنحاء العالم NTP (بروتوكول وقت الشبكة) لمزامنة وقتها مع الساعات المرجعية القياسية عبر الإنترنت باستخدام تسلسل هرمي لخوادم NTP. توجد خوادم الوقت الرئيسية في الطبقة 1 وهي متصلة مباشرة بخدمات التوقيت الوطني المختلفة في الطبقة 0 عبر الأقمار الصناعية أو الراديو أو حتى المودم عبر خطوط الهاتف. يمكن أن تكون خدمات وقت الطبقة 0 عبارة عن ساعة ذرية ، أو جهاز استقبال لاسلكي يتم ضبطه على الإشارات المرسلة بواسطة الساعات الذرية ، أو جهاز استقبال GPS يستخدم إشارات ساعة عالية الدقة يتم إرسالها بواسطة أقمار GPS الصناعية.

الغالبية العظمى من الخوادم المرجعية لديها عدة آلاف من خوادم NTP الطبقة 2 العامة المفتوحة للجمهور. يختار العديد من المؤسسات والمستخدمين (بمن فيهم أنا) الذين لديهم الكثير من المضيفين الذين يحتاجون إلى خادم NTP إعداد خوادم الوقت الخاصة بهم بحيث يصل مضيف محلي واحد فقط إلى الطبقة 2 أو 3. ثم يقومون بتكوين العقد المتبقية على الشبكة لاستخدام المحلي خادم الوقت. في حالة شبكتي المنزلية ، هذا خادم طبقة 3.

تطبيقات مختلفة من NTP

التنفيذ الأصلي لبرنامج NTP هو ntpd. ثم انضم إليه اثنان أحدث ، chronyd و systemd-timesyncd. يقوم الثلاثة بمزامنة وقت المضيف المحلي مع خادم وقت NTP. خدمة systemd-timeyncd ليست موثوقة مثل chronyd ، لكنها جيدة بما يكفي لمعظم الأغراض. إذا كان RTC غير متزامن ، فيمكنه ضبط وقت النظام تدريجيًا للمزامنة مع خادم NTP عندما ينحرف وقت النظام المحلي قليلاً. لا يمكن استخدام خدمة systemd-timeync كخادم وقت.

كروني هو تطبيق NTP يحتوي على برنامجين: البرنامج الخفي chronyd وواجهة سطر أوامر تسمى chronyc. يحتوي Chrony على بعض الميزات التي لا غنى عنها في كثير من الحالات:

  • يمكن لـ Chrony المزامنة مع خادم وقت أسرع بكثير من خدمة ntpd القديمة. هذا جيد لأجهزة الكمبيوتر المحمولة أو أجهزة الكمبيوتر المكتبية التي لا تعمل طوال الوقت.
  • يمكن أن تعوض تقلبات الساعة ، مثل عندما ينام المضيف أو يدخل في وضع السكون ، أو عندما تتغير الساعة بسبب قفز التردد ، مما يؤدي إلى إبطاء الساعات عند الأحمال المنخفضة.
  • إنه يحل مشاكل الوقت المتعلقة باتصال الشبكة غير المستقر أو ازدحام الشبكة.
  • ينظم تأخيرات الشبكة.
  • بعد مزامنة الوقت الأولي ، لا يوقف Chrony الساعة أبدًا. يوفر هذا فترات زمنية ثابتة ومتسقة للعديد من خدمات وتطبيقات النظام.
  • يمكن لـ Chrony العمل حتى بدون اتصال بالشبكة. في هذه الحالة ، يمكن تحديث المضيف أو الخادم المحلي يدويًا.
  • يمكن أن يعمل Chrony كخادم NTP.

مرة أخرى ، NTP هو بروتوكول يمكن تنفيذه على مضيف Linux باستخدام Chrony أو systemd-timesyncd.

تتوفر RPMs NTP و Chrony و systemd-timeyncd في مستودعات Fedora القياسية. يعد systemd-udev RPM مدير أحداث kernel يتم تثبيته افتراضيًا على Fedora ، ولكنه اختياري.

يمكنك تثبيت الثلاثة والتبديل بينهم ، ولكن هذا سيخلق صداعًا إضافيًا. لذلك من الأفضل عدم القيام بذلك. انتقلت الإصدارات الحديثة من Fedora و CentOS و RHEL إلى Chrony كتطبيق افتراضي ، ولديها أيضًا systemd-timeyncd. أجد أن Chrony يعمل بشكل جيد ، ويوفر واجهة أفضل من خدمة NTP ، ويوفر المزيد من المعلومات والتحكم ، وهو ما سيستمتع به مسؤولو النظام بالتأكيد.

تعطيل خدمات NTP

ربما تكون خدمة NTP قيد التشغيل بالفعل على مضيفك. إذا كان الأمر كذلك ، فأنت بحاجة إلى تعطيله قبل التبديل إلى شيء آخر. كان لدي chronyd قيد التشغيل لذا استخدمت الأوامر التالية لإيقافه وتعطيله. قم بتشغيل الأوامر المناسبة لأي برنامج خفي NTP تقوم بتشغيله على مضيفك:

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

تأكد من إيقاف الخدمة وتعطيلها:

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

تحقق من الحالة قبل الإطلاق

تتيح لك حالة مزامنة ساعة النظام تحديد ما إذا كانت خدمة NTP قيد التشغيل. نظرًا لأنك لم تبدأ NTP حتى الآن ، فإن الأمر timeync-status سوف يلمح إلى هذا:

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

يوفر طلب الحالة المباشر معلومات مهمة. على سبيل المثال ، يقوم الأمر timedatectl بدون وسيطة أو خيارات بتنفيذ الأمر الفرعي للحالة افتراضيًا:

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

سيعطيك هذا التوقيت المحلي لمضيفك ، وتوقيت UTC ، ووقت RTC. في هذه الحالة ، يتم تعيين وقت النظام على المنطقة الزمنية America / New_York (TZ) ، ويتم تعيين RTC على الوقت في المنطقة الزمنية المحلية ، وتكون خدمة NTP غير نشطة. بدأ وقت RTC ينحرف قليلاً عن وقت النظام. هذا أمر طبيعي للأنظمة التي لم تتم مزامنة ساعاتها. يعتمد مقدار الإزاحة على المضيف على الوقت المنقضي منذ آخر مزامنة للنظام.

تلقينا أيضًا تحذيرًا بشأن استخدام التوقيت المحلي لـ RTC - وهذا ينطبق على تغييرات المنطقة الزمنية وإعدادات DST. إذا تم إيقاف تشغيل الكمبيوتر عند الحاجة إلى إجراء تغييرات ، فلن يتغير RTC. ولكن بالنسبة للخوادم أو المضيفات الأخرى التي تعمل على مدار الساعة ، فهذه ليست مشكلة على الإطلاق. بالإضافة إلى ذلك ، فإن أي خدمة توفر مزامنة وقت NTP ستعمل على ضبط وقت المضيف أثناء مرحلة بدء التشغيل الأولية ، لذلك سيكون الوقت صحيحًا مرة أخرى بعد اكتمال بدء التشغيل.

تحديد المنطقة الزمنية

عادة ، تقوم بتحديد المنطقة الزمنية أثناء إجراء التثبيت وليس لديك مهمة تغييرها لاحقًا. ومع ذلك ، هناك أوقات تحتاج فيها إلى تغيير المنطقة الزمنية. هناك العديد من الأدوات التي يمكن أن تساعد. يستخدم Linux ملفات المنطقة الزمنية لتحديد المنطقة الزمنية المحلية للمضيف. هذه الملفات موجودة في الدليل / usr / share / zoneinfo. بشكل افتراضي ، بالنسبة لمنطقي الزمني ، يطلب النظام ما يلي: / etc / localtime -> ../usr/share/zoneinfo/America/New_York. لكنك لست بحاجة إلى معرفة هذه التفاصيل الدقيقة لتغيير المنطقة الزمنية.

الشيء الرئيسي هو معرفة اسم المنطقة الزمنية الرسمية لموقعك والأمر المقابل. لنفترض أنك تريد تغيير المنطقة الزمنية إلى لوس أنجلوس:


[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>

الآن يمكنك ضبط المنطقة الزمنية. لقد استخدمت الأمر date للتحقق من التغييرات ، ولكن يمكنك أيضًا استخدام 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 ~]#

يمكنك الآن تغيير المنطقة الزمنية لمضيفك إلى التوقيت المحلي.

systemd- timesyncd

يوفر البرنامج الخفي للمزامنة الزمنية systemd تطبيق NTP يسهل إدارته في سياق systemd. يتم تثبيته افتراضيًا على Fedora و Ubuntu. ومع ذلك ، فإنه يبدأ فقط بشكل افتراضي على Ubuntu. لست متأكدًا من التوزيعات الأخرى. يمكنك التحقق بنفسك:

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

تكوين systemd-timeyncd

ملف التكوين لـ systemd-timesyncd هو /etc/systemd/timesyncd.conf. هذا ملف بسيط مع تمكين خيارات أقل من خدمات NTP و chronyd القديمة. ها هي محتويات هذا الملف (بدون تعديلات إضافية) على جهاز Fedora VM الخاص بي:

#  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

القسم الوحيد الذي يحتوي عليه ، إلى جانب التعليقات ، هو [الوقت]. يتم التعليق على جميع الأسطر الأخرى. هذه هي القيم الافتراضية ولا يجب تغييرها (إلا إذا كان لديك سبب لذلك). إذا لم يكن لديك خادم وقت NTP محدد في سطر NTP = ، فسيتم تعيين Fedora افتراضيًا على خادم وقت احتياطي فيدورا. عادةً ما أقوم بإضافة خادم الوقت الخاص بي:

NTP=myntpserver

تشغيل timeync

يمكنك بدء تشغيل systemd-timeyncd وتنشيطه كما يلي:

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

ضبط ساعة الجهاز

إليك ما يبدو عليه الموقف بعد تشغيل المزامنة الزمنية:

[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    

في البداية ، يكون الفرق بين التوقيت المحلي (RTC) والتوقيت المحلي (EDT) أقل من ثانية ، ويزداد التباين بمقدار ثانيتين أخريين خلال الأيام القليلة المقبلة. نظرًا لعدم وجود مفهوم للمناطق الزمنية في RTC ، يجب أن يقوم الأمر timedatectl بإجراء مقارنة لتحديد المنطقة الزمنية الصحيحة. إذا كان وقت RTC لا يتطابق تمامًا مع التوقيت المحلي ، فإنه لا يتطابق أيضًا مع المنطقة الزمنية المحلية.

بحثًا عن مزيد من المعلومات ، تحققت من حالة systemd-timeync ووجدت هذا:

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

لاحظ رسالة السجل التي تفيد بأن وقت النظام لم يتم ضبطه أو تمت إعادة تعيينه. تعيّن خدمة Timesync وقت النظام بناءً على الطابع الزمني. يتم الاحتفاظ بالطوابع الزمنية من خلال برنامج التزامن الزمني الخفي ويتم إنشاؤها في كل مزامنة ناجحة.

لا يملك الأمر timedatectl أي طريقة لأخذ قيمة ساعة الجهاز من ساعة النظام. يمكنه فقط ضبط الوقت والتاريخ من القيمة المدخلة في سطر الأوامر. يمكنك ضبط RTC على نفس قيمة وقت النظام باستخدام الأمر 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

يخبر خيار --localtime ساعة الجهاز بإظهار التوقيت المحلي ، وليس التوقيت العالمي المنسق (UTC).

لماذا تحتاج RTC على الإطلاق؟

سيؤدي أي تنفيذ لـ NTP إلى ضبط ساعة النظام في وقت بدء التشغيل. ولماذا إذن RTC؟ هذا ليس صحيحًا تمامًا: لن يحدث هذا إلا إذا كان لديك اتصال شبكة بخادم الوقت. ومع ذلك ، لا تتمتع العديد من الأنظمة دائمًا بإمكانية الوصول إلى اتصال الشبكة ، لذا فإن ساعة الجهاز مفيدة لنظام التشغيل Linux لضبط وقت النظام. هذا أفضل من ضبط الوقت يدويًا ، على الرغم من أنه قد ينحرف عن الوقت الفعلي.

اختتام

استعرضت هذه المقالة بعض الأدوات لمعالجة التاريخ والوقت والمناطق الزمنية. توفر أداة systemd-timesyncd عميل NTP يمكنه مزامنة الوقت على المضيف المحلي مع خادم NTP. ومع ذلك ، لا يوفر systemd-timeyncd خدمة خادم ، لذلك إذا كنت بحاجة إلى خادم NTP على شبكتك ، فيجب عليك استخدام شيء آخر ، مثل Chrony ، للعمل كخادم.

أفضل أن يكون لدي تطبيق واحد لأي خدمة على شبكتي ، لذلك أستخدم Chrony. إذا لم تكن بحاجة إلى خادم NTP محلي ، أو إذا كنت لا تمانع في استخدام Chrony كخادم و systemd-timeyncd كعميل SNTP. بعد كل شيء ، ليست هناك حاجة لاستخدام الميزات الإضافية لـ Chrony كعميل إذا كنت راضيًا عن وظيفة systemd-timeyncd.

ملاحظة أخرى: لست مطالبًا باستخدام أدوات systemd لتنفيذ NTP. يمكنك استخدام إصدار أقدم من ntpd أو Chrony أو تطبيق NTP آخر. بعد كل شيء ، يتكون systemd من عدد كبير من الخدمات ؛ العديد منها اختياري ، لذا يمكنك إيقاف تشغيلها واستخدام شيء آخر بدلاً من ذلك. هذا ليس وحشًا ضخمًا مترابطًا. قد لا تعجبك systemd أو أجزاء منه ، لكن يجب عليك اتخاذ قرار مستنير.

أحب تطبيق systemd لـ NTP ، لكني أفضل Chrony لأنه يناسب احتياجاتي بشكل أفضل. إنه لينكس ، حبيبي -)

كإعلان

عروض VDSina خوادم لأية مهمة، مجموعة كبيرة من أنظمة التشغيل للتثبيت التلقائي ، من الممكن تثبيت أي نظام تشغيل من نظامك ISO، مريح لوحة التحكم التنمية الخاصة والدفع اليومي. تذكر أن لدينا خوادم أبدية هي بالتأكيد خالدة 😉

مزامنة وقت Linux: NTP و Chrony و systemd-timeyncd

المصدر: www.habr.com

إضافة تعليق