العودة
NetBSD: تفكيك تسمية القرص بايتًا بايتًا
SiTech AI Team3 წთ. საკითხავი

NetBSD: تفكيك تسمية القرص بايتًا بايتًا

جولة عملية على تسمية القرص في NetBSD 11: أين تُخزَّن التسمية على القرص، وما معنى كل حقل في الترويسة، وكيف تُحسب خانة التحقق XOR، وكيف تُنشأ قسمة يدويًا داخل محرر سداسي عشري.

تفكّك تدوينة على مدونة movq.de تسمية القرص الخاصة بأنظمة BSD داخل NetBSD 11 على معمارية x86_64. يوضح الكاتب أنه جاء من DOS وLinux وأنه لم يلتفت كثيرًا إلى تسميات الأقراص في أنظمة OpenBSD الخاصة به، وأنه أراد معرفة معنى كل بايت وإلى أي حد يمكن تعديل الصيغة يدويًا.

أين تُخزَّن التسمية

يبدأ البحث عن التوثيق بصفحة man disklabel، ويشير قسم SEE ALSO فيها إلى disklabel(5). غير أن الكاتب قرأ في معظم التدوينة ملف /usr/include/sys/disklabel.h مباشرة. ولتجنّب التعارض مع أنظمة MBR تُحفظ التسميات بعيدًا عن منطقة MBR المعتادة: يعيد برنامج C صغير مرتبط بمكتبة libutil القيمة 1 من getlabelsector() والقيمة 0 من getlabeloffset()، أي أن التسمية تقع في القطاع الثاني عند الإزاحة 512 بايت.

قراءة الترويسة حقلًا بحقل

تبدأ التسمية ببيانات وصفية عن القرص وتنتهي بمصفوفة الأقسام. وعند قراءتها ككلمات little-endian يظهر رقمان سحريان (d_magic وd_magic2)، ونوع القرص 0x0f أي logical disk، واسم المشغّل ld1، ثم تأتي الهندسة: 512 بايت للقطاع، و63 قطاعًا للمسار، و16 مسارًا للأسطوانة، و260 أسطوانة، وإجمالًا 262144 قطاعًا أي 128 ميبي بايت. أما معاملات العتاد القديمة مثل سرعة 3600 دورة في الدقيقة وأزمنة البحث فهي أصفار في الغالب على معمارية x86_64 الحديثة، وحتى MBR ببقايا CHS ليس أفضل حالًا؛ وتطابق القيم المقروءة من التفريغ السداسي عشري مخرجات disklabel ld1.

تفريغ سداسي عشري لترويسة التسمية مع تمييز الحقول

جدول الأقسام وخانة التحقق

تُعلن الترويسة قيمة d_npartitions، ثم تأتي السجلات بطول 16 بايت للأقسام من a إلى d. وثلاثة حقول فقط مهمة فعليًا: البداية والحجم ونوع نظام الملفات. فالقسم a يضم 262144 قطاعًا من الإزاحة 0 ونوعه 0x07 أي 4.2BSD (FFS). أما القسم d فيوجد دائمًا على x86_64 ويصف القرص بأكمله، كما شرح مطوّر NetBSD مارتن هوزمان. والقسم c غير ظاهر لأن حجمه وإزاحته ونوعه كلها أصفار.

يعرّف ملف الترويسة الحقل d_checksum بأنه xor للبيانات مع الأقسام. وعند إجراء XOR على كل مقطع من 16 بت في التسمية تنتج قيمة صفر، وهذا يؤكد اتساق القيمة المخزنة، لأن خانة التحقق نفسها أحد تلك المقاطع. وباستثنائها تظهر القيمة 1dc6، وهي تطابق c61d الظاهرة في التفريغ. ومن المرجّح أن الشيفرة المقابلة في NetBSD هي dkcksum.c داخل sys/lib/libkern.

قسم أُنشئ داخل محرر سداسي عشري

ثم جرّب العكس: عرّف القسم i بطول 1234 قطاعًا يبدأ من القطاع 5678، وبصيغة نظام ملفات ZFS. يبدأ السجل التاسع عند البايت 788، وفق الحساب 512 + 0x94 + (9-1) * 16. وكتب الحقول p_size وp_offset وp_fstype بالقيمة 0x21، ورفع d_npartitions إلى 9 وأعاد حساب خانة التحقق لتساوي 160f.

وبعد الإقلاع عرض disklabel ld1 القسم الجديد تمامًا كما أراد، مع تحذير بأن القسمين a وi متداخلان؛ وهذا متوقع لأن a يغطي القرص كله. ويختم الكاتب بأن هذه الطبقة التي تضيفها أنظمة BSD فوق MBR وGPT يسهل تجاهلها، وأن العمل العملي وحده جعله يتقن الصيغة.

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.