HWCLOCK(8) إدارة النظام HWCLOCK(8)

الاسم

hwclock - أداة لساعات الوقت

موجز

hwclock [الوظيفة] [الخيار...]

الوصف

hwclock هي أداة إدارة لساعات الوقت. يمكنها: عرض وقت ساعة العتاد؛ وضبط ساعة العتاد على وقت محدد؛ وضبط ساعة العتاد من ساعة النظام؛ وضبط ساعة النظام من ساعة العتاد؛ وتعويض انحراف ساعة العتاد؛ وتصحيح المقياس الزمني لساعة النظام؛ وضبط المنطقة الزمنية للنواة، والمقياس الزمني لميفاق وقت الشبكة (NTP)، والحقبة (لأجهزة Alpha فقط)؛ والتنبؤ بقيم ساعة العتاد المستقبلية بناءً على معدل انحرافها.

منذ الإصدار v2.26، أُجريت تغييرات مهمة على وظيفة --hctosys والخيار --directisa، وأُضيف خيار جديد --update-drift. انظر أوصافها المعنية أدناه.

الوظائف

الوظائف التالية متعارضة تبادليًا، يمكن إعطاء واحدة فقط في كل مرة. إذا لم يُعطَ أي منها، فإن المبدئي هو --show.

-a, --adjust

أضف أو اطرح وقتًا من ساعة العتاد لمراعاة الانحراف المنهجي منذ آخر مرة ضُبطت فيها الساعة أو عُدلت. انظر المناقشة أدناه، تحت عنوان The Adjust Function.

--getepoch; --setepoch

هذه الوظائف مخصصة لحواسيب Alpha فقط، وهي متاحة فقط من خلال سائق RTC لنواة لينكس.

تُستخدم لقراءة وضبط قيمة حقبة ساعة عتاد النواة. الحقبة هي عدد السنين في التقويم الميلادي التي تشير إليها قيمة سنة الصفر في ساعة العتاد. على سبيل المثال، إذا ضبط BIOS الخاص بالحاسوب عداد السنين في ساعة العتاد ليحتوي على عدد السنين الكاملة منذ 1952، فيجب أن تكون قيمة حقبة ساعة عتاد النواة هي 1952.

تتطلب وظيفة --setepoch استخدام خيار --epoch لتحديد السنة. على سبيل المثال:

hwclock --setepoch --epoch=1952

يحاول سائق RTC تخمين قيمة الحقبة الصحيحة، لذا قد لا يكون ضبطها مطلوبًا.

تُستخدم قيمة الحقبة هذه كلما قرأت hwclock أو ضبطت ساعة العتاد على حاسوب Alpha. بالنسبة لحواسيب ISA، تستخدم النواة حقبة ساعة العتاد الثابتة 1900.

--param-get=المعلمة; --param-set=المعلمة=‎القيمة

اقرأ واضبط معلمة RTC. هذا مفيد، على سبيل المثال، لاسترداد ميزة RTC أو ضبط وضع تبديل النسخ الاحتياطي الخاص بـ RTC.

المعلمة هي إما قيمة رقمية لمعلمة RTC (انظر include/uapi/linux/rtc.h الخاص بالنواة) أو اسم مستعار. انظر --help لقائمة من الأسماء المستعارة الصحيحة. تُفسر المعلمة و القيمة، إذا سُبقت بـ 0x، على أنها قيم ست عشرية، وإلا فهي قيم عشرية.

--param-index رقم

اختر نسخة من نفس معامل RTC باستخدام رقم الفهرس الخاص به number. القيمة المبدئية لـ number هي 0.

--predict

تنبأ بما ستقرأه ساعة العتاد في المستقبل بناءً على الوقت المعطى بواسطة خيار --date والمعلومات الموجودة في /etc/adjtime. هذا مفيد، على سبيل المثال، لمراعاة الانحراف عند ضبط تنبيه (منبه) ساعة العتاد. انظر rtcwake(8).

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

-r، --show; --get

اقرأ ساعة العتاد واطبع وقتها إلى المخرج القياسي بتنسيق ISO 8601. الوقت المعروض هو دائمًا بالتوقيت المحلي، حتى لو كنت تحتفظ بـ ساعة العتاد بتوقيت UTC. انظر خيار --localtime.

عرض وقت ساعة العتاد هو المبدئي عندما لا تُحدد أي وظيفة.

تُطبق وظيفة --get أيضًا تصحيح الانحراف على الوقت المقروء، بناءً على المعلومات الموجودة في /etc/adjtime. لا تستخدم هذه الوظيفة إذا كان يجري تعديل ساعة العتاد بواسطة أي شيء آخر غير أمر hwclock لنظام التشغيل الحالي، مثل 'وضع 11 دقيقة' أو من تمهيد مزدوج لنظام تشغيل آخر.

-s، --hctosys

اضبط ساعة النظام من ساعة العتاد. يُعوَّض الوقت المقروء من ساعة العتاد لمراعاة الانحراف المنهجي قبل استخدامه لضبط ساعة النظام. انظر المناقشة أدناه، تحت عنوان The Adjust Function.

