أعماق إدخال/إخراج Windows (الجزء 5) ── البنية الداخليّة لـ NTFS: فهم نظام الملفّات من MFT

· · Windows, NTFS, I/O, نظام الملفّات, MFT, النواة, .NET, التحقيق في الأخطاء

عبر الأجزاء الأربعة حتّى الآن، تابعنا كيف يسير طلب إدخال/إخراج (الأجزاء 1–3) وكيف يستقبله مدير الذاكرة المؤقّتة (الجزء 4). في النهاية يصل الطلب إلى نظام الملفّات. هذه المرّة دور مثاله الرائد، NTFS.

تتغيّر الزاوية هنا. حتّى الآن كانت القصّة ديناميّة — تدفّق الطلب. هذه المرّة قصّة ساكنة عن كيف تُوضَع البيانات على القرص. الهويّة الحقيقيّة لـ «Zone.Identifier» غير المرئيّ المرفق بملفّ منزَّل. لماذا نسخ عشرة آلاف ملفّ صغير أبطأ بكثير من نسخ ملفّ واحد بالحجم الإجماليّ نفسه. إلى أيّ مدى يصدق أنّ «NTFS ذو سجلّ تدوين، لذا هو آمن» — كلّ ذلك يُفسَّر من هذه البنية.

هذا الجزء 5 من سلسلة «أعماق إدخال/إخراج Windows».

شرط قراءة هذا الجزء: يسهّل أن تكون لديكم أساساً IRP ومكدّس الأجهزة من الجزء 1. غير أنّه، حتّى يقوم المقال وحده، نعرّف أوّلاً مصطلحات الأجزاء السابقة التي تظهر في النصّ.

المصطلح في سطر التفاصيل
IRP (I/O Request Packet) «قسيمة طلب إدخال/إخراج» التي يُحوَّل إليها استدعاء واجهة مثل ReadFile داخل النواة. تتلقّى برامج التشغيل هذه القسيمة وتعمل عليها الجزء 1
مدير الإدخال/الإخراج ومكدّس الأجهزة مكوّن النواة الذي يصنع IRP ويمرّره بالترتيب في مكدّس برامج التشغيل المتراصّة في الطريق إلى الجهاز الهدف — وذلك المكدّس نفسه الجزء 1
مدير الذاكرة المؤقّتة المكوّن الذي يحتفظ بمحتوى الملفّ في الذاكرة ويُخرج لاحقاً محتوى استدعاءات WriteFile المتراكم إلى القرص. أصل «مجرّد أن كتبتم لا يعني أنّه وصل إلى القرص بعد» الجزء 4

جدول 1: مصطلحات الأجزاء السابقة المفترضة في هذه الحلقة

أمر آخر: المرحلتان اللتان غطّاهما الجزء 1 — cleanup (حين يُغلق آخر مقبض) وclose (حين تختفي كلّ المراجع داخل النواة) — تُستخدمان أيضاً في شرح حذف الملفّ في الفصل 4.

1. الخلاصة أوّلاً

  • مركز NTFS هو MFT (جدول الملفّات الرئيسيّ). كلّ ملفّ يُدار كسجلّ في سجلّ MFT، وكلّ معلومات عن الملفّ إمّا «داخل إدخال MFT» أو «في المنطقة خارج MFT التي يشير إليها الإدخال» (الفصل 2).1
  • كيان الملفّ «مجموعة سمات». ملفّ صغير يتّسع فيه محتوى البيانات نفسه داخل سجلّ MFT (مقيم)، وملفّ كبير لا يحمل إلا مرجعاً إلى سلسلة عناقيد (غير مقيم). بطء معالجة عدد هائل من الملفّات الصغيرة يُفسَّر من هنا (الفصل 2).1
  • يمكن حمل عدّة بيانات (عدّة دفق بيانات). البيانات المعتادة «دفق بلا اسم»، ويمكن حمل دفق إضافيّ بـ file.txt:اسم. هويّة Zone.Identifier (Mark of the Web) (الفصل 3).2
  • الاسم أيضاً سمة. ما يضع عدّة أسماء على السجلّ نفسه هو الرابط الصلب. واسم 8.3 المختصر أيضاً «اسم آخر» يجاور (الفصل 4).34
  • نقطة إعادة التحليل حيلة رسميّة لـ«إن فُتح فمكان آخر». الروابط الرمزيّة والوصلات وملفّات OneDrive عند الطلب كلّها تطبيقات لهذه البيانات ذات الوسم (الفصل 5).56
  • هناك سجلّا تدوين. $LogFile لـاستعادة اتّساق البيانات الوصفيّة (سجلّ سابق كي لا ينكسر)، وسجلّ USN لـتسجيل تاريخ التغيير (سجلّ ما تغيّر). الدوران مختلفان تماماً (الفصل 6).78
  • «الحجم» و«الحجم على القرص» شيئان مختلفان. الملفّات المتناثرة والضغط يولّدان الفارق. خلف «الملفّ المضغوط لا يصير لاتزامنيّاً» الذي رأيناه في الجزء 2 أيضاً هنا (الفصل 7).910

خريطة المعرفة لهذه المقالة

مركز NTFS هو MFT (جدول الملفّات الرئيسيّ)، وتُدار كلّ الملفّات سجلاتٍ في دفتر MFT. البيانات الصغيرة مقيمة داخل السجلّ، والكبيرة تصير غير مقيمة ولا تحمل إلا مرجعاً إلى سلسلة العناقيد (مسار البيانات)؛ وهذا هو جوهر بطء معالجة الملفّات الصغيرة الكثيرة والتجزئة. تدفقات البيانات المتعدّدة والارتباط الثابت والاسم المختصر 8.3 تطبيقات للآليّة نفسها «مجموعة سمات»؛ ونقطة إعادة التوزيع هي الخطّاف الرسميّ على «الفتح» الذي يسند من الارتباط الرمزيّ حتّى ملفات OneDrive عند الطلب. ما يحميه $LogFile هو اتّساق البنية؛ أمّا ديمومة محتوى البيانات فتُبنى على حدة بأدوات التحكّم في الذاكرة المؤقّتة في الحلقة الرابعة.

