Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
btrfs_fixes — गंभीर extent tree भ्रष्टाचार के लिए कस्टम BTRFS मरम्मत उपकरण जहाँ btrfs check --repair विफल होता है (segfault, loop, या deadlock) | Kitploit
उपकरण/GitHubGitHub/msedek/btrfs_fixes
भेद्यता विश्लेषणफोरेंसिकडेटा रिकवरीपेपर और शोधलर्निंग और शिक्षा
GitHubmsedek/btrfs_fixes

btrfs_fixes

गंभीर extent tree भ्रष्टाचार के लिए कस्टम BTRFS मरम्मत उपकरण जहाँ btrfs check --repair विफल होता है (segfault, loop, या deadlock)

रिपॉजिटरी देखें
94 महीने पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

btrfs_fixes: कस्टम BTRFS मरम्मत उपकरण

12TB मल्टी-डिवाइस BTRFS पूल की रिकवरी के दौरान लिखे गए कस्टम टूल्स, जिसमें गंभीर एक्सटेंट ट्री भ्रष्टाचार था, जिसे मूल कमांड (btrfs check --repair, --init-extent-tree, आदि) मरम्मत नहीं कर सके।

इस रिकवरी का संरचित केस स्टडी, मूल कारण वर्गीकरण और अपस्ट्रीम btrfs-progs में सुधारों के लिए रचनात्मक प्रस्ताव देखने के लिए INCIDENT-ANALYSIS.md देखें।

इन उपकरणों का उपयोग कब करें

इन उपकरणों का उपयोग केवल तब करें जब btrfs check --repair सेगफॉल्ट करता है, अनंत लूप में चला जाता है, या फाइलसिस्टम को पहले से भी बदतर स्थिति में छोड़ देता है।