يجب الإبقاء على ساعة النظام في مقياس توقيت UTC لتعمل تطبيقات الوقت والتاريخ بشكل صحيح بالاقتران مع المنطقة الزمنية التي ضُبطت للنظام. إذا كانت ساعة العتاد مُبقية بالتوقيت المحلي، فيجب إزاحة الوقت المقروء منها إلى مقياس توقيت UTC قبل استخدامه لضبط ساعة النظام. تقوم وظيفة --hctosys بذلك بناءً على المعلومات الموجودة في ملف /etc/adjtime أو وسطاء سطر الأوامر --localtime و --utc. ملاحظة: لا يُجرى أي تعديل للتوقيت الصيفي. انظر المناقشة أدناه، تحت عنوان LOCAL vs UTC.

تحتفظ النواة أيضًا بقيمة للمنطقة الزمنية، وتضبطها وظيفة --hctosys على المنطقة الزمنية التي ضُبطت للنظام. تُضبط المنطقة الزمنية للنظام بواسطة متغير البيئة TZ أو ملف /etc/localtime، كما يفسرهما tzset(3). حُقل tz_dsttime المهمل لقيمة المنطقة الزمنية للنواة يُضبط على الصفر. (للحصول على تفاصيل حول ما كان يعنيه هذا الحقل، انظر settimeofday(2).)

عند استخدامه في نص برمجي لبدء التشغيل، مما يجعل وظيفة --hctosys المستدعِي الأول لـ settimeofday(2) من التمهيد، فإنه سيضبط مقياس توقيت NTP 'وضع 11 دقيقة' عبر متغير النواة persistent_clock_is_local. إذا غُيّر ضبط المقياس الزمني لساعة العتاد، فإنه يلزم إعادة التشغيل لإبلاغ النواة. انظر المناقشة أدناه، تحت عنوان Automatic Hardware Clock Synchronization by the Kernel.

هذه وظيفة جيدة للاستخدام في أحد نصوص بدء تشغيل النظام قبل وصل أنظمة الملفات للقراءة/الكتابة.

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

يمكن تثبيط تعويض الانحراف عن طريق ضبط عامل الانحراف في /etc/adjtime على الصفر. سيكون هذا الإعداد مستمراً طالما لم يُستخدم خيار --update-drift مع --systohc عند الإيقاف (أو في أي مكان آخر). وهناك طريقة أخرى لتثبيط هذا وهي استخدام خيار --noadjfile عند استدعاء وظيفة --hctosys. الطريقة الثالثة هي حذف ملف /etc/adjtime. عندها سيعود Hwclock مبدئياً إلى استخدام المقياس الزمني UTC لساعة الأجهزة. إذا كانت ساعة الأجهزة تعمل بالتوقيت المحلي، فسيحتاج ذلك إلى تعريف في الملف. يمكن القيام بذلك عن طريق استدعاء hwclock --localtime --adjust؛ عندما لا يكون الملف موجوداً، لن يقوم هذا الأمر بضبط الساعة فعلياً، ولكنه سيُنشئ الملف مع ضبط الوقت المحلي، وعامل انحراف قيمته صفر.

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

ليعمل تصحيح انحراف hwclock بشكل صحيح، من الضروري ألا يقوم أي شيء بتغيير ساعة الأجهزة أثناء عدم تشغيل نسخة لينكس الخاصة بها.

--set

يضبط ساعة الأجهزة على الوقت المعطى بواسطة خيار --date، ويُحدّث الطوابع الزمنية في /etc/adjtime. مع خيار --update-drift، يُعاد أيضاً حساب عامل الانحراف. جربه دون الخيار إذا فشل --set. راجع --update-drift أدناه.

--systz

هذا بديل لوظيفة --hctosys التي لا تقرأ ساعة الأجهزة ولا تضبط ساعة النظام؛ وبالتالي لا يوجد أي تصحيح للانحراف. الغرض منه هو استخدامه في سكربت بدء التشغيل على الأنظمة التي تحتوي على أنوية أعلى من الإصدار 2.6 حيث تعلم أن ساعة النظام قد ضُبطت من ساعة الأجهزة بواسطة النواة أثناء الإقلاع.

يقوم بالأمور التالية المفصلة أعلاه في وظيفة --hctosys:

•يصحح المقياس الزمني لساعة النظام إلى UTC حسب الحاجة. ولكن بدلاً من تحقيق ذلك عن طريق ضبط ساعة النظام، يقوم hwclock ببساطة بإبلاغ النواة وهي تتولى التغيير.
•يضبط المقياس الزمني لـ 'وضع 11 دقيقة' الخاص بـ NTP في النواة.
•يضبط المنطقة الزمنية للنواة.

الأمران الأولان متاحان فقط عند الاستدعاء الأول لـ settimeofday(2) بعد الإقلاع. وبالتالي فإن هذا الخيار يكون منطقياً فقط عند استخدامه في سكربت بدء التشغيل. إذا غُيّر تكوين المقياس الزمني لساعات الأجهزة، فسيلزم إعادة التشغيل لإبلاغ النواة.

-w، --systohc

يضبط ساعة الأجهزة من ساعة النظام، ويُحدّث الطوابع الزمنية في /etc/adjtime. مع خيار --update-drift، يُعاد أيضاً حساب عامل الانحراف. جربه دون الخيار إذا فشل --systohc. راجع --update-drift أدناه.

--vl-read، --vl-clear