خريطة معرفة البنية الداخليّة لـ NTFS وMFTمخطّط يبيّن علاقات NTFS وMFT وسجلّ الملفّ، والسمات المقيمة وغير المقيمة، ومسار البيانات، والتجزئة، وتعدّد تدفقات البيانات، وZone.Identifier، والارتباط الثابت، والاسم المختصر 8.3، ونقطة إعادة التوزيع (الارتباط الرمزيّ والوصلة وملفات OneDrive عند الطلب)، و$LogFile وسجلّ USN، والملفّ المتفرّق وضغط NTFSيستخدميستخدميشترطيخفّفيستخدميستخدملا يتوافق معيستخدمقد يسبّبيُتحقّق بـيستخدميُحفظ فييُتحقّق بـيُتحقّق بـقد يسبّبيستخدميشترطيستخدميُكوَّن بـيستخدميُتحقّق بـينفّذينفّذينفّذيستخدميخفّفيستخدميستخدميُتحقّق بـيستخدمقد يسبّبيستخدمقد يسبّبلا يتوافق معيُتحقّق بـNTFSMFT (جدول الملفّات الرئيسيّ)سجلّ ملفّ MFTمنطقة MFTالتجزئة (NTFS)سمة مقيمة (resident)سمة غير مقيمة (non-resident)مسار البيانات (data run)fsutilتدفق بيانات بديل (ADS)Zone.Identifier (Mark of the Web)streams (Sysinternals)تباعد الحجم المنطقيّ عن استخدام القرصارتباط ثابتالاسم المختصر 8.3نقطة إعادة التوزيعارتباط رمزيّوصلة (نقطة تركيب)ملفات OneDrive عند الطلب$LogFile (سجلّ معاملات NTFS)تلف وحدة التخزينمدير الذاكرة المؤقّتةسجلّ USN (سجلّ التغييرات)ملفّ متفرّقضغط NTFSإدخال/إخراج لاتزامنيّProcess Monitor (procmon.exe)

في المخطّط، يشير الخطّ المتّصل إلى علاقة قائمة دائماً، ويشير الخطّ المتقطّع إلى علاقة مشروطة (شروط قيامها مذكورة في شرح كلّ علاقة في الصفحة التفصيليّة). القائمة الكاملة للعلاقات (المجموع 35، مع الأدلّة ودرجة اليقين) وتعريفات المفاهيم الرئيسة مجمّعة في صفحة تفاصيل خريطة المعرفة (باليابانية). البيانات: JSON-LD / Turtle

2. كلّ شيء سجلّ في MFT

2.1. سجلّ المجلّد

حين تُنسَّق مجلّد NTFS، يُنشأ MFT (master file table) ومجموعة ملفّات بيانات وصفيّة تبدأ بـ $. في MFT إدخال واحد على الأقلّ لكلّ ملفّ على المجلّد، ويشمل إدخال MFT نفسه.1

مجلّد NTFSالسجلّ يشير إلى الموضع$MFT ── جدول الملفّات الرئيسيّسجلّ سجلات كلّ الملفّات (يحمل نفسه أيضاً)منطقة بيانات المستخدم(موضع البيانات غير المقيمة)$LogFile ── سجلّ معاملاتعمليّات البيانات الوصفيّة (الفصل 6)$Bitmap ── حالة استخدام العناقيد$Boot / $Secure / $UpCase وغيرهاملفّات بيانات وصفيّة أخرى

الشكل 1: بنية مجلّد NTFS. «معلومات إدارة نظام الملفّات نفسها تُحمَل كملفّات» تصميم NTFS

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

2.2. الملفّ = مجموعة سمات، مقيم وغير مقيم

محتوى سجلّ الملفّ قائمة سمات. معلومات قياسيّة (طوابع زمنيّة وغيرها)، واسم الملفّ، والأمن، ثمّ البيانات. هنا فرع مهمّ.

سجلّ ملفّ MFT (سجلّ ملفّ واحد)حتّى بضع مئات من البايتاتأكثر من ذلكسمة المعلومات القياسيّةطوابع زمنيّة وأعلام السماتسمة اسم الملفّ(يمكن حمل عدّة ── الفصل 4)سمة البياناتهل البيانات صغيرةمقيم (resident)محتوى البيانات يتّسع داخل السجلّالقراءة تكتمل بوصول MFT فقطغير مقيم (non-resident)السجلّ لا يحمل إلا «مرجعاً إلى سلسلة عناقيد»البيانات الفعليّة في منطقة بيانات المستخدم

الشكل 2: سجلّ الملفّ مجموعة سمات. إن صغرت البيانات «تقيم» داخل السجلّ

يصير أوضح إن صففنا كيف يتغيّر محتوى السجلّ نفسه بين المقيم وغير المقيم.

غير مقيم (non-resident) ── ملفّ كبيريشير إلى الموضعيشير إلى الموضعسجلّ ملفّ MFT (طول ثابت)معلومات قياسيّة / اسم الملفّ / الأمن─────────────سمة البيانات = جدول تشغيلات البياناتتسلسل «من أين كم عنقوداً»منطقة بيانات المستخدمالتشغيل 1: عناقيد متّصلةمنطقة بيانات المستخدمالتشغيل 2: عناقيد متّصلة في موضع آخرمقيم (resident) ── ملفّ صغيرسجلّ ملفّ MFT (طول ثابت)معلومات قياسيّة / اسم الملفّ / الأمن─────────────سمة البيانات = المحتوى نفسه«القيمة=1» تدخل هنا مباشرةلا موضع آخر على القرصالقراءة تكتمل بوصول MFT فقط

