همگام سازی زمان لینوکس: NTP، Chrony و systemd-timesyncd

همگام سازی زمان لینوکس: NTP، Chrony و systemd-timesyncd
بیشتر مردم زمان را پیگیری می کنند. ما به موقع از خواب بیدار می شویم تا مراسم صبحگاهی خود را کامل کنیم و به سر کار برویم، ناهار استراحت کنیم، ضرب الاجل های پروژه را رعایت کنیم، تولدها و تعطیلات را جشن بگیریم، سوار هواپیما شویم و غیره.

علاوه بر این: برخی از ما به زمان وسواس داریم. ساعت من با انرژی خورشیدی کار می کند و زمان دقیق را از موسسه ملی استاندارد و فناوری دریافت می کند (NIST) به فورت کالینز، کلرادو از طریق رادیو موج بلند WWVB. سیگنال های زمان با ساعت اتمی که در فورت کالینز نیز قرار دارد، هماهنگ می شوند. Fitbit من با گوشی من که در حال همگام سازی با سرور است همگام سازی می شود NTP، که در نهایت با ساعت اتمی همگام می شود.

دستگاه ها نیز زمان را پیگیری می کنند

دلایل زیادی وجود دارد که چرا دستگاه ها و رایانه های ما به زمان دقیق نیاز دارند. به عنوان مثال، در بانکداری، بازارهای سهام و سایر مشاغل مالی، معاملات باید به ترتیب مناسب انجام شوند و توالی زمانی دقیق برای این امر حیاتی است.

تلفن‌ها، تبلت‌ها، اتومبیل‌ها، سیستم‌های GPS و رایانه‌های ما همگی به تنظیمات دقیق زمان و تاریخ نیاز دارند. من می خواهم ساعت روی دسکتاپ کامپیوترم زمان درست را نشان دهد. می‌خواهم یادآورها در زمان مناسب در تقویم محلی من ظاهر شوند. زمان صحیح همچنین تضمین می کند که کارهای cron و systemd در زمان صحیح اجرا شوند.

تاریخ و زمان نیز برای ورود به سیستم مهم هستند، بنابراین یافتن گزارش‌های خاص بر اساس تاریخ و زمان کمی آسان‌تر است. به عنوان مثال، من یک بار در DevOps کار می کردم (در آن زمان نام آن چنین نبود) و در حال راه اندازی یک سیستم ایمیل در ایالت کارولینای شمالی بودم. ما روزانه بیش از 20 میلیون ایمیل را پردازش می کردیم. ردیابی ایمیل از طریق یک سری از سرورها، یا تعیین توالی دقیق رویدادها با استفاده از فایل های گزارش روی میزبان های پراکنده جغرافیایی، در صورتی که رایانه های مربوطه به موقع همگام شوند، می تواند بسیار آسان تر باشد.

یک بار - چندین ساعت

هاست لینوکس باید در نظر داشته باشد که یک زمان سیستم و یک زمان 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-timesyncd به اندازه chronyd قابل اعتماد نیست، اما برای اکثر اهداف به اندازه کافی خوب است. اگر RTC هماهنگ نباشد، می‌تواند به تدریج زمان سیستم را برای همگام‌سازی با سرور NTP زمانی که زمان سیستم محلی کمی تغییر می‌کند، تنظیم کند. سرویس systemd-timesync نمی تواند به عنوان سرور زمان استفاده شود.

کرونی یک پیاده سازی از NTP است که شامل دو برنامه است: chronyd daemon و یک رابط خط فرمان به نام chronyc. Chrony دارای ویژگی هایی است که در بسیاری از موارد ضروری هستند:

  • Chrony می تواند با سرور زمان بسیار سریعتر از سرویس قدیمی ntpd همگام شود. این برای لپ تاپ ها یا دسکتاپ هایی که همیشه کار نمی کنند خوب است.
  • می تواند نوسانات ساعت را جبران کند، مانند زمانی که میزبان به خواب می رود یا وارد حالت خواب می شود، یا زمانی که ساعت به دلیل جهش فرکانس تغییر می کند، که باعث کاهش سرعت ساعت در بارهای کم می شود.
  • مشکلات زمانی مربوط به اتصال شبکه ناپایدار یا تراکم شبکه را حل می کند.
  • تأخیرهای شبکه را تنظیم می کند.
  • پس از همگام‌سازی اولیه، Chrony هرگز ساعت را متوقف نمی‌کند. این برای بسیاری از سرویس ها و برنامه های سیستم، بازه های زمانی پایدار و ثابتی را فراهم می کند.
  • Chrony می تواند حتی بدون اتصال به شبکه نیز کار کند. در این صورت می توان میزبان یا سرور محلی را به صورت دستی به روز کرد.
  • Chrony می تواند به عنوان یک سرور NTP عمل کند.

