APFS: خوارزمية إستعادة البيانات وهيكل نظام الملفات

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

APFS: خوارزمية إستعادة البيانات وهيكل نظام الملفات

إذهب للعرض
🔝 Top Tools to Recover Data from APFS drives or how to recover Apple MacOs disk in Windows (2021)🍏

🔝 Top Tools to Recover Data from APFS drives or how to recover Apple MacOs disk in Windows (2021)🍏

الحاويات والمساحات التخزين

هيكل نظام ملفات ApFS هو هيكل B-tree، حيث يكون الدليل الجذري الذي يحتوي على البيانات عبارة عن أوراق هذه الشجرة. تحتوي جميع العقد الفرعية فقط على روابط للعقدة التالية حتى تصل إلى العقد الطرفية. يستخدم نظام الملفات هذا الحاويات كخلايا تخزين، ويمكن أن تحتوي هذه الخلايا على وحدات تخزين ApFS متعددة. أيضًا، الحاوية هي الكائن الأساسي لتخزين البيانات. لإحتواء مجلد واحد، يجب أن يكون > 512 ميجا بايت على الأقل، > 1024 ميغا بايت أن تحتوي على أكثر من مجلدين وما إلى ذلك.

توضح الصورة أدناه نظرة عامة على هيكل نظام الملفات ApFS.

ApFS

يبدأ كل عنصر في هذه البنية (بإستثناء ملف التخصيص) برأس كتلة 32 بايت، والتي تحتوي على بعض المعلومات العامة حول الكتلة. العنصر الذي يليه هو جسم نظام الملفات. وتتكون من الأجزاء التالية:

  • 0x01: حاوية الكتلة الفائقة
  • 0x02: العقدة
  • 0x05: مدير المساحة
  • 0x07: ملف معلومات التخصيص
  • 0x0C: نقطة التحقق
  • 0x0D: مساحة الكتلة الفائقة

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

على الرغم من أن نظام الملفات ApFS لا يدعم برمجية RAIDمباشرةً، إلا أنه يمكن إستخدامه مع وحدات تخزين Apple RAID لدعم المستوى الشريطي (RAID 0) و النسخ المتطابق (RAID 1) والتسلسل (JBOD ).

بإستخدام فهرس 64 بت، ستدعم وحدات التخزين ApFS ما يصل إلى 9 كوينتيليون (1018) ملفًا.

يستخدم نظام الملفات الجديد نانوثانية لتعيين الأختام الزمنية. في نظام +HFS، تم ضبط الأختام الزمنية على أقرب ثانية. سيؤدي ذلك إلى تقليل عدد حالات الفشل في نقل البيانات وعمليات الملفات الأخرى.

يحتوي نظام ApFS على نظام تشفير مدمج ويستخدم أنظمة AES-XTS أو AES-CBC ، إعتمادًا على نوع الجهاز. يمكنك إستخدام العديد من مفاتيح التشفير لضمان أمان البيانات حتى في حالة “الإختراق المادي” للوسيط.

هذه ليست قائمة كاملة بالإبتكارات التي يمكن أن يفتخر بها نظام ApFS.

الأقسام المهيئة بنظام الملفات ApFS لا يتعرف عليها نظام الشغيل OS X 10.11 Yosemite والإصدارات السابقة من نظام التشغيل.

رأس الكتلة

يبدأ كل عنصر من عناصر بنية في نظام الملفات ApFS برأس كتلة. يبدأ هذا العنوان بمجموع إختباري. تتضمن المعلومات الأخرى الموجودة في الرأس إصدار النسخ عند الكتابة من الكتلة ومعرف الكتلة (المعرف) ونوع الكتلة.

الموقع الحجم النوع المعرف
0 8 uint64 Checksum
8 8 uint64 block ID
16 8 uint64 Version
24 2 uint16 Block type
26 2 uint16 Flags
28 4 uint32 Padding

من الجدول، يمكننا أن نرى أن 1 uint يساوي 1 بت، 8 بت = 1 بايت و hence uint64 يساوي 8، uint32 يساوي 4 و uint16 يساوي 2 بايت.

حاوية الكتلة الفائقة

حاوية الكتلة الفائقة (Container Superblock) هي نقطة الدخول إلى نظام الملفات. بسبب بنية نظام الملفات بالحاويات ووحدات التخزين المرنة، يجب معالجة التخصيص على مستوى الحاوية. تحتوي حاوية الكتلة الفائقة على معلومات حول حجم الكتلة وعدد الكتل والمؤشرات لهذه المهمة في مدير المساحة. بالإضافة إلى ذلك، يتم تخزين معرفات الكتلة (المعرفات) لجميع وحدات التخزين في ما يسمى بالكتلة الفائقة superblock. لتعيين معرفات الكتلة لحظر الإزاحات يتم حفظ مؤشر إلى خريطة كتلة B-tree. تحتوي شجرة B-tree هذه على إدخالات لكل وحدة تخزين بمعرفها وإزاحتها. تعتبر حاوية وحدة التخزين أعلى مستوى في نظام الملفات.

إليك كيف تبدو:

الإزاحة (HEX) النوع المعرف الوصف
0 tApFS_COH Header رأس كيان الحاوية
20 uint32 MagicNumber (NXSB) قيمة التحقق من قراءة حاوية الكتلة الفائقة.
24 uint32 BlockSize حجم حاوية الكتلة (بايت)
28 uint64 BlocksCount عدد حاويات الكتل
30 uint64 Features صورة نقطية للميزات الرئيسية للحاوية
38 uint64 ReadOnlyFeatures صورة نقطية للمميزات الرئيسية للحاوية (للقراءة فقط)
40 uint64 IncompatibleFeatures صورة نقطية لمميزات الحاوية غير المتوافقة
48 tApFS_Uuid Uuid UUID الحاوية
58 tApFS_Ident NextIdent المعرف التالي لكائن منطقي أو إفتراضي جديد
60 tApFS_Transaction NextTransaction رقم المعاملة التالية
68 uint32 DescriptorBlocks عدد الكتل المستخدمة بواسطة الواصف
6C uint32 DataBlocks عدد الكتل التي تستخدمها البيانات
70 tApFS_Address DescriptorBase العنوان الأساسي للواصف أو معرف الكائن المادي مع شجرة العنوان
78 int32 DataBase عنوان قاعدة البيانات أو معرف الكائن المادي مع شجرة العنوان
80 uint32 DescriptorNext فهرس الواصف التالي
84 uint32 DataNext فهرس البيانات التالي
88 uint32 DescriptorIndex فهرس أول عنصر صالح في مقطع التوصيف
8C uint32 DescriptorLength عدد الكتل في مقطع التوصيف المستخدمة بواسطة الكتلة الفائقة
90 uint32 DataIndex فهرس أول عنصر صالح في مقطع البيانات
94 uint32 DataLength عدد الكتل في مقطع البيانات المستخدمة بواسطة الكتلة الفائقة
98 tApFS_Ident SpaceManagerIdent معرّف الكائن المنطقي لمدير المساحة
A0 tApFS_Ident ObjectsMapIdent معرّف الكائن المادي لخريطة كيان الحاوية
A8 tApFS_Ident ReaperIdent معرف الكائن المنطقي
B0 uint32 ReservedForTesting
B4 uint32 MaximumVolumes أقصى عدد ممكن من وحدات التخزين في الحاوية
8 tApFS_Ident VolumesIdents[100] مصفوفة وحدة التخزين لمعرفات الكائنات الإفتراضية
3D8 uint64 Counters[32] مصفوفة من عدادات تخزين معلومات الحاوية
4D8 tApFS_BlockRange BlockedOutOfRange النطاق المادي للكتل التي لا يمكن إستخدامها
4E8 tApFS_Ident MappingTreeIdent معرّف الكائن المادي للشجرة المستخدم لتتبع الكائنات المنقولة من التخزين المقفل.
4F0 uint64 OtherFlags صورة نقطية لوظائف الحاوية الأخرى
4F8 tApFS_Address JumpstartEFI معرف الكائن المادي مع بيانات برنامج تشغيل EFI
500 tApFS_Uuid FusionUuid UUID حاوية الإنصهار أو صفر للحاويات غير المنصهرة
510 tApFS_BlockRange KeyLocker موقع علامة مفتاح الحاوية
50 uint64 EphemeralInfo[4] مجموعة الحقول المستخدمة لإدارة البيانات المؤقتة
540 tApFS_Ident ReservedForTesting
548 tApFS_Ident FusionMidleTreeIdent أجهزة الإنصهار فقط
550 tApFS_Ident FusionWriteBackIdent أجهزة الإنصهار فقط
558 tApFS_BlockRange FusionWriteBackBlocks الكتل المستخدمة لمنطقة التخزين المؤقت

مع الأنواع المحددة:

uint8  tApFS_Uuid;
uint64 tApFS_Ident;
uint64 tApFS_Transaction;
int64  tApFS_Address;
uint64 tApFS_BTreeKey;

and

struct tApFS_BlockRange
{
    tApFS_Address       First;          // الكتلة الأولى
    uint64              Count;          // عدد الكتل
}
struct tApFS_COH
{
    uint64              CheckSum;       // المجموع الإختباري للكتلة
    tApFS_Ident         Ident;          // المعرف
    tApFS_Transaction   Transaction;    // رقم معاملة تغيير الكائن
    uint16              Type;           // نوع الكائن
    uint16              Flags;          // أعلام الكائن
    uint32              SubType;        // نوع الكائن الفرعي
};

مع قائمة أنواع الكائنات:

