time_namespaces(7)

الاسم
time_namespaces - نظرة عامة على مساحات أسماء الوقت في لينكس

الوصف
مساحات أسماء الوقت تُظاهِر قيم ساعتي نظام:

•   CLOCK_MONOTONIC (وكذلك CLOCK_MONOTONIC_COARSE و CLOCK_MONOTONIC_RAW)، ساعة غير قابلة للضبط تمثل الوقت الرتيب منذ —كما هو موصوف بواسطة POSIX— "نقطة غير محددة في الماضي".

•   CLOCK_BOOTTIME (وكذلك CLOCK_BOOTTIME_ALARM)، ساعة غير قابلة للضبط مطابقة لـ CLOCK_MONOTONIC، باستثناء أنها تتضمن أيضًا أي وقت يكون فيه النظام معلقًا.

وبالتالي، تشترك العمليات في مساحة اسم الوقت في قيم خاصة بكل مساحة اسم لهذه الساعات. يؤثر هذا على واجهات برمجة تطبيقات مختلفة تقيس مقابل هذه الساعات، بما في ذلك: clock_gettime(2)، clock_nanosleep(2)، nanosleep(2)، timer_settime(2)، timerfd_settime(2)، و /proc/uptime.

حاليًا، الطريقة الوحيدة لإنشاء مساحة اسم وقت هي استدعاء unshare(2) مع العلامة CLONE_NEWTIME. يُنشئ هذا الاستدعاء مساحة اسم وقت جديدة ولكنه لا يضع العملية المستدعية في مساحة الاسم الجديدة. بدلاً من ذلك، توضع العمليات التابعة التي تُنشأ لاحقًا للعملية المستدعية في مساحة الاسم الجديدة. يسمح هذا بتعيين إزاحات الساعة (انظر أدناه) لمساحة الاسم الجديدة قبل وضع أول عملية في مساحة الاسم. يُظهر الرابط الرمزي /proc/pid/ns/time_for_children مساحة اسم الوقت التي ستُنشأ فيها عمليات تابعة لعملية ما. (يمكن لعملية استخدام واصف ملف مفتوح على هذا الرابط الرمزي في استدعاء لـ setns(2) للانتقال إلى مساحة الاسم.)

  /proc/pid/timens_offsets
مرتبطة بكل مساحة اسم وقت إزاحات، معبر عنها بالنسبة لمساحة اسم الوقت الأولية، تحدد قيم ساعتي الرتيبة ووقت الإقلاع في تلك المساحة. تُعرض هذه الإزاحات عبر الملف /proc/pid/timens_offsets. داخل هذا الملف، تُعبر الإزاحات كأسطر تتكون من ثلاثة حقول مفصولة بمسافات:

    <clock-id> <offset-secs> <offset-nanosecs>

معرف-الساعة هو سلسلة تحدد الساعة التي تُعرض إزاحاتها. هذا الحقل إما monotonic لـ CLOCK_MONOTONIC، أو boottime لـ CLOCK_BOOTTIME. تعبر الحقول المتبقية عن الإزاحة (ثوانٍ زائد نانوثانية) للساعة في مساحة اسم الوقت هذه. تُعبر هذه الإزاحات بالنسبة لقيم الساعة في مساحة اسم الوقت الأولية. يمكن أن تكون قيمة إزاحة-ثوان سالبة، مع مراعاة القيود المذكورة أدناه؛ إزاحة-نانو هي قيمة غير موقعة.

في مساحة اسم الوقت الأولية، محتويات ملف timens_offsets هي كما يلي:

    $ cat /proc/self/timens_offsets
    monotonic           0         0
    boottime            0         0

في مساحة اسم وقت جديدة ليس لها عمليات عضو، يمكن تعديل إزاحات الساعة بكتابة سجلات منتهية بسطر جديد بنفس النموذج إلى ملف timens_offsets. يمكن الكتابة إلى الملف عدة مرات، ولكن بعد إنشاء أول عملية في مساحة الاسم أو دخولها، تفشل عمليات write(2) على هذا الملف مع الخطأ EACCES. للكتابة إلى ملف timens_offsets، يجب أن تمتلك العملية القدرة CAP_SYS_TIME في مساحة اسم المستخدم التي تمتلك مساحة اسم الوقت.

يمكن أن تفشل عمليات الكتابة إلى ملف timens_offsets مع الأخطاء التالية:

EINVAL
    قيمة إزاحة-نانو أكبر من 999,999,999.

EINVAL
    قيمة معرف-الساعة غير صالحة.

EPERM
    لا يمتلك المستدعي القدرة CAP_SYS_TIME.

ERANGE
    قيمة إزاحة-ثوان خارج النطاق. على وجه الخصوص؛

    •   لا يمكن تعيين إزاحة-ثوان إلى قيمة تجعل الوقت الحالي على الساعة المقابلة داخل مساحة الاسم قيمة سالبة؛ و

    •   لا يمكن تعيين إزاحة-ثوان إلى قيمة بحيث يتجاوز الوقت على الساعة المقابلة داخل مساحة الاسم نصف قيمة الثابت النواة KTIME_SEC_MAX (يحد هذا من قيمة الساعة إلى حد أقصى يبلغ حوالي 146 سنة).

في مساحة اسم وقت جديدة تم إنشاؤها بواسطة unshare(2)، تُورث محتويات ملف timens_offsets من مساحة اسم وقت العملية المنشئة.

ملاحظات
يتطلب استخدام مساحات أسماء الوقت نواة مهيأة بالخيار CONFIG_TIME_NS.

