يوم جيد ، خبرافشان. أعمل في Veeam Software وأنا أحد مطوري حل النسخ الاحتياطي لنظام Linux. عن طريق الاحتلال ، لقد صادفت لقاء BTRFS. في الآونة الأخيرة ، انتقلت من وضع "غير مناسب بعد" إلى وضع "مستقرة". وبينما كان المستخدمون الأولون على الشبكة يناقشون مجالات المشكلات وقضايا الاستقرار ، قمنا في Veeam بتلاعبها بعصا وحاولنا عمل نسخة احتياطية منها. اتضح ، بعبارة ملطفة ، ليس كثيرًا - إنه مختلف تمامًا ، وليس مثل أنظمة الملفات التقليدية. اضطررت إلى دراسة العديد من الجوانب وجمع الكثير من المكابس قبل أن نتعلم كيفية التعامل معها. في عملية التعلم ، تمكنت BTRFS من إقناعي ، بطريقة جيدة وليس كثيرًا. أنا متأكد من أنها لن تترك أي متخصص في تكنولوجيا المعلومات من عالم Linux غير مبال: سوف يبصق البعض ، والثناء عليه.
إذا كنت قد سمعت عن نظام الملفات هذا ، لكنك لا تعرف السبب في ذلك ، أو المهتمين بالتفاصيل ، أو تبحث عن المكان الذي تبدأ في التعرف عليه ، فأنا أدعوك إلى المشاركة.
مقدمة
BTRFS (B-Tree Filesystem) - نظام ملفات لأنظمة التشغيل المشابهة لنظام Unix استنادًا إلى تقنية Copy on Write (CoW) ، المصمم لتوفير سهولة التوسع في نظام الملفات ، ودرجة عالية من موثوقية البيانات والأمن ، ومرونة التكوين وسهولة الإدارة ، مع الحفاظ على في نفس الوقت بسرعة عالية. على الأقل هذا ما تقوله
صفحة الويكي الرئيسية .
للامتثال للإجراءات الشكلية ، ندرج الميزات الرئيسية ل btrfs:
- الحد الأقصى لحجم الملف 2 ^ 64 بايت
- الجدول inode ديناميكي
- إلغاء البيانات المكررة
- تخزين فعال للملفات بأحجام صغيرة جدًا وكبيرة جدًا
- إنشاء Subwolums واللقطات
- حصص فرعية
- تدقيقات للبيانات والبيانات الوصفية
- القدرة على دمج عدة محركات أقراص في نظام ملفات واحد
- إنشاء تكوين RAID على مستوى نظام الملفات
- ضغط البيانات
- إلغاء تجزئة البيانات على الطاير
أريد أن أحذرك فورًا بأن BTRFS تتطور بشكل نشط ، وقد تختلف بعض النقاط من إصدار إلى آخر. الرابط -
https://btrfs.wiki.kernel.org/index.php/Changelog ، يمكنك معرفة وقت إضافة الوظيفة أو تغييرها أو إصلاحها.
نعم ، BTRFS هو نظام ملفات حديث وعصري يعمل على حل مجموعة واسعة من المهام ، ولكن ليس بدون عيوبه:
- يؤدي تطويرها النشط إلى تغيير في أي نقاط أساسية يمكن أن تعتمد عليها أدوات الجهات الخارجية عند العمل معها.
- على الرغم من تأكيدات المطورين حول استقرار BTRFS ، يواجه المستخدمون بانتظام مشاكل قد تؤدي إلى فقد البيانات. كقاعدة ، فهي "تطفو" في طبيعتها ، ونتيجة لذلك لم تتم دراستها وتصحيحها بعد.
- قابلية عالية للتفتيت.
- وثائق هزيلة وأحيانا عفا عليها الزمن.
يتم تخصيص صفحة كاملة لمشاكل نظام الملفات على إصدارات مختلفة من النواة -
https://btrfs.wiki.kernel.org/index.php/Gotchas . أنصحك بشدة أن تبحث هناك - لقد ظهر الكثير من الاهتمام وغير الواضح.
هيكل BTRFS
يمكن تقسيم جهاز BTRFS المبسط إلى المستويات التالية:

توجد أجهزة الحظر في أدنى مستوى ، وتمثل واحدة أو عدة فراغات عنوان فعلي منفصلة (نفس "الفعلية" مثل الأجهزة كتلة نفسها ، ولكن هذه هي بالفعل التفاصيل). من خلال بنيات خاصة ، يتم دمج الكتل المخصصة من الذاكرة الفعلية في مساحة عنوان افتراضية واحدة.
تتم معالجة هياكل البيانات التعريفية وكتلها مع بيانات المستخدم (النطاقات) بالفعل على مستوى منطقي. نتيجة لذلك ، يمكن أن توجد البيانات الموجودة بالتسلسل على المستوى المنطقي فعليًا على أجهزة كتلة مختلفة.
يمكن تقسيم هياكل البيانات الأولية إلى مستويات. بالطبع ، لن أقوم بتصنيفهم - فهناك الكثير منهم ، وهذه التفاصيل منخفضة المستوى هي موضوع مقالة منفصلة. من المهم هنا أن تتحول بعض الهياكل في التسلسل الهرمي إلى مستوى أعلى من غيرها ، وفي القمة سيكون هناك بنية فرعية.
Subvolume هو نوع من نقطة الإدخال ، أو بالأحرى العناصر الجذرية لنظام الملفات. إنها تشكل طبقة منفصلة من تمثيل البيانات ، والتي تُلخص عمل الطبقات السفلى ، وتقدم بيانات المستخدم في النموذج المعتاد: الدلائل والملفات. بالإضافة إلى ذلك ، تعتبر الذئاب الفرعية عنصرًا رئيسيًا في آلية CoW على BTRFS. قد تتحول نفس الملفات الموجودة في جزئين فرعيين إلى نفس البيانات التي تم تعيينها في المستويات الأدنى.
الطبقة الأخيرة هي طبقة البيانات. كما يراها المستخدم. هذه هي الملفات والأدلة الموجودة في المجلد الفرعي.
لكن نظرية كافية. حان الوقت للمضي قدما في الممارسة!
Btrfs-progs
هذه مجموعة قياسية من الأدوات المساعدة لإدارة BTRFS. بناءً على حزمة التوزيع ، قد يكون للحزمة التي تحتوي على هذه الأدوات المساعدة في المستودع أسماء مختلفة:
btrfsprogs ،
btrfs-progs ،
btrfs-tools ، إلخ. إذا لم يكن مستودعك يشبهه ، فيمكنك دائمًا تجميعه يدويًا ، فالمصادر ليست بعيدة -
https://github.com/kdave/btrfs-progs .
أهم الأدوات المساعدة في هذه الحزمة هي
btrfs و
mkfs.btrfs . من الثانية ، أعتقد أن كل شيء واضح للغاية - من الضروري إنشاء BTRFS على جهاز كتلة. أولاً ،
btrfs هي الأداة الرئيسية التي تسمح لك بالقيام بالباقي. نوع من "السكين السويسري".
في هذه المقالة ، استخدمت الإصدار v4.15.1. يتم تطوير الأداة المساعدة بنشاط كبير ، وهناك اختلافات ملحوظة من إصدار إلى إصدار. لذلك إذا لم يكن لديك الأمر الضروري ، فتحقق من إصدار الأداة المساعدة
btrfs ، فقد يكون
قديمًا بالفعل.
أيضًا ، على الأرجح ، تم العثور على الأدوات المساعدة
btrfsck و
btrfstune في الحزمة.
- أولهما يعمل على التحقق من نظام الملفات بحثًا عن الأخطاء وللتصحيحات اللاحقة ، ومع ذلك ، لا أوصي باستخدامه - إنه في حالة إهمال ، فقد تم نقل وظائفه إلى الأمر check btrfs .
- يسمح لك الثاني بتنفيذ بعض العمليات المفيدة على btrfs ، على سبيل المثال ، تغيير المعرف الفريد لنظام الملفات (FS UUID) ، أو تمكين وظائف معينة لنظام الملفات.
بالإضافة إلى الأدوات المساعدة المذكورة أعلاه ، هناك العديد من الأدوات المساعدة في الحزمة ، لكنها ضرورية بشكل أساسي لتصحيح أخطاء btrfs ولن تكون مفيدة لنا في هذه المقالة.
تنسيق قرص في BTRFS
في الممارسة العملية ، كل شيء أبسط. لنبدأ بمحرك واحد.
يحدث تنسيق قرص واحد في btrfs باستخدام الأمر المعتاد:
mkfs.btrfs /dev/sdc -L single_drive
استجابة لذلك ، ستقوم الأداة المساعدة بإخراج معلمات نظام الملفات الذي تم إنشاؤه إلى وحدة التحكم:
btrfs-progs v4.15.1 See http://btrfs.wiki.kernel.org for more information. Label: single_drive UUID: 59307d69-6d2f-4d2e-aae2-a5189ad3c256 Node size: 16384 Sector size: 4096 Filesystem size: 1.00GiB Block group profiles: Data: single 8.00MiB Metadata: DUP 51.19MiB System: DUP 8.00MiB SSD detected: no Incompat features: extref, skinny-metadata Number of devices: 1 Devices: ID SIZE PATH 1 1.00GiB /dev/sdc
دعنا نذهب من خلال المعلمات المقدمة.
عند ترميز جهاز كتلة واحد ، ستطبق btrfs التكرار على بيانات التعريف وبيانات النظام بشكل افتراضي ، وستظل بيانات المستخدم في الوسائط بنسخة واحدة. سيؤدي إنشاء btrfs على عدة أقراص مرة واحدة إلى تطبيق ملف تعريف "RAID0" على بيانات المستخدم افتراضيًا ، و "RAID1" على البيانات الأولية.
يتم التحكم في هذه المجموعة من المعلمات باستخدام مفتاحين:
-d
للبيانات و
-m
للبيانات التعريفية وبيانات النظام.
ولكن هناك فارق بسيط ... الأمور مختلفة مع محركات أقراص الحالة الصلبة. الحقيقة هي أنه إذا كنا نقوم بترميز محرك أقراص SSD (أو محرك أقراص فلاش) ، فلن يقوم نظام الملفات افتراضيًا بتكرار البيانات الأولية. يمكن لمحركات أقراص الحالة الثابتة تمديد إلغاء البيانات المكررة لإطالة عمر عناصر الذاكرة. أي وجود نسختين منطقيتين من البيانات ، في الواقع سيتم تسجيل نسخة واحدة فقط في الوسط. نتيجة لذلك ، عندما تتعطل شريحة الذاكرة ، فإن "كلا نسختين" البيانات ستكون تالفة. بالإضافة إلى ذلك ، من خلال كتابة البيانات مرتين ، يتم ببساطة استهلاك مورد SSD بشكل أسرع.
لتحديد نوع الوسائط ، تقوم btrfs بفحص محتويات الملف
/ sys / block / DEV / قائمة الانتظار / rotational ، حيث "DEV" هو اسم جهاز الكتلة الجاري فحصه.
بالطبع ، حتى في حالة SSD ، يمكن فرض ملف تعريف التخزين.
لإنشاء مثيل btrfs على العديد من الأجهزة ، ما عليك سوى تحديده بمسافة:
sudo mkfs.btrfs /dev/sdc /dev/sdd -L double_drive
أو مع ملفات التعريف:
sudo mkfs.btrfs /dev/sdc /dev/sdd -d raid1 -m raid1 -L raid1_drive
تجدر الإشارة إلى أن الوسائط لا يجب أن تكون بنفس الحجم ، حتى لو تم استخدام النسخ المتطابق الكامل. ومع ذلك ، بمجرد عدم وجود مساحة كافية على أصغر محرك أقراص لتخصيص الذاكرة ، سيعرض نظام الملفات رسالة تشير إلى عدم وجود مساحة خالية ، على الرغم من أنه من الناحية الفعلية قد لا تزال هناك بعض المساحة الحرة على وسائط أخرى.
متزايد
لا يختلف التحميل الأول من btrfs حديثًا عن أنظمة الملفات الأخرى:
mount /dev/sdc /mnt
إذا كان نظام الملفات موجودًا على عدة أقراص ، فسيكون كافيًا لتحديد أي منها للتركيب.
بشكل عام ، يتضمن btrfs المتصاعد دائمًا تثبيت واحد أو أكثر من مجلده الفرعي. إذا لم يتم تحديد الأمر mount أي مجلد فرعي يجب تثبيته ، فسوف تقرأ btrfs من السجل الخاص معرف المجلد الفرعي ، والذي يجب تثبيته افتراضيًا. يمكن تغيير هذا الإدخال فيما بعد باستخدام الأمر
btrfs set-default
، ولكن عندما تقوم أولاً بتثبيته على btrfs ، يوجد مجلد فرعي واحد فقط - الجذر. يتم تحديده بشكل افتراضي للتركيب.
العالم الفرعي الجذر على btrfs موجود دائما. يظهر مع نظام الملفات ولا يخضع لأي تغييرات في المستقبل.
هناك طريقتان لتحميل أي مجلد فرعي بخلاف الافتراضي:
تحديد المسار من btrfs الجذر الفرعي:
mount -o subvol=/path/to/subvol /dev/sdc /mnt
إما تحديد معرف المجلد الفرعي:
mount -o subvolid=257 /dev/sdc /mnt
كما ذكرنا سابقًا ، يتم تحديد أحد مجلدات btrfs الفرعية كما هو مثبت افتراضيًا. معرفة أي واحد ممكن عن طريق القيام:
btrfs subvolume get-default /path/to/any/subvolume
لتثبيت القائمة الفرعية الافتراضية ، يمكنك استخدام الأمر:
btrfs subvolume set-default 258 /path/to/any/subvolume
مطلوب المسار إلى المجلد الفرعي في هذه الحالة فقط للإشارة إلى مثيل btrfs المحدد الذي ينطبق عليه الأمر. بالمناسبة ، لا يجب أن يكون هذا هو عالم فرعي ؛ المسار إلى أي دليل مناسب أيضًا.
يقبل الأمر
mount
عددًا كبيرًا من الخيارات للتحكم في إمكانيات btrfs: إلغاء التجزئة ، مسح ذاكرة التخزين المؤقت ، الضغط ، البقرة ، التسجيل ، التوازن ، دعم ssd ، والكثير من الأشياء الأخرى الخاصة بـ btrfs. أنا لن أعتبرها في إطار هذه المقالة ، لأن هناك حاجة إليها لضبط نظام الملفات ، وفي الغالبية العظمى من الحالات يمكنك الاستغناء عنها.
المجلد الفرعي هو
تعتبر المجموعة الفرعية عنصرا أساسيا في btrfs الذي يؤدي وظائف مختلفة:
- تخزين بيانات المستخدم والمجلدات الفرعية الأخرى ،
- توفير الوصول إلى البيانات (تركيب) ،
- آلية coW
- خلق لقطات.
عند التقريب الأول ، يعد المجلد الفرعي دليلًا عاديًا. يمكنك إعادة تسمية / نقلها ، وعرض محتوياتها ، ووضع وتعديل الملفات بداخلها. لا يلزم المرافق الخاصة.
يتم إنشاء وحذف مجلد فرعي على btrfs محمّل باستخدام أوامر خاصة:
btrfs subvolume create /mnt/subvolume_name btrfs subvolume delete /mnt/subvolume_name
لاحظت أنه إذا حاولت إزالة المجلد الفرعي باستخدام أداة إدارة الملفات أو الأداة المساعدة
rm ، فستنتهي
العملية بعملية خطأ
غير مسموح بها (العملية غير مسموح بها).
UPD: بدءًا من الإصدار kernel 4.18.0 ، يمكن حذف الأجزاء الفرعية باستخدام أداة
rm أو أدوات إدارة الملفات. على ما يبدو ، كان خطأ ، وليس ميزة. بفضل Prototik
habravchanin للتوضيح.
بعد إنشاء مجلد فرعي ، يمكنك رؤية خصائصه:
btrfs subvolume show /mnt/subvolume_name Name: subx UUID: 09af45e8-d2b2-b342-8a92-fa270ac82d0a Parent UUID: - Received UUID: - Creation time: 2019-03-23 17:59:28 +0100 Subvolume ID: 268 Generation: 39 Gen at creation: 35 Parent ID: 260 Top level ID: 260 Flags: - Snapshot(s):
دعنا نذهب من خلال الخصائص الرئيسية لل subwolume:
- الاسم - اسم المجلد الفرعي
- UUID هو معرف فريد عالمي يخدم بشكل رئيسي لتحديد العلاقات بين مضخم الصوت واللقطات ،
- الأصل UUID - معرف سلف الجزء السفلي الذي يستمد منه التيار الحالي ،
- تم تلقي UUID - معرف سلف الجزء الفرعي المرسل عبر btrfs send ،
- معرف المجلد الفرعي - معرف فريد للموضع في شجرة B ،
- الجيل - رقم المعاملة في التحديث الأخير لبيانات التعريف الفرعية ،
- الجنرال عند الإنشاء - رقم المعاملة في وقت إنشاء المجلد الفرعي ،
- معرف الأصل - معرف الجزء الفرعي الذي تم تضمينه الحالي ،
- معرف المستوى الأعلى هو نفسه معرف الأصل تمامًا ،
- الأعلام - الأعلام (في الواقع علم واحد فقط للقراءة فقط ) ،
- لقطات - قائمة لقطات مأخوذة من هذا المجلد الفرعي.
تحتوي المجموعة الفرعية على معلمة أخرى - هذا هو مسارها من btrfs لعنصر الجذر. يتم عرض المسار عند سرد المجلد الفرعي:
btrfs subvolume list /path/to/any/btrfs/mountpoint
ولكن هنا كل شيء بسيط وواضح - حتى أنه من غير المنطقي إحضار ناتج الأمر.
كما هو الحال مع أوامر
get-default
و
set-default
، هنا يمكنك تحديد المسار لأي مجلد فرعي ، لن تتغير نتيجة ذلك. يستخدم هذا المسار للعثور على الجذر الفرعي btrfs. بعد ذلك يتم قراءة شجرة الشبه كله.
إذا حاولت نسخ المجلد الفرعي ، على سبيل المثال ، باستخدام الأداة المساعدة
cp ، ستنجح عملية النسخ ، ولكن نتيجة لذلك ، لن يتم إنشاء المجلد الفرعي ، ولكن الدليل المعتاد. ومع ذلك ، توفر btrfs أداة أكثر مرونة لإنشاء مثل هذه النسخ - لقطات.
لقطة هي
لقطة هي أيضا عالم ثانوي ، فقط بعد الخصائص المتقدمة.
الفارق الرئيسي بينهما هو أن اللقطة تحتوي على سجلات عن أي مضخم تم إنتاجه منه. هذه هي الحقول
UUID الأصل و
UUID المتلقاة . في مضخم الصوت ، توجد هذه الحقول أيضًا ، لكنها دائماً فارغة. لذلك ، في الواقع ، لقطة ومجموعه هي واحدة واحدة.
عند الإنشاء ، يمكنك حظر لقطة التغييرات باستخدام مفتاح التبديل
-r
.
btrfs subvolume snapshot -r /path/to/subvol /path/to/snapshot
في هذه الحالة ، يتم ضمان بقاء الملفات في الحالة التي كانت عليها في وقت إنشاء اللقطة.
يمكن أيضًا التحكم في علامة القراءة فقط يدويًا ، وهذا يعمل مع أي مجلد فرعي:
btrfs property get /path/to/subvol ro btrfs property set /path/to/subvol ro true
إذا نظرنا الآن إلى خصائص اللقطة ،
فسنرى حقل
UUID الأصل المعبأ:
btrfs subvolume show /path/to/snapshot Name: subx UUID: d08612d8-596a-11e9-8647-d663bd873d93 Parent UUID: 09af45e8-d2b2-b342-8a92-fa270ac82d0a Received UUID: - Creation time: 2019-03-23 17:59:28 +0100 Subvolume ID: 269 Generation: 39 Gen at creation: 35 Parent ID: 260 Top level ID: 260 Flags: - Snapshot(s):
من الميزات المهمة لعملية اللقطة أنها غير متكررة. بدلاً من مجلد فرعي متداخل ، سيتم إنشاء أدلة فارغة في اللقطة.
دعنا ننتقل إلى المثال التالي.
يوجد في نظام الملفات مضخم صوت "sub0" ، يوجد بداخله مضخم صوت subwoofer ودليل
dirB . داخل كل واحد منهم
fileA و
fileB ، على التوالي.
إزالة اللقطة:
btrfs subvolume snapshot sub0 snap0

