كل شيء عبارة عن ملف

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

  1. تمثيل الكائنات كمعرفات ملفات بدلاً من بدائل مثل المقابض المجردة أو الأسماء،
  2. التعامل مع الكائنات باستخدام عمليات الإدخال/الإخراج القياسية ، وإرجاع تدفقات البايت ليتم تفسيرها بواسطة التطبيقات (بدلاً من البيانات المهيكلة بشكل صريح)، و
  3. السماح باستخدام أو إنشاء الكائنات عن طريق فتح أو إنشاء الملفات في مساحة اسم نظام الملفات العالمي .

غالباً ما تتداخل الحدود بين التفسيرات الشائعة لمصطلحي "ملف" و"مُعرِّف ملف" عند تحليل نظام يونكس، وتُعدّ إمكانية تسمية الملفات أقلّ جوانب هذا المبدأ أهمية؛ لذا، يُوصف أحياناً بأنه "كل شيء مُعرِّف ملف" . [ 1 ] [ 2 ] [ 3 ]

يُفسَّر هذا النهج بطرق مختلفة باختلاف الزمن، وفلسفة كل نظام، والمجال الذي يُطبَّق فيه. ويُقدِّم الجزء المتبقي من هذه المقالة أمثلة بارزة لبعض هذه التفسيرات، وتداعياتها.

الكائنات كمعرفات ملفات

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

تتبع بعض الواجهات جزءًا فقط من هذه الإرشادات، فعلى سبيل المثال، لا توجد أنابيب في نظام الملفات - مما يُنشئ زوجًا من مُعرّفات الملفات غير القابلة للتسمية. [ 5 ] وقد سدّ اختراع الأنابيب المُسماة (FIFOs) لاحقًا بواسطة POSIX هذه الثغرة.pipe()

لا يعني هذا أن العمليات الوحيدة على الكائن هي القراءة والكتابة؛ ioctl()إذ تسمح واجهات مماثلة بعمليات خاصة بالكائن (مثل التحكم في خصائص الطرفية )، ويمكن استخدام مُعرّفات ملفات الدليل لتغيير عمليات البحث عن المسار (مع تزايد عدد *at()متغيرات استدعاء النظام مثل openat()[ 6 ] ) أو لتغيير دليل العمل إلى الدليل الذي يمثله مُعرّف الملف، [ 7 ] وفي كلتا الحالتين، يمنع ذلك حدوث حالات التزامن ، كما أنه أسرع من البحث عن المسار بأكمله. [ 8 ]

تتطلب مُعرّفات ملفات المقابس تهيئة (تحديد العنوان البعيد والاتصال) بعد إنشائها قبل استخدامها للإدخال/الإخراج. قد لا يُستخدم مقبس الخادم للإدخال/الإخراج مباشرةً على الإطلاق - في البروتوكولات القائمة على الاتصال، bind()يتم تعيين عنوان محلي للمقبس، ويُستخدم listen()هذا المقبس للانتظار حتى تتصل عملية بعيدة، ثم يُعيد مُعرّف ملف مقبس جديد يُمثل هذا الاتصال ثنائي الاتجاه المباشر.

يسمح هذا النهج بإدارة الكائنات التي يستخدمها البرنامج بطريقة موحدة، تمامًا مثل أي ملف آخر - بعد الربط بعنوان، يمكن إسقاط الامتيازات، ويمكن توزيع مقبس الخادم بين العديد من العمليات عن طريق fork()(على التوالي إغلاقه في العمليات الفرعية التي لا ينبغي أن يكون لها حق الوصول)، أو يمكن إعطاء مقابس الاتصالات الفردية كمدخلات/مخرجات قياسية لمعالجات متخصصة لتلك الاتصالات، كما هو الحال في نماذج الخادم الفائق / CGI / inetd .

تكررت العديد من الواجهات الموجودة في أنظمة يونكس القديمة والتي لا تستخدم مُعرّفات الملفات في التصاميم اللاحقة: تُجدول استدعاءات النظام alarm()/ setitimer()إرسال إشارة بعد انقضاء الوقت المُحدد؛ ويرث هذا المؤقت العمليات الفرعية، ويستمر بعد ذلك exec(). تؤدي واجهة برمجة تطبيقات POSIX timer_create()وظيفة مماثلة، لكنها تُزيل المؤقت في العمليات الفرعية وعند انتهاء العملية exec()؛ وتُعرف هذه المؤقتات بمقابض مُبهمة. تُرسل كلتا الواجهتين دائمًا عمليات الإكمال بشكل غير متزامن، ولا يمكن poll()حذفهما/ select()إعادتهما، مما يجعل دمجهما في حلقة أحداث مُعقدة أكثر صعوبة.