بعض أجهزة RTC قادرة على مراقبة جهد البطارية الاحتياطية وبالتالي توفر وسيلة للمستخدم لمعرفة وجوب استبدال البطارية. تسترجع وظيفة --vl-read معلومات انخفاض الجهد وتفك ترميز النتيجة إلى شكل مقروء للبشر. وتقوم وظيفة --vl-clear بإعادة تعيين معلومات انخفاض الجهد، وهو أمر ضروري لبعض أجهزة RTC بعد استبدال البطارية.

راجع include/uapi/linux/rtc.h في النواة للحصول على تفاصيل حول قطع المعلومات التي قد تُرجع. لاحظ أنه ليست كل أجهزة RTC تمتلك قدرة المراقبة هذه، ولا تدعم جميع التعريفات بالضرورة قراءة المعلومات.

-h، --help

اعرض نص المساعدة ثم اخرج.

-V، --version

اعرض الإصدار واخرج.

الخيارات

--adjfile=اسم_الملف

يتجاوز مسار ملف /etc/adjtime المبدئي.

--date=نص_التاريخ

يجب استخدام هذا الخيار مع وظائف --set أو --predict، وإلا فسيُتجاهل.

hwclock --set --date='16:45'

hwclock --predict --date='2525-08-14 07:11:05'

يجب أن يكون المعامل بالتوقيت المحلي، حتى لو كنت تحتفظ بساعة الأجهزة بتوقيت UTC. راجع خيار --localtime. لذلك، يجب ألا يتضمن المعامل أي معلومات عن المنطقة الزمنية. كما يجب ألا يكون وقتاً نسبياً مثل "+5 دقائق"، لأن دقة hwclock تعتمد على الارتباط بين قيمة المعامل ووقت الضغط على مفتاح الإدخال. تُحذف أجزاء الثواني بصمت. هذا الخيار قادر على فهم العديد من تنسيقات الوقت والتاريخ، ولكن يجب مراعاة المعايير السابقة.

--delay=ثانية

يتجاوز هذا الخيار التأخير المبدئي المستخدم عند ضبط وقت الساعة. القيمة المبدئية هي 0.5 (500 ملي ثانية) لـ rtc_cmos؛ أما لأنواع RTC الأخرى فالتأخير هو 0. إذا تعذر تحديد نوع RTC (من sysfs)، فإن التأخير يعود مبدئياً إلى 0.5 ليكون متوافقاً مع الإصدارات السابقة.

تعتمد القيمة المبدئية 500 ملي ثانية على ساعة العتاد (x86) المتوافقة مع MC146818A الشائعة الاستخدام. لا يمكن ضبط ساعة العتاد هذه إلا على وقت صحيح إضافة إلى نصف ثانية. الوقت الصحيح مطلوب لعدم وجود واجهة لجلب أو ضبط أجزاء من الثانية. نصف الثانية الإضافي سببه أن ساعة العتاد تُحدث الثانية التالية بدقة بعد 500 ملي ثانية من ضبط الوقت الجديد. للأسف، هذا السلوك محدد بالعتاد وفي بعض الحالات يلزَم تأخير مختلف.

-D، --debug

استخدم --verbose. أُهمل الخيار --debug وقد يُعاد استخدامه لغرض آخر أو يُزال في إصدار مستقبلي.

--directisa

هذا الخيار ذو أهمية للحواسيب المتوافقة مع ISA في عائلتي x86 و x86_64. أما للحواسيب الأخرى، فليس له أي تأثير. يخبر هذا الخيار hwclock باستخدام تعليمات إدخال/إخراج صريحة للوصول إلى ساعة الحاسوب. دون هذا الخيار، سيستخدم hwclock ملف جهاز rtc، والذي يفترض أنه يُقاد بواسطة تعريف جهاز لينكس RTC. بدءاً من الإصدار v2.26 لن يُستخدم directisa آلياً عند عدم توفر تعريف rtc؛ فقد كان ذلك يسبب حالة غير آمنة قد تسمح لعمليتين بالوصول إلى ساعة الحاسوب في الوقت نفسه. ينبغي ألا يُستخدم الوصول المباشر للعتاد من مساحة المستخدم إلا للاختبار، واستكشاف الأخطاء وإصلاحها، وكملجأ أخير عند فشل كافة الطرق الأخرى. انظر الخيار --rtc.

--epoch=سنة

هذا الخيار مطلوب عند استخدام وظيفة --setepoch. الحد الأدنى لقيمة سنة هو 1900. أما الحد الأقصى فيعتمد على النظام (ULONG_MAX - 1).

-f، --rtc=اسم_الملف

تجاوز اسم ملف جهاز rtc المبدئي لـ hwclock. وإلا فإنه سيستخدم أول ملف يُعثر عليه بهذا الترتيب: /dev/rtc، /dev/rtc0، /dev/misc/rtc. بالنسبة لـ IA-64: /dev/efirtc /dev/misc/efirtc

-l، --localtime; -u، --utc

حدد أي مقياس زمني ضُبطت عليه ساعة الحاسوب.

قد تُضبط ساعة الحاسوب لاستخدام إما المقياس الزمني العالمي (UTC) أو المحلي، ولكن لا يوجد شيء في الساعة نفسها يوضح أي الخيارين مستخدم. يمنح الخياران --localtime أو --utc هذه المعلومات لأمر hwclock. إذا حددت الخيار الخاطئ (أو لم تحدد أياً منهما واتُخذ خيار مبدئي خاطئ)، فسيكون كل من ضبط وقراءة ساعة الحاسوب غير صحيحين.