سوف ترث لقطة
snap0 التي تم إنشاؤها جميع الملفات والدلائل الخاصة بها ، ومع ذلك ، لن يظهر
مضخم صوت subA في داخل اللقطة. بدلاً من ذلك ، لن يظهر سوى دليل فارغ في اللقطة ، أي لن يتم توريث محتويات المجلد
الفرعي الفرعي .
من ناحية ، يعد هذا أمرًا جيدًا - فنحن نزيل اللقطة من مجلد فرعي معين ، وكلها متداخلة لا تهمنا. من ناحية أخرى ، إذا كانت لقطة متكررة مطلوبة ، فلن يكون لدى btrfs حلاً لهذه المشكلة. سيتعين علينا البحث عن جولات العمل.
يستند الحل الأول إلى حقيقة أن اللقطة قد تمت إزالتها دون إشارة للقراءة فقط ، مما يسمح لك بإصلاح الموقف بكل بساطة:

إذا تمت إزالة اللقطة التي تحمل علامة للقراءة فقط ، فلن يعمل الخيار أعلاه ، لأن في
snap0 لا يمكنك حذف الدليل أو وضع لقطة. هناك خيار واحد فقط - وضع لقطات في مكان ما بالقرب من
مضخم صوت snap0:
btrfs subvolume snapshot sub0/subA snapA
ثم قم بتحميل
snapA داخل
snap0 snaps0 ، دليل هذا موجود بالفعل:
mount -o subvol=snapA snap0/subA

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