لاحظ أن مساحات أسماء الوقت لا تُظاهِر ساعة CLOCK_REALTIME. تم تجنب تظاهر هذه الساعة لأسباب تتعلق بالتعقيد والعبء داخل النواة.

للتوافق مع التنفيذ الأولي، عند كتابة معرف-الساعة إلى ملف /proc/pid/timens_offsets، يمكن كتابة القيم الرقمية للمعرفات بدلاً من الأسماء الرمزية الموضحة أعلاه؛ أي 1 بدلاً من monotonic، و 7 بدلاً من boottime. من أجل سهولة القراءة، يُفضل استخدام الأسماء الرمزية على الأرقام.

كان الدافع لإضافة مساحات أسماء الوقت هو السماح لساعتي الرتيبة ووقت الإقلاع بالحفاظ على قيم متسقة أثناء ترحيل الحاويات ونقاط التفتيش/الاستعادة.

أمثلة
جلسة الصدفة التالية توضح تشغيل مساحات أسماء الوقت. نبدأ بعرض رقم inode لمساحة اسم الوقت لصدفة في مساحة اسم الوقت الأولية:

    $ readlink /proc/$$/ns/time
    time:[4026531834]

بالاستمرار في مساحة اسم الوقت الأولية، نعرض وقت تشغيل النظام باستخدام uptime(1) ونستخدم برنامج المثال clock_times الموضح في clock_getres(2) لعرض قيم الساعات المختلفة:

    $ uptime --pretty
    up 21 hours, 17 minutes
    $ ./clock_times
    CLOCK_REALTIME : 1585989401.971 (18356 days +  8h 36m 41s)
    CLOCK_TAI      : 1585989438.972 (18356 days +  8h 37m 18s)
    CLOCK_MONOTONIC:      56338.247 (15h 38m 58s)
    CLOCK_BOOTTIME :      76633.544 (21h 17m 13s)

ثم نستخدم unshare(1) لإنشاء مساحة اسم وقت وتنفيذ صدفة bash(1). من الصدفة الجديدة، نستخدم أمر echo المدمج لكتابة سجلات إلى ملف timens_offsets مع ضبط الإزاحة لساعة CLOCK_MONOTONIC للأمام يومين والإزاحة لساعة CLOCK_BOOTTIME للأمام 7 أيام:

    $ PS1=ns2# sudo unshare -T -- bash --norc
    ns2# echo monotonic$((2*24*60*60))0">/proc/$$/timens_offsets"
    ns2# echo boottime$((7*24*60*60))0">/proc/$$/timens_offsets"

أعلاه، بدأنا صدفة bash(1) مع الخيار --norc بحيث لا تُنفذ أي نصوص بدء تشغيل. يضمن هذا عدم إنشاء أي عمليات فرعية من الصدفة قبل أن تتاح لنا فرصة تحديث ملف timens_offsets.

ثم نستخدم cat(1) لعرض محتويات ملف timens_offsets. ينشئ تنفيذ cat(1) أول عملية في مساحة اسم الوقت الجديدة، وبعد ذلك تُنتج أي محاولات أخرى لتحديث ملف timens_offsets خطأ.

    ns2# cat /proc/$$/timens_offsets
    monotonic      172800         0
    boottime       604800         0
    ns2# echo "boottime $((9*24*60*60)) 0" > /proc/$$/timens_offsets
    bash: echo: write error: Permission denied

بالاستمرار في مساحة الاسم الجديدة، ننفذ uptime(1) وبرنامج المثال clock_times:

    ns2# uptime --pretty
    up 1 week, 21 hours, 18 minutes
    ns2# ./clock_times
    CLOCK_REALTIME : 1585989457.056 (18356 days +  8h 37m 37s)
    CLOCK_TAI      : 1585989494.057 (18356 days +  8h 38m 14s)
    CLOCK_MONOTONIC:     229193.332 (2 days + 15h 39m 53s)
    CLOCK_BOOTTIME :     681488.629 (7 days + 21h 18m  8s)

من المخرجات أعلاه، يمكننا رؤية أن ساعتي monotonic وboot-time لهما قيم مختلفة في مساحة اسم الوقت الجديدة.

بفحص الروابط الرمزية /proc/pid/ns/time و/proc/pid/ns/time_for_children، نرى أن الصدفة عضو في مساحة اسم الوقت الأولية، لكن أطفالها يُنشؤون في مساحة الاسم الجديدة.

    ns2# readlink /proc/$$/ns/time
    time:[4026531834]
    ns2# readlink /proc/$$/ns/time_for_children
    time:[4026532900]
    ns2# readlink /proc/self/ns/time  # Creates a child process
    time:[4026532900]

بالعودة إلى الصدفة في مساحة اسم الوقت الأولية، نرى أن ساعتي monotonic وboot-time غير متأثرتين بتغييرات timens_offsets التي أُجريت في مساحة اسم الوقت الأخرى:

    $ uptime --pretty
    up 21 hours, 19 minutes
    $ ./clock_times
    CLOCK_REALTIME : 1585989401.971 (18356 days +  8h 38m 51s)
    CLOCK_TAI      : 1585989438.972 (18356 days +  8h 39m 28s)
    CLOCK_MONOTONIC:      56338.247 (15h 41m  8s)
    CLOCK_BOOTTIME :      76633.544 (21h 19m 23s)

انظر أيضًا
nsenter(1), unshare(1), clock_settime(2), setns(2), unshare(2), namespaces(7), time(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.