enum eApFS_ObjectType
{
    eApFS_ObjectType_01_SuperBlock            = 0x0001, //Container superblockа
    eApFS_ObjectType_02_BTreeRoot             = 0x0002, // B-Tree: root node
    eApFS_ObjectType_03_BTreeNode             = 0x0003, // B-Tree: non-root node
    eApFS_ObjectType_05_SpaceManager          = 0x0005, // Space manager
    eApFS_ObjectType_06_SpaceManagerCAB       = 0x0006, // Space manager: segments’ addresses
    eApFS_ObjectType_07_SpaceManagerCIB       = 0x0007, // Space manager: segments’ information
    eApFS_ObjectType_08_SpaceManagerBitmap    = 0x0008, // Free сspace bitmap used by Space manager
    eApFS_ObjectType_09_SpaceManagerFreeQueue = 0x0009, // Free space used by Space manager_ (keys - _tApFS_09_SpaceManagerFreeQueue_Key_, values - _tApFS_09_SpaceManagerFreeQueue_Value_)
    eApFS_ObjectType_0A_ExtentListTree        = 0x000A, // Extents’ list tree (keys – offset beginning extent_tApFS_Address_, value – physical data location _tApFS_BlockRange_)
    eApFS_ObjectType_0B_ObjectsMap            = 0x000B, // Type – Objects map; subType – Object map record tree (keys - _tApFS_0B_ObjectsMap_Key_, values - _tApFS_0B_ObjectsMap_Value_)
    eApFS_ObjectType_0C_CheckPointMap         = 0x000C, // Check point map 
    eApFS_ObjectType_0D_FileSystem            = 0x000D, // Volume file system
    eApFS_ObjectType_0E_FileSystemTree        = 0x000E, // File system tree (keys start from с _tApFS_BTreeKey_, describes key type and value)
    eApFS_ObjectType_0F_BlockReferenceTree    = 0x000F, // Block reference tree (keys - _tApFS_BTreeKey_, values - _tApFS_0F_BlockReferenceTree_Value_)
    eApFS_ObjectType_10_SnapshotMetaTree      = 0x0010, // Snapshot meta tree (keys - _tApFS_BTreeKey_, values - _tApFS_10_SnapshotMetaTree_Value_)
    eApFS_ObjectType_11_Reaper                = 0x0011, // Reaper
    eApFS_ObjectType_12_ReaperList            = 0x0012, // Reaper List
    eApFS_ObjectType_13_ObjectsMapSnapshot    = 0x0013, // Objects map snapshot tree (keys - _tApFS_Transaction_, values - _tApFS_13_ObjectsMapSnapshot_Value_)
    eApFS_ObjectType_14_JumpStartEFI          = 0x0014, // EFI Loader
    eApFS_ObjectType_15_FusionMiddleTree      = 0x0015, // Fusion devices tree to track SSD cached HDD, blocks (keys - _tApFS_Address_, values - _tApFS_15_FusionMiddleTree_Value_)
    eApFS_ObjectType_16_FusionWriteBack       = 0x0016, // Fusion devices writeback cache status
    eApFS_ObjectType_17_FusionWriteBackList   = 0x0017, // Fusion devices writeback cache list
    eApFS_ObjectType_18_EncryptionState       = 0x0018, // Encryption
    eApFS_ObjectType_19_GeneralBitmap         = 0x0019, // General Bitmap
    eApFS_ObjectType_1A_GeneralBitmapTree     = 0x001A, // General Bitmap Tree (keys - uint64, keys - uint64)
    eApFS_ObjectType_1B_GeneralBitmapBlock    = 0x001B, // General Bitmap Block
    eApFS_ObjectType_00_Invalid               = 0x0000, // Non-valid as a type or absent subtype
    eApFS_ObjectType_FF_Test                  = 0x00FF  // Reserved for testing (never stored on media)
    eApFS_ObjectType_FF_Test                  = 0x00FF  // Reserved for testing (never stored on media)
};

enum eApFS_ObjectFlag
{
    eApFS_ObjectFlag_Virtual         = 0x0000, // Virtual object
    eApFS_ObjectFlag_Ephemeral       = 0x8000, // Ephemeral object
    eApFS_ObjectFlag_Physical        = 0x4000, // Physical object
    eApFS_ObjectFlag_NoHeader        = 0x2000, // Object with no header _tApFS_ContainerObjectHeader_ (for example, Space (bitmap) manager bitmap)
    eApFS_ObjectFlag_Encrypted       = 0x1000, // Encrypted object
    eApFS_ObjectFlag_NonPersistent   = 0x0800, // Object with this flag is never saved on media
    eApFS_ObjectFlag_StorageTypeMask = 0xC000, // Bitmask (bitmask) for для accessing к object category flags
    eApFS_ObjectFlag_ValidMask       = 0xF800  // Valid flag bit mask
};

struct tApFS_0B_ObjectsMap_Key
{
    tApFS_Ident       ObjectIdent; // Object identifier
    tApFS_Transaction Transaction; // Transaction number
};

struct tApFS_0B_ObjectsMap_Value
{
    uint32       Flags;    // Flags
    uint32       Size;     // Object size in bytes (multiple of containerру block size)
    tApFS_Address Address; // Object address
};

struct tApFS_09_SpaceManagerFreeQueue_Key
{
    tApFS_Transaction sfqk_xid;
    tApFS_Address     sfqk_paddr;
};

struct tApFS_09_SpaceManagerFreeQueue_Value
{
    uint64            sfq_count;
    tApFS_Ident       sfq_tree_oid;
    tApFS_Transaction sfq_oldest_xid;
    uint16            sfq_tree_node_limit;
    uint16            sfq_pad16;
    uint32            sfq_pad32;
    uint64            sfq_reserved;
};

