الخلاصة

  • يستخدم NFS المسار للعثور على الملف، ثم يستخدم مقبض ملف مبهم يصدره الخادم للعمليات اللاحقة. يستطيع العميل حفظ القيمة وإعادتها، لكنه لا يملك تفسيرها على أنها رقم inode أو موقع تخزين أو هوية عالمية.
  • قسّم NFSv4 المقابض إلى دائمة ومتطايرة. يبقى المقبض الدائم ثابتاً طوال حياة الكائن عبر إعادة تشغيل الخادم وترحيله، بينما قد ينتهي المقبض المتطاير وفق شروط يعلنها الخادم.
  • يفيد NFS4ERR_STALE بأن المرجع لم يعد يصل إلى كائن موجود أو متاح. أما NFS4ERR_FHEXPIRED فقد يعني أن مرجعاً مؤقتاً فقد استمراريته مع احتمال بقاء الملف. الاستعادة تعني إعادة اجتياز الأسماء والتحقق من النتيجة، لا تخمين معنى البايتات القديمة.

اسم جديد لا يعني بالضرورة ملفاً جديداً

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

ظهر هذا الفصل في NFS مبكراً. وصف RFC 1094 عام 1989 نسخة NFSv2 وهي تجتاز المسار مكوّناً بعد مكوّن. يحصل العميل أولاً على مقبض للجذر بواسطة بروتوكول MOUNT المنفصل، ثم يرسل إلى LOOKUP مقبض دليل واسماً واحداً، فيتلقى مقبضاً جديداً. تستخدم عمليات مثل GETATTR وREAD وWRITE ذلك المقبض بدلاً من إعادة إرسال المسار كاملاً.

كان المقبض بطول 32 بايت ووصفه المعيار بأنه مبهم. لا تعني كلمة «مبهم» أنه مشفّر أو سري. معناها أن بنيته ليست عقداً متاحاً للعميل. قد يبنيه الخادم من رقم جهاز أو inode أو خانة داخلية، لكن العميل المتوافق لا يحق له قراءة تلك الحقول أو الاعتماد على بقائها.

جعل RFC 1813 مقبض NFSv3، المسمى nfs_fh3، متغير الطول. تحمل القيمة ما يحتاجه الخادم لتمييز ملف، وتعيدها عمليات منها LOOKUP وCREATE وLINK وREADDIRPLUS. أتاحت الحدود للخادم تغيير تمثيله الداخلي، فيما حصل العميل على مرجع صالح للإعادة لا على خريطة لنظام التخزين.

للمساواة دلالة محدودة

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

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

يستطيع مخبأ البيانات تفادي عمل مكرر عندما يرى قيمة متساوية. لكنه لا يستطيع الاستنتاج من عدم المساواة أن عمليتين لن تمسا الكائن نفسه. تظل خريطة الهوية تحت سلطة الخادم الذي أصدر المرجع.

الدوام وعد محدد لا خلود

قدّم RFC 3010 في NFSv4 فئتين: مقابض دائمة ومقابض متطايرة. أبقى RFC 7530 وRFC 8881 هذا النموذج.

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

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

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

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

التقادم غير انتهاء الصلاحية

يقول NFS4ERR_STALE إن المرجع لم يعد يصل إلى الكائن المتوقع: ربما حُذف الكائن أو أصبح نظام الملفات الذي يحمل المرجع الدائم غير متاح.

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

دمج الخطأين يمحو حقيقة نافعة. اعتبار كل انتهاء حذفاً يحوّل فقدان المرجع إلى بلاغ كاذب عن ضياع البيانات. واعتبار كل تقادم عارضاً مؤقتاً يؤدي إلى إعادة محاولات بلا نهاية تجاه كائن محذوف. لا يلغي البروتوكول عدم اليقين؛ بل يمنع طبقة أدنى من اختراع يقين لا تملكه.

الاستعادة تبدأ من الجذر ولا تعيد الزمن

أدخل NFSv4 مقابض خاصة للجذر وعمليات للسير في فضاء الأسماء. تضع PUTROOTFH الجذر الحالي، ثم تعبر عمليات LOOKUP المكوّنات. إذا حفظ العميل الأسماء التي قادته إلى المقبض، يستطيع بعد انتهاء صلاحيته طلب مرجع جديد.

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

ويبقى التفويض منفصلاً. المقبض الصحيح ليس صلاحية قراءة أو كتابة. الخادم هو من يفحص الوصول لكل عملية. كما أن نجاح البحث من جديد لا يجدد قفلاً سابقاً ولا يثبت أن إعادة كتابة انقطعت سابقاً آمنة.

تكمن قيمة تاريخ NFS هنا في تحديد معنى المرجع، لا في ادعاء أنه يجيب عن كل شيء. يختار الخادم التمثيل الداخلي ويعلن حدود استمراريته. يضع المعيار قواعد مشتركة قليلة: الإبهام، والمساواة المحدودة، وفئة العمر، والفشل الصريح. ويحفظ العميل سياق الأسماء اللازم للمحاولة من جديد من دون أن يحوّل نتيجة جديدة إلى إثبات بأثر رجعي.

قد يتغير المسار ويبقى الكائن. وقد يبقى الكائن وينتهي المقبض. وقد يصح المقبض وتظل العملية ممنوعة. صان NFS سلامته بإبقاء هذه العلاقات منفصلة.

المصادر