الشكل 3: مقابلة المقيم وغير المقيم. في غير المقيم، ما يحمله السجلّ جدول «أين كم من البيانات الفعليّة» (تشغيلات البيانات) فقط

كلّما زاد عدد تشغيلات البيانات، تصير قراءة ملفّ واحد عبور مناطق متفرّقة. هذه هويّة التفتيت المذكورة تالياً.

من هذه البنية تُفسَّر ظواهر تُصادَف في الميدان.

  • سبب بطء نسخ عشرة آلاف ملفّ صغير. لكلّ ملفّ تحدث عمليّات بيانات وصفيّة: إنشاء سجلّ MFT وتسجيل الاسم وإعداد الأمن. عمل السجلّ يصير مهيمناً على نقل البيانات نفسه (وكلّ واحدة منها تصير أيضاً هدفاً لفحص المرشّحات التي نراها في الجزء 6).
  • هويّة التفتيت. البيانات غير المقيمة تُسجَّل «كتسلسل نطاقات متّصلة من العناقيد (تشغيلات)». إن تعذّر أخذ نطاق متّصل زاد عدد التشغيلات وزادت التماسات القراءة اللازمة — هذا التفتيت. يمكن الاطّلاع على ترتيب التشغيلات الفعليّ بـ fsutil file layout.
  • «المجلّد» ليس خاصّاً. الدليل «ملفّ يحمل فهرساً من اسم الملفّ إلى رقم سجلّ MFT». على السجلّ، الكلّ يركب الآليّة نفسها.

3. البيانات مجرّد «دفق» واحد

3.1. ملفّ واحد، عدّة تسلسلات بايتات

في NTFS يستطيع ملفّ واحد حمل عدّة دفق بيانات. ما تقرأونه وتكتبونه عادة بـ ReadFile/WriteFile هو الدفق الافتراضيّ بلا اسم، ويمكن بتركيب اسم_الملفّ:اسم_الدفق صنع دفق بيانات بديل (ADS).2

ملفّ اسمه report.docx (سجلّ MFT واحد)الدفق الافتراضيّ (بلا اسم)= المحتوى الذي نراه عادة:Zone.Identifierمعلومات المصدر (Mark of the Web):اسم اختياريّمعلومات إضافيّة خاصّة بالتطبيق

الشكل 4: عدّة دفق بيانات. ما يظهر في عرض الحجم في المستكشف الدفق الافتراضيّ فقط

أقرب ADS هو Zone.Identifier. للملفّات المنزَّلة بالمتصفّح يُسجَّل المصدر (من الإنترنت ونحوه) في هذا الدفق، فيصير مادّة حكم SmartScreen «قامت Windows بحماية جهاز الكمبيوتر الخاص بك» والعرض المحميّ في Office. الجانب الظاهر لهذه الآليّة عولج في «لماذا تظهر رسالة «قامت Windows بحماية جهاز الكمبيوتر الخاص بك» في Windows» — وهويّة الجانب الخلفيّ مجرّد دفق NTFS.

3.2. مطبّات يطؤها المطوّرون

  • غير مرئيّ. لا يظهر في حجم المستكشف ولا في قائمة dir. يمكن التحقّق بـ dir /r أو streams من Sysinternals.11
  • غير قابل للنقل. ADS ميزة NTFS، لذا تضيع غالباً عند النسخ عبر محرّك USB بـ FAT أو تخزين سحابيّ. «اختفى تحذير التنزيل بعد النسخ» هذا.
  • يمكن فتحه من تطبيقكم أيضاً. يكفي تضمين نقطتين في المسار مثل CreateFile("data.txt:meta", ...) للقراءة والكتابة.2 مريح، لكنّكم تتولّون خاصّيّة «غير قابل للنقل» في الفقرة السابقة، لذا ليس موضع وضع جوهر بيانات الأعمال.

4. الاسم أيضاً سمة ── الروابط الصلبة وأسماء 8.3

4.1. الرابط الصلب ── عدّة أسماء للسجلّ نفسه

كتبنا في الشكل 2 أنّ «سمة اسم الملفّ يمكن حمل عدّة». داخل المجلّد نفسه، تشير عدّة مسارات إلى ملفّ واحد — هذا الرابط الصلب (CreateHardLink / mklink /H).3

فهرس C:\backup\\فهرس C:\app\\config-link.json → سجلّ#1234config.json → سجلّ#1234سجلّ MFT#1234محتوى البيانات (أو مرجع إلى التشغيلات)عدد الروابط: 2

الشكل 5: الرابط الصلب. فهرس الدليل يشير إلى سجلّ MFT نفسه فحسب، وكلاهما «حقيقيّ»

أيّ اسم تغيّرون منه الملفّ نفسه فالمحتوى يتطابق فوراً.3 ويتغيّر معنى «الحذف» — DeleteFile «ينزع اسماً واحداً»، والكيان لا يختفي إلا حين يُنزَع آخر اسم، وتُغلق المقابض المفتوحة، وتختفي أيضاً كلّ المراجع داخل النواة مثل أقسام تعيين الذاكرة. مرحلتا cleanup (آخر مقبض) وclose (آخر مرجع) اللتان رأيناهما في الجزء 1 تؤثّران كما هما في عمر الحذف. كذلك لعرض السمات طبع، وسلوك مثل تغيير السمة عبر رابط وترك العرض الظاهريّ لروابط أخرى قديماً منصوص رسميّاً.3

4.2. اسم 8.3 ── اسم خفيّ آخر

