จะยกเลิกการลบไฟล์ในพาร์ทิชัน btrfs ได้อย่างไร?


20

ฉันจะยกเลิกการลบ (กู้คืน) ไฟล์ที่ถูกลบบนพาร์ติชัน btrfs ได้อย่างไร

ฉันยังไม่ได้ถ่ายรูปเลยดังนั้นฉันจึงใช้คุณสมบัตินั้นไม่ได้ ฉันรู้ว่ามี บาง เครื่องมือ สำหรับระบบไฟล์ Linux อื่น ๆ แต่ google ไม่ได้เปิดใช้ btrfs ใด ๆ ฉันเจอสิ่งที่คลุมเครือว่า btrfs มีเครื่องมือยกเลิกการลบ แต่ฉันหามันไม่เจอ ก่อนที่จะลองใช้เครื่องมือสำหรับระบบไฟล์อื่นฉันกำลังขอที่นี่

ข้อมูลเพิ่มเติม:

  • รีโมตไฟล์ (สอง) ไฟล์ถูกลบโดยรีโมต rsync คำสั่งผิดพลาด
  • นี่เป็นไฟล์ข้อความธรรมดาขนาดเล็ก
  • ฉันรู้ชื่อของไฟล์
  • ฉันอาจจะจำสตริงในไฟล์ได้
  • ดิสก์เป็น HDD ปกติ แต่มีขนาดใหญ่ (2TB)
  • ฉันใช้ Kubuntu 12.04 (beta2) พร้อมอัปเดตล่าสุดทั้งหมด
  • ฉันยังไม่ได้เขียนข้อมูลใหม่ใด ๆ ลงในพาร์ติชันที่ไฟล์ถูกลบ
  • ฉันไม่มีสแนปชอตหรือสำรองไฟล์เหล่านี้ (การสำรองข้อมูลครั้งล่าสุดมีอายุเพียงไม่กี่ชั่วโมงกว่าไฟล์เหล่านี้)
  • น่าแปลกที่ระบบไฟล์ COW ดูเหมือนจะมีตัวเลือกยกเลิกการลบไฟล์น้อยกว่า ext3 / 4 ...

คำตอบ:


8

เนื่องจากไฟล์ของคุณมีขนาดเล็กและข้อความธรรมดาฉันจะลองสแกนเอาต์พุตของ "strings" ลงในอุปกรณ์ที่ระบบไฟล์อยู่เช่น

strings /dev/sda1 | less

จากนั้นใช้ "/" เพื่อค้นหาสตริงที่อาจอยู่ในไฟล์นั้น เมื่อคุณพบข้อความให้คั่นการเริ่มต้นด้วย "m" จากนั้นเลื่อนไปยังจุดสิ้นสุดและใช้ "| cat & gt; file" เพื่อบันทึกลงในไฟล์

ฉันทำอย่างนั้นจริง ๆ เมื่อฉันมีสถานการณ์ที่คล้ายกันในระบบไฟล์อื่นโดยไม่ถูกลบทิ้งเมื่อไม่กี่ปีก่อนและมันก็ใช้ได้ดีสำหรับฉัน


4

Jörg Walter ดำเนินการ btrfs-undelete เชลล์สคริปต์โดยใช้ find-root และ restore เครื่องมือจาก btrfs-progsซึ่งสามารถพบได้ ที่นี่ และควรช่วยเหลือผู้อื่นในตำแหน่งที่คล้ายกัน

เนื่องจากได้รับอนุญาตภายใต้ GPLv2 ฉันจึงไม่สามารถรวมได้


3
น่าสังเกตว่าสคริปต์ดังกล่าวมีเส้นทางอย่างน้อยหนึ่งเส้นทาง hardcoded (อาจสันนิษฐานโดยไม่ได้ตั้งใจ) และมีปัญหาอื่น ๆ อีกสองสามข้อดังนั้นผู้ซื้อระวังว่าจะต้องแก้ไขก่อนใช้งาน
gamen

1
ต่อไปนี้เป็นสคริปต์ต้นฉบับเวอร์ชันที่ล้างแล้ว: gist.github.com/Changaco/45f8d171027ea2655d74
Changaco

