APFS: خوارزمية إستعادة البيانات وهيكل نظام الملفات
يوفر نظام ApFS فرصة لإسترداد حالات معينة من نظام الملفات، بما في ذلك إستعادة الإصدارات القديمة أو التي تمت إزالتها من الملفات.تحتوي حاوية الكتلة الفائقة على رابط للعنصر المعروف بإسم نقطة التحقق. تشير نقطة التحقق هذه إلى الكتلة الفائقة السابقة للحاوية والتي تخزن المعلومات على حالة قديمة من نظام الملفات. بهذه الطريقة، يمكن إسترداد العديد من الحالات القديمة عن طريق فحص سلسلة حاوية الكتلة الفائقة.
- الحاويات والمساحات التخزين
- رأس الكتلة
- حاوية الكتلة الفائقة
- الكتلة الفائقة لمساحة التخزين
- نقطة التحقق
- نقطة التحقق واصف الكتلة الفائقة
- هياكل الصور النقطية (صورة نقطية أو خريطة المساحة)
- الجداول
- ملخص الجدول
- اللقطات
- العقد
- مدير المساحة
- ملف معلومات التخصيص
- ملف ومجلد B-tree
- النطاقات (نطاقات B-tree)
- عقد الفهرس 64 بت (واصفات الفهرس)
- أسئلة وأجوبة
- التعليقات
الحاويات والمساحات التخزين
هيكل نظام ملفات ApFS هو هيكل B-tree، حيث يكون الدليل الجذري الذي يحتوي على البيانات عبارة عن أوراق هذه الشجرة. تحتوي جميع العقد الفرعية فقط على روابط للعقدة التالية حتى تصل إلى العقد الطرفية. يستخدم نظام الملفات هذا الحاويات كخلايا تخزين، ويمكن أن تحتوي هذه الخلايا على وحدات تخزين ApFS متعددة. أيضًا، الحاوية هي الكائن الأساسي لتخزين البيانات. لإحتواء مجلد واحد، يجب أن يكون > 512 ميجا بايت على الأقل، > 1024 ميغا بايت أن تحتوي على أكثر من مجلدين وما إلى ذلك.
توضح الصورة أدناه نظرة عامة على هيكل نظام الملفات 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:
الكتلة الفائقة لمساحة التخزين
توجد مساحة الكتلة الفائقة لكل مساحة تخزين داخل نظام الملفات. تحتوي على إسم مساحة التخزين والمعرف (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 وهي الكتلة السابقة للواصف. أهم المعلومات في هذه الكتلة هي موقع بنية الصورة النقطية (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 أو موجودة بمفردها. يمكن أن تحتوي العقد على إدخالات مرنة أو ذات حجم ثابت. تبدأ العقدة بقائمة من المؤشرات إلى مفاتيح الإدخال وسجلات الإدخال. بهذه الطريقة، لكل إدخال، تحتوي العقدة على رأس إدخال في بداية العقدة، ومفتاح إدخال في منتصف العقدة وسجل دخول في نهاية العقدة.
الموقع | الحجم | النوع | المعرف |
---|---|---|---|
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 فرصة لإسترداد حالات معينة من نظام الملفات، بما في ذلك إسترداد الإصدارات القديمة أو التي تمت إزالتها من الملفات. تحتوي حاوية الكتلة الفائقة على رابط للعنصر المعروف بإسم نقطة التحقق. تشير نقطة التحقق هذه إلى الكتلة الفائقة السابقة للحاوية والتي تخزن المعلومات حول حالة قديمة من نظام الملفات. بهذه الطريقة، يمكننا محاولة إسترداد العديد من الحالات القديمة لنظام الملفات من خلال تحليل هذه السلسلة من الكتل الفائقة داخل الحاوية.