प्रलेखित मामले जहां ये मदद करते हैं:

  • btrfs check --repair [3/8] checking extents पर सेगफॉल्ट करता है (Issue #525)
  • btrfs check --init-extent-tree डेडलॉक करता है
  • btrfs check --repair समान मरम्मत दोहराते हुए अनंत लूप में चला जाता है
  • हजारों METADATA_ITEMs के साथ एक्सटेंट ट्री जिनमें गलत owner/level/generation होता है
  • FS_TREE में पुराने चाइल्ड पॉइंटर्स जो अन्य पेड़ों द्वारा पुनः उपयोग किए गए ब्लॉकों को संदर्भित करते हैं
  • पूल केवल rescue=all,ro के साथ माउंट होता है, RW माउंट करने में विफल रहता है

ये उपकरण हल्के भ्रष्टाचार के लिए नहीं हैं। सामान्य क्षति के लिए पहले btrfs check --repair का प्रयास करें।

चेतावनियाँ

  • --write वाले किसी भी उपकरण को चलाने से पहले मेटाडेटा का बैकअप लें:
    root@kitploit:~
    for DEV in sda1 sdb1 sdc1; do
      sudo dd if=/dev/$DEV of=sb_${DEV}.bin bs=4096 count=1 skip=16
    done
    
  • ये उपकरण फाइलसिस्टम में अपरिवर्तनीय परिवर्तन करते हैं
  • सभी डिफ़ॉल्ट रूप से केवल-स्कैन मोड में होते हैं (--write ऑप्ट-इन है)
  • इन उपकरणों को चलाते समय फाइलसिस्टम अनमाउंटेड होना चाहिए
  • EEXIST पैच लागू के साथ btrfs-progs v6.19.1 या समान आवश्यक है

बिल्ड

उपकरण आंतरिक btrfs-progs API का उपयोग करते हैं और btrfs-progs स्रोत ट्री के अंदर बनाए जाने चाहिए:

root@kitploit:~
# 1. btrfs-progs क्लोन करें
git clone --depth 1 --branch v6.19.1 https://github.com/kdave/btrfs-progs.git
cd btrfs-progs

# 2. EEXIST पैच लागू करें (बैच बैकरेफ़ इंजेक्शन के लिए आवश्यक)
patch -p1 < path/to/btrfs_fixes/patches/alloc_reserved_tree_block_eexist.patch

# 3. आधार btrfs-progs कॉन्फ़िगर और बनाएं
./autogen.sh
./configure
make -j$(nproc)

# 4. इस रेपो से .c फ़ाइलों को btrfs-progs निर्देशिका में कॉपी करें
cp path/to/btrfs_fixes/programs/*.c .

# 5. प्रत्येक प्रोग्राम के लिए Makefile में जोड़ें:
echo '
PROGNAME: PROGNAME.o $(objects) $(libs_shared)
	@echo "  [LD]    $@"
	$(Q)$(CC) -o $@ PROGNAME.o $(objects) $(libs_shared) $(LDFLAGS) $(LIBS)
' >> Makefile

# 6. बिल्ड करें
make PROGNAME

उपकरण

अनुशंसित निष्पादन क्रम:

1. scan_and_fix_all_backrefs.c (सबसे महत्वपूर्ण)

सबसे महत्वपूर्ण उपकरण। फाइलसिस्टम में प्रत्येक ट्री (ROOT, CHUNK, EXTENT, FS, DEV, CSUM, UUID, FREE_SPACE) पर पुनरावर्ती रूप से चलता है और उन मेटाडेटा ब्लॉकों का पता लगाता है जिनमें एक्सटेंट ट्री में METADATA_ITEM बैकरेफ़ गायब है। एकल लेन-देन में सभी गायब बैकरेफ़ इंजेक्ट करता है ताकि "रूट ट्री कमिट के बीच स्थानांतरित होने" की समस्या से बचा जा सके।

उपयोग:

root@kitploit:~
sudo ./scan_and_fix_all_backrefs /dev/sdX          # केवल स्कैन
sudo ./scan_and_fix_all_backrefs /dev/sdX --write  # स्कैन + इंजेक्ट

2. fix_owner_refs.c

इनलाइन TREE_BLOCK_REF में owner को ठीक करता है जब वह ब्लॉक के वास्तविक btrfs_header_owner() से मेल नहीं खाता। विफल मरम्मत के दौरान ब्लॉकों को पेड़ों के बीच पुनः असाइन किए जाने पर बेमेल होता है।

root@kitploit:~
sudo ./fix_owner_refs /dev/sdX          # स्कैन
sudo ./fix_owner_refs /dev/sdX --write  # ठीक करें

3. fix_bad_levels.c

गलत स्तर वाले METADATA_ITEM और EXTENT_ITEM प्रविष्टियों को ठीक करता है। भ्रष्ट स्तर (जैसे 50, 55, 237) btrfs check --repair के लूप में प्रवेश करने के बाद छोड़े गए कचरे हैं। ब्लॉक के वास्तविक btrfs_header_level() के विरुद्ध सत्यापित किया जाता है।

root@kitploit:~
sudo ./fix_bad_levels /dev/sdX          # स्कैन
sudo ./fix_bad_levels /dev/sdX --write  # ठीक करें

4. fix_duplicate_extents.c

डुप्लिकेट METADATA_ITEMs (समान bytenr, कुंजी में अलग-अलग स्तर) को हटाता है। वह रखता है जिसका स्तर btrfs_header_level से मेल खाता है और दूसरे को हटा देता है।

root@kitploit:~
sudo ./fix_duplicate_extents /dev/sdX          # स्कैन
sudo ./fix_duplicate_extents /dev/sdX --write  # डुप्लिकेट हटाएं

5. remove_stale_ptrs.c

FS_TREE के प्रत्येक स्तर-1 नोड को स्कैन करता है। तीन जांचों का उपयोग करके पुराने चाइल्ड पॉइंटर्स का पता लगाता है: मालिक बेमेल, first_key बेमेल, या एक first_key जिसका प्रकार FS_TREE के लिए अमान्य है (जैसे BLOCK_GROUP_ITEM)। उन्हें btrfs_del_ptr से हटाता है।

root@kitploit:~
sudo ./remove_stale_ptrs /dev/sdX          # स्कैन
sudo ./remove_stale_ptrs /dev/sdX --write  # हटाएं

6. fix_uuid_tree.c / fix_csum_tree.c

UUID ट्री / CSUM ट्री के लिए क्रमशः एक खाली लीफ बनाता है। तब उपयोगी जब ROOT_ITEM एक ऐसे ब्लॉक की ओर इशारा करता है जिसे किसी अन्य ट्री को पुनः असाइन किया गया हो। कर्नेल RW माउंट पर UUID ट्री को स्वचालित रूप से पुनर्जीवित करता है। खाली CSUM ट्री के साथ, NODATASUM चिह्नित फ़ाइलें सत्यापन में विफल नहीं होती हैं।

root@kitploit:~
sudo ./fix_uuid_tree /dev/sdX
sudo ./fix_csum_tree /dev/sdX

7. set_nodatasum.c

नियमित फ़ाइल inodes पर BTRFS_INODE_NODATASUM फ्लैग सेट करता है। इसका उपयोग करें यदि csum ट्री खाली है लेकिन फ़ाइलों में अभी भी अपेक्षित चेकसम हैं, जिससे पढ़ने में त्रुटियां होती हैं। NODATASUM के साथ, कर्नेल csum लुकअप छोड़ देता है।

root@kitploit:~
sudo ./set_nodatasum /dev/sdX          # स्कैन
sudo ./set_nodatasum /dev/sdX --write  # लागू करें

8. fix_fstree_node.c

हार्डकोडेड पुराने ब्लॉकों की सूची वाला संस्करण। remove_stale_ptrs को प्राथमिकता दें, जो उन्हें स्वचालित रूप से पहचानता है। इसका उपयोग केवल तभी करें जब आपको किन विशिष्ट ब्लॉकों को हटाना है, इस पर मैन्युअल नियंत्रण की आवश्यकता हो।

9. add_backrefs.c

गायब बैकरेफ़ की हार्डकोडेड सूची वाला प्रारंभिक संस्करण। scan_and_fix_all_backrefs को प्राथमिकता दें, जो उन्हें स्वचालित रूप से पहचानता है।

सत्र 2 उपकरण सेट (2026-04-04/05): बड़े पैमाने पर भ्रष्टाचार के लिए विस्तारित रिकवरी

जब उपरोक्त आधार उपकरण अपर्याप्त थे (200K+ त्रुटियों वाला पूल अनेक पेड़ों में फैली हुई), तो ये अतिरिक्त उपकरण बनाए गए:

scan_fstree_extents.c + scan_extent_tree.c

पास 1 और पास 2 स्कैनर जो क्रमशः FS_TREE और एक्सटेंट ट्री पर चलते हैं, प्रत्येक रेफ/एक्सटेंट मैपिंग के साथ TSV फ़ाइलें उत्पन्न करते हैं। rebuild_extent_tree_apply के लिए इनपुट बनाने के लिए उपयोग किया जाता है जब एक्सटेंट ट्री को स्क्रैच से पुनर्निर्मित करने की आवश्यकता होती है।

rebuild_extent_tree_apply.c (भारी लेखक)

मुख्य चरण 3 लेखक। रेफ़ की पहले से मुड़ी हुई सूची (scan_fstree_extents + scan_extent_tree अंतर से) लेता है और 3M+ EXTENT_DATA_REFs को एक्सटेंट ट्री में प्रति लेन-देन 5000 के टुकड़ों में इंजेक्ट करता है। DM-SMR री-शिंगल स्टाल से बचने के लिए प्रत्येक 50K आइटम के बाद थ्रॉटल करता है। 3× WD40EFAX SMR डिस्क पर लगभग 34 मिनट में 3,248,617 इंसर्ट पर सफलतापूर्वक सत्यापित।

root@kitploit:~
sudo ./rebuild_extent_tree_apply /dev/sdX1 refs_folded.txt to_insert.txt watermark.txt --dryrun
sudo ./rebuild_extent_tree_apply /dev/sdX1 refs_folded.txt to_insert.txt watermark.txt --write

patch_block_group_used.c

BLOCK_GROUP_ITEM.used के लिए सर्जिकल सिंगल-फील्ड पैचर जब फेज 3 लेखक पूर्व-मौजूदा ओवरलैपिंग file_extent_items के कारण किसी विशिष्ट bg को ओवरशूट के साथ छोड़ देता है। btrfs_update_block_group space_info अकाउंटिंग (जो हम यहां नहीं चाहते) से बचने के लिए btrfs_set_block_group_used डायरेक्ट सेटर का उपयोग करता है। flags & BTRFS_BLOCK_GROUP_DATA को पूर्व-सत्यापित करता है।

root@kitploit:~
sudo ./patch_block_group_used /dev/sdX1 <bg_bytenr> <bg_length> <new_used> --write

remove_extent_items_by_key.c

एक्सटेंट ट्री से (bytenr, num_bytes, expected_inode) की हार्डकोडेड सूची वाले EXTENT_ITEMs को हटाता है। एकल लीफ में ओवरलैपिंग पुराने एक्सटेंट को साफ करने के लिए उपयोग किया जाता है जो RO माउंट को रोकते हैं। हटाने से पहले प्रति-आइटम सैनिटी चेक (इनोड अनुमति सूची सहित 7 इन्वेरिएंट)। rebuilding_extent_tree=1 + reinit_extent_tree=true के साथ चलता है ताकि space अकाउंटिंग को छोड़ा जा सके (कॉलर पहले patch_block_group_used के माध्यम से used को मैन्युअल रूप से पैच करता है)।

clean_orphan_dir_entries.c

FS_TREE से अनाथ DIR_ITEM + DIR_INDEX प्रविष्टियों को साफ करता है। प्रति लेन-देन 100 प्रविष्टियों के टुकड़े। पैरेंट INODE_ITEM i_size को अपडेट करता है (namelen × 2 से घटाएं: महत्वपूर्ण बग फिक्स: v1 केवल namelen से घटा रहा था, जिससे डीआईआर अमान्य स्थिति में रह गए)। महत्वपूर्ण शीर्ष-स्तरीय निर्देशिका नामों (जैसे pelis, series, music, backups, homestorage) के लिए हार्डकोडेड बहिष्करण सूची। i_size को कभी भी कच्चे namelen से घटाएं नहीं: BTRFS namelen × 2 अकाउंटिंग संग्रहीत करता है।

clean_orphan_inode_refs.c

FS_TREE पर INODE_REF आइटमों के लिए चलता है जिनका key.offset (पैरेंट inode) एक अनाथ पैरेंट सूची में है। INODE_EXTREF को छोड़ देता है झूठी सकारात्मकता से बचने के लिए (EXTREF का key.offset एक हैश है, पैरेंट आईडी नहीं)। प्रति लेन-देन 32 के टुकड़े।

fix_dir_inode_counts.c

i_size = sum(name_len × 2) और nlink = 1 की पुनर्गणना उन DIR inodes के लिए करता है जिनके काउंट पिछले अनाथ सफाई बगों से दूषित हो गए थे। सुरक्षा के लिए महत्वपूर्ण: यदि किसी DIR का nlink = 2 है, तो उसके पथ पर एक भी rm -rf चुपचाप हजारों उपनिर्देशिकाओं को हटा देगा (rmdir बम)। DIR_INDEX प्रविष्टियों पर चलता है, हैश टकराव का पता लगाने के लिए DIR_ITEM को क्रॉस-चेक करता है (अनुभवजन्य रूप से 0 टकराव सत्यापित)।

remove_orphan_inode_subtrees.c

FS_TREE से अनाथ inode सबट्री (DIR परिवार + स्टैंडअलोन REGs) हटाता है। प्रत्येक लक्ष्य के लिए: EXTENT_DATA, INODE_REF, INODE_EXTREF, XATTR, और अंत में INODE_ITEM को चलता है और हटाता है। प्रति DIR परिवार लेन-देन (प्रति सबट्री परमाणु), स्टैंडअलोन REGs के लिए 50 के टुकड़े। हार्डकोडेड पैरानॉइड बहिष्करण सूची।

⚠️ प्रमुख सुरक्षा सावधानी: नीचे "बुलेटप्रूफ सबसेट मापदंड" देखें।

remove_stale_ptrs_v2.c

remove_stale_ptrs का बेहतर संस्करण: खाली लीफ को parent expected_key से पहचानता है (v1 ने इस मामले को छोड़ दिया था), पुनरावर्ती 2-स्तरीय स्कैन (रूट→level1 + level1→लीव्स), डायनामिक बफर (कोई 512 सीमा नहीं), read_tree_block विफलताओं को सहन करता है।

insert_one_extent_poc.c

सत्यापन के साथ एकल एक्सटेंट इंसर्शन का PoC। rebuild_extent_tree_apply चलाने से पहले API पथ को मान्य करने के लिए उपयोग किया जाता है।

बुलेटप्रूफ सबसेट मापदंड (महत्वपूर्ण)

2026-04-05 सत्र के दौरान, remove_orphan_inode_subtrees एक ही BUG_ON अभिकथन पर दो बार क्रैश हुआ, दो अलग-अलग कारणों से:

क्रैश वेक्टर 1: MIXED लीफ (gen 3601, जिसमें अनाथ और जीवित inodes दोनों हैं) पर डायरेक्ट btrfs_cow_block(leaf) → update_ref_for_cow बच्चों पर चलता है → पुराने सिबलिंग बच्चों पर __btrfs_mod_ref(inc=1) → btrfs_free_extent(phantom) -ENOENT लौटाता है → BUG_ON → SIGABRT।

क्रैश वेक्टर 2 (बाद में पता चला, फ़िल्टरिंग द्वारा टाला गया): btrfs_del_items पोस्ट-पर्ज एक लीफ को LEAF_DATA_SIZE/4 = 4096 बाइट्स से नीचे निकाल देता है → push_leaf_left(sibling) या push_leaf_right(sibling) को आमंत्रित करता है → यदि sibling का gen ≤ last_snapshot = 3701 है, तो btrfs_block_can_be_shared 1 लौटाता है → update_ref_for_cow refs > 1 पथ में प्रवेश करता है → btrfs_inc_ref(cow_sibling, 0) → __btrfs_mod_ref(cow, level=0, inc=1) → पुराने sibling के सभी EXTENT_DATAs पर पुनरावृति करता है → btrfs_inc_extent_ref(phantom_bytenr) → extent-tree.c:1302 पर BUG_ON(err) → SIGABRT।

फ़्लैग fs_info->rebuilding_extent_tree = 1 और trans->reinit_extent_tree = true INC पथ को नहीं बचाते: वे केवल BTRFS_DROP_DELAYED_REF को छूट देते हैं (extent-tree.c:3885 में सत्यापित)। BTRFS_ADD_DELAYED_REF (btrfs_inc_ref से) घातक है।

किसी भी लक्ष्य inode के लिए बुलेटप्रूफ मापदंड जिसे हटाया जाएगा:

  1. inode के INODE_ITEM को होस्ट करने वाली लीफ का gen > 3701 (पोस्ट-क्रैश)
  2. लीफ के पैरेंट level-1 का gen > 3701
  3. पोस्ट-पर्ज अनुमानित used बाइट्स > 4096 (कोई रीबैलेंस ट्रिगर नहीं)
  4. पैरेंट नोड में सभी तत्काल सिबलिंग्स का gen > 3701 (भले ही शर्त 3 विफल हो, पोस्ट-क्रैश सिबलिंग्स में रीबैलेंस सुरक्षित है)
  5. कोई भी बैकरेफ़ लक्ष्य (EXTENT_DATA disk_bytenr) वर्तमान एक्सटेंट ट्री में हल करता है (बैकरेफ़ लुकअप पर कोई -ENOENT नहीं)

शर्त 3+4 में से किसी का उल्लंघन क्रैश वेक्टर 2 को ट्रिगर करता है। शर्त 5 को reinit_extent_tree द्वारा DROP के लिए माफ किया जाता है लेकिन INC के लिए नहीं (जो push_leaf_left आमंत्रित करता है)।

अनुभवजन्य सत्यापन पैटर्न

किसी भी उम्मीदवार अनाथ inode सेट के लिए, FS_TREE डंप पर चलें और प्रत्येक लक्ष्य लीफ को 5 बुलेटप्रूफ शर्तों द्वारा वर्गीकृत करें। उदाहरण पैटर्न (अनामीकृत):

जहां ≥90% आइटम अनाथ हैं, ऐसी लीव्स खतरे का क्षेत्र हैं: वे निश्चित रूप से रीबैलेंस थ्रेशोल्ड (LEAF_DATA_SIZE/4 = 4096 बाइट्स) से नीचे खाली होंगी, जिससे push_leaf_left/right मजबूर होगा। यदि पैरेंट नोड में कोई भी तत्काल सिबलिंग का gen ≤ last_snapshot है, तो पुश उस सिबलिंग पर CoW ट्रिगर करता है, जो btrfs_block_can_be_shared → refs > 1 → btrfs_inc_ref → __btrfs_mod_ref(inc=1) पथ में प्रवेश करता है और btrfs_inc_extent_ref में BUG_ON(err) के साथ क्रैश करता है।

शमन: इनपुट फ़ाइल से आपत्तिजनक inodes को बाहर करें। उपकरण जो कुछ भी प्री-फ्लाइट सत्यापन पास करता है उसे संसाधित करता है; मिश्रित सुरक्षित/असुरक्षित लक्ष्यों वाली लीव्स को केवल सुरक्षित उपसमुच्चय को सूचीबद्ध करके आंशिक रूप से संसाधित किया जा सकता है। प्रति-परिवार लेन-देन शब्दार्थ का मतलब है कि प्रत्येक सुरक्षित परिवार परमाणु रूप से प्रतिबद्ध होता है, भले ही अन्य परिवारों को बाहर रखा गया हो।

एक सत्र से अनुभवजन्य परिणाम: N उम्मीदवार अनाथों से शुरू करके, सभी 5 शर्तों को लागू करने के बाद अंतिम सुरक्षित उपसमुच्चय इनपुट का लगभग 14% था, लेकिन उस उपसमुच्चय ने एक भी BUG_ON के बिना प्रतिबद्ध किया, जिसमें प्री-राइट कैप्चर की गई लाइव फ़ाइलों के आधारभूत sha256 पर 0-बाइट अंतर था।

पैच: alloc_reserved_tree_block में EEXIST

patches/alloc_reserved_tree_block_eexist.patch btrfs-progs को संशोधित करता है ताकि जब alloc_reserved_tree_block METADATA_ITEM पहले से मौजूद पाए, तो वह EEXIST को प्रचारित करने के बजाय 0 लौटाए। बैच बैकरेफ़ इंजेक्शन के काम करने के लिए यह आवश्यक है: कई बैकरेफ़ इंजेक्ट करते समय, विलंबित रेफ़ प्रणाली भी CoW के माध्यम से नए आवंटित ब्लॉकों के लिए METADATA_ITEMs बनाने का प्रयास करती है और उनसे टकराती है जिन्हें हमने पहले ही डाला है।

गंभीर रिकवरी के लिए पूर्ण कार्यप्रवाह

root@kitploit:~
# 1. बैकअप
mkdir -p backup
for DEV in /dev/sdX1 /dev/sdY1; do
  sudo dd if=$DEV of=backup/$(basename $DEV).sb bs=4096 count=1 skip=16
done

# 2. सुनिश्चित करें कि फाइलसिस्टम अनमाउंटेड है
sudo umount /mnt/pool 2>/dev/null

# 3. लॉग ट्री को शून्य करें (यदि लागू हो)
sudo btrfs rescue zero-log /dev/sdX1

# 4. सब कुछ स्कैन + ठीक करें (क्रम में)
sudo ./scan_and_fix_all_backrefs /dev/sdX1 --write
sudo ./fix_bad_levels /dev/sdX1 --write
sudo ./fix_owner_refs /dev/sdX1 --write
sudo ./fix_duplicate_extents /dev/sdX1 --write
sudo ./remove_stale_ptrs /dev/sdX1 --write

# 5. अभिसरण सत्यापित करने के लिए पुनः स्कैन करें
sudo ./scan_and_fix_all_backrefs /dev/sdX1
sudo ./remove_stale_ptrs /dev/sdX1

# 6. यदि csum ट्री टूटा हुआ है:
sudo ./fix_csum_tree /dev/sdX1
sudo ./set_nodatasum /dev/sdX1 --write

# 7. RW माउंट करने का प्रयास करें
sudo mount -o rw /dev/sdX1 /mnt/pool

# 8. यदि यह माउंट होता है, तो btrfs check readonly से सत्यापित करें
sudo btrfs check --force /dev/sdX1

ज्ञात सीमाएं

  1. प्रत्येक मरम्मत COW के माध्यम से नई समस्याएं पैदा कर सकती है: जब कोई उपकरण एक्सटेंट ट्री को संशोधित करता है, btrfs प्रभावित नोड्स को CoW करता है। नए नोड पुराने नोड्स से पॉइंटर्स कॉपी करते हैं, जो पुराने पॉइंटर्स को प्रचारित कर सकते हैं। कई पास की आवश्यकता हो सकती है।

  2. डेटा एक्सटेंट रेफ बेमेल ठीक नहीं किए जाते: ये उपकरण केवल मेटाडेटा बैकरेफ़ को छूते हैं। डेटा एक्सटेंट पर गलत रेफ काउंट (असफल btrfs check --repair रन के बाद आम) को साफ नहीं किया जाता है।

  3. अनाथ inodes साफ नहीं किए जाते: FS_TREE में अनाथ निर्देशिका प्रविष्टियां (उन inodes के संदर्भ जो अब मौजूद नहीं हैं) हटाई नहीं जाती हैं।

  4. btrfs check --repair को प्रतिस्थापित नहीं करता: ये उपकरण विशिष्ट परिदृश्यों को लक्षित करते हैं। हल्की या मध्यम क्षति के लिए, btrfs check --repair बेहतर है।

सीखे गए सबक

  1. कभी भी हार्ड पावर-साइकिल न करें मल्टी-डिवाइस BTRFS फाइलसिस्टम को: संयुक्त फ्री स्पेस ट्री + एक्सटेंट ट्री भ्रष्टाचार की मरम्मत करना बेहद मुश्किल है।

  2. एक पंक्ति में कभी भी btrfs check --repair को कई बार न चलाएं यदि पहला रन सब कुछ हल नहीं करता है: यह अनंत लूप में प्रवेश कर सकता है और फाइलसिस्टम को नाटकीय रूप से बदतर बना सकता है।

  3. प्रत्येक लेखन ऑपरेशन से पहले हमेशा सुपरब्लॉक का बैकअप लें।

  4. trans->reinit_extent_tree = true उन ब्लॉकों के लिए विलंबित रेफ में DROP विफलताओं को अनदेखा करने की कुंजी है जिनमें बैकरेफ़ नहीं है।

  5. fs_info->rebuilding_extent_tree = 1 मरम्मत के दौरान स्थान जांच को अक्षम करता है।

  6. कई इंसर्ट के साथ एक बड़ा कमिट कई छोटे कमिट्स से बेहतर है, क्योंकि मध्यवर्ती कमिट्स रूट ट्री को स्थानांतरित करते हैं।

  7. SB में backup_slots ऐतिहासिक बैकअप नहीं हैं: वे केवल सबसे हाल के 4 कमिट्स की एक स्लाइडिंग विंडो हैं। 46,000+ कमिट्स का btrfs check --repair लूप मिनटों में प्रत्येक स्लॉट को लगभग 11,000 बार घुमाएगा, कर्नेल से प्राप्त किसी भी प्री-क्रैश स्थिति को नष्ट कर देगा। वास्तविक प्रतिधारण के लिए आपको किसी अन्य डिवाइस पर स्पष्ट btrfs subvolume snapshot या btrfs send स्ट्रीम की आवश्यकता है।

  8. reinit_extent_tree असममित है: केवल को छूट देता है, को नहीं। कोई भी कोड पथ जो पुरानी लीफ पर कॉल करता है (रीबैलेंस के दौरान सहित) → के माध्यम से क्रैश करेगा।

अस्वीकरण

ये उपकरण एक विशिष्ट रिकवरी मामले के लिए लिखे गए थे जहां मूल उपकरण विफल हो रहे थे। सामान्य उपयोग के मामलों के लिए इनका परीक्षण नहीं किया गया है। इनका उपयोग केवल तभी करें यदि आप कोड को समझते हैं और डेटा हानि का जोखिम स्वीकार करते हैं।

यदि संभव हो तो हमेशा कोई भी मरम्मत करने से पहले अपने डेटा की प्रतिलिपि बनाएं।

लाइसेंस

GPL-2.0 (btrfs-progs के साथ संगत, जिसके आंतरिक API का ये उपकरण उपयोग करते हैं)।

टूल डाउनलोड करें
लीफGenअनाथ आइटम / कुलपोस्ट-पर्ज used (अनुमानित)रीबैलेंस?तत्काल सिबलिंग्सफैसला
$LEAF_Aपोस्ट-क्रैशज्यादातर अनाथ, भारी पर्जसीमा से नीचेहाँसभी पोस्ट-क्रैश✓ सुरक्षित
$LEAF_Bपोस्ट-क्रैशज्यादातर जीवित, हल्का पर्जसीमा से ऊपरनहींसाफ पैरेंट✓ सुरक्षित
$LEAF_Cपोस्ट-क्रैशलगभग 100% अनाथ4096 से बहुत नीचेहाँ मजबूरप्री-क्रैश पुराना❌ क्रैश
BTRFS_DROP_DELAYED_REF
BTRFS_ADD_DELAYED_REF
btrfs_inc_ref
push_leaf_left/right
btrfs_inc_extent_ref
BUG_ON(err)
  • क्षतिग्रस्त FS_TREE में inodes को संसाधित करने के लिए सुरक्षा मापदंड में सिबलिंग्स भी शामिल होनी चाहिए, न कि केवल लक्ष्य लीफ ही। "बुलेटप्रूफ सबसेट मापदंड" अनुभाग देखें।

  • लाइव फ़ाइलों का आधारभूत sha256 इन्वेरिएंट का एकमात्र अनुभवजन्य प्रमाण है। किसी भी लेखन ऑपरेशन से पहले इसे कैप्चर करें, बाद में अंतर करें। कोई भी बेमेल = रोलबैक।

  • DIR i_size को sum(name_len × 2) के रूप में संग्रहीत किया जाता है, sum(name_len) के रूप में नहीं। कोई भी अनाथ सफाई उपकरण जो प्रविष्टि हटाने पर i_size घटाता है, उसे namelen × 2 से घटाना होगा। इसे गलत करने से DIR अमान्य स्थिति में रह जाते हैं जो बाद में nlink = 2 के रूप में प्रकट हो सकते हैं: जो पूल को RW माउंट करने पर rmdir बम को ट्रिगर करता है (माता-पिता पर एक भी rm -rf चुपचाप हजारों उपनिर्देशिकाओं को हटा सकता है)।

  • अनुभवजन्य साक्ष्य वाले विशेषज्ञ समीक्षक एजेंट महत्वपूर्ण हैं। 2026-04-05 सत्र ने दो समानांतर Opus समीक्षकों (btrfs आंतरिक + संचालन) का उपयोग किया जिन्होंने डंप-ट्री आउटपुट के विरुद्ध प्रस्तावित योजना का विश्लेषण किया। उन्होंने एक नियतात्मक क्रैश वेक्टर (push_leaf_left → पुराना sibling) पकड़ा जो पिछली विफलताओं को दोहराता। अनुभवजन्य डंप-ट्री विश्लेषण के बिना एक पाठ्य योजना समीक्षा इसे याद करती।