
NetBSD: לפרק את תווית הדיסק בית אחר בית
סקירה מעשית של תווית הדיסק ב-NetBSD 11: היכן התווית נשמרת בדיסק, מה המשמעות של כל שדה בכותרת, כיצד מחושבת ספרת הביקורת XOR ואיך מגדירים מחיצה חדשה בתוך עורך hex.
פוסט בבלוג movq.de מפרק לגורמים את ה-BSD disklabel ב-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 MiB. פרמטרים של חומרה ישנה, כמו 3600 סל״ד וזמני חיפוש, מאופסים ברובם ב-x86_64 מודרני, וגם MBR עם שאריות CHS אינו טוב בהרבה; הערכים שנקראו מה-hex dump תואמים לפלט של 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 שב-dump. סביר שהיישום של NetBSD הוא dkcksum.c בתיקייה sys/lib/libkern.
מחיצה שנוצרה בעורך hex
בשלב הבא הוא עשה את ההפך: הגדיר מחיצה 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 קלה לפיספוס ורק עבודה מעשית לימדה אותו את הפורמט.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.