سؤال

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

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

هل هناك أي طريقة لإلغاء "ذري" لمحاسبة FS ، وجعل لقطة LVM وتركيبها مرة أخرى؟ سيكون على ما يرام إذا كان نظام التشغيل سيمنع جميع النشاط لبضع ثوان للقيام بهذه المهمة. أو ربما نوع من "Sync+Snapshot" الذرية؟ مكالمة kernel؟

لا أعرف ما إذا كان ذلك ممكنًا ...

هل كانت مفيدة؟

المحلول

يجب ألا تضطر إلى فعل أي شيء لمعظم أنظمة ملفات Linux. يجب أن تعمل فقط دون أي جهد على الإطلاق من جانبك. يبحث أمر Snapshot نفسه في أنظمة الملفات المثبتة باستخدام مستوى الصوت الذي يتم تصويره ويطلق على خطاف خاص يتفقدها في حالة متسقة وقابلة للتركيب وتفعل اللقطة ذرية.

جاءت الإصدارات الأقدم من LVM مع مجموعة من تصحيحات قفل VFS التي من شأنها تصحيح أنظمة الملفات المختلفة بحيث يمكن تفتيشها للحصول على لقطة. ولكن مع نواة جديدة يجب أن تكون مدمجة بالفعل في معظم أنظمة ملفات Linux.

هذه مقدمة على لقطات المطالبة بنفس القدر.

ويكشف المزيد من الأبحاث أنه بالنسبة إلى kernels في سلسلة 2.6 ، يجب أن تدعم هذه السلسلة من أنظمة الملفات. reiserfs ربما أيضا. وإذا كنت أعرف أشخاص BTRFS ، فمن المحتمل أن يفعل ذلك أيضًا.

نصائح أخرى

أعلم أن Ext3 و Ext4 في Redhat Enterprise و Fedora و CentOS تلقائيًا نقطة تفتيش عند إنشاء لقطة LVM. هذا يعني أنه لا توجد أي مشكلة في تصاعد اللقطة لأنها نظيفة دائمًا.

أنا يصدق XFS لديه نفس الدعم. لست متأكدًا من أنظمة الملفات الأخرى.

يعتمد ذلك على نظام الملفات الذي تستخدمه. مع XFS يمكنك استخدامه xfs_freeze -f لمزامنة وتجميد FS ، و xfs_freeze -u لتنشيطه مرة أخرى ، حتى تتمكن من إنشاء لقطة من وحدة التخزين المجمدة ، والتي يجب أن تكون حالة حفظ.

لست متأكدًا مما إذا كان هذا سيفعل الخدعة بالنسبة لك ، ولكن يمكنك إعادة تشكيل نظام ملفات على أنه قراءة فقط. mount -o remount,ro /lvm (أو شيء مشابه) سيفعل الخدعة. بعد الانتهاء من اللقطة الخاصة بك ، يمكنك إعادة إعادة الكتابة عن القراءة باستخدام mount -o remount,rw /lvm.

هل هناك أي طريقة لإلغاء "ذري" لمحاسبة FS ، وجعل لقطة LVM وتركيبها مرة أخرى؟

من الممكن أن نلتقاء نظام ملفات مثبتة ، حتى عندما لا يكون نظام الملفات على مستوى مستوى LVM. إذا كان نظام الملفات موجودًا على LVM ، أو يحتوي على مرافق لقطة مدمجة (مثل BTRFS أو ZFS) ، فاستخدمها بدلاً من ذلك.

تعتبر الإرشادات أدناه منخفضة المستوى إلى حد ما ، لكنها قد تكون مفيدة إذا كنت تريد القدرة على لقطة نظام ملفات ليس على مستوى LVM ، ولا يمكنك نقله إلى مستوى LVM جديد. ومع ذلك ، فهي ليست من أجل القلب الخافت: إذا ارتكبت خطأً ، فقد تفسد نظام الملفات الخاص بك. تأكد من التشاور الوثائق الرسمية و dmsetup صفحة الرجل ، تحقق ثلاث مرات الأوامر التي تقوم بتشغيلها ، و لديهم نسخ احتياطية!

يحتوي Linux kernel على منشأة رائعة تسمى Mapper Mapper ، والتي يمكن أن تفعل أشياء لطيفة مثل إنشاء أجهزة كتلة هي "طرق عرض" لأجهزة Block الأخرى ، وبالطبع لقطات. إنه أيضًا ما تستخدمه LVM تحت الغطاء للقيام بالرفع الثقيل.

في الأمثلة أدناه ، سأفترض أنك تريد لقطة /home, ، وهو نظام ملفات Ext4 موجود على /dev/sda2.

أولاً ، ابحث عن اسم جهاز Mapper الجهاز الذي يتم تثبيته على:

# mount | grep home
/dev/mapper/home on /home type ext4 (rw,relatime,data=ordered)

هنا ، اسم جهاز Mapper هو home. إذا لم يبدأ المسار إلى جهاز الكتلة /dev/mapper/, ، ستحتاج إلى إنشاء جهاز Mapper للجهاز ، وإعادة تشغيل نظام الملفات لاستخدام هذا الجهاز بدلاً من قسم HDD. ستحتاج فقط إلى القيام بذلك مرة واحدة.

# dmsetup create home --table "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0"
# umount /home
# mount -t ext4 /dev/mapper/home /home

بعد ذلك ، احصل على جدول Mapper Mapper الخاص بجهاز Block:

# dmsetup table home
home: 0 3864024960 linear 9:2 0