للتوافق التاريخيّ، يستطيع NTFS توليد اسم مختصر بصيغة 8.3 مثل REPORT~1.DOC تلقائيّاً للأسماء الطويلة. هذا أيضاً يجاور في السجلّ كـ«اسم آخر». في مجلّدات ذات عدد هائل من الملفّات يصير توليد الاسم المختصر وتجنّب التصادم كلفة، لذا يمكن بـ fsutil 8dot3name تعطيل التوليد أو إزالة الأسماء المختصرة القائمة (نقطة عمليّة أنّ هناك وظيفة فحص قبل strip، لأنّ تطبيقاً قديماً يسجّل مسار سجلّ بالاسم المختصر قد ينكسر).4

ما ينبغي الانتباه إليه أنّ وجود الاسم المختصر يعتمد على البيئة. السلوك الافتراضيّ يُحسَم بقيمة السجلّ NtfsDisable8dot3NameCreation، وهي أربعة: 0 (توليد على كلّ المجلّدات)، 1 (لا توليد على أيّ مجلّد)، 2 (تعيين لكلّ مجلّد)، 3 (لا توليد إلا خارج مجلّد النظام).4 إن اخترتم 2 يمكن التبديل لكلّ مجلّد، لذا لا يصحّ أن «في Windows يوجد حتماً اسم مختصر مثل PROGRA~1». قبل كتابة شيفرة أو إجراء يعتمد على الاسم المختصر، تحقّقوا من الحالة الحاليّة بـ fsutil 8dot3name query C: (حذف المجلّد يعيد الإعداد الافتراضيّ المشترك لكلّ المجلّدات).

مطبّات المسارات والأسماء (MAX_PATH، والأسماء المحجوزة، والنقطة الأخيرة) عولجت تفصيلاً في «MAX_PATH ومطبّات المسارات وأسماء الملفّات في Windows». جمع حلّ الأسماء في الجزء 1 (مدير الكائنات) وهذا الفصل (الأسماء داخل نظام الملفّات) يعطي الصورة الكلّيّة لـ«الاسم» في Windows.

5. نقاط إعادة التحليل ── حيلة «إن فُتح فمكان آخر»

يمكن إرفاق نقطة إعادة تحليل بملفّ أو دليل. الكيان سمة «وسم + بيانات يعرّفها المستخدم». حين يفتح نظام الملفّات ملفّاً بنقطة إعادة تحليل، تُختطَف المعالجة حسب الوسم — يتولّى برنامج تشغيل مرشّح يفهم الوسم المعالجة، أو إن كان وسم إعادة تسمية يُعاد الحلّ بمسار الهدف.5

NTFSمدير الإدخال/الإخراجالتطبيقNTFSمدير الإدخال/الإخراجالتطبيقاكتشاف نقطة إعادة تحليل على الهدفإعادة الوسم والبياناتمرشّح يفهم الوسميتولّى المعالجة (الجزء 6)alt[رابط رمزيّ / وصلة (إعادة تسمية)][وسم يديره مرشّح (ملفّات سحابة وغيرها)]CreateFile("C:\data\link.txt")IRP_MJ_CREATE (عالم الجزء 1)«الموضع الحقيقيّ هنا»إعادة الحلّ بمسار الهدف

الشكل 6: حلّ نقطة إعادة التحليل. صارت خطّافاً رسميّاً يتقاطع مع عمليّة «الفتح»

فوق هذه الحيلة الواحدة تصطفّ ميزات مألوفة.

  • الرابط الرمزيّ (mklink) ── لافتة تحمل مسار الهدف. تستطيع الإشارة إلى مجلّد آخر أو مسار UNC أيضاً.6
  • الوصلة / نقطة التركيب ── آليّة قديمة تصل دليلاً بموضع على مجلّد محلّيّ آخر.3
  • ملفّات OneDrive عند الطلب ── تمثّل ملفّاً ليست بياناته الفعليّة في اليد بنقطة إعادة تحليل، وفي لحظة الفتح ينزّل المرشّح ويقدّم المحتوى. هويّة «يظهر في المستكشف لكن الفتح يشغّل اتصالاً» (آليّة المرشّح نفسها في الجزء 6).

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

6. سجلّا تدوين ── $LogFile وUSN

كثيراً ما يُقال «NTFS نظام ملفّات ذو سجلّ تدوين»، لكن لـ NTFS سجلّي تدوين بدورين مختلفين. الخلط يُخطئ قراءة الضمان.

سجلّ USN ── تاريخ التغيير (لمعرفة ما تغيّر)عند كلّ تغيير لملفّ / دليلتسجيل محتوى التغيير والاسمأدوات النسخ الاحتياطيّ وفهرس البحث والمزامنةتدرك «ما تغيّر منذ المرّة السابقة» بلا مسح كامل$LogFile ── سجلّ سابق (كي لا ينكسر)تسجيل عمليّات البيانات الوصفيّة (تحديث سجلّ وإعادة تسمية وغيرها)في السجلّ قبل التنفيذعند بدء التشغيل التالي بعد عطل نظامإعادة تشغيل السجلّ لاستعادة اتّساق البنية

الشكل 7: سجلّا التدوين. $LogFile «كي لا ينكسر»، وUSN «لمعرفة التغيير»

الفرق في جدول كالتالي.