ستظهر مجلد فرعي جديد (لقطة) على نظام الملفات بنفس المحتوى تمامًا مثل المجلد الفرعي الأصلي. عملية إنشاء لقطة فورية تقريبًا - لا يتم نسخ بيانات الملف نفسه. بدلاً من ذلك ، يتم إنشاء بيانات تعريف إضافية ، وتصبح لقطة مع المجلد الفرعي الأصل هو مالك الملف. في الواقع ، كان هناك ملف واحد فقط على القرص ، لكنه الآن ينتمي إلى كل من المجلد الفرعي واللقطه.
إذا قمت الآن بتغيير الملف في المجلد الفرعي ، فلن تؤثر التغييرات على الملف في اللقطة. إذا لم يتم تعيين علامة القراءة فقط عند إنشاء اللقطة ، فيمكن أيضًا تعديل الملف الموجود في اللقطة.

من الناحية الفنية ، عندما يتم تغيير الملف ، يتم تسجيل هذه التغييرات فقط. لذلك سيتم تخزين الملف المصدر على القرص بالإضافة إلى بعض الدلتا التي تميز الملف الأصلي عن الملف المعدل. إذا قمت بحذف أحد المجلدات الفرعية (يعني الثاني لقطة) ، فسيتم مسح البيانات الزائدة التي لم يعد يستخدمها أي شخص من القرص ، وسيظل الإصدار الحالي فقط من الملف موجودًا على القرص (من وجهة نظر المجلد الفرعي المتبقي).
ملاحظة قصيرة : عند الإزالة ، سوف يختفي مضخم الصوت من أعين المستخدم على الفور ، وسوف تعيد الأداة المساعدة التحكم إلى الجهاز ، ومع ذلك ، سيتم تنظيف البيانات الموجودة على القرص بواسطة عملية الخلفية لبعض الوقت. وهذا هو ، على عكس إزالة دليل منتظم ، ليست هناك حاجة لانتظار الإكمال الفعلي لعملية الحذف. إذا كنت بحاجة إلى المزامنة مع هذه العملية وانتظر حتى تكتمل ، فيمكنك تحديد
--commit-after
التبديل
--commit-after
استدعاء
الحذف .
يعرض أمر
قائمة bvfs subvolume ، الذي تم
استدعاؤه باستخدام مفتاح التبديل
-d
، قائمة بالمجلدات الفرعية التي تم حذفها من قبل المستخدم وهي حاليًا في عملية حذفها من القرص.
بالإضافة إلى ذلك ، يتيح لك btrfs استنساخ الملفات على نظام الملفات دون اللجوء إلى لقطات. يتم ذلك عن طريق النسخ المنتظم باستخدام
--reflink
:
cp -ax --reflink=always /original/file /copied/file
يخبر المفتاح
reflink=always
نظام الملفات الذي نريد استخدام آلية CoW عند النسخ. بعد النسخ ، يمكن تغيير الملفات بشكل مستقل عن بعضها البعض ، حتى نحصل على نفس السلوك بعد إنشاء لقطة. فلماذا إذن نحتاج إلى أعمدة فرعية؟
تلعب المصطلحات الفرعية على btrfs دور أداة تحكم عالية المستوى لمجموعات البيانات بأكملها: أولاً ، تتم إزالة اللقطة الذرية من جميع بيانات مجلد فرعي (في حالة - إعادة ربط atomicity على مستوى الملف فقط) ، وثانياً ، من الممكن رؤية من يتم توارثه من أو "استرجاع" مجموعة البيانات بسرعة إلى إصدار سابق ، إلخ.
وبالتالي ، توفر btrfs القدرة على التقاط حالات الملف في نقاط الوقت المرغوبة ، وذلك باستخدام وحدات التخزين الفرعية كوسيلة عالية المستوى لإدارة هذه الحالات.
الانتعاش الفرعي
في المساحات الشاسعة ، يطرح السؤال غالبًا: "لدي مضخم صوت ، ولدي لقطة سريعة ، وكيفية عمل عكس؟" هذا النهج لا ينطبق على btrfs ، لأن ليست هناك فرصة ل "دحر الفتيلة". بدلاً من ذلك ، تقدم btrfs إستراتيجية لاستبدال اللقمة الفرعية بلقطتها. في الواقع ، لماذا ترجع شيئًا ما ، إذا كانت اللقطة نفسها هي هذا الكائن الذي نريد أن نعود إليه.
تخيل هذا السيناريو: على btrfs يوجد مجلد فرعي توجد به ملفات قاعدة البيانات (جيدًا ، أو بيانات مهمة أخرى). تتم إزالة اللقطات بشكل دوري من هذا المجلد الفرعي ، وهناك حاجة في بعض الأحيان إلى استعادة البيانات. في هذه الحالة ، نتخلص ببساطة من subwolum ونبدأ بدلاً من ذلك في استخدام اللقطة المأخوذة منه ، أو - إذا لم نرغب في إفساد هذه البيانات أيضًا - فإننا نزيل لقطة أخرى من اللقطة. إذا لم يتم تثبيت العالم الفرعي الأصلي واستخدامه كدليل عادي ، فيجب إما حذفه أو نقله / إعادة تسميته ، ويجب وضع لقطة في مكانه.

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

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