بار دیگر، NTP پروتکلی است که می تواند با استفاده از Chrony یا systemd-timesyncd روی هاست لینوکس پیاده سازی شود.

RPM های NTP، Chrony و systemd-timesyncd در مخازن استاندارد فدورا موجود هستند. systemd-udev RPM یک مدیریت رویداد هسته است که به طور پیش‌فرض روی فدورا نصب می‌شود، اما اختیاری است.

شما می توانید هر سه را نصب کنید و بین آنها جابجا شوید، اما این یک سردرد اضافی ایجاد می کند. پس بهتر است این کار را نکنید. نسخه‌های مدرن Fedora، CentOS و RHEL به عنوان پیاده‌سازی پیش‌فرض به Chrony منتقل شده‌اند، و همچنین دارای systemd-timesyncd هستند. به نظر من Chrony به خوبی کار می کند، رابط بهتری نسبت به سرویس NTP ارائه می دهد، اطلاعات و کنترل بسیار بیشتری را ارائه می دهد، که مطمئناً مدیران سیستم از آن لذت خواهند برد.

غیرفعال کردن خدمات NTP

ممکن است سرویس NTP از قبل روی هاست شما در حال اجرا باشد. اگر چنین است، قبل از اینکه به چیز دیگری بروید، باید آن را غیرفعال کنید. من chronyd running داشتم، بنابراین از دستورات زیر برای توقف و غیرفعال کردن آن استفاده کردم. دستورات مناسب را برای هر شبح 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 را راه اندازی نکرده اید، دستور timesync-status به این اشاره می کند:

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

درخواست وضعیت مستقیم اطلاعات مهمی را ارائه می دهد. به عنوان مثال، دستور timedatectl بدون هیچ آرگومان یا گزینه ای، دستور فرعی status را به طور پیش فرض اجرا می کند:

[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 را می دهد. در این حالت، زمان سیستم بر روی منطقه زمانی آمریکا / نیویورک (TZ) تنظیم می شود، RTC روی زمان در منطقه زمانی محلی تنظیم می شود، و سرویس NTP فعال نیست. زمان RTC کمی از زمان سیستم شروع به انحراف کرده است. این برای سیستم هایی که ساعت آنها هماهنگ نشده است طبیعی است. مقدار افست روی هاست بستگی به مدت زمانی دارد که از آخرین همگام سازی سیستم گذشته است.

ما همچنین هشداری در مورد استفاده از زمان محلی برای RTC دریافت کردیم - این برای تغییرات منطقه زمانی و تنظیمات DST اعمال می شود. اگر در زمان نیاز به انجام تغییرات، رایانه خاموش شود، RTC تغییر نخواهد کرد. اما برای سرورها یا هاست های دیگری که به صورت شبانه روزی کار می کنند، این به هیچ وجه مشکلی ندارد. علاوه بر این، هر سرویسی که همگام‌سازی زمان NTP را ارائه می‌کند، زمان میزبان را در مرحله راه‌اندازی اولیه تنظیم می‌کند، بنابراین پس از اتمام راه‌اندازی، زمان دوباره درست می‌شود.

تنظیم منطقه زمانی

معمولاً در حین نصب منطقه زمانی را مشخص می کنید و بعداً وظیفه تغییر آن را ندارید. با این حال، مواقعی وجود دارد که باید منطقه زمانی را تغییر دهید. چندین ابزار وجود دارد که می تواند کمک کند. لینوکس از فایل های منطقه زمانی برای تعیین منطقه زمانی محلی میزبان استفاده می کند. این فایل ها در دایرکتوری هستند /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 timeync یک پیاده سازی NTP را ارائه می دهد که مدیریت آن در زمینه systemd آسان است. به طور پیش فرض روی فدورا و اوبونتو نصب شده است. با این حال، فقط به طور پیش فرض در اوبونتو شروع می شود. در مورد توزیع های دیگر مطمئن نیستم. می توانید خودتان بررسی کنید:

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

پیکربندی systemd-timesyncd

فایل پیکربندی systemd-timesyncd است /etc/systemd/timesyncd.conf. این یک فایل ساده است که گزینه‌های کمتری نسبت به سرویس‌های NTP و chronyd قدیمی دارد. در اینجا محتویات این فایل (بدون تغییرات بیشتر) در فدورا 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= تعریف نشده باشد، فدورا به صورت پیش‌فرض به سرور زمان فدورا بازگشتی تبدیل می‌شود. من معمولا سرور زمان خود را اضافه می کنم:

NTP=myntpserver

در حال اجرا زمان همگام سازی

می توانید systemd-timesyncd را به این صورت شروع کرده و فعال کنید:

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

تنظیم ساعت سخت افزاری

در اینجا وضعیت پس از اجرای 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    

در ابتدا، تفاوت بین RTC و زمان محلی (EDT) کمتر از یک ثانیه است و این اختلاف طی چند روز آینده چند ثانیه دیگر افزایش می‌یابد. از آنجایی که هیچ مفهومی از مناطق زمانی در RTC وجود ندارد، دستور timedatectl باید مقایسه ای را برای تعیین منطقه زمانی صحیح انجام دهد. اگر زمان RTC دقیقاً با زمان محلی مطابقت نداشته باشد، با منطقه زمانی محلی نیز مطابقت ندارد.

در جستجوی اطلاعات بیشتر، وضعیت systemd-timesync را بررسی کردم و این را پیدا کردم:

[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 زمان سیستم را بر اساس مهر زمانی تنظیم می کند. مهرهای زمانی توسط دیمون timeync نگهداری می شوند و در هر همگام سازی موفق ایجاد می شوند.

دستور timedatectl راهی برای گرفتن مقدار ساعت سخت افزاری از ساعت سیستم ندارد. فقط می تواند زمان و تاریخ را از مقدار وارد شده در خط فرمان تنظیم کند. با استفاده از دستور hwclock می توانید RTC را روی همان مقدار زمان سیستم تنظیم کنید:

[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؟ این کاملاً درست نیست: این فقط در صورتی اتفاق می‌افتد که به سرور زمان اتصال شبکه داشته باشید. با این حال، بسیاری از سیستم ها همیشه به اتصال شبکه دسترسی ندارند، بنابراین ساعت سخت افزاری برای لینوکس برای تنظیم زمان سیستم مفید است. این بهتر از تنظیم دستی زمان است، حتی اگر ممکن است از زمان واقعی منحرف شود.

نتیجه

در این مقاله ابزارهایی برای دستکاری تاریخ، زمان و مناطق زمانی بررسی شده است. ابزار systemd-timesyncd یک سرویس گیرنده NTP را فراهم می کند که می تواند زمان را در میزبان محلی با یک سرور NTP همگام کند. با این حال، systemd-timesyncd سرویس سرور ارائه نمی دهد، بنابراین اگر به یک سرور NTP در شبکه خود نیاز دارید، باید از چیز دیگری مانند Chrony برای عمل به عنوان سرور استفاده کنید.

من ترجیح می دهم برای هر سرویسی در شبکه خود یک پیاده سازی داشته باشم، بنابراین از Chrony استفاده می کنم. اگر به یک سرور NTP محلی نیاز ندارید، یا اگر مشکلی ندارید از Chrony به عنوان سرور و systemd-timesyncd به عنوان سرویس گیرنده SNTP استفاده کنید. از این گذشته، اگر از عملکرد systemd-timesyncd راضی هستید، نیازی به استفاده از ویژگی های اضافی Chrony به عنوان مشتری نیست.

نکته دیگر: برای اجرای NTP نیازی به استفاده از ابزار systemd نیست. می توانید از نسخه قدیمی ntpd، Chrony یا اجرای NTP دیگری استفاده کنید. از این گذشته ، systemd از تعداد زیادی سرویس تشکیل شده است. بسیاری از آنها اختیاری هستند، بنابراین می توانید آنها را خاموش کنید و به جای آن از چیز دیگری استفاده کنید. این یک هیولای یکپارچه بزرگ نیست. ممکن است سیستم یا قسمت هایی از آن را دوست نداشته باشید، اما باید آگاهانه تصمیم بگیرید.

من پیاده‌سازی NTP توسط systemd را دوست دارم، اما Chrony را ترجیح می‌دهم زیرا با نیازهای من مطابقت دارد. لینوکس هست عزیزم -)

در حقوق تبلیغات

VDSina ارائه می دهد سرور برای هر کاری، مجموعه عظیمی از سیستم عامل ها برای نصب خودکار، امکان نصب هر سیستم عامل از خود وجود دارد ISO، راحت پنل مدیریت توسعه خود و پرداخت روزانه. به یاد داشته باشید که ما سرورهای ابدی داریم که قطعاً بی انتها هستند

همگام سازی زمان لینوکس: NTP، Chrony و systemd-timesyncd

منبع: www.habr.com

اضافه کردن نظر