الجانب $LogFile (سجلّ المعاملات) سجلّ USN (سجلّ التغيير)
الغرض إعادة بنية نظام الملفّات إلى حالة متّسقة بعد العطل7 معرفة «ما تغيّر منذ المرّة السابقة» لاحقاً8
ما يُسجَّل سجلّ سابق لعمليّات البيانات الوصفيّة (تحديث سجلّ وإعادة تسمية وغيرها). محتوى الملفّ خارج النطاق عند كلّ تغيير، محتوى التغيير واسم الملفّ/الدليل المستهدف8
من يستخدمه NTFS نفسه. للاستعادة التلقائيّة عند التركيب التالي تطبيقات مثل النسخ الاحتياطيّ وفهرس البحث وأدوات المزامنة
إلى أيّ مدى يمكن الرجوع النطاق اللازم للاستعادة فقط. حجم ثابت يُعاد استخدامه، فلا يصلح لتتبّع تاريخ الماضي إن تجاوز الحجم الأقصى المستهدف (MaximumSize) تُقطَع السجلات القديمة عند نقطة التحقّق. نطاق الرجوع يتوقّف على إعداد الحجم وكمّ التحديث في المجلّد12
طريقة الرجوع لا وسيلة رسميّة لقراءة المحتوى (يمكن تأكيد الحجم بـ chkdsk /L) الحالة بـ fsutil usn queryjournal، والمحتوى بـ fsutil usn readjournal. من البرنامج FSCTL_QUERY_USN_JOURNAL / FSCTL_READ_USN_JOURNAL12
هل يمكن إيقافه لا يمكن (جزء من NTFS) يستطيع المدير الحذف والتعطيل. غير أنّه يفرض مسحاً كاملاً على الخدمات المستخدمة فالأثر كبير12

جدول 2: مقابلة سجلّي التدوين

  • $LogFile (سجلّ المعاملات) سجلّ سابق لعمليّات البيانات الوصفيّة. حتّى إن وقع عطل نظام، يستعيد NTFS اتّساق نظام الملفّات تلقائيّاً من هذا السجلّ ومعلومات نقطة التحقّق عند بدء التشغيل التالي.7 ما يُحمى هنا البنية. كما رأينا في الجزء 4، محتوى البيانات المتّسخ في الذاكرة المؤقّتة يمكن أن يُفقد عند انقطاع الطاقة — القراءة الصحيحة «المجلّد لا ينكسر. غير أنّ آخر كتابة يمكن أن تختفي».
  • سجلّ USN (سجلّ التغيير) سجلّ يسجّل، عند كلّ تغيير لملفّ أو دليل داخل المجلّد، محتوى التغيير واسم المستهدف.8 آليّة تلتقط بها النسخ الاحتياطيّ والمفهرسات «ما تغيّر منذ المرّة السابقة فقط» بلا مسح كامل، وتُستخدم أيضاً لتجنّب إعادة بناء الفهرس بعد العطل.8 عمليّاً يفيد تذكّر أنّ fsutil usn readjournal يُستخدم في التحقيق كسجلّ مضاهاة يكمّل إفلات FileSystemWatcherأساسيّات FileSystemWatcher الآمنة»).

7. المتناثر والضغط ── قصّة أنّ لـ«الحجم» اثنين

في NTFS يُدار الطول المنطقيّ للملفّ والمنطقة المخصَّصة فعلاً على حدة. «الحجم» و«الحجم على القرص» في شاشة الخصائص. ممثلان يولّدان الفارق.

الملفّ المتناثر لا يخصّص منطقة حقيقيّة للنطاقات التي تجري أصفاراً ويديرها «ثقوباً».9 ملفّ قرص افتراضيّ بحجم منطقيّ 42 غيغابايت يستخدم 500 ميغابايت فقط على القرص — يحدث عاديّاً. قراءة الثقب تُعيد أصفاراً، والكتابة تخصّص بذلك القدر.

التخصيص على القرص (15 ميغابايت + معلومات إدارة)الملفّ المنطقيّ (الحجم: 1 غيغابايت)تشغيل: كيان R1تشغيل: كيان R2بيانات 10 ميغابايتثقب (أصفار) 500 ميغابايتبيانات 5 ميغابايتثقب (أصفار) الباقي

الشكل 8: الملفّ المتناثر. لا تخصيص لـ«الثقب»، فيفترق الحجم المنطقيّ والحجم على القرص

ضغط NTFS يخزّن البيانات مضغوطة بوحدات ضغط.10 شفاف ومريح، لكن الكلفة ليست شفّافة — عند كلّ قراءة وكتابة يجري فكّ وإعادة ضغط، ويسهل تقدّم التفتيت أيضاً. وكما رأينا في الفصل 5 من الجزء 2، الوصول إلى ملفّ مضغوط لا يصير لاتزامنيّاً (نظام الملفّات يحوّله إلى تزامنيّ). أحد المواضع التي تُشتبَه حين «جعلناه إدخال/إخراج لاتزامنيّاً لكن هناك ملفّ لا يسرع».

يمكن الحصول على الحجم الفعليّ القائم على التخصيص بـ GetCompressedFileSize. في تحقيق عدم تطابق «مجموع أحجام الملفّات» و«استخدام القرص»، الممارسة الاشتباه بالترتيب في المتناثر والضغط وADS (الفصل 3) وتقريب العناقيد الأربعة.

8. التحقّق بأعينكم

هذه المرّة أيضاً يمكن مراقبة الكلّ على Windows لديكم (بعضها يحتاج امتيازات مدير). نُرفق لكلّ أمر أين تنظرون لتعرفوا ماذا حتّى تحكموا بأنفسكم إن كانت نتيجة التنفيذ صحيحة.

:: عرض دفق البيانات البديلة
dir /r C:\Users\%USERNAME%\Downloads

انظروا هنا: تحت سطر الملفّ العاديّ تصطفّ أسطر مزاحمة بالشكل اسم_الملفّ:Zone.Identifier:$DATA مع طول. إن وُجد هذا السطر فذلك الملفّ يحمل Mark of the Web (الفصل 3). يُرفَق بملفّ منزَّل بالمتصفّح ولا يُرفَق بملفّ صنعتموه بأنفسكم. التنفيذ في الموضعين والمقارنة يوضح وجود ADS.

:: عرض ترتيب الملفّ على MFT (التشغيلات) والسمات
fsutil file layout C:\path\to\file.dat