struct tApFS_10_SnapshotMetaTree_Value
{
    tApFS_Ident ExtentRefIdent;    // Identifier  of B-Tree physical object, that stores the extent information
    tApFS_Ident SuperBlockIdent;   // Superblock identifier
    uint64      CreatedTime;       // Snapshot creation time (in nanoseconds from midnight 01/01/1970)
    uint64      LastModifiedTime;  // Snapshot last modified  time (in nanoseconds from midnight 01/01/1970)
    uint64      iNum;
    uint32      ExtentRefTreeType; // Type of B-tree, that stores extent information
    uint16      NameLength;        // Snapshot name length (including end of line character)
    uint8       Name[];            // Snapshot name (ending with 0)
};

struct tApFS_13_ObjectsMapSnapshot_Value
{
    uint32      Flags;    // Snapshot flags
    uint32      Padding;  // Reserved (for adjustment)
    tApFS_Ident Reserved; // Reserved
};

struct tApFS_15_FusionMiddleTree_Value
{
    tApFS_Address fmv_lba;
    uint32        fmv_length;
    uint32        fmv_flags;
};

مثال على بنية نظام ApFS:

مثال على بنية نظام ApFS:

الكتلة الفائقة لمساحة التخزين

توجد مساحة الكتلة الفائقة لكل مساحة تخزين داخل نظام الملفات. تحتوي على إسم مساحة التخزين والمعرف (ID) والختم الزمني. بشكل مشابه لحاوية الكتلة الفائقة، فإنه يحتوي على مؤشر لخريطة الكتلة التي تمثل معرفات الكتلة لمنع الإزاحات. علاوة على ذلك، تحتوي مساحة الكتلة الفائقة على مؤشر إلى الدليل الجذري الذي يتم تخزينه كعقدة.

الإزاحة (HEX) النوع المعرف الوصف
0 tApFS_COH Header رأس كيان الحاوية
20 uint32 MagicNumber (APSB) قيمة يمكن إستخدامها للتحقق من قراءة جزء مساحة الكتلة الفائقة
24 uint32 IndexInSuperBlock فهرس معرف الكائن لهذه المساحة في مصفوفة مساحة الحاوية
28 uint64 Features صورة نقطية للمميزات الرئيسية التي تستخدمها مساحة التخزين
30 uint64 ReadOnlyFeatures صورة نقطية للمميزات الرئيسية (للقراءة فقط) المستخدمة من قبل مساحة التخزين
38 uint64 IncompatibleFeatures صورة نقطية لمميزات مساحة التخزين غير المتوافقة
40 uint64 LastUnmountTime وقت الفصل الأخير للمساحة (بالنانو ثانية من منتصف ليل 01/01/1970)
48 uint64 ReservedBlocksCount عدد الكتل المحجوزة لتخصيص مساحة التخزين
50 uint64 QuotaBlocksCount الحد الأقصى لعدد الكتل التي يمكن لهذا الحجم تخصيصها
58 uint64 AllocatedCount عدد الكتل المخصصة حاليًا لنظام الملفات لهذه المساحة
60 uint8 MetaCryptoState[20] معلومات حول المفتاح المستخدم لتشفير البيانات الوصفية لهذه المساحة (wrapped_meta_crypto_state_t instance)
74 uint32 RootTreeType نوع شجرة المجلد الجذري (عادةً: نوع (eApFS_ObjectFlag_Virtual << 16) \ eApFS_ObjectType_02_BTreeRoot, نوع فرعي من eApFS_ObjectType_0E_FileSystemTree)
78 uint32 ExtentRefTreeType نوع رقعة شجرة التجليد (عادةً: نوع (eApFS_ObjectFlag_Physical << 16) \ eApFS_ObjectType_02_BTreeRoot, نوع فرعي من OBJECT_TYPE_BLOCKREF)
7C uint32 SnapshotMetaTreeType نوع شجرة بيانات تعريف اللقطة (عادةً: نوع (eApFS_ObjectFlag_Physical << 16) \ eApFS_ObjectType_02_BTreeRoot, نوع فرعي من OBJECT_TYPE_BLOCKREF)
80 tApFS_Ident ObjectsMapIdent معرف الكيان المادي لخريطة كيان مساحة التخزين
88 tApFS_Ident RootTreeIdent معرف الكيان الإفتراضي لشجرة المجلد الجذري
90 tApFS_Ident ExtentRefTreeIdent معرف الكيان المادي لرقعة شجرة الرابط
98 tApFS_Ident SnapshotMetaTreeIdent معرف الكيان الإفتراضي لشجرة بيانات وصف اللقطة
A0 tApFS_Transaction RevertToXid رقم المعاملة من اللقطة التي سيتم إرجاع مساحة التخزين إليها
A8 tApFS_Ident RevertToSuperBlock معرّف الكيان المادي لمساحة الكتلة الفائقة التي ستعود إليها مساحة التخزين
B0 uint64 NextObjectIdent المعرف التالي الذي سيتم تعيينه لكيان نظام الملفات في مساحة التخزين.
8 uint64 NumberOfFiles عدد الملفات العادية في مساحة التخزين
C0 uint64 NumberOfDirectories عدد الملفات في مساحة التخزين
C8 uint64 NumberOfSymbolicLinks عدد الروابط الرمزية في مساحة التخزين
D0 uint64 NumberOfOtherObjects عدد العناصر الأخرى في مساحة التخزين (لا يشمل x0B8_NumberOfFiles و x0C0_NumberOfDirectories و x0C8_NumberOfSymbolicLinks)
D8 uint64 NumberOfSnapshots عدد اللقطات في هذه المساحة
E0 uint64 TotalBlocksAllocated إجمالي عدد الكتل المخصصة بواسطة هذه المساحة
E8 uint64 TotalBlocksFreed العدد الإجمالي للكتل التي تم تحريرها بواسطة هذه المساحة
F0 tApFS_Uuid Uuid
100 uint64 LastModifiedTime وقت آخر تغيير لهذه المساحة (بالنانو ثانية من منتصف ليل 1/1/1970)
108 uint64 Flags
110 tApFS_0D_FSM FormattedBy معلومات حول البرنامج الذي أنشأ هذه المساحة
140 tApFS_0D_FSM ModifiedBy[8] معلومات حول البرنامج الذي غيّر هذه المساحة
2C0 uint8 VolumeName[256] إسم مساحة التخزين السلسلة الصفرية UTF-8
3C0 uint32 NextDocumentIdent المعرف التالي للمستند الذي سيتم تعيينه (مخزن في الحقل الموسع APFS_0E_TYPE_DOCUMENT_ID للمستند)
3C4 uint16 Role حجم الصورة النقطية لدور مساحة التخزين
3C6 uint16 Reserved
3C8 tApFS_Transaction RootToXid رقم معاملة اللقطة لغير الجذر أو صفر للجذر
3D0 tApFS_Ident EncryptStateIdent الحالة الحالية للتشفير أو فك التشفير، أو صفر إذا لم يكن هناك تشفير