إذا لم تحدد --utc ولا --localtime، فسيُستخدم الخيار الأخير الذي أُعطي مع وظيفة ضبط (--set، أو --systohc، أو --adjust)، كما هو مسجل في /etc/adjtime. إذا لم يكن ملف adjtime موجوداً، فإن المبدئي هو UTC.

ملاحظة: قد تكون تغييرات التوقيت الصيفي غير متسقة عندما تُحفظ ساعة الحاسوب بالتوقيت المحلي. انظر المناقشة أدناه، تحت LOCAL vs UTC.

--noadjfile

عطل التسهيلات التي يوفرها /etc/adjtime. لن يقرأ hwclock هذا الملف ولن يكتب فيه مع هذا الخيار. يجب تحديد إما --utc أو --localtime عند استخدام هذا الخيار.

--test

لا تغير أي شيء فعلياً في النظام، أي الساعات أو /etc/adjtime (--verbose متضمن ضمنياً مع هذا الخيار).

--update-drift

حدث عامل انزياح ساعة الحاسوب في /etc/adjtime. لا يُمكن استخدامه إلا مع --set أو --systohc.

يُشترط وجود فترة زمنية لا تقل عن أربع ساعات بين عمليات الضبط. وذلك لتجنب الحسابات غير الصالحة. كلما طالت الفترة، زادت دقة عامل الانزياح الناتج.

أُضيف هذا الخيار في v2.26، لأن من المعتاد أن تستدعي الأنظمة hwclock --systohc عند الإيقاف؛ ومع السلوك القديم كان ذلك سيعيد حساب عامل الانزياح آلياً مما سبب مشاكل عدة:

•عند استخدام NTP مع نواة بوضع '11 دقيقة'، كان عامل الانزياح سيُسحق ليقترب من الصفر.
•لم يكن ليسمح باستخدام تصحيح الانزياح 'البارد'. في معظم التشكيلات، يعطي استخدام الانزياح 'البارد' نتائج أفضل. بارد تعني عندما يكون الحاسوب مطفأً، وهو ما قد يؤثر بشكل كبير على عامل الانزياح.
•تؤدي إعادة (حساب) عامل الانحراف عند كل إغلاق إلى نتائج غير مثالية. على سبيل المثال، إذا تسببت ظروف عابرة في جعل الحاسوب ساخنًا بشكل غير طبيعي فإن حساب عامل الانحراف سيكون خارج النطاق.
•زادت أوقات إغلاق النظام بشكل ملحوظ (اعتبارًا من الإصدار v2.31 عند عدم استخدام --update-drift لا تُقرأ RTC).

يعد جعل hwclock يحسب عامل الانحراف نقطة بداية جيدة، ولكن للحصول على نتائج مثالية، فمن المرجح أن يحتاج الأمر إلى تعديله عن طريق التحرير المباشر لملف /etc/adjtime. بالنسبة لمعظم التشكيلات، بمجرد صياغة عامل الانحراف الأمثل للحاسوب، فلا ينبغي أن يحتاج إلى تغيير. لذلك، غُيّر السلوك القديم لحساب الانحراف آلياً وأصبح يتطلب الآن استخدام هذا الخيار. انظر المناقشة أدناه، تحت عنوان The Adjust Function.
يتطلب هذا الخيار قراءة ساعة العتاد قبل ضبطها. إذا تعذرت قراءتها، فسيؤدي هذا الخيار إلى فشل دوال الضبط. يمكن أن يحدث هذا، على سبيل المثال، إذا تعطلت ساعة العتاد بسبب انقطاع الطاقة. في هذه الحالة، يجب ضبط الساعة أولاً دون هذا الخيار. وبالرغم من عدم عمله، فإن عامل تصحيح الانحراف الناتج سيكون غير صالح على أي حال.

-v، --verbose

اعرض مزيداً من التفاصيل حول ما يفعله hwclock داخلياً.

ملاحظات

الساعات في نظام لينكس

هناك نوعان من ساعات التاريخ والوقت:

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

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

تُسمى هذه الساعة عادةً ساعة العتاد، وساعة الوقت الحقيقي (RTC)، وساعة BIOS، وساعة CMOS. صِيغ مصطلح Hardware Clock، بصيغته الكبيرة، لاستخدامه بواسطة hwclock. تشير إليها نواة لينكس أيضاً باسم الساعة المستمرة.

تمتلك بعض الأنظمة غير المتوافقة مع ISA بضع ساعات وقت حقيقي، واحدة منها فقط لها نطاق طاقة خاص بها. قد تُستخدم رقاقة ساعة I2C أو SPI خارجية منخفضة الطاقة جداً مع بطارية احتياطية كـ ساعة عتاد لتهيئة ساعة وقت حقيقي مدمجة أكثر وظيفية تُستخدم لمعظم الأغراض الأخرى.

ساعة النظام: هذه الساعة هي جزء من نواة لينكس وتُقاد بواسطة مقاطعة الموقّت. (في أجهزة ISA، تعد مقاطعة الموقّت جزءاً من معيار ISA). لها معنى فقط أثناء تشغيل لينكس على الحاسوب. وقت النظام هو عدد الثواني منذ 00:00:00 في 1 يناير 1970 UTC (أو باختصار أكثر، عدد الثواني منذ 1969 UTC). وقت النظام ليس عدداً صحيحاً، بل له دقة لانهائية افتراضياً.