:: عرض الامتدادات فقط (أمر فرعيّ مذكور في الوثائق الرسميّة)
fsutil file queryextents C:\path\to\file.dat

انظروا هنا: layout يصطفّ لكلّ دفق الحجم وحجم التخصيص، وإن كان غير مقيم قائمة الامتدادات (أزواج VCN وLCN وعدد العناقيد). ملفّ صغير جدّاً بلا أسطر امتداد مقيم (القسم 2.2)، والانقسام على عدّة أسطر يعني تفتيتاً. التنفيذ على ملفّ نصّ بضعة بايتات وملفّ مئات الميغابايتات والمقارنة أقصر طريقة لاستشعار المقيم/غير المقيم.

:: إعداد توليد الاسم المختصر 8.3 والأسماء المختصرة القائمة
fsutil 8dot3name query C:
dir /x

انظروا هنا: query يُعيد ما إذا كان توليد الاسم المختصر مفعَّلاً أو معطَّلاً على ذلك المجلّد (حذف المجلّد يعيد الإعداد الافتراضيّ المشترك لكلّ المجلّدات).4 يعرض dir /x عمود الاسم المختصر بجانب الاسم الطويل، لذا عمود فارغ يعني أنّ اسماً مختصراً لم يُصنع. يمكن تأكيد «ليس من المحتوم وجود اسم مختصر» في القسم 4.2 على بيئتكم.

:: حالة سجل USN
fsutil usn queryjournal C:

انظروا هنا: يُعرض معرّف السجلّ، ونطاق USN الساري (First USN / Next USN)، والحجم الأقصى المستهدف (MaximumSize) ووحدة التخصيص (AllocationDelta).12 إن صنعتم ملفّاً ثمّ نفّذتم مرّة أخرى ينبغي أن يتقدّم Next USN، وهذا تأكيد أنّ «التغيير يُسجَّل». MaximumSize مقياس «إلى أيّ مدى يمكن الرجوع» المذكور في الفصل 6. على مجلّد السجلّ فيه معطَّل يحدث خطأ.

:: تأكيد نقطة إعادة تحليل (الهدف والوسم)
dir /aL C:\Users\%USERNAME%
fsutil reparsepoint query "C:\Users\%USERNAME%\OneDrive"

انظروا هنا: ما يظهر في dir /aL نقاط إعادة تحليل (ما رُفع فيه FILE_ATTRIBUTE_REPARSE_POINT). تُعرض الروابط الرمزيّة والوصلات بنوع مثل <SYMLINKD> <JUNCTION>. يعرض fsutil reparsepoint query قيمة وسم إعادة التحليل، ومسار الهدف إن كان من نوع إعادة التسمية. تحديد هدف ليس نقطة إعادة تحليل يحدث خطأ، لذا حدوث الخطأ نفسه تأكيد أنّ «هذا مجلّد عاديّ».

إن تتبّعتم عمليّات الملفّات بـ Procmon، تسير شخصيّات هذه الحلقة بأسمائها الحقيقيّة (كتابة إلى $LogFile، ومسارات بأسماء دفق، ومعالجة إعادة التحليل). طريقة الاستخدام في «دليل عملي لأداة Process Monitor (ProcMon)».

9. الخلاصة

  • مركز NTFS MFT. كلّ ملفّ سجلّ في السجلّ، والمعلومات إمّا «داخل السجلّ» أو «منطقة خارجيّة يشير إليها السجلّ». البيانات الصغيرة مقيمة، والكبيرة مرجع تشغيلات، وبطء معالجة عدد هائل من الملفّات الصغيرة والتفتيت نتائج هذه البنية.1
  • يمكن حمل عدّة دفق بيانات. Zone.Identifier (Mark of the Web) مجرّد ADS، يُرى بـ dir /r، ولا يُنقَل خارج NTFS.211
  • الاسم سمة ويمكن حمل عدّة. الرابط الصلب أسماء بمكانة مساوية للسجلّ نفسه، واسم 8.3 اسم آخر للتوافق. «الحذف = نزع اسم»، واختفاء الكيان حين تختفي آخر الأسماء والمقابض والمراجع داخل النواة (أقسام معيَّنة وغيرها) كلّها.34
  • نقطة إعادة التحليل خطّاف رسميّ لـ«الفتح»، والرابط الرمزيّ والوصلة وملفّات عند الطلب تطبيقات لها. شيفرة تجتاز شجرة تحتاج الوعي بـ FILE_ATTRIBUTE_REPARSE_POINT.56
  • سجلّا تدوين. $LogFile استعادة اتّساق البنية (كي لا ينكسر)، وUSN تاريخ التغيير (ما تغيّر). ليس «ذو سجلّ تدوين لذا البيانات أيضاً آمنة» — ديمومة البيانات تُبنى بأدوات الجزء 4.78
  • الحجم المنطقيّ والتخصيص شيئان مختلفان. المتناثر والضغط وADS وتقريب العناقيد العوامل الأربعة الكبرى لـ«عدم تطابق الحجم». بما فيه أنّ الملفّ المضغوط لا يصير إدخال/إخراج لاتزامنيّاً، درج تحقيق الأداء.910

التتمّة الحلقة الأخيرة، الجزء 6 «برامج تشغيل المرشّح والمرشّحات المصغّرة ── لماذا يستطيع Procmon ومسح الفيروسات التقاطع مع الإدخال/الإخراج». كيف يتقاطع مع الإدخال/الإخراج «من يتوسّطون» الذين ظهروا من الجزء 1 بين حين وآخر — مكافحة الفيروسات، وProcmon، وOneDrive، والتشفير. كلمسة أخيرة للسلسلة، نكشف هويّة السكّان الواقفين في فجوات مكدّس الأجهزة.

مقالات ذات صلة

مجالات الاستشارة ذات الصلة

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