عرض مفصل لنظام الملفات APFS:

صورة مفصلة لنظام الملفات  APFS

نقطة التحقق

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

نقطة التحقق واصف الكتلة الفائقة

تحتوي هذه الكتلة على معلومات حول هياكل البيانات الوصفية في نظام الملفات ApFS وهي الكتلة السابقة للواصف. أهم المعلومات في هذه الكتلة هي موقع بنية الصورة النقطية (BMS)، ملف التخصيص السابق في نظام +HFS.

نقطة التحقق واصف الكتلة الفائقة:

نقطة التحقق واصف الكتلة الفائقة

هياكل الصور النقطية (صورة نقطية أو خريطة المساحة)

سجلات الكتل المستخدمة وغير المستخدمة. لا يوجد سوى نظام واحد للصور النقطية لمساحة التخزين يغطي الحاوية بأكملها وهو مشترك لجميع مساحات التخزين في نظام الملفات. يستخدم نظام ApFS مجموعة من الكتل لتخزين هياكل الصور النقطية (BMS).

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

كتل الصور النقطية

الجداول

تُستخدم الجداول في دلائل B-tree والنطاقات وقوائم المساحة وخريطة معرف الكيان.

تعد الجداول المستخدمة في نظام الملفات ApFS كتلة صغيرة واحدة من قواعد البيانات ذات أغراض مختلفة بعض الشيء في هياكل نظام الملفات. يتكون حقل نوع الجدول من 2 بايت تقع في الكتلة مع الإزاحة 0x20 مباشرة بعد رأس العقدة. هناك ثمانية أنواع مختلفة من الجداول، من 0 إلى 7. يوفر البايتان التاليان مستوى الجدول من 0 وما فوق. يحتوي جدول المستوى الثاني على سجلات تشير إلى جدول المستوى 1 الأساسي. تشير جداول المستوى 0 إلى الكتل التي تحتوي غالبًا على بيانات تعريف للملف.

تختلف أنواع الجدول في البنية ولكن رأس الجدول 24 بايت هو نفسه لجميع أنواع الجداول.

تُظهر الصورة أدناه نموذجًا لبنية رأس الجدول:

تُظهر الصورة أدناه نموذجًا لبنية رأس الجدول

وصف معاني الحقول في بنية الرأس:

الإزاحة (HEX) الحقل نوع البيانات الوصف
20 tableType uint16 القيم الممكنة 0-7. إنه جدول من النوع 1
22 tableLevel uint16 يشير إلى مستوى B-Tree.
24 tableRecords uint16 عدد السجلات في الجدول
26 Unknown 1 uint16
28 Unknown 2 uint16
2A tableIndexSize uint16 حجم منطقة فهرس الجدول.
2C tableKeyAreaSize uint16 حجم منطقة مفتاح الجدول.
2E tableFreeSpaceSize uint16 حجم المنطقة الشاغرة. تنتهي منطقة بيانات الجدول عند الإزاحة
0x38+tableIndexSize+tableKeyAreaSize+tableFreeSpaceSize. 0x38 + 0x80 + 0x170 + 0xd58.
30 Unknown 3 uint16
32 Unknown 4 uint16
34 Unknown 5 uint16
36 Unknown 6 uint16

يظهر هنا تصميم نموذجي للجداول المختلفة:

تصميم نموذجي للجداول المختلفة

لا يتم إستخدام جميع العناصر الموجودة في هذه الصورة في جميع الجداول. يُظهر كتلة كاملة مع رأس الكتلة/العقدة في الأعلى. تشكل بقية الكتلة الجدول.

