เนื่องจากเป็นระบบปฏิบัติการที่มีผู้ใช้หลายรายและทำงานหลายอย่างพร้อมกัน เมื่อไฟล์ภายใต้ Linux ถูกลบไปแล้ว จะทำให้กู้คืนได้ยาก แม้ว่าคำสั่งลบจะทำเครื่องหมายเฉพาะโหนดไฟล์สำหรับการลบ และไม่ได้ล้างเนื้อหาไฟล์จริงๆ ผู้ใช้รายอื่นและกระบวนการบางอย่างที่เขียนลงดิสก์จะเขียนทับข้อมูลอย่างรวดเร็ว
1. ข้อมูลเบื้องต้นเกี่ยวกับโครงสร้างของระบบไฟล์ Ext2
ในระบบไฟล์ Ext2 ที่ใช้โดย Linux ไฟล์จะถูกจัดเก็บเป็นบล็อก ตามค่าเริ่มต้น ขนาดของแต่ละบล็อกคือ 1K และบล็อกที่แตกต่างกันจะแยกตามหมายเลขบล็อก แต่ละไฟล์ยังมีโหนดซึ่งประกอบด้วยเจ้าของไฟล์ สิทธิ์ในการอ่านและเขียน ประเภทไฟล์ และข้อมูลอื่นๆ สำหรับไฟล์ที่มีขนาดเล็กกว่า 12 บล็อก หมายเลขบล็อกของบล็อกข้อมูลไฟล์จะถูกจัดเก็บไว้ในโหนดโดยตรง หากไฟล์มีขนาดใหญ่กว่า 12 บล็อก โหนดจะจัดเก็บหมายเลขบล็อกของบล็อกทางอ้อมหลังหมายเลขบล็อก 12 บล็อก ในบล็อกที่สอดคล้องกับหมายเลขบล็อกทางอ้อมนี้ หมายเลขบล็อกของบล็อกข้อมูลไฟล์ 256 บล็อกจะถูกจัดเก็บ (แต่ละบล็อกใน Ext2fs ตัวเลขมีขนาด 4 ไบต์ ดังนั้นหมายเลขบล็อกที่สามารถจัดเก็บไว้ในบล็อกได้คือ 1024/4=256) หากมีไฟล์ขนาดใหญ่ บล็อกทางอ้อมรองและบล็อกทางอ้อม ** จะปรากฏในโหนดด้วย
2. วิธีการกู้คืนไฟล์ที่ถูกลบโดยไม่ตั้งใจ
ลีนุกซ์ส่วนใหญ่มีเครื่องมือ debugfs ที่สามารถใช้เพื่อแก้ไขระบบไฟล์ Ext2 แต่ก่อนที่จะใช้เครื่องมือนี้ ยังมีงานที่ต้องทำอยู่บ้าง
ขั้นแรก ติดตั้งพาร์ติชันอีกครั้งซึ่งมีไฟล์ที่ถูกลบโดยไม่ตั้งใจอยู่ในโหมดอ่านอย่างเดียว ใช้คำสั่งต่อไปนี้: (สมมติว่าไฟล์อยู่ในพาร์ติชัน /usr)
mount -r -n -o remount /usr -r บ่งชี้ว่าการติดตั้งแบบอ่านอย่างเดียว -n บ่งชี้ว่าไม่ได้เขียนไปที่ /etc/mtab หากคุณกำลังกู้คืนไฟล์ใน /etc ให้เพิ่มพารามิเตอร์นี้ หากระบบแจ้งว่าพาร์ติชัน xxx ไม่ว่าง คุณสามารถใช้คำสั่ง fuser เพื่อตรวจสอบว่ากระบวนการใดใช้ไฟล์ในพาร์ติชันนี้:
ฟิวเซอร์ –v –m /usr
หากไม่มีกระบวนการที่สำคัญ ให้หยุดกระบวนการเหล่านั้นด้วยคำสั่งต่อไปนี้:
ฟิวเซอร์ -k –v –m /usr
ระบบไฟล์เหล่านี้สามารถติดตั้งใหม่ได้
หากไฟล์ทั้งหมดได้รับการติดตั้งในขนาดใหญ่ / พาร์ติชั่น คุณสามารถใช้ linux single เพื่อเข้าสู่โหมดผู้ใช้คนเดียวที่พร้อมท์การบูต เพื่อลดโอกาสที่ระบบจะเขียนข้อมูลลงในฮาร์ดดิสก์ หรือเพียงแค่วางฮาร์ดดิสก์ไว้ที่ตำแหน่งอื่น . บนเครื่อง นอกจากนี้อย่าเขียนข้อมูลที่กู้คืนไปที่ / ด้านบนเพื่อหลีกเลี่ยงความเสียหายต่อข้อมูลที่เป็นประโยชน์เหล่านั้น หากมี dos/windows บนเครื่อง คุณสามารถเขียนลงในพาร์ติชันเหล่านี้ได้:
เมานต์ –r –n /dev/hda1 /mnt/had
จากนั้นคุณสามารถดำเนินการ debugfs: (สมมติว่า Linux อยู่ใน /dev/hda5)
#debugfs /dev/hda5
ข้อความแจ้ง debugfs debugfs จะปรากฏขึ้น:
ใช้คำสั่ง lsdel เพื่อแสดงข้อมูลเกี่ยวกับไฟล์ที่ถูกลบจำนวนมาก:
| debugfs:lsdel debugfs: พบ inodes ที่ถูกลบ 2692 รายการ บล็อกขนาดโหมดเจ้าของไอโหนด เวลาที่ถูกลบ 164821 0 100600 8192 1/ 1 อาทิตย์ที่ 13 พฤษภาคม 19:22:46 2544 36137 0 100644 4 1/ 1 อังคารที่ 24 เม.ย. 10:11:15 2544 196829 0 100644 149500 38/ 38 จันทร์ที่ 27 พฤษภาคม 13:52:04 2544 |
มีไฟล์หลายรายการอยู่ในรายการ (พบ 2692 ไฟล์ที่นี่) ฟิลด์แรกคือหมายเลขโหนดไฟล์ ฟิลด์ที่สองคือเจ้าของไฟล์ ฟิลด์ที่สามคือสิทธิ์ในการอ่านและเขียน ตามด้วยขนาดไฟล์ จำนวนบล็อกที่ถูกครอบครอง และ เวลาลบ
จากนั้นเราสามารถกำหนดได้ว่าเราต้องการอันไหนโดยพิจารณาจากขนาดไฟล์และวันที่ลบ ตัวอย่างเช่น เราต้องการกู้คืนไฟล์ด้วยโหนด 196829:
คุณสามารถดูสถานะข้อมูลไฟล์ได้ก่อน:
| debugfs:สถิติ <196829> ไอโหนด: 196829 ประเภท: ปกติ โหมด: 0644 ค่าสถานะ: 0x0 เวอร์ชัน: 1 ผู้ใช้: 0 กลุ่ม: 0 ขนาด: 149500 ACL ไฟล์: 0 ACL ไดเรกทอรี: 0 ลิงค์: 0 จำนวนบล็อค: 38 ส่วน: ที่อยู่: 0 หมายเลข: 0 ขนาด: 0 เวลาสูงสุด: 0x31a9a574 -- จันทร์ที่ 27 พฤษภาคม 13:52:04 2544 เวลา: 0x31a21dd1 -- อังคารที่ 21 พฤษภาคม 20:47:29 2544 เวลาสูงสุด: 0x313bf4d7 -- อังคาร 5 มี.ค. 08:01:27 2544 เวลา: 0x31a9a574 -- จันทร์ที่ 27 พฤษภาคม 13:52:04 2544 บล็อก: 594810 594811 594814 594815 594816 594817 ทั้งหมด: 38 |
จากนั้นคุณสามารถใช้คำสั่ง dump เพื่อกู้คืนไฟล์:
debugfs: ดัมพ์ <196829> /mnt/hda/01.sav
นี่จะเป็นการคืนค่าไฟล์ ออกจากการดีบัก:
debugfs: ออก
อีกวิธีหนึ่งคือแก้ไข inode ด้วยตนเอง:
| ดีบัก fs:mi <196829> โหมด [0100644] รหัสผู้ใช้ [0] รหัสกลุ่ม [0] ขนาด [149500] เวลาในการสร้าง [0x31a9a574] เวลาแก้ไข [0x31a9a574] เวลาในการเข้าถึง [0x31a21dd1] เวลาในการลบ [0x31a9a574] 0 จำนวนลิงก์ [0] 1 จำนวนบล็อค [38] ค่าสถานะไฟล์ [0x0] จองแล้ว1[0] ไฟล์ acl [0] ไดเรกทอรีตาม [0] ที่อยู่แฟรกเมนต์ [0] หมายเลขชิ้นส่วน [0] ขนาดชิ้นส่วน [0] บล็อกตรง #0 [594810] บล็อกทางอ้อมสามทาง [0] |
หลังจากใช้คำสั่ง mi ข้อมูลหนึ่งบรรทัดจะปรากฏขึ้นเพื่อแก้ไขในแต่ละครั้ง สำหรับบรรทัดอื่นๆ คุณสามารถกด Enter โดยตรงเพื่อยืนยัน เปลี่ยนเวลาการลบเป็น 0 (ไม่ถูกลบ) และเปลี่ยนจำนวนลิงก์เป็น 1 หลังจากทำการเปลี่ยนแปลงแล้ว ให้ออกจาก debugfs:
debugfs: ออก
จากนั้นตรวจสอบ /dev/hda5 ด้วย fsck
fsck /dev/hda5.fsck
โปรแกรมจะแจ้งว่าพบบล็อกข้อมูลที่สูญหาย แล้วนำไปไว้ใน Lost+found ไฟล์ในไดเร็กทอรีนี้เป็นสิ่งที่เราต้องการ