يقوم تصميم timerfd (الذي تم العثور عليه في الأصل في Linux ) بتحويل كل كائن مؤقت إلى واصف ملف، والذي يمكن مراقبته بشكل فردي باستخدام poll()& c. ويمكن التحكم في توريثه إلى العمليات الفرعية باستخدام عناصر التحكم القياسية close()/ CLOEXEC/ CLOFORK.

بينما توفر واجهة برمجة تطبيقات POSIX timer_getoverrun()دالة تُرجع عدد مرات انقضاء المؤقت، إلا أن هذه القيمة تُرجع كنتيجة لعملية قراءة read()من مُعرّف المؤقت (timerfd). هذه العملية تُسبب حظرًا، لذا فإن انتظار انقضاء مُعرّف المؤقت سهلٌ تمامًا كقراءة بياناته. لا توجد طريقة لتنفيذ ذلك بشكل ذري باستخدام مؤقتات Unix أو POSIX التقليدية. يمكن فحص المؤقت دون حظر عن طريق إجراء عملية قراءة غير حظرية (عملية إدخال/إخراج قياسية).

الكائنات في مساحة اسم نظام الملفات

أنواع الملفات الخاصة

تُعدّ الملفات الخاصة بالأجهزة سمةً مميزةً لنظام يونكس: ففي البداية، كان فتح ملف عادي برقم عقدة i ≤ 40 (يُخزّن عادةً تحت /dev) يُعيد مُعرّف ملف يُطابق جهازًا، ويتولى مُشغّل الجهاز معالجته. لاحقًا، تمّ ترميز نظام أرقام عقدة i السحرية في ملفات من النوع S_IFBLK/ S_IFCHR.

يخضع فتح الملفات الخاصة لنفس عمليات التحقق من أذونات نظام الملفات مثل فتح الملفات العادية، مما يسمح بالتحكم المشترك في الوصول - chown dmr /usr/dmr /dev/rk0; chmod o= /usr/dmr /dev/rk0تغيير ملكية ونمط الوصول إلى الملفات لكل من الدليل /usr/dmrوالجهاز /dev/rk0.

بالنسبة لأجهزة التخزين الكتلية ( الأقراص الصلبة ومحركات الأشرطة )، ونظرًا لحجمها، فقد استلزم ذلك دلالات فريدة: إذ كانت تُعنون على شكل كتل (انظر [ 9 ] )، وكان لا بد من كتابة البرامج خصيصًا للعمل معها بشكل صحيح. وُصِف هذا بأنه "مؤسف للغاية"، وقد خففت الواجهات اللاحقة من هذه المشكلة. [ أ ]

في كثير من الحالات، لا تزال الأشرطة المغناطيسية تحتفظ بدلالات فريدة: يمكن تقسيم بعض الأشرطة إلى "ملفات"، ويشير برنامج التشغيل إلى حالة نهاية الملف عند الوصول إلى نهاية القسم، وبالتالي cp /dev/nrst0 file1; cp /dev/nrst0 file2سيتم إنشاء file1قسمين file2متتاليين من الشريط. يوفر برنامج التشغيل طبقة تجريدية تعرض وصف ملف الشريط كما لو كان ملفًا عاديًا ليتناسب مع نموذج "كل شيء ملف" . تُستخدم برامج متخصصة mtللتنقل بين الأقسام على شريط كهذا.

تظهر الأنابيب المسماة (FIFOs) S_IFIFOكملفات من النوع - في نظام الملفات، ويمكن إعادة تسميتها، ويمكن فتحها مثل الملفات العادية.

في أنظمة يونكس المشتقة، تظهر مقابس نطاق يونكسS_IFSOCK كملفات من نوع معين في نظام الملفات، ويمكن إعادة تسميتها، ولكن لا يمكن open()تحريرها - يجب إنشاء واصف ملف المقبس الصحيح connect()بشكل صريح. أما في نظام بلان 9 ، فيمكن فتح المقابس في نظام الملفات كملفات عادية.

كبديل لنداءات النظام المخصصة

