ما هي البرامج التي ترى عندما لا تستطيع zfs تقديم بيانات غير منضدة؟

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

سؤال

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

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

المحلول

EIO هو في الواقع الإجابة الوحيدة مع تطبيقات ZFS الحالية.

يسأل ZFS Open "BUG" بطريقة ما لقراءة البيانات التالفة:http://bugs.opensolaris.org/bugdatabase/printablebug.do؟bug_id=6186106.

أعتقد أن هذا ممكن بالفعل باستخدام الأداة المساعدة ZDB غير موثقة ولكن مفتوحة. القي نظرة على http://www.cuddletech.com/blog/pivot/entry.php؟id=980. للحصول على تفسيرات حول كيفية تفريغ محتوى الملفات باستخدام خيار ZDB -R و "R".

نصائح أخرى

سولاريس 10:

# Create a test pool
[root@tesalia z]# cd /tmp
[root@tesalia tmp]# mkfile 100M zz
[root@tesalia tmp]# zpool create prueba /tmp/zz

# Fill the pool
[root@tesalia /]# dd if=/dev/zero of=/prueba/dummy_file
dd: writing to `/prueba/dummy_file': No space left on device
129537+0 records in
129536+0 records out
66322432 bytes (66 MB) copied, 1.6093 s, 41.2 MB/s

# Umount the pool
[root@tesalia /]# zpool export prueba

# Corrupt the pool on purpose
[root@tesalia /]# dd if=/dev/urandom of=/tmp/zz seek=100000 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.0715209 s, 7.2 kB/s

# Mount the pool again
zpool import -d /tmp prueba

# Try to read the corrupted data
[root@tesalia tmp]# md5sum /prueba/dummy_file 
md5sum: /prueba/dummy_file: I/O error

# Read the manual
[root@tesalia tmp]# man -s2 read
[...]
RETURN VALUES
     Upon successful completion,  read()  and  readv()  return  a
     non-negative integer indicating the number of bytes actually
     read. Otherwise, the functions return -1 and  set  errno  to
     indicate the error.

ERRORS
     The read(), readv(), and pread() functions will fail if:
[...]
     EIO        A physical I/O error has occurred, [...]

يجب عليك تصدير / استيراد تجمع الاختبار لأنه، إن لم يكن، سيتم تفويت الكتابة فوق الكتابة المباشرة (تلف التجمع) نظرا لأن الملف سيظل مؤقتا في ذاكرة OS.

ولا، سوف ترفض ZFS حاليا إعطائك بيانات تالفة. كما ينبغى.

كيف سيعود أي شيء ولكن EIO خطأ من read() منطقي خارج نظام الملفات المنخفضة مستوى نظام الإنقاذ محددة؟

ستحتاج الأداة المساعدة لانقاذ البيانات المنخفضة إلى استخدام نظام التشغيل OS و FS محددة بخلاف فتح / قراءة / كتابة / قريب من الوصول إلى الملف. تختلف الدلالات التي ستحتاجها بشكل أساسي عن قراءة الملفات العادية، لذلك ستحتاج إلى API متخصص.

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