وقت النظام هو الوقت الأهم. الغرض الأساسي لساعة العتاد هو حفظ الوقت عندما لا يكون لينكس قيد التشغيل بحيث يمكن تهيئة ساعة النظام منها عند الإقلاع. لاحظ أنه في DOS، الذي صُمم ISA من أجله، كانت ساعة العتاد هي ساعة الوقت الحقيقي الوحيدة.

من المهم ألا يحتوي وقت النظام على أي انقطاعات مثلما سيحدث إذا استُخدم برنامج date(1) لضبطه أثناء تشغيل النظام. ومع ذلك، يمكنك القيام بما تريد بساعة العتاد أثناء تشغيل النظام، وفي المرة القادمة التي يبدأ فيها تشغيل لينكس، سيفعل ذلك بالوقت المعدل من ساعة العتاد. ملاحظة: حالياً لا يمكن القيام بذلك في معظم الأنظمة لأن hwclock --systohc يُستدعى عند الإيقاف.

يُضبط النطاق الزمني لنواة لينكس بواسطة hwclock. ولكن لا تنخدع - لا أحد تقريباً يهتم بالنطاق الزمني الذي تعتقد النواة أنها فيه. بدلاً من ذلك، تستخدم البرامج التي تهتم بالنطاق الزمني (ربما لأنها تريد عرض توقيت محلي لك) دائماً تقريباً طريقة أكثر تقليدية لتحديد النطاق الزمني: حيث تستخدم متغير البيئة TZ أو ملف /etc/localtime، كما هو موضح في صفحة الدليل لـ tzset(3). ومع ذلك، تستخدم بعض البرامج والأجزاء الهامشية من نواة لينكس مثل أنظمة الملفات قيمة النطاق الزمني للنواة. مثال على ذلك هو نظام ملفات vfat. إذا كانت قيمة النطاق الزمني للنواة خاطئة، فسيسجل نظام ملفات vfat ويضبط طوابع زمنية خاطئة على الملفات. مثال آخر هو وضع '11 دقيقة' لـ NTP في النواة. إذا كانت قيمة النطاق الزمني للنواة و/أو متغير persistent_clock_is_local خاطئة، فستُضبط ساعة العتاد بشكل غير صحيح بواسطة 'وضع 11 دقيقة'. انظر المناقشة أدناه، تحت مزامنة ساعة العتاد الآلية بواسطة النواة.

يضبط hwclock النطاق الزمني للنواة على القيمة المشار إليها بواسطة TZ أو /etc/localtime باستخدام وظائف --hctosys أو --systz.

تتكون قيمة النطاق الزمني للنواة فعلياً من جزأين: 1) حقل tz_minuteswest يوضح عدد دقائق تأخر التوقيت المحلي (غير المعدل للتوقيت الصيفي) عن UTC، و 2) حقل tz_dsttime يوضح نوع اتفاقية التوقيت الصيفي (DST) المعمول بها في المنطقة في الوقت الحالي. هذا الحقل الثاني لا يُستخدم تحت لينكس ويكون دائماً صفراً. انظر أيضاً settimeofday(2).

طرق الوصول إلى ساعة العتاد

يستخدم hwclock طرقاً مختلفة عديدة لجلب وقيم ساعة العتاد وضبطها. الطريقة الأكثر اعتيادية هي إجراء إدخال/إخراج (I/O) إلى ملف جهاز rtc الخاص، والذي يُفترض أنه يُقاد بواسطة تعريف جهاز rtc. أيضاً، أنظمة لينكس التي تستخدم إطار عمل rtc مع udev، قادرة على دعم عدة ساعات عتاد. قد يؤدي هذا إلى الحاجة لتجاوز جهاز rtc المبدئي عبر تحديد واحد باستخدام خيار --rtc.

ومع ذلك، هذه الطريقة ليست متاحة دائماً لأن الأنظمة الأقدم لا تمتلك تعريف rtc. في هذه الأنظمة، تعتمد طريقة الوصول إلى ساعة العتاد على عتاد النظام.

في الأنظمة المتوافقة مع ISA، يمكن لـ hwclock الوصول مباشرة إلى سجلات "ذاكرة CMOS" التي تشكل الساعة، عن طريق إجراء إدخال/إخراج إلى المنافذ 0x70 و 0x71. يقوم بذلك باستخدام تعليمات إدخال/إخراج فعلية وبالتالي لا يمكنه فعل ذلك إلا إذا وُجه بمعرف مستخدم له صلاحيات المستخدم الخارق. يمكن استخدام هذه الطريقة بتحديد خيار --directisa.

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

وظيفة الضبط

عادةً ما تكون ساعة العتاد غير دقيقة للغاية. ومع ذلك، فإن الكثير من عدم دقتها يمكن التنبؤ به تماماً - فهي تكتسب أو تفقد نفس القدر من الوقت كل يوم. يسمى هذا الانجراف المنهجي. تتيح لك وظيفة --adjust في hwclock تطبيق تصحيحات الانجراف المنهجي على ساعة العتاد.