عند إنشاء لقطة ، يتم إصلاح حالة الملفات الموجودة على القرص. من الآن فصاعدا ، لقطة هي غداء من الفرع
الرئيسي . لن تؤثر جميع التغييرات الأخرى على
main على اللقطة بأي شكل من الأشكال. العودة إلى اللقطة تعني إيقاف استخدام الفرع
الرئيسي والتحول بشكل كامل إلى الغداء. يمكن حذف الفرع
الرئيسي باعتباره غير ضروري. وبالتالي ، فإن btrfs هو عمليًا نظام للتحكم في الإصدار ، ولكن بدون القدرة على دمج الفروع مرة أخرى.
شجرة نظام الملفات
تتمثل إحدى النقاط غير الواضحة المرتبطة باستخدام btrfs في كيفية تقسيم بيانات النظام إلى مجلد فرعي. بالطبع ، لا يوجد نهج "صحيح" لهذه المسألة. ولكن هناك 3 طرق لتنظيم بنية الجزء الفرعي: بنية مسطحة ، متداخلة ومختلطة.
بنية مسطحة تعني أن المجلد الفرعي يتم وضعه في قائمة مسطحة في مجلد الجذر الفرعي. على سبيل المثال ، يمكنك تحديد جذر نظام الملفات (دعنا نسميه
الجذر ) ،
ومنزل دليل المستخدم ، والدليل مع الموقع
/ var / www وقاعدة البيانات الموجودة على سبيل المثال في
/ var / قاعدة البيانات كمجلدات فرعية منفصلة.