من المحتمل أن تكون أرقامك مختلفة. يجب أن يكون هدف الجهاز linear; ؛ إذا لم يكن لك ، فقد تحتاج إلى أخذ اعتبارات خاصة. إذا لم يكن الرقم الأخير (إزاحة البدء) 0 ، فستحتاج إلى إنشاء جهاز كتلة وسيط (مع نفس الجدول مثل الجدول الحالي) واستخدامه كقاعدة بدلاً من /dev/sda2.

في المثال أعلاه ، home يستخدم جدول إدخال واحد مع linear هدف. ستحتاج إلى استبدال هذا الجدول بجهاز جديد ، والذي يستخدم snapshot هدف.

يوفر Mapper Mapper ثلاثة أهداف للتصوير:

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

  • ال snapshot-origin الهدف ، الذي يرسل كتابة إلى الجهاز الأساسي ، ولكنه يرسل أيضًا البيانات القديمة التي يكتب الكتابة فوقها إلى جهاز البقر المحدد.

عادة ، سوف تصنع home أ snapshot-origin الهدف ، ثم إنشاء بعض snapshot الأهداف فوقها. هذا ما يفعله LVM. ومع ذلك ، فإن طريقة أبسط هي ببساطة إنشاء ملف snapshot الهدف مباشرة ، وهو ما سأظهره أدناه.

بغض النظر عن الطريقة التي تختارها ، أنت لا يجب اكتب إلى الجهاز الأساسي (/dev/sda2) ، أو ستشاهد اللقطات عرضًا تالفًا لنظام الملفات. لذا ، كإجراء احترازي ، يجب عليك وضع علامة على جهاز الكتلة الأساسي على أنه قراءة فقط:

# blockdev --setro /dev/sda2

لن يؤثر ذلك /home تشغيل /dev/mapper/home, ، لا ينبغي أن يكون لها تأثير ملحوظ.

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

# dd if=/dev/zero bs=1M count=0 seek=32768 of=/home_cow
# losetup --find --show /home_cow
/dev/loop0

من الواضح أن الملف المتناثر لا ينبغي أن يكون على نظام الملفات الذي تقوم بتصويره :)

يمكنك الآن إعادة تحميل جدول الجهاز وتحويله إلى جهاز لقطة:

# dmsetup suspend home && \
  dmsetup reload home --table \
    "0 $(blockdev --getsz /dev/sda2) snapshot /dev/sda2 /dev/loop0 PO 8" && \
  dmsetup resume home

إذا نجح ذلك ، يكتب نيو /home يجب الآن تسجيل في /home_cow ملف ، بدلاً من كتابته إلى /dev/sda2. تأكد من مراقبة حجم ملف البقرة ، وكذلك المساحة الحرة على نظام الملفات الذي يظهر ، لتجنب نفاد مساحة البقرة.

بمجرد أن لا تحتاج إلى لقطة ، يمكنك دمجها (لالتزام التغييرات في ملف البقر بشكل دائم على الجهاز الأساسي) ، أو تجاهلها.

  • لدمجها:

    1. استبدل الجدول بـ snapshot-merge الهدف بدلا من أ snapshot هدف:

      # dmsetup suspend home && \
        dmsetup reload home --table \
          "0 $(blockdev --getsz /dev/sda2) snapshot-merge /dev/sda2 /dev/loop0 P 8" && \
        dmsetup resume home
      
    2. بعد ذلك ، راقب حالة الدمج حتى يتم دمج جميع كتل غير ميتاداتا:

      # watch dmsetup status home
      ...
      0 3864024960 snapshot-merge 281688/2097152 1104
      

      لاحظ الأرقام الثلاثة في النهاية (x/yz). يكتمل الدمج عند x = z.

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

      # dmsetup suspend home && \
        dmsetup reload home --table \
          "0 $(blockdev --getsz /dev/sda2) linear /dev/sda2 0" && \
        dmsetup resume home
      
    4. الآن يمكنك تفكيك جهاز الحلقة:

      # losetup -d /dev/loop0
      
    5. أخيرًا ، يمكنك حذف ملف البقرة.

      # rm /home_cow
      
  • لتجاهل اللقطة ، unmount /home, ، اتبع الخطوات 3-5 أعلاه ، وقم بإعادة التدوير /home. على الرغم من أن جهاز Mapper سيسمح لك بالقيام بذلك دون إلغاء التثبيت /home, ، ليس من المنطقي (نظرًا لأن حالة تشغيل البرامج في الذاكرة لن تتوافق مع حالة نظام الملفات بعد الآن) ، ومن المحتمل أن تفسد نظام الملفات الخاص بك.

الفساد FS "غير مرجح للغاية" ، طالما أنك لا تعمل أبدًا في أي نوع من البيئة المهنية. وإلا فإنك ستلتقي بالواقع ، وقد تحاول إلقاء اللوم على "Bit Rot" أو "الأجهزة" أو أي شيء آخر ، لكن كل ذلك يعود إلى عدم المسؤولية. تجميد/ذوبان (كما ذكرنا عدة مرات ، وفقط إذا تم استدعاؤه بشكل صحيح) كافية الخارج بيئات قاعدة البيانات. بالنسبة لقواعد البيانات ، لا يزال لديك نسخة احتياطية لإكمال المعاملات ، وإذا كنت تعتقد أن النسخة الاحتياطية التي تراجع بعض المعاملات تكون جيدة عند استعادتها: انظر بدء الجملة. اعتمادًا على النشاط الذي قد تضافته للتو اخر من 5 إلى 10 دقائق من التوقف عن العمل إذا كنت بحاجة إلى تلك النسخ الاحتياطي.معظم منا يمكن أن تحمل ذلك بسهولة ، ولكن لا يمكن أن تكون نصيحة عامة.كن صادقا بشأن الجوانب السلبية ، الرجال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top