تعمل الآلية كالتالي: يحتفظ hwclock بملف، /etc/adjtime، يحفظ بعض المعلومات التاريخية. يسمى هذا ملف adjtime.

افترض أنك بدأت دون ملف adjtime. أصدرت أمر hwclock --set لضبط ساعة الحاسوب على الوقت الحالي الحقيقي. ينشئ hwclock ملف adjtime ويسجل فيه الوقت الحالي كآخر وقت عويرت فيه الساعة. بعد خمسة أيام، تقدمت الساعة 10 ثوانٍ، لذا أصدرت أمر hwclock --set --update-drift لإعادتها 10 ثوانٍ للخلف. يحدث hwclock ملف adjtime ليظهر الوقت الحالي كآخر وقت عويرت فيه الساعة، ويسجل ثانيتين يومياً كمعدل انزياح منتظم. تمر 24 ساعة، ثم تصدر أمر hwclock --adjust. يراجع hwclock ملف adjtime ويرى أن الساعة تتقدم ثانيتين يومياً عندما تُترك وحدها وأنها تُرِكت كذلك ليوم واحد بالضبط. لذا يطرح ثانيتين من ساعة الحاسوب. ثم يسجل الوقت الحالي كآخر وقت ضُبطت فيه الساعة. تمر 24 ساعة أخرى وتصدر أمر hwclock --adjust آخر. يقوم hwclock بالشيء نفسه: يطرح ثانيتين ويحدث ملف adjtime بالوقت الحالي كآخر وقت ضُبطت فيه الساعة.

عند استخدام خيار --update-drift مع --set أو --systohc، يُعاد حساب معدل الانجراف المنتظم بمقارنة وقت ساعة العتاد الحالي المصحح كلياً مع الوقت الجديد المضبوط، ومن ذلك يُشتق معدل الانجراف لمدة 24 ساعة بناءً على آخر طابع زمني جُورِيَ من ملف adjtime. يُحفظ عامل الانجراف المحدث هذا في /etc/adjtime.

يتسلل مقدار ضئيل من الخطأ عند ضبط ساعة العتاد، لذا يمتنع --adjust عن إجراء أي تعديل يقل عن ثانية واحدة. لاحقاً، عند طلب تعديل مرة أخرى، سيكون الانجراف المتراكم أكثر من ثانية واحدة وسيقوم --adjust بإجراء التعديل بما في ذلك أي مقدار كسري.

يستخدم hwclock --hctosys أيضاً بيانات ملف adjtime لتعويض القيمة المقروءة من ساعة العتاد قبل استخدامها لضبط ساعة النظام. لا يشترك هذا الخيار في قيد الثانية الواحدة الخاص بـ --adjust، وسيقوم بتصحيح قيم الانجراف التي تقل عن ثانية فوراً. لا يغير هذا الخيار وقت ساعة العتاد ولا ملف adjtime. قد يغني هذا عن الحاجة لاستخدام --adjust، ما لم يحتاج شيء آخر في النظام إلى تعويض ساعة العتاد.

ملف Adjtime

رغم تسميته لغرضه التاريخي المتمثل في التحكم في التعديلات فقط، إلا أنه يحتوي فعلياً على معلومات أخرى يستخدمها hwclock من استدعاء لآخر.

تنسيق ملف adjtime هو، بترميز ASCII:

السطر 1: ثلاثة أرقام تفصل بينها فراغات: 1) معدل الانجراف المنتظم بالثواني في اليوم، كسر عشري؛ 2) عدد الثواني الناتج منذ عام 1969 UTC لآخر تعديل أو معايرة، عدد صحيح عشري؛ 3) صفر (للتوافق مع clock(8)) ككسر عشري.

السطر 2: رقم واحد: عدد الثواني الناتج منذ 1969 UTC لأحدث معايرة. صفر إذا لم تكن هناك معايرة بعد أو إذا عُرف أن أي معايرة سابقة أصبحت لاغية (على سبيل المثال، لأنه وُجد أن ساعة العتاد، منذ تلك المعايرة، لا تحتوي على وقت صالح). هذا عدد صحيح عشري.

السطر 3: "UTC" أو "LOCAL". يوضح ما إذا كانت ساعة العتاد مضبوطة على التوقيت العالمي المنسق أو الوقت المحلي. يمكنك دائماً تجاوز هذه القيمة باستخدام الخيارات في سطر أوامر hwclock.

يمكنك استخدام ملف adjtime كان قد استُخدم سابقاً مع برنامج clock(8) مع hwclock.

مزامنة ساعة العتاد الآلية بواسطة النواة

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

إذا صُرِفت النواة مع خيار 'وضع الـ 11 دقيقة'، فسيكون نشطاً عندما يكون انضباط ساعة النواة في حالة مزامنة. في هذه الحالة، تكون البتة 6 (البتة المضبوطة في القناع 0x0040) لمتغير time_status الخاص بالنواة غير مضبوطة. تظهر هذه القيمة في سطر 'status' لأوامر adjtimex --print أو ntptime.

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

إذا كان نظامك يعمل مع تشغيل 'وضع الـ 11 دقيقة'، فقد يحتاج إلى استخدام إما --hctosys أو --systz في برنامج بدء التشغيل، خاصة إذا كانت ساعة العتاد مضبوطة لاستخدام المقياس الزمني المحلي. ما لم تُخطر النواة بالمقياس الزمني الذي تستخدمه ساعة العتاد، فقد تفسده بمقياس خاطئ. تستخدم النواة UTC مبدئياً.