تحتوي الأنظمة الحديثة على إمكانيات عالية الأداء لإشعارات أحداث الإدخال/الإخراج - مثل kqueue (في أنظمة BSD المشتقة)، وepoll (في أنظمة Linux)، و IOCP ( في أنظمة Windows NT و Solaris ) /dev/poll- حيث يتم إنشاء كائن التحكم وتكوينه عادةً باستخدام استدعاءات نظام مخصصة. يتم إنشاء مثيل عن طريق فتح الملف مباشرةً kqueue()، وكتابة الكائنات المُكوَّنة للمراقبة، و s لإجراء تكوينات إضافية.epoll_create()kevent()epoll_ctl()/dev/poll"/dev/poll"ioctl()

يمكن تخصيص الذاكرة عن طريق طلب تعيين ذاكرة مجهول - أي تعيين لا يرتبط بأي ملف. في الأنظمة الحديثة، يمكن القيام بذلك بتحديد عدم وجود ملف MAP_ANONYMOUS؛ أما في نظام يونكس سيستم 5 الإصدار 4 ، فكان يتم ذلك عن طريق فتح ملف `.org/local /dev/zero...mmap()

أنظمة ملفات واجهة برمجة التطبيقات

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

في الحالة الأخيرة، يتم عرض حالة النظام كما لو كانت ملفات ومجلدات عادية [ 12 ] - على الأنظمة التي تحتوي على procfs ، يمكن الحصول على معلومات حول العمليات قيد التشغيل من خلال النظر، بشكل أساسي، إلى /proc، والذي يحتوي على مجلدات تحمل أسماء معرفات العمليات التي تعمل على النظام، وتحتوي على ملفات مثل stat ( status ) مع بيانات تعريف العملية، و cwd ، و exe ، و root - وهي روابط رمزية إلى دليل عمل العملية، والصورة التنفيذية، ودليل الجذر - أو مجلدات مثل fd التي تحتوي على روابط رمزية إلى الملفات التي فتحتها العملية، والتي تحمل أسماء واصفات الملفات.

نظرًا لأن هذه الخصائص تُعرض كملفات وروابط رمزية، فإن الأدوات القياسية تعمل عليها، ويمكن، على سبيل المثال، فحص هوية العملية باستخدام الأمر `fl` ، ثم الانتقال إلى نفس الدليل الذي توجد فيه العملية باستخدام الأمر `fl` ، ثم الاطلاع على الملفات المفتوحة بواسطة العملية باستخدام الأمر `fl` ، ثم فتح ملف مفتوح بواسطة تلك العملية باستخدام الأمر `fl` . يُحسّن هذا من سهولة الاستخدام مقارنةً بتحليل هذه البيانات من مخرجات الأداة. [ 13 ] [ 14 ]grep Uid /proc/1392400/statuscd /proc/1392400/cwdls -l /proc/1392400/fdless /proc/1392400/fd/8

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

تُعدّ أوامر sysctl المشتقة من نظام 4.4BSD عبارة عن تعيينات مفتاح/قيمة تُدار بواسطة برنامج sysctl ، الذي يسرد جميع المتغيرات باستخدام `<var>` ، وقيمة متغير واحد باستخدام `<var>` ، ويُعيّنها باستخدام ` <var> `. في نظام Linux، تُوفّر procfs آلية مُكافئة ضمن الشجرة: يُمكن تنفيذ العمليات المُقابلة باستخدام `/ ` و`< var>` و`<var >`.sysctl -asysctl net.inet.ip.forwardingsysctl -w net.inet.ip.forwarding=1/proc/sysfind /proc/sysgrep -r ^ /proc/syscat /proc/sys/net/ipv4/ip_forwardecho 1 > /proc/sys/net/ipv4/ip_forward

ولأغراض الراحة أو الامتثال للمعايير، قد يتم توفير أدوات فحص مخصصة (مثل pssysctl ) باستخدام أنظمة الملفات هذه كمصادر/مستودعات للبيانات.

sysfs [ 15 ] و debugfs [ 16 ] هما واجهتان متشابهتان لنظام Linux لمزيد من تكوين النواة: كتابة mem إلى سيؤدي إلى تشغيل إجراء تعليق إلى ذاكرة الوصول العشوائي ، [ 17 ] وكتابة 2 إلى سيؤدي إلى بدء وميض مؤشر LED الخاص بشبكة Wi-Fi عند النشاط./sys/power/state/sys/module/iwlwifi/parameters/led_mode

هذه أنظمة ملفات اصطناعية لأن محتويات كل ملف لا تُخزَّن حرفيًا في أي مكان: عند قراءة الملف، تُحوَّل هياكل بيانات النواة المناسبة إلى مخزن الإدخال الخاص بعملية القراءة، وعند الكتابة إلى الملف، يُحلَّل مخزن الإخراج. [ 15 ] هذا يعني أن تجريد الملف معطَّل، لأن بيانات تعريف الملف غير صالحة: فبحسب نظام الملفات، يُبلغ كل ملف عن حجم 0 أو PAGE_SIZE ، على الرغم من أن قراءة البيانات ستُنتج عددًا مختلفًا من البايتات.

ملحوظات

  1. أولاً في الإصدار 4 من يونكس عن طريق إضافةseek()أوضاع خاصة تضرب الإزاحة في 512 في النواة، [ 10 ] وأخيراً في الإصدار 7 من يونكس عن طريق توفيرlseek()وسيطة 32 بت. [ 11 ]

انظر أيضاً

مراجع

  1. "لينوس تورفالدز - 'كل شيء عبارة عن واصف ملف أو عملية'"" . Yarchive.net . تم الاطلاع عليه بتاريخ 28-08-2015 .
  2. "أشباح الماضي في يونكس" . Lwn.net . تم الاطلاع عليه بتاريخ 28-08-2015 .
  3. ^ كيرنيغان ، بريان (18 أكتوبر 2019). يونكس - تاريخ ومذكرات . نُشرت بشكل مستقل (18 أكتوبر 2019). ص. 76 وما يليها. رقم ISBN  978-1695978553.
  4. كين تومسون ودينيس ريتشي (3 نوفمبر 1971). "دليل (V)" (ملف PDF) . دليل مبرمج يونكس . مختبرات بيل .
  5. كين تومسون ودينيس ريتشي (فبراير 1973). "PIPE (II)" . دليل مبرمج يونكس ( الطبعة الثالثة). مختبرات بيل . ./man2/pipe.2
  6. "open, openat — فتح ملف" . معيار IEEE 1003.1-2024، المواصفات الأساسية لمجموعة Open Group، الإصدار 8. معهد مهندسي الكهرباء والإلكترونيات ومجموعة Open Group . 2024.
  7. "fchdir — تغيير دليل العمل" . معيار IEEE 1003.1-2024، المواصفات الأساسية لمجموعة Open Group، الإصدار 8. معهد مهندسي الكهرباء والإلكترونيات ومجموعة Open Group . 2024.
  8. "د. اعتبارات قابلية النقل (معلوماتية)، د.2 إمكانيات قابلية النقل، د.2.3 الوصول إلى البيانات" . معيار IEEE 1003.1-2024، المواصفات الأساسية لمجموعة Open Group، الإصدار 8. معهد مهندسي الكهرباء والإلكترونيات ومجموعة Open Group . 2024.
  9. كين تومسون ودينيس ريتشي (3 نوفمبر 1971). "/DEV/RF0 (IV)" (ملف PDF) . دليل مبرمج يونكس . مختبرات بيل .
  10. كين تومسون ودينيس ريتشي (نوفمبر 1973). "PIPE (II)" . دليل مبرمج يونكس ( الطبعة الرابعة). مختبرات بيل . ./man2/pipe.2وتم حذف المقطع .
  11. "LSEEK(2)" . دليل مبرمج يونكس ( الطبعة السابعة). مختبرات بيل . يناير 1979. usr/man/man2/lseek.2
  12. ^ بنفينوتي ، كريستيان (2006). "3. واجهة المستخدم من الفضاء إلى النواة" . فهم الأجزاء الداخلية لشبكة Linux (Nachdr. ed.). بكين كولن: أورايلي. ص. 58. ردمك   9780596002558.
  13. شياو، يانغ؛ لي، فرانك هايزون؛ تشين، هوي (2011). دليل الأمن والشبكات . هاكنساك (نيوجيرسي): وورلد ساينتيفيك. ص 160. ISBN  9789814273039.
  14. "27. ترقية وتخصيص النواة" . إدارة الشبكات والأنظمة في ريد هات لينكس . جون وايلي وأولاده. 2007. ص 662. ISBN  9780471777311.
  15. 1 2 موشيل، باتريك؛ مورفي، مايك (16 أغسطس 2011). "sysfs - نظام الملفات لتصدير كائنات النواة - وثائق نواة لينكس" . kernel.org . مؤرشف من الأصل في 13 مارس 2024. تم الاطلاع عليه في 15 يونيو 2024 .
  16. "sysfs و procfs و sysctl و debugfs وغيرها من واجهات النواة المماثلة" . مدونة جون . 2013-11-20 . تاريخ الاسترجاع 2024-06-15 .
  17. ويسوكي، رافائيل ج. "حالات السكون لإدارة طاقة النظام" . kernel.org . تم الاطلاع عليه في 15 يونيو 2024 .