يتبع رأس الجدول فهرس السجل. هناك نوعان منهم. الأول مع قيمتين فقط: الإزاحة في المفاتيح والإزاحة في قسم البيانات لكل عنصر من عناصر Uint16. الآخر يستخدم 4 قيم Uint16 مع الإزاحة والطول لكل من أقسام المفتاح والبيانات. يحتوي فهرس سجل الجدول على معلومات حول المفاتيح وسجلات البيانات في الجدول. هناك تمييز آخر بين أنواع الجداول وهو إستخدامها للتذييلات.

تستخدم أنواع الجداول 1 و 3 و 5 و 7 تذييل بايت 0x28 في نهاية الكتلة. في هذه الجداول، ترتبط جميع إزاحات البيانات بالإزاحة 0xFD8، ويحتوي التذييل على قيم مختلفة خاصة بنوع الجدول. لا تحتوي أنواع الجداول الأخرى على تذييل وجميع المراجع إلى محتوى قسم البيانات مرتبطة بنهاية الكتلة.

في B-trees ذات الطبقات المتعددة، أنواع الجداول 1 أو 3 أو 5 أو 7 في أعلى مستوى لأنها تحتوي على تذييل. يستخدم التذييل لتخزين المعلومات حول بنية B-tree الكاملة. إحدى القيم الموجودة في التذييل هي العدد الإجمالي للسجلات في بنية B-tree بالكامل.

يبدأ تعريف الجدول عند الإزاحة 0x20 في الكتلة بنوع الجدول وعدد الخانات وحجم قسم المفتاح والفجوة بين قسم المفتاح والبيانات. بعد إعداد الجدول، يتم وصف تعريفات الخانات و الأعمدة في الجدول من الإزاحة 0x38. يحتوي الجدول على رأس وتعريفات للتسجيل ومفتاح وأقسام بيانات. تحتوي أنواع معينة من الجداول أيضًا على تذييل. يبدأ الرأس عند الإزاحة 0x20 في الكتلة ويبلغ طوله 0x18 بايت. يبدأ رأس نوع الجدول هذا بقيمة 16 بت التي تمثل نوع الجدول. ويتبعه وحدتا بايت يمثلان المستوى في B-tree التي يستخدم فيها الجدول. البايتان اللاحقان يمثلان عدد الخانات في الجدول. تم العثور على طول سجل تعريف المسح في 0x2A متبوعًا بـ Uint16 الذي يسجل طول قسم المفتاح. يتبع ذلك الفجوة بين قسم المفتاح والبيانات. يكون تذييل الجدول دائمًا 0x28 بايت ويحتل دائمًا نهاية الكتلة. مؤشرات الجدول هي 4 أو 8 بايت لكل منهما. في فهارس 8 بايت، أول Uint16 هما إزاحة وطول السجل الرئيسي. يعد Uint16 التاليان هما إزاحة وطول سجل البيانات في الجدول. تحتوي الجداول التي تحتوي على فهارس 4 بايت على قيمتين Uint16 وهما الإزاحة لسجل المفتاح والبيانات. يتم تحديد طول البيانات في السجلين مسبقًا. في الجداول التي تحتوي على تذييل، تكون الإزاحة في سجل البيانات متناسبة مع بداية التذييل (0x28)، وبالنسبة لأنواع الجداول الأخرى، يكون ذلك متعلقًا بنهاية الكتلة..

معظم القيم المتعلقة برأس الجدول و تذييله واضحة على الأقل لقراءة نوع الجدول. الإزاحة 0x18 في التذييل (الإزاحة 0xFF في كتلة 4 كيلوبايت) هي عدد السجلات في الجدول وجميع الجداول الأساسية (إذا كان هذا جدولاً بمستوى أعلى من 0 في إزاحة 0x22). الإزاحة 0x20 في التذييل هي رقم السجل التالي في الجدول.

الجدول 0

يتواجد نوع الجدول 0 في بنية الدليل B-tree بين العقد الطرفية والعقدة الجذرية. تعتبر القيم الغير المعروفة 3-6 هي إزاحة المفتاح والطول، وإزاحة البيانات وطول السجل التالي المتاح. في حالة عدم وجود سجلات فهرس شاغرة، يتم تعيين الإزاحات إلى 0xFFFF والطول 0x00.

السجلات في الجدول هي أربع قيم Uint16. أول 2 هما الإزاحة وطول القيمة في قسم المفتاح والتالي هو الإزاحة وقيمة المحتوى في قسم البيانات.

مثال على نوع الجدول 0 يمكن أن يكون معرف عقدة الدليل والمفتاح المسمى في قسم المفتاح ومعرف الكيان في قسم البيانات. لا يحتوي هذا الجدول على تذييل.

الجدول 1

يحتوي نوع الجدول 1 على تذييل ويحتوي فهرس الجدول على 4 قيم من 16 بت حيث تكون القيمتان الأوليان هما الإزاحة للسجل في قسم المفتاح وطول السجل. توفر القيمتان التاليتان الإزاحة للسجل في قسم البيانات وطول هذا السجل. يتم ملاحظة هذا الجدول بشكل متكرر في كل من بنية الدليل B-tree و نطاق B-tree لعقدة المستوى الأعلى. القيم النموذجية هي معرف الأصل وإسم المفتاح (إسم الملف/المجلد في بنية الدليل ورقم بداية الكتلة في نطاق B-tree) في قسم المفتاح ومعرف الكيان عند إستخدامه كعقدة جذرية في هيكل الدليل أو رقم الكتلة عند إستخدامه في نطاق B-tree.