للراحة ، يمكن وضع بعض الأجزاء الفرعية في الدلائل ، على سبيل المثال ، في حالة المجلد الفرعي
var / www .
مع هذا النهج ، يجب أن يتم تثبيت جميع الأجزاء الفرعية. يجب أن يكون
للجذر الفرعي نقطة تحميل / ، وفيه يحتوي على أدلة
المنزل و
var .
بعد تركيب الجذر في / الوطن يجب أن يتم تثبيت sabvolyum المنزل ، وفي / فار / على شبكة الاتصالات العالمية و / فار / databas بريد - sabvolyumy فار / على شبكة الاتصالات العالمية و قاعدة البيانات ، على التوالي.وبالتالي ، يمكن عرض شجرة btrfs-subvolume بشكل تعسفي في نظام الملفات الظاهري لنظام التشغيل ، وهناك بالفعل ما يكفي لذلك.الايجابيات:
- لا يرى المستخدم سوى وحدة فرعية مثبتة ،
- من السهل استبدال مضخم الصوت (إلغاء تحميل واحد ، تركيب الآخر) ،
- سهلة لإزالة مضخم الصوت.
سلبيات:
- من السهل الخلط حول مكان تثبيته ،
- بالنسبة لكل مجلد فرعي ، يجب أن يكون هناك إدخال في fstab ، وإذا كان هناك "استرجاع" للقطات ، فيجب أيضًا تحديث الإدخالات المقابلة في fstab.
تقترح البنية المتداخلة من المجلد الفرعي استخدامًا بسيطًا للمجلدات الفرعية بدلاً من بعض الأدلة.
في هذه الحالة ، بالإضافة إلى الجذر الفرعي ، لا يلزم تثبيت أي شيء آخر.الايجابيات:
- جميع الأجزاء الفرعية مرئية ، والهيكل سهل الإدراك ،
- لا تحتاج إلى تحميل أي شيء مرة أخرى ، كل شيء يشبه نظام الملفات "العادي".
سلبيات:
- جميع الأجزاء الفرعية مرئية ، وربما يرغب البعض في الاختباء من المستخدم ،
- من الصعب إزالة / استبدال المادّة الفرعية (سبب ذلك هو ذئاب فرعية متداخلة).
حسنًا ، النهج الثالث مختلط. أنها تنطوي على مزيج من الأولين لتحقيق أقصى قدر من الفوائد على حد سواء. ومع ذلك ، فمن الممكن أن يؤدي هذا النهج المحدد إلى بنية معقدة وصعبة التغيير ومشوشة مع عدد كبير من الإدخالات في fstab. كل هذا يتوقف على رصانة مسؤول النظام.
إضافة / إزالة القرص ، والتوازن
btrfs تفتخر بوظيفة ممتازة - القدرة على "إضافة أجهزة كتلة ساخنة" مباشرة أثناء تشغيل نظام الملفات: btrfs device add /path/to/device /path/to/btrfs
أو حذف: btrfs device remove /path/to/device /path/to/btrfs
بالمناسبة ، في استدعاء / حذف واحد يمكنك تحديد عدة أقراص.مرة أخرى ، المسار المحدد هو المسار لأي مجلد فرعي من btrfs الذي سيتم تطبيق الأمر عليه.دعنا نتحقق من عدد الأجهزة التي تحظرها والتي تسيطر عليها btrfs: btrfs filesystem show /path/to/btrfs Label: none uuid: 52961dda-df84-4e2d-9727-e93e7738df81 Total devices 2 FS bytes used 192.00KiB devid 1 size 20.00GiB used 132.00MiB path /dev/sdc devid 2 size 50.00GiB used 0.00B path /dev/sdd
يخبرنا 0.00B في الحقل المستخدم أن القرص المضافة فارغ. لملء البيانات وفقًا لملف تعريف التسجيل ، يجب عليك التوازن: btrfs balance start /path/to/btrfs
يقوم أمر الرصيد بإعادة توزيع البيانات على الأقراص وفقًا لملف تعريف التسجيل المحدد. على سبيل المثال ، في حالة RAID1 ، سيؤدي الرصيد إلى استنساخ البيانات من الجهاز الأصلي ، وفي حالة RAID0 ، سيؤدي ذلك إلى توزيع أكثر عدلاً للبيانات عبر قرصين ، إلخ.كنتيجة للتوازن ، إذا كانت هناك فراغات على القرص قبل ذلك ، فسيتم كتابة البيانات الموجودة على القرص بطريقة أكثر كثافة ، على سبيل المثال سوف إلغاء التجزئة تتحول. ومع ذلك ، من المهم أن نفهم أن هذا ليس بالضبط "هذا" إلغاء التجزئة. في هذه الحالة ، لا ينظر أمر الرصيد إلى المحتوى المنطقي ، ولكنه يعمل فقط على كتل البيانات. إنها لا تولي اهتماما لحقيقة أن أي ملف ينتشر على القرص. بدلاً من ذلك ، يقوم التوازن بنقل كتل البيانات من مكان إلى آخر. أي
سيبقى ملف مجزأ للتوازن مجزأ بعده. ولكن! ستظل التجزئة على مستوى كتل البيانات تنخفض ، ويمكن استخدام هذا.لتجنب الارتباك ، دعنا نقول هذا: عملية التوازن تقلل من تجزئة على مستوى كتل البيانات ، لكنها لا تؤثر على تجزئة الملف.أيضًا ، يوفر الأمر balance إمكانية تغيير ملف تعريف التسجيل. على سبيل المثال ، تم استخدام ملف تعريف DUP على القرص ، وبعد إضافة القرص قرروا جعل RAID1 الكامل. للقيام بذلك ، استخدم عامل التصفية convert
: btrfs balance start -dconvert=raid1 -mconvert=raid1 /path/to/btrfs
باستخدام الخيار والخيارات -dconvert
، -mconvert
يتم تعيين ملفات تعريف السجلات الجديدة للبيانات والبيانات الوصفية ، على التوالي. يوجد أيضًا خيار -sconvert ، المصمم لتغيير ملف تعريف كتابة بيانات النظام ، ومع ذلك ، سيكون عليك أيضًا إضافة مفتاح التبديل -f (- القوة) لإجبار العملية.بشكل عام ، الغرض الرئيسي من المرشحات هو وضع قواعد لعملية التوازن: أي كتل يجب معالجتها وليس لمسها. لذلك ، على سبيل المثال ، يمكنك فقط التأثير على الكتل المسجلة بملف تعريف تسجيل محدد (ملفات تخصيص الفلتر) ، أو الكتل المشغولة أعلى من نسبة معينة (مرشح الاستخدام) ، أو يمكنك التأثير فقط على مجموعات الكتل المرتبطة بقرص معين (عامل التصفية devid) ، إلخ. بالمناسبة ، لا يزال من الممكن الجمع بينهما. بشكل عام ، قدرات المرشحات واسعة للغاية وهي ضرورية بشكل أساسي لإجراء توازن انتقائي للبيانات.تجزئة
لسوء الحظ ، فإن btrfs ، بسبب بنيتها المعمارية ، معرضة للغاية لظاهرة مثل التجزئة. الحقيقة هي أن البيانات تتم كتابتها دائمًا إلى موقع جديد على القرص. حتى إذا كنت تقرأ الملف ، لا تفعل شيئًا مع البيانات وتكتبه مرة أخرى إلى نفس الملف ، فستنتقل البيانات إلى منطقة جديدة على القرص. يحدث الشيء نفسه إذا قمت بتحديث البيانات في الملف جزئيًا فقط - تتم كتابة التغييرات في منطقة جديدة على القرص. وبالتالي ، فإن التغييرات المتكررة في أجزاء الملفات تكون قوية للغاية ، مما يزيد من "تشتت" الأجزاء ، في الحالة العامة ، عبر عدة أقراص. هذا يؤدي إلى زيادة الحمل على وحدة المعالجة المركزية واستهلاك الذاكرة غير الضرورية. الأكثر تجزئة هي قواعد البيانات والصور الجهاز الظاهري.يمكنك تقييم تجزئة الملف باستخدام الأداة المساعدة filefrag (غير مدرجة في btrfs-progs). filefrag /path/to/your/file
يوضح عدد النطاقات المستخدمة لتخزين الملف. ببساطة - كلما كان عدد المرات أقل ، كلما كان الملف أقل تجزئة.هناك طريقتان لمكافحة التجزئة على btrfs: إلغاء التجزئة والعلم nocow
.يمكن تطبيق إلغاء التجزئة على ملف واحد أو مجلد فرعي / دليل ، بما في ذلك بشكل متكرر. الأمر كما يلي: btrfs filesystem defragment /path/to/file/or/dir
يجب أن أقول إن هذا الفريق لا يؤدي دائمًا إلى النتائج المتوقعة. يمكن تقسيم الملفات الصغيرة والمجزأة قليلاً (10-20 نطاقات) بعد إلغاء التجزئة إلى أجزاء أكثر. بالإضافة إلى ذلك ، يؤدي إلغاء تجزئة btrfs على بعض إصدارات kernel إلى كسر إلغاء البيانات المكررة للملفات ، مما يجعلها نسخًا فعلية حقيقية. أي
سوف تصبح لقطات على المستوى المادي نسخًا كاملة.الطريقة الثانية لمكافحة التجزؤ هي سمة الملف nocow
. chattr +C /path/to/file
nocow
لا يمكن ضبط السمة إلا على ملف جديد أو فارغ. يقوم بتعطيل آلية النسخ عند الكتابة ، لذلك ستعمل btrfs دائمًا مع منطقة قرص ثابتة عند تحديث محتويات الملف ، وكتابة البيانات على المحتويات الموجودة (على المستوى الفعلي). من السلبيات nocow - فإنه يعطل أيضا التحقق من المجموع الاختباري لهذا الملف. وبعبارة أخرى ، لا بقرة - لا الاختباري.بالطبع ، قم بتعيين السمة يدويًاnocow
كل ملف هو مهمة ناكر للجميل. إذا تم تعيين علامة الدليل / المجلد الفرعي ، فإن كل الملفات الجديدة التي تم إنشاؤها فيه سترث العلامة تلقائيًا. ينطبق الشيء نفسه على الدلائل المتداخلة التي تم إنشاؤها. إذا كانت السمة في حالة تشغيل أي بيانات موجودة بالفعل في الدليل ، فلن يؤثر ذلك عليها بأي طريقة - nocow
لا يمكن تعيين السمة إلا على ملف جديد أو فارغ.وهناك طريقة أخرى لتعيين العلامة تلقائيًا nocow
وهي تثبيت نظام الملفات باستخدام الخيار nodatacow
: mount -o subvol=path/to/subvol,nodatacow /dev/sdXX /path/to/mountpoint
سيؤدي هذا الخيار إلى خيار الاتصال تلقائيًا nodatasum
، بحيث لا يتم احتساب المجموع الاختباري للملفات التي تم إنشاؤها حديثًا.كالعادة ، هناك فارق بسيط: لا يمكنك تركيب مضخم صوت واحد فقط مع وجود خيار nocow
. إما أن جميع المجلدات الفرعية سيكون لها خيار nocow
، أو لا شيء. يتم تحديد كل شيء من خلال المجلد الفرعي الأول المُثبت: إذا كان لديه خيار محدد nodatacow
، فستتوفر جميع عمليات التثبيت اللاحقة مع هذا الخيار تلقائيًا.تنشأ لحظة غير واضحة إذا وضعت علامة على ملف nocow
وقمت بإزالة اللقطة من المجلد الفرعي الذي يوجد به هذا الملف. في هذه الحالة ، يتجاهل btrfs العلامة nocow
إذا أشار أكثر من مجلد فرعي إلى كتلة البيانات المحدّثة. لذلك ، على الرغم من العلمnocow
(بالمناسبة ، سيرث الملف أيضًا في اللقطة) ، ستنتقل التغييرات على أي من الملفات إلى منطقة جديدة على القرص ، وسيصبح الملف مجزأًا مرة أخرى. إذا تم تحديث كتلة البيانات الموجودة في الملف عدة مرات ، فعندها ستقع أول مرة في منطقة جديدة على القرص ، وسيتم تحديثها في هذه المنطقة الجديدة "في مكانها" مع الإدخالات اللاحقة.الحيل والفشل
عند استخدام btrfs-progs ، يمكنك حذف الاسم الكامل للأمر: btrfs sub cre = btrfs subvolume create
يكفي مجرد مصادفة الأحرف الأولى التي تحدد الأمر بشكل فريد: su = subvolume, fi = filesystem, ba = balance, de = device;
أعتقد أن المبدأ واضح.للأسف ، لا يمكن btrfs إنشاء لقطة من الدليل ، ولكن هناك حل بديل:لا nocow
يمكنك تعيين السمة إلى ملف بيانات موجود. ومع ذلك ، يمكنك الذهاب بالطريقة التالية:إذا نفدت مساحة btrfs ، فقد يؤدي حذف ملف إلى حدوث خطأ "لا توجد مساحة على الجهاز" . بالنسبة للحل ، يوصى بتوصيل محرك أقراص مؤقت بأحجام لا تقل عن 1 جيجا بايت إلى btrfs. ثم قم بتنظيف البيانات. ثم قم بإزالة محرك الأقراص المؤقت.عملية التوازن ، والناجمة عن دون تسجيل ملامح، وضمنا تغييرها مع الحزب الاتحادي الديمقراطي على RAID1 . ما ، بالمناسبة ، هو مكتوب على صفحة Gotchas . يحدث هذا بعد إضافة إلى btrfs القرص، والذي يستخدم لتسجيل البيانات الشخصية الحزب الاتحادي الديمقراطي . اسمحوا لي أن أذكركم بأن تنسيق محرك واحد في ملفه btrfs يستخدم الحزب الاتحادي الديمقراطي البيانات الفوقية الافتراضية ونظام.ربما الأهم
تجنب إنشاء استنساخ منخفض المستوى لأجهزة الكتل باستخدام btrfs. كونه نظام ملفات "ذكي" ، بالنسبة لبعض العمليات (في معظم الأحيان ، عند التثبيت) ، يعيد btrfs قراءة بيانات النظام على أجهزة الكتلة للعثور على جميع أجزاء نظام الملفات. إذا تم العثور على جهازي كتلة مع نفس UUIDs في عملية البحث ، فسيقبل btrfs هذه الأجهزة كجزء من نفس المثيل. ومع ذلك ، إذا تبين أن هذين الجهازين هو الأصل واستنساخه ، فبعد تثبيت برنامج التشغيل وحده يعرف كيف سيعمل نظام الملفات ، ولكن من الواضح أن هذا لن ينتهي بأي شيء جيد. في أسوأ الحالات ، سيؤدي ذلك إلى تلف بيانات لا رجعة فيه.إذا كنت تريد حقًا استنساخ الأقراص باستخدام btrfs بطريقة منخفضة المستوى ، فيجب توخي الحذر الشديد. بشكل عام ، لا ينبغي أن يكون الاستنساخ مرئيًا لـ kernel OS كجهاز كتلة أثناء وجود الأصل في النظام ، والعكس صحيح. إذا توفر هذا الشرط ، يمكنك تغيير UUID الخاص بالاستنساخ (جيدًا ، أو الأصلي ، هنا اختياري). ستساعد الأداة المساعدة btrfstune التي تأتي مع حزمة btrfs-progs : btrfstune -u /path/to/device
ومرة أخرى: btrfstune ، كونه أداة مساعدة "ذكية" ، سيغير UUID ليس فقط على القرص ، ولكن على نظام الملفات بالكامل. هذا يعني أنه عند الاتصال ، ستقوم بقراءة جميع أجهزة الكتلة من أجل استبدال UUID على جميع الأجهزة المتعلقة بنظام الملفات.بدلا من الاستنتاج
إذا كنت لا تفهم شيئًا في هذه اللحظة - فهذا أمر طبيعي. Btrfs غير تافهة وقد لا تستسلم على الفور. في كل مرة يبدو لي أنني الآن فهمتها ، كانت تفاجئها وجعلتها تعيد التفكير في الأشياء القائمة. لا أستطيع أن أقول إنني فهمت كل شيء في الوقت الحالي - أثناء عملية الكتابة ، وجدت شيئًا جديدًا ، رغم أنني كتبت بالفعل على أساس تجربتي.أود أن أقارن عملية إتقان btrfs مع الانتقال من أسلوب البرمجة الإجرائي إلى الأسلوب الموجه للكائنات. الانطباع الأول هو "نجاح باهر ، كم هو رائع" ، ولكن بعد ذلك تستمر في كتابة التعليمات البرمجية الإجرائية ملفوفة في الفصول الدراسية.في المقال ، حاولت عدم سكب الماء - لكتابة كل شيء عن القضية. على الرغم من هذا ، اتضح بشكل كبير. ولكن أبعد ما يكون عن كل شيء كان من الممكن أن يقول - لا يزال بإمكانك الكتابة والكتابة عن btrfs. هذا المقال هو مجرد غيض من فيض. البداية هي فهم فلسفتها والبدء في استخدامها. والآن حان وقت النهاية.شكرا لك على القراءة حتى النهاية. آمل أن لا أكون متعبة. اكتب التعليقات حول ماذا تريد أن تعرفه.عمل نسخ احتياطية ، أيها السادة. ودعهم لن يأتوا أبداً.