روابط مرجعيّة

  1. Microsoft Learn, Master File Table. حول وجود إدخال واحد على الأقلّ في MFT لكلّ ملفّ على مجلّد NTFS، بما فيه إدخال MFT نفسه؛ وحفظ كلّ المعلومات بما فيها حجم الملفّ والطوابع الزمنيّة وأذون الوصول ومحتوى البيانات داخل إدخال MFT أو في منطقة خارج MFT يصف الإدخال موضعها؛ وتعليم الإدخال حرّاً وإعادة استخدامه عند حذف الملفّ دون انكماش حجم MFT؛ وحجز منطقة MFT لإبقاء MFT متّصلاً؛ وحدوث تفتيت MFT بتقدّم التخصيص.  2 3 4 5 6

  2. Microsoft Learn, File Streams. حول تخزين بيانات ملفّ NTFS كدفق واحد أو أكثر؛ ووجود دفق بيانات افتراضيّ (بلا اسم) ودفق بيانات بديل مسمّى؛ وإمكان فتح دفق بـ CreateFile بالشكل «اسم_الملفّ:اسم_الدفق».  2 3 4

  3. Microsoft Learn, fsutil 8dot3name. حول قدرة NTFS على توليد اسم مختصر بصيغة 8.3 للأسماء الطويلة؛ واستعلام إعداد توليد الاسم المختصر وتعيينه بـ fsutil 8dot3name، وإزالة الأسماء المختصرة القائمة (strip)، ومسح مراجع السجلّ المتأثّرة عند الإزالة.  2 3 4 5

  4. Microsoft Learn, Reparse points. حول كون نقطة إعادة التحليل تجميعاً لبيانات يعرّفها المستخدم ووسم إعادة تحليل يحدّد صيغة تلك البيانات فريداً؛ ومحاولة نظام الملفّات عند فتح ملفّ بنقطة إعادة تحليل معالجة تطابق الوسم (معالجة من مرشّح نظام ملفّات يفسّر الوسم)؛ واستخدامها في تنفيذ روابط نظام ملفّات NTFS والتخزين البعيد (تخزين متدرّج)؛ وإمكان تأكيد الوجود بسمة FILE_ATTRIBUTE_REPARSE_POINT.  2 3 4

  5. Microsoft Learn, NTFS overview. حول استخدام NTFS ملفّ سجلّ ومعلومات نقطة تحقّق، واستعادة اتّساق نظام الملفّات تلقائيّاً بإعادة تشغيل سجلّ المعاملات عند بدء التشغيل التالي إن وقع عطل نظام؛ وتجهيزه بإعادة تعيين ديناميّ للقطاعات التالفة وself-healing NTFS الذي يصلح تلفاً طفيفاً في الخلفيّة.  2 3 4

  6. Microsoft Learn, Change Journals. حول تسجيل محتوى التغيير واسم الملفّ/الدليل المستهدف في سجلّ تغيير USN لذلك المجلّد عند كلّ تغيير لملفّ أو دليل داخل المجلّد؛ والحفاظ على سجلّ لكلّ مجلّد؛ وإمكان استخدامه لاستعادة فهرس نظام الملفّات بعد العطل وتجنّب إعادة الفهرسة للمجلّد كلّه.  2 3 4 5 6

  7. Microsoft Learn, Sparse Files. حول عدم تخصيص مساحة قرص مادّيّة للنطاقات الكبيرة المؤلَّفة من أصفار في الملفّ المتناثر، وتخصيص المساحة للأجزاء الحاملة للبيانات فقط؛ وإعادة أصفار عند قراءة نطاق بلا تخصيص.  2 3

  8. Microsoft Learn, File Compression and Decompression. حول جريان ضغط ملفّات NTFS بشفافيّة، وضغط البيانات وتخزينها لكلّ وحدة ضغط؛ والحصول على الحجم بعد الضغط (التخصيص الفعليّ) بـ GetCompressedFileSize؛ ومرافقة قراءة الملفّ المضغوط وكتابته كلفة فكّ وإعادة ضغط.  2 3

  9. Microsoft Learn, Streams - Sysinternals. حول قدرة أداة streams من Sysinternals على تعداد دفق البيانات البديلة لملفّات NTFS وحذفها.  2

  10. Microsoft Learn, Creating, Modifying, and Deleting a Change Journal وfsutil usn. حول كون MaximumSize لسجلّ التغيير قيمة مستهدفة، وقَطع NTFS له عند نقطة التحقّق إن تجاوز الحجم مجموع MaximumSize وAllocationDelta؛ وكون AllocationDelta وحدة الإضافة إلى نهاية السجلّ والحذف من بدايته؛ وإمكان الرجوع إلى حالة السجلّ وسِعته بـ fsutil usn queryjournal وإلى المحتوى بـ readjournal؛ واستخدام البرنامج FSCTL_CREATE_USN_JOURNAL / FSCTL_QUERY_USN_JOURNAL / FSCTL_READ_USN_JOURNAL / FSCTL_DELETE_USN_JOURNAL؛ ومرافقة حذف سجلّ نشط أو تعطيله مسح MFT كلّه وفرض إعادة مسح المجلّد على الخدمات التي تستخدم السجلّ.  2 3 4

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

أعماق إدخال/إخراج Windows (الجزء 6، الأخير) ── برامج تشغيل المرشّح والمرشّحات المصغّرة: لماذا يستطيع Procmon ومسح الفيروسات التقاطع مع الإدخال/الإخراج

الحلقة الأخيرة من سلسلة تشرح برامج تشغيل المرشّح والمرشّحات المصغّرة في Windows بالرسوم. نرتّب مدير المرشّحات والارتفاع، واستدعاءات pre/p...

ترتبط هذه المقالة بشكل طبيعي بصفحات الخدمات التالية.

الأسئلة الشائعة

