كيف يمكن للمرء استعادة الكتل الصفرت من ملف متناثر؟

StackOverflow https://stackoverflow.com/questions/1982749

سؤال

النظر في ملف متناثر مع 1S مكتوب إلى جزء من الملف.

أرغب في استعادة المساحة الفعلية على القرص لهذه 1s لأنني لم أعد بحاجة إلى هذا الجزء من الملف المتفرق. يجب أن يصبح جزء الملف الذي يحتوي على هذه 1s "ثقبًا" كما كان قبل كتابة 1S.

للقيام بذلك ، قمت بمسح المنطقة إلى 0s. هذا لا ليس استعادة الكتل على القرص.

كيف أقوم بالفعل بعمل الملف المتفرق ، حسناً ، متفرق مرة أخرى؟

هذا السؤال مشابه ل هذا ولكن لا توجد إجابة مقبولة لهذا السؤال.

النظر في التسلسل التالي للأحداث التي يتم تشغيلها على خادم Linux الأسهم:

$ cat /tmp/test.c
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char **argv) {
    int fd;
    char c[1024];

    memset(c,argc==1,1024);

    fd = open("test",O_CREAT|O_WRONLY,0777);
    lseek(fd,10000,SEEK_SET);
    write(fd,c,1024);
    close(fd);

    return 0;
}

$ gcc -o /tmp/test /tmp/test.c

$ /tmp/test

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002710  01 01 01 01 01 01 01 01  01 01 01 01 01 01 01 01  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

$ /tmp/test clear

$ hexdump -C ./test
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002b10

$ du -B1 test; du -B1 --apparent-size test
4096        test
11024       test

# NO CHANGE IN SIZE.... HMM....

تعديل -

اسمحوا لي أن أتأهل أيضًا أنني لا أريد إعادة كتابة الملفات ونسخ الملفات وما إلى ذلك فى الموقع, ، سواء كان الأمر كذلك ، لكني أود تحديد ما إذا كان هذا ممكنًا بالفعل أم لا. يبدو مثل "لا ، إنه ليس" في هذه المرحلة. أفترض أنني أبحث عن sys_punchhole للينكس (المناقشات التي تعثرت عليها للتو).

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

المحلول

في الوقت الحالي ، يبدو أن NTFS يدعم فقط ضرب الثقب. لقد كانت هذه مشكلة تاريخيا عبر معظم أنظمة الملفات. Posix على حد علمي ، لا يحدد واجهة نظام التشغيل لكمة الثقوب ، لذلك لا يوجد أي من أنظمة ملفات Linux القياسية لديها دعم لها. NetApp يدعم الثقب من خلال Windows فيه WAFL نظام الملفات. هناك منشور مدونة لطيف حول هذا هنا.

بالنسبة لمشكلتك ، كما أوضح الآخرون ، فإن الحل الوحيد هو نقل الملف الذي يترك الكتل التي تحتوي على الأصفار. نعم سيكون بطيئًا. أو اكتب امتدادًا لنظام الملفات الخاص بك على Linux يقوم بذلك و إرسال أ تصحيح إلى الناس الطيبين في فريق Linux kernel. ؛)

تعديل: يبدو أن XFS يدعم ثقب. الشيك هذا الموضوع.

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


إخلاء المسئولية: افعل هذا على مسؤوليتك الخاصة. أنا لست مسؤولاً عن أي فقدان البيانات الذي تتحمله. ;)

نصائح أخرى

يبدو كما لو أن Linux أضاف syscall تسمى fallocate ل "اللكم الثقوب" في الملفات. يبدو أن التطبيقات في أنظمة الملفات الفردية تركز على القدرة على استخدام هذا لتخصيص عدد أكبر من الكتل المستمرة.

هناك أيضا posix_fallocate استدعاء هذا التركيز فقط على الأخير ، وليس قابلاً للاستخدام في ثقب الثقب.

رون يورستون يقدم العديد من الحلول ؛ لكنهم جميعا ينطويون على تصاعد FS للقراءة فقط (أو إلغاء تثبيتها) بينما يحدث التباين ؛ أو إنشاء ملف متناثر جديد ، ثم ينسخ عبر هذه القطع الأصلية التي ليست فقط 0s ، ثم استبدال الملف الأصلي بالملف المُصنّع حديثًا.

يعتمد الأمر حقًا على نظام الملفات الخاص بك. لقد رأينا بالفعل أن NTFS يتعامل مع هذا. أتصور أن أيًا من أنظمة الملفات الأخرى قوائم ويكيبيديا نظرًا لأن التعامل مع الضغط الشفاف من شأنه أن يفعل نفس الشيء تمامًا - وهذا ، بعد كل شيء ، يعادل ضغط الملف بشفافية.

بعد أن يكون لديك "صفر" بعض المناطق من الملف ، عليك أن تخبرنا بنظام الملفات بأن هذه المنطقة الجديدة تهدف إلى أن تكون منطقة متناثرة. لذلك في حالة NTFS ، يجب عليك الاتصال بـ DeviceIocontrol () لتلك المنطقة مرة أخرى. على الأقل أفعل بهذه الطريقة في فائدتي: "sparse_checker"

بالنسبة لي المشكلة الأكبر هي كيفية ضبط المنطقة المتفرقة :).

يعتبر

بهذه الطريقة رخيصة ، لكنها تعمل. : p

  1. اقرأ في جميع البيانات التي تتجاوز الفتحة التي تريدها ، أو في الذاكرة (أو ملف آخر ، أو أي شيء آخر).
  2. اقتطاع الملف إلى بداية الحفرة (ftruncate هو صديقك).
  3. ابحث إلى نهاية الحفرة.
  4. اكتب البيانات مرة أخرى.

umount نظام الملفات الخاص بك وتحرير نظام الملفات مباشرة بطريقة مماثلة depugfs أو FSCK. عادة ما تحتاج إلى برنامج تشغيل لكل FS المستخدمة.

يبدو أن كتابة الأصفار (كما في السؤال المشار إليه) إلى الجزء الذي أنجزته هو شيء منطقي لتجربته. هنا رابط لسؤال MSDN للملفات المتفرقة NTFS التي تفعل ذلك فقط "لإصدار" الجزء "غير المستخدم". ymmv.

http://msdn.microsoft.com/en-us/library/ms810500.aspx

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