| HWCLOCK(8) | System Administration | HWCLOCK(8) |
نام (NAME)
hwclock - تنظیم و خواندن ساعت سختافزاری سیستم (RTC)
خلاصه دستور (SYNOPSIS)
hwclock [function] [option...]
توضیحات (DESCRIPTION)
دستور hwclock ابزاری مدیریتی برای ساعتهای زمانی است. این ابزار میتواند: زمان ساعت سختافزاری (Hardware Clock) را نمایش دهد؛ ساعت سختافزاری را روی یک زمان مشخص تنظیم کند؛ ساعت سختافزاری را از روی ساعت سیستم تنظیم کند؛ ساعت سیستم را از روی ساعت سختافزاری تنظیم کند؛ انحراف (drift) ساعت سختافزاری را جبران کند؛ مقیاس زمانی ساعت سیستم را تصحیح کند؛ منطقه زمانی هسته، مقیاس زمانی NTP و مبدأ زمانی (epoch) هسته (فقط در معماری Alpha) را تنظیم کند؛ و مقادیر آینده ساعت سختافزاری را بر اساس نرخ انحراف آن پیشبینی کند.
از نسخه 2.26 تغییرات مهمی در عملکرد --hctosys و گزینه --directisa ایجاد شد و یک گزینه جدید به نام --update-drift افزوده شد. توضیحات مربوط به هرکدام را در زیر مشاهده کنید.
عملکردها (FUNCTIONS)
عملکردهای زیر مانعةالجمع هستند و در هر زمان فقط یکی از آنها میتواند مشخص شود. اگر هیچ عملکردی مشخص نشود، مقدار پیشفرض --show است.
-a, --adjust
--getepoch; --setepoch
این عملکردها برای خواندن و تنظیم مقدار مبدأ زمانی (epoch) ساعت سختافزاری هسته استفاده میشوند. منظور از مبدأ زمانی (Epoch)، تعداد سالهای میلادی است که مقدار سال صفر در ساعت سختافزاری به آن اشاره دارد. برای مثال، اگر BIOS ماشین شمارنده سال را در ساعت سختافزاری طوری تنظیم کند که شامل تعداد سالهای کامل از سال ۱۹۵۲ باشد، در این صورت مقدار مبدأ زمانی ساعت سختافزاری هسته باید ۱۹۵۲ باشد.
عملکرد --setepoch نیازمند استفاده از گزینه --epoch برای مشخص کردن سال است. برای نمونه:
hwclock --setepoch --epoch=1952
درایور RTC تلاش میکند مقدار صحیح مبدأ زمانی را حدس بزند، بنابراین ممکن است نیازی به تنظیم دستی آن نباشد.
این مقدار مبدأ زمانی هر بار که hwclock ساعت سختافزاری را روی یک ماشین Alpha میخواند یا تنظیم میکند، استفاده میشود. برای ماشینهای ISA، هسته از مبدأ زمانی ثابت ساعت سختافزاری یعنی ۱۹۰۰ استفاده میکند.
--param-get=parameter; --param-set=parameter=value
مقدار parameter یا یک مقدار عددی پارامتر RTC است (به include/uapi/linux/rtc.h در هسته مراجعه کنید) یا یک نام مستعار (alias). برای دیدن فهرستی از نامهای مستعار معتبر به --help مراجعه کنید. مقادیر parameter و value اگر با 0x شروع شوند به عنوان هگزادسیمال و در غیر این صورت به عنوان مقادیر دهدهی تفسیر میشوند.
--param-index number
--predict
اگر ساعت سختافزاری توسط چیزی غیر از دستور hwclock سیستمعامل فعلی تغییر داده میشود (مانند «حالت ۱۱ دقیقهای» یا بوت دوگانه با یک سیستمعامل دیگر)، از این عملکرد استفاده نکنید.
-r, --show; --get
نمایش زمان ساعت سختافزاری، حالت پیشفرض در صورت مشخص نشدن هیچ عملکردی است.
عملکرد --get همچنین تصحیح انحراف را بر اساس اطلاعات موجود در /etc/adjtime بر روی زمان خواندهشده اعمال میکند. اگر ساعت سختافزاری توسط چیزی غیر از دستور hwclock سیستمعامل فعلی تغییر داده میشود (مانند «حالت ۱۱ دقیقهای» یا بوت دوگانه با یک سیستمعامل دیگر)، از این عملکرد استفاده نکنید.
-s, --hctosys
ساعت سیستم باید در مقیاس زمانی UTC نگه داشته شود تا برنامههای تاریخ و زمان در هماهنگی با منطقه زمانی پیکربندیشده برای سیستم به درستی کار کنند. اگر ساعت سختافزاری در زمان محلی نگه داشته شود، زمان خواندهشده از آن باید پیش از استفاده برای تنظیم ساعت سیستم، به مقیاس زمانی UTC منتقل شود. عملکرد --hctosys این کار را بر اساس اطلاعات فایل /etc/adjtime یا آرگومانهای خط فرمان --localtime و --utc انجام میدهد. توجه: هیچگونه تنظیمی برای ساعت تابستانی (DST) انجام نمیشود. به بحث زیر در بخش محلی در برابر UTC (LOCAL vs UTC) مراجعه کنید.
هسته همچنین یک مقدار منطقه زمانی را نگه میدارد، عملکرد --hctosys آن را روی منطقه زمانی پیکربندیشده برای سیستم تنظیم میکند. منطقه زمانی سیستم توسط متغیر محیطی TZ یا فایل /etc/localtime همانطور که tzset(3) آنها را تفسیر میکند، پیکربندی میشود. فیلد منسوخشده tz_dsttime در مقدار منطقه زمانی هسته روی صفر تنظیم میشود. (برای جزئیات درباره معنای پیشین این فیلد، settimeofday(2) را ببینید.)
هنگامی که در یک اسکریپت راهاندازی استفاده میشود، قرار دادن عملکرد --hctosys به عنوان اولین فراخواننده settimeofday(2) پس از بوت، مقیاس زمانی «حالت ۱۱ دقیقهای» NTP را از طریق متغیر هسته persistent_clock_is_local تنظیم میکند. اگر پیکربندی مقیاس زمانی ساعت سختافزاری تغییر کند، برای مطلع ساختن هسته نیاز به راهاندازی مجدد (reboot) است. به توضیحات زیر در بخش همگامسازی خودکار ساعت سختافزاری توسط هسته (Automatic Hardware Clock Synchronization by the Kernel) مراجعه کنید.
این عملکرد مناسبی برای استفاده در یکی از اسکریپتهای راهاندازی سیستم، پیش از سوار شدن (mount) فایلسیستمها به صورت خواندن/نوشتن است.
این عملکرد هرگز نباید در یک سیستم در حال اجرا استفاده شود. پرش ناگهانی در زمان سیستم باعث بروز مشکلاتی مانند خراب شدن برچسبهای زمانی فایلسیستم میشود. همچنین، اگر چیزی ساعت سختافزاری را تغییر داده باشد (مانند «حالت ۱۱ دقیقهای» NTP)، عملکرد --hctosys زمان را به اشتباه با احتساب جبران انحراف تنظیم خواهد کرد.
جبران انحراف را میتوان با تنظیم فاکتور انحراف در /etc/adjtime روی صفر غیرفعال کرد. این تنظیم تا زمانی که از گزینه --update-drift به همراه --systohc هنگام خاموش شدن (یا هر جای دیگر) استفاده نشود، پایدار خواهد ماند. روش دیگر برای غیرفعال کردن این مورد، استفاده از گزینه --noadjfile هنگام فراخوانی عملکرد --hctosys است. روش سوم، حذف فایل /etc/adjtime است. در این صورت hwclock به طور پیشفرض از مقیاس زمانی UTC برای ساعت سختافزاری استفاده خواهد کرد. اگر ساعت سختافزاری بر اساس زمان محلی کار میکند، باید در فایل تعریف شود. این کار را میتوان با فراخوانی hwclock --localtime --adjust انجام داد؛ هنگامی که فایل وجود ندارد، این دستور در عمل ساعت را تنظیم نمیکند، بلکه فایل را با پیکربندی زمان محلی و ضریب انحراف صفر ایجاد میکند.
شرایطی که ممکن است در آن غیرفعال کردن تصحیح انحراف hwclock مطلوب باشد، زمان بوت دوگانه چند سیستمعامل است. اگر در حالی که این نمونه از لینوکس متوقف است، سیستمعامل دیگری مقدار ساعت سختافزاری را تغییر دهد، هنگامی که این نمونه دوباره راهاندازی شود، تصحیح انحراف اعمالشده نادرست خواهد بود.
برای اینکه تصحیح انحراف hwclock به درستی کار کند، ضروری است که هیچ چیزی ساعت سختافزاری را در زمانی که نمونه لینوکس در حال اجرا نیست تغییر ندهد.
--set
--systz
این عملکرد موارد زیر را انجام میدهد که در بالا در عملکرد --hctosys شرح داده شدهاند:
دو مورد اول فقط در اولین فراخوانی settimeofday(2) پس از بوت در دسترس هستند. در نتیجه، این گزینه فقط زمانی منطقی است که در یک اسکریپت راهاندازی استفاده شود. اگر پیکربندی مقیاس زمانی ساعتهای سختافزاری تغییر کند، برای مطلع ساختن هسته نیاز به راهاندازی مجدد خواهد بود.
-w, --systohc
--vl-read, --vl-clear
برای جزئیات درباره اینکه چه مواردی از اطلاعات ممکن است برگردانده شوند، به include/uapi/linux/rtc.h هسته مراجعه کنید. توجه داشته باشید که همه دستگاههای RTC این قابلیت نظارتی را ندارند و لزوماً همه درایورها از خواندن این اطلاعات پشتیبانی نمیکنند.
-h, --help
-V, --version
گزینهها (OPTIONS)
--adjfile=filename
--date=date_string
hwclock --set --date='16:45'
hwclock --predict --date='2525-08-14 07:11:05'
آرگومان باید به وقت محلی باشد، حتی اگر ساعت سختافزاری خود را در قالب UTC نگه دارید. گزینه --localtime را ببینید. بنابراین، آرگومان نباید شامل هیچگونه اطلاعات منطقه زمانی باشد. همچنین نباید یک زمان نسبی مانند "+5 minutes" باشد، زیرا دقت hwclock به تطابق میان مقدار آرگومان و زمان فشرده شدن کلید Enter بستگی دارد. بخش کسری ثانیهها بدون هشدار نادیده گرفته میشود. این گزینه قادر به درک بسیاری از قالبهای تاریخ و زمان است، اما پارامترهای پیشین باید رعایت شوند.
--delay=seconds
مقدار پیشفرض ۵۰۰ میلیثانیه بر اساس ساعت سختافزاری رایج سازگار با MC146818A (معماری x86) است. این ساعت سختافزاری را فقط میتوان روی یک زمان صحیح به اضافه نیم ثانیه تنظیم کرد. زمان صحیح لازم است زیرا هیچ رابطی برای دریافت یا تنظیم کسر ثانیه وجود ندارد. نیم ثانیه اضافی به این دلیل است که ساعت سختافزاری دقیقاً ۵۰۰ میلیثانیه پس از تنظیم زمان جدید، به ثانیه بعدی بهروزرسانی میشود. متاسفانه این رفتار وابسته به سختافزار است و در برخی موارد تاخیر متفاوتی مورد نیاز است.
-D, --debug
--directisa
--epoch=year
-f, --rtc=filename
-l, --localtime; -u, --utc
ساعت سختافزاری ممکن است برای استفاده از مقیاس زمانی UTC یا محلی پیکربندی شده باشد، اما هیچ چیزی در خود ساعت نشان نمیدهد که کدام حالت در حال استفاده است. گزینههای --localtime یا --utc این اطلاعات را به دستور hwclock میدهند. اگر گزینه اشتباه را مشخص کنید (یا هیچکدام را مشخص نکنید و پیشفرض اشتباه را بپذیرید)، هم تنظیم و هم خواندن ساعت سختافزاری نادرست خواهد بود.
اگر نه --utc و نه --localtime را مشخص نکنید، آخرین گزینهای که با یک عملکرد تنظیم (--set، --systohc، یا --adjust) داده شده بود، همانطور که در /etc/adjtime ثبت شده است، استفاده خواهد شد. اگر فایل adjtime وجود نداشته باشد، مقدار پیشفرض UTC است.
توجه: تغییرات ساعت تابستانی (DST) در صورتی که ساعت سختافزاری در زمان محلی نگه داشته شود ممکن است ناسازگار باشد. به توضیحات زیر در بخش محلی در برابر UTC (LOCAL vs UTC) مراجعه کنید.
--noadjfile
--test
--update-drift
حداقل یک دوره چهار ساعته بین دفعات تنظیم مورد نیاز است. این برای جلوگیری از محاسبات نامعتبر است. هرچه این دوره طولانیتر باشد، ضریب انحراف حاصل دقیقتر خواهد بود.
این گزینه در نسخه 2.26 اضافه شد، زیرا معمول است که سیستمها هنگام خاموش شدن hwclock --systohc را فراخوانی کنند؛ با رفتار قدیمی، این کار به طور خودکار ضریب انحراف را (مجدداً) محاسبه میکرد که باعث بروز چندین مشکل میشد:
محاسبه
ضریب
انحراف
توسط hwclock
نقطه شروع
خوبی است،
اما برای
دستیابی به
نتایج
بهینه
احتمالا
نیاز است که
با ویرایش
مستقیم
فایل /etc/adjtime
تنظیم شود.
برای بیشتر
پیکربندیها،
زمانی که
ضریب
انحراف
بهینه یک
دستگاه
تنظیم شد،
نیازی به
تغییر آن
نخواهد بود.
بنابراین،
رفتار
قدیمی برای
محاسبه
خودکار
انحراف
تغییر کرد و
اکنون
نیازمند
استفاده از
این گزینه
است. به
توضیحات
زیر در بخش
عملکرد
تنظیم (The Adjust Function)
مراجعه
کنید.
این گزینه
نیازمند
خواندن
ساعت
سختافزاری
پیش از
تنظیم آن
است. اگر
نتوان آن را
خواند، این
گزینه باعث
ناموفق شدن
عملکردهای
تنظیم
میشود. این
امر برای
مثال ممکن
است در
صورتی رخ
دهد که ساعت
سختافزاری
بر اثر قطع
برق خراب
شده باشد. در
این صورت،
ساعت باید
ابتدا بدون
این گزینه
تنظیم شود.
گذشته از
اینکه کار
نمیکند،
ضریب تصحیح
انحراف
حاصل نیز به
هر حال
نامعتبر
خواهد بود.
-v, --verbose
نکات (NOTES)
ساعتها در یک سیستم لینوکس (Clocks in a Linux System)
دو نوع ساعت تاریخ و زمان وجود دارد:
ساعت سختافزاری (The Hardware Clock): این ساعت یک دستگاه سختافزاری مستقل با منبع تغذیه اختصاصی خود (باتری، خازن و غیره) است که هنگام خاموش بودن دستگاه یا حتی جدا بودن آن از برق کار میکند.
در یک سیستم سازگار با ISA، این ساعت به عنوان بخشی از استاندارد ISA مشخص شده است. یک برنامه کنترلی میتواند این ساعت را فقط با دقت یک ثانیه کامل بخواند یا تنظیم کند، اما همچنین میتواند لبههای تیکهای ۱ ثانیهای ساعت را تشخیص دهد، بنابراین ساعت عملاً دقتی تقریباً بینهایت دارد.
این ساعت معمولاً ساعت سختافزاری (hardware clock)، ساعت زمان واقعی (real time clock)، RTC، ساعت بایوس (BIOS clock) و ساعت CMOS نامیده میشود. عبارت Hardware Clock با حروف بزرگ برای استفاده توسط hwclock ابداع شد. هسته لینوکس همچنین از آن به عنوان ساعت پایدار (persistent clock) یاد میکند.
برخی از سیستمهای غیر ISA دارای چند ساعت زمان واقعی هستند که تنها یکی از آنها منبع تغذیه اختصاصی خود را دارد. ممکن است یک تراشه ساعت خارجی I2C یا SPI بسیار کممصرف به همراه یک باتری پشتیبان به عنوان ساعت سختافزاری برای مقداردهی اولیه یک ساعت زمان واقعی یکپارچهتر و کاربردیتر که برای بیشتر اهداف دیگر استفاده میشود، به کار رود.
ساعت سیستم (The System Clock): این ساعت بخشی از هسته لینوکس است و توسط یک وقفه تایمر هدایت میشود. (در یک ماشین ISA، وقفه تایمر بخشی از استاندارد ISA است.) این ساعت فقط زمانی معنا دارد که لینوکس روی ماشین در حال اجرا باشد. زمان سیستم تعداد ثانیهها از ساعت 00:00:00 یکم ژانویه ۱۹۷۰ بر حسب UTC است (یا به طور خلاصه، تعداد ثانیهها از سال ۱۹۶۹ بر حسب UTC). با این حال، زمان سیستم یک عدد صحیح نیست و دقت تقریباً بینهایتی دارد.
زمان سیستم همان زمانی است که اهمیت دارد. هدف اصلی ساعت سختافزاری نگهداشتن زمان در هنگام عدم اجرای لینوکس است تا بتوان ساعت سیستم را در زمان بوت از روی آن مقداردهی اولیه کرد. توجه داشته باشید که در DOS، که ISA برای آن طراحی شده بود، ساعت سختافزاری تنها ساعت زمان واقعی است.
بسیار مهم است که زمان سیستم هیچگونه ناپیوستگی نداشته باشد، مانند آنچه در صورت استفاده از برنامه date(1) برای تنظیم آن در حین اجرای سیستم رخ میدهد. با این حال، شما میتوانید هر کاری که میخواهید با ساعت سختافزاری در حین اجرای سیستم انجام دهید، و دفعه بعد که لینوکس راهاندازی میشود، با زمان تعدیلشده از ساعت سختافزاری کار خود را آغاز خواهد کرد. توجه: در حال حاضر این کار در بیشتر سیستمها امکانپذیر نیست زیرا hwclock --systohc هنگام خاموش شدن فراخوانی میشود.
منطقه زمانی هسته لینوکس توسط hwclock تنظیم میشود. اما گمراه نشوید — تقریباً برای هیچکس اهمیتی ندارد که هسته فکر میکند در چه منطقه زمانی قرار دارد. در عوض، برنامههایی که به منطقه زمانی اهمیت میدهند (شاید به این دلیل که میخواهند یک زمان محلی را برای شما نمایش دهند) تقریباً همیشه از یک روش سنتیتر برای تعیین منطقه زمانی استفاده میکنند: آنها از متغیر محیطی TZ یا فایل /etc/localtime همانطور که در صفحه راهنمای tzset(3) توضیح داده شده است، استفاده میکنند. با این حال، برخی برنامهها و بخشهای جانبی هسته لینوکس مانند فایلسیستمها از مقدار منطقه زمانی هسته استفاده میکنند. یک نمونه، فایلسیستم vfat است. اگر مقدار منطقه زمانی هسته نادرست باشد، فایلسیستم vfat برچسبهای زمانی نادرستی را روی فایلها گزارش و تنظیم میکند. نمونه دیگر، «حالت ۱۱ دقیقهای» NTP در هسته است. اگر مقدار منطقه زمانی هسته و/یا متغیر persistent_clock_is_local نادرست باشند، ساعت سختافزاری توسط «حالت ۱۱ دقیقهای» به اشتباه تنظیم خواهد شد. به توضیحات زیر در بخش همگامسازی خودکار ساعت سختافزاری توسط هسته (Automatic Hardware Clock Synchronization by the Kernel) مراجعه کنید.
دستور hwclock با عملکردهای --hctosys یا --systz منطقه زمانی هسته را روی مقدار مشخصشده توسط TZ یا /etc/localtime تنظیم میکند.
مقدار منطقه زمانی هسته در واقع از دو بخش تشکیل شده است: ۱) یک فیلد tz_minuteswest که مشخص میکند زمان محلی (بدون تعدیل DST) چند دقیقه از UTC عقبتر است، و ۲) یک فیلد tz_dsttime که نوع قرارداد ساعت تابستانی (DST) را که در حال حاضر در آن منطقه برقرار است مشخص میکند. این فیلد دوم در لینوکس استفاده نمیشود و همیشه صفر است. همچنین settimeofday(2) را ببینید.
روشهای دسترسی به ساعت سختافزاری (Hardware Clock Access Methods)
دستور hwclock از روشهای مختلفی برای دریافت و تنظیم مقادیر ساعت سختافزاری استفاده میکند. معمولترین روش انجام I/O بر روی فایل ویژه دستگاه rtc است، که فرض میشود توسط درایور دستگاه rtc هدایت میشود. همچنین، سیستمهای لینوکسی که از چارچوب rtc همراه با udev استفاده میکنند، قادر به پشتیبانی از چند ساعت سختافزاری هستند. این ممکن است نیاز به لغو دستگاه rtc پیشفرض را با مشخص کردن یک دستگاه از طریق گزینه --rtc ایجاد کند.
با این حال، این روش همیشه در دسترس نیست زیرا سیستمهای قدیمیتر فاقد درایور rtc هستند. در این سیستمها، روش دسترسی به ساعت سختافزاری به سختافزار سیستم بستگی دارد.
در یک سیستم سازگار با ISA، دستور hwclock میتواند با انجام I/O روی درگاههای 0x70 و 0x71، به طور مستقیم به ثباتهای «حافظه CMOS» که ساعت را تشکیل میدهند دسترسی پیدا کند. این کار را با دستورالعملهای I/O واقعی انجام میدهد و در نتیجه فقط در صورت اجرا با شناسه کاربری مؤثر ابرکاربر (superuser) میتواند آن را انجام دهد. این روش ممکن است با مشخص کردن گزینه --directisa استفاده شود.
این روش واقعاً ضعیفی برای دسترسی به ساعت است، به تمام دلایلی که برنامههای فضای کاربری عموماً نباید I/O مستقیم انجام دهند و وقفهها را غیرفعال کنند. hwclock آن را برای آزمایش، عیبیابی، و به این دلیل که ممکن است تنها روش موجود در سیستمهای ISA فاقد درایور کارآمد دستگاه rtc باشد، ارائه میدهد.
عملکرد تنظیم (The Adjust Function)
ساعت سختافزاری معمولاً خیلی دقیق نیست. با این حال، بخش زیادی از عدم دقت آن کاملاً قابل پیشبینی است - هر روز مقدار ثابتی از زمان را جلو میافتد یا عقب میماند. این پدیده انحراف سیستماتیک (systematic drift) نامیده میشود. عملکرد --adjust در hwclock به شما امکان میدهد تصحیحات انحراف سیستماتیک را روی ساعت سختافزاری اعمال کنید.
نحوه کار به این صورت است: hwclock فایلی به نام /etc/adjtime را نگه میدارد که برخی اطلاعات تاریخی را در خود ذخیره میکند. این فایل، فایل adjtime نامیده میشود.
فرض کنید بدون هیچ فایل adjtime شروع میکنید. شما یک دستور hwclock --set صادر میکنید تا ساعت سختافزاری را روی زمان واقعی فعلی تنظیم کنید. hwclock فایل adjtime را ایجاد کرده و زمان فعلی را به عنوان آخرین باری که ساعت کالیبره شده در آن ثبت میکند. پنج روز بعد، ساعت ۱۰ ثانیه جلو افتاده است، بنابراین دستور hwclock --set --update-drift را صادر میکنید تا آن را ۱۰ ثانیه به عقب بازگردانید. hwclock فایل adjtime را بهروزرسانی میکند تا زمان فعلی را به عنوان آخرین زمان کالیبره شدن ساعت نشان دهد، و ۲ ثانیه در روز را به عنوان نرخ انحراف سیستماتیک ثبت میکند. ۲۴ ساعت میگذرد و سپس دستور hwclock --adjust را صادر میکنید. hwclock با فایل adjtime مشورت کرده و میبیند که ساعت در صورت رها شدن به حال خود روزانه ۲ ثانیه جلو میافتد و دقیقاً یک روز به حال خود رها شده است. بنابراین ۲ ثانیه از ساعت سختافزاری کم میکند. سپس زمان فعلی را به عنوان آخرین زمان تنظیم شدن ساعت ثبت میکند. ۲۴ ساعت دیگر میگذرد و شما یک دستور hwclock --adjust دیگر صادر میکنید. hwclock همین کار را تکرار میکند: ۲ ثانیه کم میکند و فایل adjtime را با زمان فعلی به عنوان آخرین زمان تنظیم ساعت بهروز میکند.
هنگامی که از گزینه --update-drift همراه با --set یا --systohc استفاده میکنید، نرخ انحراف سیستماتیک با مقایسه زمان فعلی ساعت سختافزاری که انحراف آن به طور کامل تصحیح شده با زمان تنظیم جدید، (مجدداً) محاسبه میشود، و از آن نرخ انحراف ۲۴ ساعته بر اساس آخرین برچسب زمانی کالیبرهشده از فایل adjtime استخراج میگردد. این ضریب انحراف بهروزرسانیشده سپس در /etc/adjtime ذخیره میشود.
هنگام تنظیم ساعت سختافزاری، مقدار کمی خطا رخنه میکند، بنابراین --adjust از انجام هرگونه تنظیمی که کمتر از ۱ ثانیه باشد خودداری میکند. بعداً، هنگامی که دوباره درخواست تنظیم میکنید، انحراف انباشتهشده بیشتر از ۱ ثانیه خواهد بود و --adjust تنظیم را همراه با هر مقدار کسری اعمال خواهد کرد.
دستور hwclock --hctosys نیز از دادههای فایل adjtime برای جبران مقدار خواندهشده از ساعت سختافزاری پیش از استفاده از آن برای تنظیم ساعت سیستم استفاده میکند. این عملکرد محدودیت ۱ ثانیهای --adjust را ندارد و مقادیر انحراف کمتر از ثانیه را بلافاصله تصحیح میکند. این عملکرد زمان ساعت سختافزاری و فایل adjtime را تغییر نمیدهد. این ممکن است نیاز به استفاده از --adjust را از بین ببرد، مگر اینکه بخش دیگری از سیستم نیاز داشته باشد که ساعت سختافزاری جبران شود.
فایل Adjtime (The Adjtime File)
اگرچه این فایل به خاطر هدف تاریخیاش در کنترل تنظیمات نامگذاری شده است، اما در واقع حاوی اطلاعات دیگری است که توسط hwclock از یک فراخوانی به فراخوانی بعدی استفاده میشود.
قالب فایل adjtime در قالب اسکی (ASCII) به صورت زیر است:
خط ۱: سه عدد، جداشده با فاصله: ۱) نرخ انحراف سیستماتیک بر حسب ثانیه در روز، به صورت اعشاری ممیز شناور؛ ۲) تعداد ثانیههای حاصل از سال ۱۹۶۹ بر حسب UTC برای جدیدترین تنظیم یا کالیبراسیون، به صورت عدد صحیح دهدهی؛ ۳) صفر (برای سازگاری با clock(8)) به صورت اعشاری ممیز شناور.
خط ۲: یک عدد: تعداد ثانیههای حاصل از سال ۱۹۶۹ بر حسب UTC برای جدیدترین کالیبراسیون. اگر هنوز کالیبراسیونی انجام نشده باشد یا مشخص باشد که هرگونه کالیبراسیون قبلی بیاثر است (برای مثال، به این دلیل که مشخص شده ساعت سختافزاری از زمان آن کالیبراسیون حاوی زمان معتبری نبوده است)، این مقدار صفر خواهد بود. این یک عدد صحیح دهدهی است.
خط ۳: عبارت "UTC" یا "LOCAL". مشخص میکند که آیا ساعت سختافزاری روی زمان هماهنگ جهانی (UTC) تنظیم شده است یا زمان محلی. همیشه میتوانید این مقدار را با گزینههای موجود در خط فرمان hwclock لغو کنید.
میتوانید از فایل adjtime که قبلاً با برنامه clock(8) استفاده شده بود، در hwclock استفاده کنید.
همگامسازی خودکار ساعت سختافزاری توسط هسته (Automatic Hardware Clock Synchronization by the Kernel)
باید از روش دیگری که در برخی سیستمها برای همگام نگه داشتن ساعت سختافزاری استفاده میشود، آگاه باشید. هسته لینوکس دارای حالتی است که در آن زمان سیستم را هر ۱۱ دقیقه یکبار در ساعت سختافزاری کپی میکند. این حالت یک گزینه زمان کامپایل است، بنابراین همه هستهها این قابلیت را نخواهند داشت. این حالت مناسبی برای استفاده در زمانی است که از ابزار پیشرفتهای مانند NTP برای همگام نگه داشتن ساعت سیستم خود استفاده میکنید. (NTP روشی برای همگام نگه داشتن زمان سیستم با یک سرور زمان در شبکه یا یک ساعت رادیویی متصل به سیستم شما است. RFC 1305 را ببینید.)
اگر هسته با گزینه «حالت ۱۱ دقیقهای» کامپایل شده باشد، هنگامی که انضباط ساعت هسته در وضعیت همگامشده باشد، این حالت فعال خواهد بود. هنگامی که در این وضعیت قرار دارد، بیت ۶ (بیتی که در ماسک 0x0040 تنظیم میشود) از متغیر time_status هسته غیرفعال (unset) است. این مقدار به عنوان خط 'status' در خروجی دستورات adjtimex --print یا ntptime نمایش داده میشود.
یک عامل خارجی، مانند دیمن NTP، لازم است تا انضباط ساعت هسته را در وضعیت همگامشده قرار دهد و بنابراین «حالت ۱۱ دقیقهای» را روشن کند. این حالت را میتوان با اجرای هر چیزی که ساعت سیستم را به روش قدیمی تنظیم میکند، از جمله hwclock --hctosys، خاموش کرد. با این حال، اگر دیمن NTP همچنان در حال اجرا باشد، دفعه بعد که ساعت سیستم را همگام کند، «حالت ۱۱ دقیقهای» را دوباره روشن خواهد کرد.
اگر سیستم شما با «حالت ۱۱ دقیقهای» روشن اجرا میشود، ممکن است لازم باشد از --hctosys یا --systz در یک اسکریپت راهاندازی استفاده کند، بهویژه اگر ساعت سختافزاری برای استفاده از مقیاس زمانی محلی پیکربندی شده باشد. مگر اینکه هسته از مقیاس زمانی مورد استفاده ساعت سختافزاری مطلع شود، در غیر این صورت ممکن است آن را با مقیاس نادرست بازنویسی و تخریب کند. هسته به طور پیشفرض از UTC استفاده میکند.
اولین دستور فضای کاربری که ساعت سیستم را تنظیم میکند، هسته را از مقیاس زمانی مورد استفاده ساعت سختافزاری مطلع میسازد. این اتفاق از طریق متغیر هسته persistent_clock_is_local رخ میدهد. اگر --hctosys یا --systz اولین دستور باشد، این متغیر را با توجه به فایل adjtime یا آرگومان مناسب خط فرمان تنظیم میکند. توجه داشته باشید که هنگام استفاده از این قابلیت، در صورت تغییر پیکربندی مقیاس زمانی ساعت سختافزاری، برای مطلع ساختن هسته نیاز به راهاندازی مجدد است.
دستور hwclock --adjust نباید با «حالت ۱۱ دقیقهای» NTP استفاده شود.
مقدار سده ساعت سختافزاری ISA (ISA Hardware Clock Century value)
نوعی استاندارد وجود دارد که بایت ۵۰ حافظه CMOS را در یک ماشین ISA به عنوان نشاندهنده سده (قرن) تعریف میکند. دستور hwclock از آن بایت استفاده نمیکند و آن را تنظیم نمیکند زیرا ماشینهایی وجود دارند که آن بایت را به این شکل تعریف نمیکنند، و به هر حال واقعاً ضروری هم نیست، زیرا «سال از سده» به خوبی نشان میدهد که در چه سدهای هستیم.
اگر کاربرد واقعی و معتبری برای بایت سده CMOS دارید، با نگهدارنده hwclock تماس بگیرید؛ شاید افزودن یک گزینه مناسب باشد.
توجه داشته باشید که این بخش فقط زمانی مرتبط است که از روش "direct ISA" برای دسترسی به ساعت سختافزاری استفاده میکنید. ACPI یک روش استاندارد برای دسترسی به مقادیر سده در زمانی که توسط سختافزار پشتیبانی میشوند فراهم میکند.
پیکربندی تاریخ و ساعت (DATE-TIME CONFIGURATION)
نگهداری زمان بدون همگامسازی خارجی (Keeping Time without External Synchronization)
این بحث بر اساس شرایط زیر است:
چه زمان دقیق را با دیمن NTP حفظ کنید یا خیر، منطقی است که سیستم را طوری پیکربندی کنید که به خودی خود تاریخ و زمان نسبتاً مناسبی را حفظ کند.
اولین گام برای دستیابی به این هدف، داشتن درک روشنی از تصویر کلی است. دو دستگاه سختافزاری کاملاً مجزا با سرعتهای خاص خود کار میکنند و با نرخهای خاص خود از زمان «صحیح» منحرف میشوند. روشها و نرمافزارها برای تصحیح انحراف برای هر یک از آنها متفاوت است. با این حال، بیشتر سیستمها طوری پیکربندی شدهاند که مقادیر را بین این دو ساعت در زمان راهاندازی و خاموش شدن مبادله کنند. اکنون خطاهای زمانسنجی هر دستگاه بین یکدیگر رد و بدل میشود. اگر سعی کنید تصحیح انحراف را فقط برای یکی از آنها پیکربندی کنید، انحراف دستگاه دیگر روی آن قرار خواهد گرفت.
هنگام پیکربندی تصحیح انحراف برای ساعت سیستم میتوان با خاموش نکردن دستگاه از این مشکل جلوگیری کرد. این موضوع، به علاوه این واقعیت که تمام دقت hwclock (از جمله محاسبه ضرایب انحراف) به درست بودن نرخ ساعت سیستم بستگی دارد، بدین معناست که پیکربندی ساعت سیستم باید ابتدا انجام شود.
انحراف ساعت سیستم با گزینههای --tick و --frequency در دستور adjtimex(8) تصحیح میشود. این دو با هم کار میکنند: tick تنظیم درشت و frequency تنظیم دقیق است. (برای سیستمهایی که بسته adjtimex ندارند، میتوان از ntptime -f ppm به جای آن استفاده کرد.)
برخی از توزیعهای لینوکس تلاش میکنند تا انحراف ساعت سیستم را به طور خودکار با عملیات مقایسه adjtimex محاسبه کنند. تلاش برای تصحیح یک ساعت در حال انحراف با استفاده از یک ساعت در حال انحراف دیگر به عنوان مرجع، مانند سگی است که سعی میکند دم خود را بگیرد. موفقیت ممکن است در نهایت حاصل شود، اما احتمالاً تلاش زیاد و ناامیدی فراوانی پیش از آن رخ خواهد داد. این خودکارسازی ممکن است نسبت به عدم پیکربندی بهبودی ایجاد کند، اما انتظار نتایج بهینه اشتباه خواهد بود. انتخاب بهتر برای پیکربندی دستی، گزینههای --log در adjtimex خواهد بود.
شاید موثرتر باشد که به سادگی انحراف ساعت سیستم را با sntp، یا date -Ins و یک زمانسنج دقیق ردیابی کنید و سپس تصحیح را به صورت دستی محاسبه نمایید.
پس از تنظیم مقادیر tick و frequency، به آزمایش و اصلاح تنظیمات ادامه دهید تا زمانی که ساعت سیستم زمان را به خوبی حفظ کند. برای اطلاعات بیشتر و نمونهای که محاسبات دستی انحراف را نشان میدهد، به adjtimex(2) مراجعه کنید.
هنگامی که ساعت سیستم به آرامی و دقت کار کرد، به سراغ ساعت سختافزاری بروید.
به عنوان یک قاعده، انحراف سرد برای بیشتر موارد استفاده بهترین نتیجه را خواهد داد. این باید حتی برای ماشینهای ۲۴/۷ که زمان خاموشی عادی آنها شامل یک راهاندازی مجدد است نیز صادق باشد. در این حالت مقدار ضریب انحراف تفاوت چندانی ایجاد نمیکند. اما در موارد نادری که دستگاه برای یک دوره طولانی خاموش میشود، انحراف سرد باید نتایج بهتری به همراه داشته باشد.
مراحل محاسبه انحراف سرد:
1
2
3
4
5
6
توجه: اگر مرحله ۶ از --systohc استفاده میکند، ساعت سیستم باید دقیقاً قبل از انجام این کار به درستی تنظیم شود (مرحله 6a).
محاسبه ضریب انحراف توسط hwclock نقطه شروع خوبی است، اما برای دستیابی به نتایج بهینه احتمالا نیاز است که با ویرایش مستقیم فایل /etc/adjtime تنظیم شود. به آزمایش و اصلاح ضریب انحراف ادامه دهید تا زمانی که ساعت سختافزاری در هنگام راهاندازی به درستی تصحیح شود. برای بررسی این موضوع، ابتدا مطمئن شوید که زمان سیستم قبل از خاموش شدن درست است و سپس بلافاصله پس از راهاندازی از sntp، یا date -Ins و یک زمانسنج دقیق استفاده کنید.
محلی در برابر UTC (LOCAL vs UTC)
نگهداشتن ساعت سختافزاری در مقیاس زمانی محلی باعث نتایج ناسازگار در ساعت تابستانی (DST) میشود:
ساعت سختافزاری در یک سیستم سازگار با ISA فقط تاریخ و زمان را نگه میدارد و هیچ مفهومی از منطقه زمانی یا ساعت تابستانی ندارد. بنابراین، هنگامی که به hwclock گفته میشود که ساعت در زمان محلی است، فرض میکند که در زمان محلی «صحیح» قرار دارد و هیچ تعدیلی روی زمان خواندهشده از آن انجام نمیدهد.
لینوکس تغییرات ساعت تابستانی را تنها زمانی به صورت شفاف مدیریت میکند که ساعت سختافزاری در مقیاس زمانی UTC نگه داشته شود. انجام این کار برای مدیران سیستم آسان شده است زیرا hwclock از زمان محلی برای خروجی خود و به عنوان آرگومان گزینه --date استفاده میکند.
سیستمهای سازگار با POSIX، مانند لینوکس، طوری طراحی شدهاند که ساعت سیستم در مقیاس زمانی UTC کار کند. هدف ساعت سختافزاری مقداردهی اولیه ساعت سیستم است، بنابراین نگهداشتن آن در UTC نیز منطقی است.
با این حال، لینوکس تلاش میکند تا قرار داشتن ساعت سختافزاری در مقیاس زمانی محلی را نیز پوشش دهد. این کار عمدتاً برای بوت دوگانه با نسخههای قدیمیتر مایکروسافت ویندوز است. از ویندوز ۷ به بعد، کلید رجیستری RealTimeIsUniversal قرار است به درستی کار کند تا ساعت سختافزاری آن بتواند در UTC نگهداری شود.
پازیکس در برابر 'RIGHT' (POSIX vs 'RIGHT')
بحث در مورد پیکربندی تاریخ و زمان بدون پرداختن به مناطق زمانی ناقص خواهد بود؛ این موضوع تا حد زیادی در tzset(3) به خوبی پوشش داده شده است. یک بخش که به نظر میرسد هیچ مستنداتی ندارد، دایرکتوری 'right' در پایگاه داده منطقه زمانی (Time Zone Database) است که گاهی tz یا zoneinfo نامیده میشود.
دو پایگاه داده جداگانه در سیستم zoneinfo وجود دارد: posix و 'right'. پایگاه داده 'Right' (که اکنون zoneinfo-leaps نامیده میشود) شامل ثانیههای کبیسه (leap seconds) است و posix شامل آنها نیست. برای استفاده از پایگاه داده 'right'، ساعت سیستم باید روی (UTC + leap seconds) تنظیم شود که معادل (TAI - 10) است. این امر امکان محاسبه دقیق تعداد ثانیهها بین دو تاریخ را که از یک مبدأ ثانیه کبیسه عبور میکنند، فراهم میسازد. سپس ساعت سیستم با استفاده از فایلهای منطقه زمانی 'right' که ثانیههای کبیسه را کم میکنند، به زمان رسمی و تقویمی (civil time) صحیح، از جمله UTC، تبدیل میشود. توجه: این پیکربندی آزمایشی در نظر گرفته میشود و شناخته شده است که مشکلاتی دارد.
برای پیکربندی یک سیستم جهت استفاده از یک پایگاه داده خاص، تمام فایلهای موجود در دایرکتوری آن باید در ریشه /usr/share/zoneinfo کپی شوند. فایلها هرگز به طور مستقیم از زیردایرکتوریهای posix یا 'right' استفاده نمیشوند، برای مثال: TZ='right/Europe/Dublin'. این عادت به قدری رایج شده بود که پروژه بالادستی zoneinfo با انتقال زیردایرکتوریهای posix و 'right' به خارج از دایرکتوری zoneinfo و قرار دادن آنها در دایرکتوریهای همسطح، ساختار درختی فایلهای سیستم را بازسازی کرد:
/usr/share/zoneinfo، /usr/share/zoneinfo-posix، /usr/share/zoneinfo-leaps
متاسفانه، برخی از توزیعهای لینوکس در بستههای خود آن را به ساختار درختی قدیمی بازمیگردانند. بنابراین مشکل مدیران سیستمی که به سراغ زیردایرکتوری 'right' میروند همچنان ادامه دارد. این امر باعث میشود که منطقه زمانی سیستم طوری پیکربندی شود که شامل ثانیههای کبیسه باشد در حالی که پایگاه داده zoneinfo همچنان طوری پیکربندی شده است که آنها را حذف کند. سپس هنگامی که برنامهای مانند World Clock به فایل منطقه زمانی South_Pole نیاز دارد؛ یا یک MTA ایمیل، یا hwclock به فایل منطقه زمانی UTC نیاز دارد؛ آنها آن را از ریشه /usr/share/zoneinfo واکشی میکنند، زیرا این کاری است که قرار است انجام دهند. آن فایلها ثانیههای کبیسه را حذف میکنند، اما ساعت سیستم اکنون شامل آنها است که باعث تبدیل نادرست زمان میشود.
تلاش برای ترکیب و تطبیق فایلهای این پایگاههای داده مجزا کار نخواهد کرد، زیرا هر یک از آنها نیاز دارند که ساعت سیستم از مقیاس زمانی متفاوتی استفاده کند. پایگاه داده zoneinfo باید طوری پیکربندی شود که همانطور که در بالا توضیح داده شد از posix یا 'right' استفاده کند، یا با اختصاص یک مسیر پایگاه داده به متغیر محیطی TZDIR این کار انجام شود.
وضعیت خروج (EXIT STATUS)
یکی از مقادیر خروج زیر برگردانده خواهد شد:
EXIT_SUCCESS ('0' در سیستمهای سازگار با پازیکس)
EXIT_FAILURE ('1' در سیستمهای سازگار با پازیکس)
محیط (ENVIRONMENT)
TZ
TZDIR
فایلها (FILES)
/etc/adjtime
/etc/localtime
/usr/share/zoneinfo/
فایلهای دستگاهی که hwclock ممکن است برای دسترسی به ساعت سختافزاری امتحان کند: /dev/rtc /dev/rtc0 /dev/misc/rtc /dev/efirtc /dev/misc/efirtc
همچنین ببینید (SEE ALSO)
date(1), adjtime_config(5), adjtimex(8), gettimeofday(2), settimeofday(2), crontab(1p), tzset(3)
نویسندگان (AUTHORS)
نوشته شده توسط Bryan Henderson <bryanh@giraffe-data.com>، سپتامبر ۱۹۹۶، بر پایه کارهای انجامشده روی برنامه clock(8) توسط Charles Hedrick، Rob Hooft، و Harald Koenig. برای تاریخچه کامل و قدردانیها به کد منبع مراجعه کنید.
گزارش باگها (REPORTING BUGS)
برای گزارش باگها، از سامانه پیگیری مشکلات https://github.com/util-linux/util-linux/issues. استفاده کنید.
در دسترس بودن (AVAILABILITY)
دستور hwclock بخشی از بسته util-linux است که میتواند از بایگانی هسته لینوکس https://www.kernel.org/pub/linux/utils/util-linux. دریافت شود.
| 2026-09-02 | util-linux 2.42.3 |