"เนื่องจากได้รับอนุญาตภายใต้ GPLv2 ฉันไม่สามารถรวมได้ที่นี่" - บางทีคุณควรอ่านสิ่งที่ GPLv2 พูดเพราะนั่นไม่สมเหตุสมผล
slang

4
@slang คุณควรอ่านข้อกำหนดในการให้บริการของเว็บไซต์นี้หรือไม่? การบริจาคจะต้องได้รับอนุญาตภายใต้ใบอนุญาต Creative Commons Attribution Share Alike 3.0
suriv

@ suriv - ฉันเดาว่าฉันเข้าใจเหตุผลของพวกเขาสำหรับการทำเช่นนั้น แต่มันค่อนข้างน่ารำคาญ โดยเฉพาะอย่างยิ่งเนื่องจาก CC-BY-SA นั้นมีข้อ จำกัด มากกว่า GPL เพียงเล็กน้อยเท่านั้น (นอกเหนือจากสิทธิบัตรของ GPLv3)
Omnifarious

2

หากไดรฟ์ btrfs ของคุณมีไดรฟ์ย่อยคุณจะต้องผ่านส่วนเพิ่มเติม -r <subvol-id> ตัวเลือกที่จะ btrfs restore. น่าเสียดายที่สคริปต์ออกมีเช่นเดียวกับผู้ใช้ 414471 โพสต์ ( http://oelkers.de/tips/undeleteBtrfs.sh ) ไม่มีตัวเลือกสำหรับการทำเช่นนี้ แต่พวกเขาสามารถปรับให้เข้ากับสิ่งนี้ได้

หากคุณต้องการทำสิ่งนี้ด้วยมือคุณจำเป็นต้องได้รับ subvol-id ที่ถูกต้องด้วย:

# mount /dev/sdXY /mnt/blah
# btrfs subvolume list /mnt/blah
# umount /mnt/blah

หรืออีกทางเลือกด้วย:

# btrfs restore -l /dev/sdXY | grep ROOT_ITEM

หลังจากนั้นคุณใช้ btrfs-find-root เพื่อรับหมายเลขบล็อกที่คุณต้องการเปลี่ยนกลับ (โดยปกติจะเป็นหมายเลขที่อยู่ข้างหน้าหมายเลขสูงสุดซึ่งเป็นรูทปัจจุบัน) สำหรับสิ่งนี้คุณต้องตั้งค่า subvolume เริ่มต้นให้เป็นค่าแรกจากที่คุณต้องการเปลี่ยนไฟล์ (และยกเลิกการเปลี่ยนแปลงนี้ภายหลัง)

# mount /dev/sdXY /mnt/blah
# btrfs subvolume set-default <subvol-id> /mnt/blah
# umount /mnt/blah
# btrfs-find-root /dev/sdXY
Well block 4321280 seems great, but generation doesn't match, have=400760, want=400984 level 0
...
Well block 9928704 seems great, but generation doesn't match, have=400764, want=400984 level 1
Well block 1094836224 seems great, but generation doesn't match, have=400983, want=400984 level 1
Found tree root at 1095270400 gen 400984 level 1

ในที่สุดคุณสามารถใช้ btrfs restore กับ -r <subvol-id> สำหรับการกู้คืน (เริ่มแรกด้วยการ --dry-run ถ้าคุณต้องการโต้แย้ง):

# btrfs restore -r <subvol-id> -t 9928704 -v --path-regex '^/(|dir1(|/dir2(|/dir3(|/.*))))$' /dev/sdXY /tmp/recovery

ข้อมูลเพิ่มเติมเกี่ยวกับทั้งหมดนี้ที่นี่: https://btrfs.wiki.kernel.org/index.php/Restore


ทดสอบสิ่งนี้ในระบบ Fedora 26 - และที่นั่น btrfs-find-root ขั้นตอนไม่สิ้นสุด (เช่นทำงานที่ CPU 100% เป็นเวลา 3 ชั่วโมงใน & lt; 250 GB FS) ดูเรื่องที่คล้ายกัน spinics.net/lists/linux-btrfs/msg61361.html .
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.