يقوم أول أمر في مساحة المستخدم لضبط ساعة النظام بإخطار النواة بالمقياس الزمني الذي تستخدمه ساعة العتاد. يحدث هذا عبر متغير النواة persistent_clock_is_local. إذا كان --hctosys أو --systz هو الأول، فإنه سيضبط هذا المتغير وفقاً لملف adjtime أو وسيط سطر الأوامر المناسب. لاحظ أنه عند استخدام هذه القدرة وتغيير ضبط المقياس الزمني لساعة العتاد، يلزم إعادة التشغيل لإخطار النواة.

ينبغي ألا يُستخدم hwclock --adjust مع 'وضع الـ 11 دقيقة' لـ NTP.

قيمة القرن لساعة حاسوب ISA

يوجد نوع من المعايير الذي يحدد البايت 50 في ذاكرة CMOS على حواسيب ISA كمؤشر للقرن الحالي. لا يستخدم hwclock هذا البايت ولا يضبطه لأن هناك حواسيب لا تعرف البايت بتلك الطريقة، ولأنه ليس ضرورياً حقاً على أي حال، بما أن سنة القرن تقوم بمهمة جيدة في الإشارة إلى أي قرن نحن فيه.

إذا كان لديك استخدام حقيقي معتبر لبايت القرن في CMOS، فاتصل بمسؤول صيانة hwclock؛ فقد يكون من المناسب إضافة خيار لذلك.

لاحظ أن هذا القسم وثيق الصلة فقط عند استخدام طريقة "ISA المباشرة" للوصول إلى ساعة العتاد. يوفر ACPI طريقة قياسية للوصول إلى قيم القرن، عندما يدعمها العتاد.

ضبط التاريخ والوقت

الحفاظ على الوقت دون مزامنة خارجية

يعتمد هذا النقاش على الشروط التالية:

•لا يوجد شيء قيد التشغيل يغير ساعات التاريخ والوقت، مثل عفريت NTP أو مهمة cron."
•النطاق الزمني للنظام مضبوط للوقت المحلي الصحيح. انظر أدناه، تحت POSIX vs 'RIGHT'.
•في وقت مبكر أثناء بدء التشغيل، تُستدعى الأوامر التالية بهذا الترتيب: adjtimex --tick قيمة --frequency قيمة hwclock --hctosys
•أثناء إيقاف التشغيل، يُستدعى ما يلي: hwclock --systohc
•الأنظمة التي لا تتوفر فيها adjtimex يمكنها استخدام ntptime.

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

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

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

يُصحح انجراف ساعة النظام باستخدام خياري --tick و --frequency لأمر adjtimex(8). يعمل هذان الخياران معاً: tick هو التعديل التقريبي و frequency هو التعديل الدقيق. (بالنسبة للأنظمة التي لا تحتوي على حزمة adjtimex، يمكن استخدام ntptime -f ppm بدلاً من ذلك.)

تحاول بعض توزيعات لينكس حساب انزياح ساعة النظام آليًّا باستخدام عملية المقارنة الخاصة بالأداة adjtimex. إن محاولة تصحيح ساعة مُنزاحة باستخدام ساعة مُنزاحة أخرى كمرجع تشبه كلبًا يحاول مطاردة ذيله؛ قد يتحقق النجاح في النهاية، ولكن يسبقه مجهود كبير وإحباط شديد. قد يقدم هذا الأتمتة تحسنًا مقارنة بعدم الضبط، ولكن توقع نتائج مثلى سيكون خطأً. الخيار الأفضل للضبط اليدوي هو خيارات --log الخاصة بالأداة adjtimex.

قد يكون من الأكثر فاعلية تتبع انزياح ساعة النظام ببساطة باستخدام sntp، أو الأمر date -Ins وساعة دقيقة، ثم حساب التصحيح يدويًّا.

بعد ضبط قيم التكة (tick) والتردد، استمر في اختبار وتحسين التعديلات حتى تحافظ ساعة النظام على وقت جيد. راجع adjtimex(2) لمزيد من المعلومات وللمثال الذي يوضح حسابات الانزياح اليدوية.

بمجرد أن تعمل ساعة النظام بسلاسة، انتقل إلى ساعة العتاد.

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

خطوات حساب الانزياح البارد:

1

تأكد من عدم إطلاق عفريت NTP عند بدء التشغيل.

2

يجب أن يكون وقت ساعة النظام صحيحًا عند الإغلاق!

3

أغلق النظام.

4

اترك فترة طويلة تمر دون تغيير ساعة العتاد.

5

ابدأ تشغيل النظام.

6

استخدم hwclock فورًا لضبط الوقت الصحيح، مع إضافة خيار --update-drift.

ملاحظة: إذا استُخدم خيار --systohc في الخطوة 6، فيجب ضبط ساعة النظام بشكل صحيح (الخطوة 6أ) قبل القيام بذلك مباشرة.