فيما يلي أمثلة على هذا الجدول:

يتم توفير أمثلة من هذا الجدول أدناه

الجدول 2

نوع الجدول 2. في البداية يكون هذا الجدول مطابقًا للجدول السابق ولكن لا يحتوي على تذييل. يتم العثور على نوع الجدول هذا بشكل متكرر في العقد الطرفية في بنية الدليل حيث يتم تمثيل قسم المفتاح مع معرف الأصل وإسم المفتاح.

نوع الجدول 3

نوع الجدول هذا مشابه للنوع السابق. فهرس الجدول هو نفسه الموجود في نوع الجدول 1. تعتمد القيم النموذجية على البنية المستخدمة فيها. غالبًا ما يستخدم هذا الجدول في بنية الدليل ونطاق B-tree كعقدة مستوى أعلى في أحجام صغيرة حيث تعمل العقدة الجذرية كعقدة جذرية وعقدة طرفية. في مثال الإستخدام هذا، قد يكون السجل الرئيسي هو معرف الأصل. قد يكون مفتاح الإسم وسجل البيانات عبارة عن ملف بيانات وصفية به إختلافات كبيرة في الحجم.

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

مثال الجدول:

مثال الجدول:

الجدول 4

يختلف نوع الجدول 4 إلى حد ما عن الأنواع السابقة. لا يحتوي الجدول على تذييل ويحتوي فهرس الجدول على قيمتين فقط لكل سجل، والإزاحة إلى السجل في قسم المفتاح ثم قيمة 1 لقسم البيانات. طول المحتوى ثابت بـ 16 بايت في قسم المفتاح و 8 بايت في قسم البيانات. الإزاحات في قسم البيانات مرتبطة بنهاية الكتلة.

نوع الجدول 5

نوع الجدول 5 مشابه جدًا للنوع 4. الإختلاف الوحيد هو أن هذا النوع له تذييل وأن جميع إزاحات البيانات من offset-0x28(بداية التذييل). السجلات في قسم المفاتيح هي 16 بايت و 8 بايت في قسم البيانات. يتم ملاحظة نوع الجدول هذا في الغالب في عقد المستوى الأعلى في بنية الدليل وفي حاويات أكبر مع هياكل B-tree متعددة المستويات.

نوع الجدول 6

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

نوع الجدول 7

نوع الجدول 7 مشابه جدًا للنوع 6. الإختلاف الوحيد هو التذييل الذي يحتوي على معلومات مشابهة لتلك الموصوفة لنوع الجدول 1. يتم ملاحظة نوع الجدول هذا في نطاق واسع من الهياكل وغالبًا ما يتم مواجهته في أعلى مستويات الهياكل متعددة الطبقات أو في هياكل طبقة واحدة مثل إعلانات المجلد.

مثال

مثال

ملخص الجدول

يوضح الجدول التالي الخصائص الأساسية لأنواع الجداول المختلفة:

النوع التذييل إزاحة قسم المفتاح طول قسم المفتاح إزاحة قسم البيانات طول قسم البيانات طول المفتاح طول البيانات
0 لا uint16 uint16 uint16 uint16 يختلف ممكن
1 نعم uint16 uint16 uint16 uint16 يختلف ممكن
2 لا uint16 uint16 uint16 uint16 يختلف ممكن
3 نعم uint16 uint16 uint16 uint16 يختلف ممكن
4 لا uint16 uint16 16 بايت 8 بايت
5 نعم uint16 uint16 16 بايت 8 بايت
6 لا uint16 uint16 16 بايت 16 بايت
7 نعم uint16 uint16 16 بايت 16 بايت

إحدى أهم الكتل في بنية دليل B-tree، هي العقدة الجذرية وهي أعلى مستوى في بنية المجلد. تستخدم هذه العقدة مفاتيح بحث متغيرة الطول. إحدى المميزات المحسّنة في نظام الملفات ApFS هي البحث السريع في الدليل (FDS). إحدى القيم المرتبطة إرتباطًا وثيقًا بهذه الميزة هي عدد جميع السجلات في بنية الشجرة الموجودة في تذييل الجدول.

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

في خريطة كيان B-tree، يتم إستخدام نوع الجدول 5 فقط للعقدة الجذرية، بإستثناء حالة الهياكل الصغيرة جدًا حيث يمكن مواجهة النوع 7.

يوضح تفسير الجداول أن أنوا ع الجداول 0 و 2 لها نفس الأثار. ويلاحظ نفس الشيء بين الجدولين من النوع 1 و 3. يبدو أن لهذه الجداول غرضًا مختلفًا إعتمادًا على الهيكل الذي توجد فيه.

اللقطات