أسئلة شائعة حول موضوع هذه المقالة.

ما هو MFT (جدول الملفّات الرئيسيّ)؟
بنية البيانات في قلب مجلّد NTFS — سجلّ يحمل إدخالاً واحداً على الأقلّ (سجلّ ملفّ) لكلّ ملفّ على المجلّد، بما فيه إدخال لـ MFT نفسه. كلّ شيء عن الملفّ، من حجمه وطوابعه الزمنيّة وأذون الوصول حتّى محتوى البيانات نفسه، يُحفَظ إمّا داخل إدخال MFT أو في منطقة خارج MFT يشير إليها الإدخال. ملفّ صغير يتّسع بالكامل، بيانات وكلّ شيء، داخل إدخال MFT (مقيم)؛ وملفّ كبير لا يُسجَّل في الإدخال إلا مرجع لتخطيط بياناته (سلسلة عناقيد) (غير مقيم). حذف ملفّ يعلّم إدخاله حرّاً لإعادة الاستخدام، لكن حجم MFT نفسه لا ينكمش قطّ.
ما بيانات «Zone.Identifier» غير المرئيّة المرفقة بالملفّات؟
أحد دفق بيانات NTFS المتعدّدة (دفق بيانات بديل). في NTFS يستطيع ملفّ واحد حمل عدّة تسلسلات بايتات (دفق)؛ ما تقرأونه وتكتبونه عادة هو الدفق الافتراضيّ بلا اسم. يسجّل Windows مصدر الملفّ — أنّه نُزّل من الإنترنت مثلاً — في دفق إضافيّ تحدّدونه بنقطتين، كما في «file.txt:Zone.Identifier». هذا ما يُسمّى «Mark of the Web»، وهو ما يستخدمه SmartScreen والعرض المحميّ في Office دليلاً في أحكامهما. لا تظهر الدفق البديلة في عرض الحجم في المستكشف؛ يمكن التحقّق منها بأمر dir /r أو أداة streams من Sysinternals. يجدر أيضاً ملاحظة أنّها لا تُحفَظ عند النسخ إلى نظام ملفّات غير NTFS مثل FAT.
ما الفرق بين الرابط الصلب والرابط الرمزيّ؟
الرابط الصلب هو «اسم إضافيّ بمكانة مساوية، يشير إلى كيان الملفّ نفسه — سجلّ MFT نفسه». لا يُنشأ إلا داخل المجلّد نفسه، والوصول إلى الملفّ عبر أيّ من أسمائه يعطي الملفّ نفسه، وحذف اسم واحد لا يزيل الملفّ ما دام اسم آخر باقياً. الرابط الرمزيّ «لافتة توجّهكم إلى مسار مختلف»، يُنفَّذ كنقطة إعادة تحليل. لأنّه يحمل مسار الهدف كسلسلة فقط، يستطيع الإشارة إلى مجلّد مختلف أو حتّى موقع بعيد، لكنّه يصير طريقاً مسدوداً إن اختفى الهدف. عمليّاً القاعدة: استخدموا رابطاً صلباً لمشاركة الكيان الأساسيّ (ممّا يغيّر معنى الحذف)، واستخدموا رابطاً رمزيّاً لإعادة توجيه مسار (للنقل أو التحويل).
NTFS نظام ملفّات ذو سجلّ تدوين، فهل يعني ذلك أنّ البيانات تصمد أمام انقطاع الطاقة؟
يلزم فهم ما يُحمى بدقّة. ما يحميه سجلّ معاملات NTFS ($LogFile) هو اتّساق بنية نظام الملفّات (بياناته الوصفيّة). حتّى إن وقع عطل نظام، يستعيد NTFS الاتّساق تلقائيّاً باستخدام السجلّ عند بدء التشغيل التالي، فيمنع وضع المجلّد التالف غير القابل للقراءة. لكن ذلك لا يعني استعادة المحتوى الفعليّ لملفّ كان في منتصف الكتابة. كما رأينا في الجزء 4 من السلسلة، البيانات المتّسخة الجالسة في الذاكرة المؤقّتة تُفقد عند انقطاع الطاقة. لذا الفهم الصحيح «المجلّد لن ينكسر، لكن محتوى آخر كتابة يمكن أن يختفي» — إن احتجتم ديمومة للبيانات نفسها، عليكم بناؤها بأنفسكم، بـ FlushFileBuffers أو WRITE_THROUGH أو تصميم كتابة على مستوى التطبيق مثل الكتابة إلى ملفّ مؤقّت ثمّ إعادة التسمية.
لماذا يختلف «حجم» الملفّ عن «الحجم على القرص»؟
لأنّ NTFS يدير الطول المنطقيّ للملفّ ومساحة القرص المخصَّصة له فعلاً على حدة. حتّى ملفّ عاديّ يُظهر فرقاً لأنّ التخصيص يُقرَّب إلى عناقيد كاملة (4 كيلوبايت افتراضيّاً)، لكن الملفّات المتناثرة والملفّات المضغوطة حيث يتّسع الفارق. ملفّ متناثر لا يخصّص تخزيناً حقيقيّاً للنطاقات التي تجري أصفاراً — يديرها «ثقوباً» — فيمكن تماماً لملفّ بحجم منطقيّ عدّة غيغابايتات أن يستخدم بضعة ميغابايتات فقط على القرص. ملفّ مضغوط لا يُخصَّص له إلا حجمه بعد الضغط. بالمقابل، إن بدا «الحجم على القرص» أكبر، فتقريب العناقيد أو دفق بيانات بديل كثيراً ما يكون السبب.

الملف الشخصي للمؤلف

صفحة الملف الشخصي لمؤلف المقالة.

غو كومورا

مؤسّس شركة كومورا سوفت ذ.م.م.

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

العودة إلى المدونة