يعد جعل hwclock يحسب معامل الانزياح نقطة بداية جيدة، ولكن للوصول إلى نتائج مثلى سيتعين غالبًا تعديله عبر تحرير ملف /etc/adjtime مباشرة. استمر في اختبار وتحسين معامل الانزياح حتى تُصحح ساعة العتاد بشكل سليم عند بدء التشغيل. للتحقق من ذلك، تأكد أولاً من أن وقت النظام صحيح قبل الإغلاق، ثم استخدم sntp، أو الأمر date -Ins وساعة دقيقة فورًا بعد بدء التشغيل.

الوقت المحلي مقابل التوقيت العالمي (UTC)

يؤدي الاحتفاظ بساعة الحاسوب بمقياس زمني محلي إلى نتائج غير متسقة في التوقيت الصيفي:

•إذا كان لينكس قيد التشغيل أثناء تغيير التوقيت الصيفي، فسيُعدل الوقت المكتوب في ساعة العتاد ليناسب التغيير.
•إذا لم يكن لينكس قيد التشغيل أثناء تغيير التوقيت الصيفي، فلن يُعدل الوقت المقروء من ساعة العتاد ليناسب التغيير.

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

يتعامل لينكس مع تغييرات التوقيت الصيفي بشفافية فقط عندما تُحفظ ساعة العتاد بمقياس توقيت UTC. هذا الأمر يسير على مديري النظام لأن hwclock تستخدم التوقيت المحلي في مخرجاتها وكوسيط لخيار --date.

صُممت أنظمة POSIX، مثل لينكس، لتعمل ساعة النظام فيها بمقياس توقت UTC. والغرض من ساعة العتاد هو تهيئة ساعة النظام، لذا فإن إبقاءها في UTC منطقي أيضًا.

ومع ذلك، يحاول لينكس التكيف مع وجود ساعة العتاد في مقياس التوقيت المحلي. هذا بشكل أساسي من أجل الإقلاع المزدوج مع إصدارات MS Windows القديمة. بدءًا من Windows 7 فصاعدًا، من المفترض أن يعمل مفتاح السجل RealTimeIsUniversal بشكل صحيح بحيث يمكن الاحتفاظ بساعة العتاد بنظام UTC.

سيكون النقاش حول تهيئة التاريخ والوقت ناقصاً دون معالجة النطاقات الزمنية، وهذا مغطى بشكل جيد غالباً في tzset(3). أحد المجالات التي يبدو أنها لا تملك وثائق هو دليل 'right' في قاعدة بيانات النطاق الزمني، والتي تسمى أحياناً tz أو zoneinfo.

يوجد قاعدتا بيانات منفصلتان في نظام zoneinfo، هما posix و 'right'. تشمل 'right' (المسماة الآن zoneinfo-leaps) الثواني الكبيسة بينما لا تشملها posix. لاستخدام قاعدة بيانات 'right'، يجب ضبط ساعة النظام على (UTC + الثواني الكبيسة)، وهو ما يعادل (TAI - 10). يتيح ذلك حساب عدد الثواني الدقيق بين تاريخين يتقاطعان مع عهد ثانية كبيسة. ثم تُحوّل ساعة النظام إلى الوقت المدني الصحيح، بما في ذلك UTC، باستخدام ملفات المنطقة الزمنية 'right' التي تطرح الثواني الكبيسة. ملاحظة: يُعد هذا الضبط تجريبيًّا ومن المعروف وجود مشكلات فيه.

بغرض ضبط نظام لاستخدام قاعدة بيانات معينة، يجب نسخ جميع الملفات الموجودة في دليلها إلى جذر /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_SUCCESS ('0' على أنظمة POSIX)

نُفّذ البرنامج بنجاح.

EXIT_FAILURE ('1' على أنظمة POSIX)

فشلت العملية أو لم تكن صيغة الأمر صالحة.

البيئة

TZ

إذا عُيّن هذا المتغير، فإن قيمته تأخذ الأسبقية على النطاق الزمني المضبوط في النظام.

TZDIR

إذا عُيّن هذا المتغير، فإن قيمته تأخذ الأسبقية على مسار دليل قاعدة بيانات النطاق الزمني المضبوط في النظام.

الملفات

/etc/adjtime

ملف الضبط والحالة الخاص بـ hwclock. انظر أيضاً adjtime_config(5).

/etc/localtime

ملف النطاق الزمني للنظام.

/usr/share/zoneinfo/

دليل قاعدة بيانات النطاق الزمني للنظام.

ملفات الأجهزة التي قد يحاول hwclock استخدامها للوصول إلى ساعة العتاد: /dev/rtc /dev/rtc0 /dev/misc/rtc /dev/efirtc /dev/misc/efirtc

انظر أيضاً

date(1)، adjtime_config(5)، adjtimex(8)، gettimeofday(2)، settimeofday(2)، crontab(1p)، tzset(3)

المؤلفين

كتبه Bryan Henderson <bryanh@giraffe-data.com>، سبتمبر 1996، بناءً على العمل المنجز في برنامج clock(8) بواسطة Charles Hedrick و Rob Hooft و Harald Koenig. انظر الشفرة المصدرية للتاريخ الكامل والاعتمادات.

التبليغ عن الأخطاء

لتقارير العِلل، استخدم مُتتبع المشكلات https://github.com/util-linux/util-linux/issues.

التوفر

الأمر hwclock جزء من حزمة util-linux التي يمكن تنزيلها من أرشيف نواة لينكس https://www.kernel.org/pub/linux/utils/util-linux/.

2026-05-18 util-linux 2.42.1