اللقطات هي "صور" للقراءة فقط لنظام الملفات في وحدة التخزين. يمكن لنظام التشغيل إستخدام هذه اللقطات لجعل النسخ الإحتياطية أكثر كفاءة، ونتيجة لإستخدامها، ستعمل وظيفة Time Machine بشكل أسرع. مع دعم نظام ApFS للصور الفورية فإن وظيفة Time Machine ، لم تعد بحاجة إلى حفظ عدة نسخ كاملة من الملف على القرص - يمكنها ببساطة تتبع تغييرات معينة.على سبيل المثال، إذا كنت تقوم بتحرير ملف، فإن تغيير شريحة واحدة بإستخدام نظام +HFS يعني حفظ نسختين من الملف، واحدة يتم فيها تسجيل التغييرات الجديدة، والأخرى في حالة الرغبة في العودة إلى الخلف. في نظام الملفات APFS، يقوم ببساطة بحفظ الملف المصدر وتسجيل الإختلافات بين الملف المصدر وأي إصدارات محدثة، وبالتالي يؤدي نفس المهمة في مساحة أقل بكثير. تمامًا كما هو الحال مع التحسينات في Fusion Drive، تشغل المعلومات مساحة أقل على القرص.

على الرغم من أن نظام الملفات ApFS أدنى بكثير من إمكانياته مقارنة بـ 128 بت ZFS، والذي يدعمه نظام التشغيل Linux و FreeBSD وأنظمة التشغيل المجانية الأخرى، ولكن من جانب Apple، فهذه خطوة في الإتجاه الصحيح .

كما ذكر أعلاه ، حاولت شركة Apple نقل ZFS إلى OS X لفترة طويلة. تم تطبيق OpenZFS لاحقًا لنظام التشغيل OS X (O3X) و MacZFX.

العقد

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

Nodes
الموقع الحجم النوع المعرف
0 4 uint32 alignment
4 4 uint32 ENTRY_COUNT
10 2 uint16 HEAD_SIZE
16 8 entry meta_entry
24 ... entry entries (repeat entry_count times)

رأس العقدة:

الإزاحة الحقل نوع البيانات التعليقات
0 Checksum Uint64 خوارزمية فليتشريز الإختبارية
8 ID Uint64 Object-ID أو Block#
10 Checkpoint Uint64
18 Unknown Uint16 المستوى الممكن في B-Tree
1A Unknown Uint16 تظهر جميع الملاحظات القيمة 0x4000
1C Unknown Uint16 Flag?
1E Unknown Uint16 غالبًا ما تُرى القيمة 0x0b و 0x0e و 0x0f

مدير المساحة

يتم إستخدام مدير المساحة لإدارة الكتل المخصصة في حاوية نظام ApFS. يقوم بتخزين عدد الكتل الشاغرة ومؤشر لملفات معلومات التخصيص.

الموقع الحجم النوع المعرف
0 4 uint32 block size
16 8 uint64 totalblocks
40 8 uint64 freeblocks
144 8 uint64 prev_allocationinfofile_block
352 8 uint64 allocationinfofile_block

ملف معلومات التخصيص

يعمل ملف معلومات التخصيص كرأس مفقود لملف التخصيص. يقوم بتخزين طول ملفات التخصيص والإصدار والإزاحة لملف التخصيص.

الموقع الحجم النوع المعرف
4 4 uint32 alloc_file_length
8 4 uint32 alloc_file_version
24 4 uint32 TOTAL_BLOCKS
28 4 uint32 free_blocks
32 4 uint32 allocationfile_block

ملف ومجلد B-tree

يقوم بتسجيل جميع الملفات والمجلدات الموجودة في المجلد. يؤدي نفس دور ملف الدليل في نظام الملفات HFS+.

النطاقات (نطاقات B-tree)

شجرة B-Tree منفصلة لجميع النطاقات لكل حجم. النطاقات هي مراجع لمحتوى الملف مع معلومات حول مكان بداية محتوى البيانات وطول البيانات في الكتل. سيكون للملف الذي يحتوي على بعض المحتويات نطاق واحد على الأقل. سيكون للملف المجزء نطاقات متعددة. مدى B-Tree عبارة عن هيكل منفصل.

في كل سجل ملف، يتم تحديد النطاقات لكل ملف من الملفات الموجودة في B-Tree. تعد بنية المدى المنفصلة هذه جزءًا من ميزة اللقطة.

عقد الفهرس 64 بت (واصفات الفهرس)

تعمل الرموز ذات 64 بت على زيادة مساحة الإسم بشكل ملحوظ مقارنة بمعرفات 32 بت في نظام HFS+ يدعم نظام الملفات ApFS 64 بت أكثر من 9 كوينتيليون ملف في كل وحدة تخزين. يجب أن يكون هذا كافيا لأي شخص، كما قال بيل جيتس.

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

Abdelhamid Balti

المؤلف: , كاتب تقني

عبد الحميد البلطي كاتب تقني في شركة Hetman Software. يتعامل مع البرامج التعليمية والإرشادات والمراجعات التفصيلية حول كيفية عمل أدوات وبرامج الشركة مع جميع أنواع أجهزة تخزين البيانات.

Mykhailo Miroshnichenko

محرر: , كاتب تقني

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

نوصى به لك

يرحب بك مساعد Hetman Software، الذي تم إنشاؤه على أساس الذكاء الإصطناعي.
ابدأ الدردشة