लिनक्स BTRFS - असफल ड्राइव के साथ एकल में कनवर्ट करें


12

बैकस्टोरी की एक छोटी राशि:

मेरे पास एक छोटा मीडिया फाइल सिस्टम है, जिस पर मैं अपने एचटीपीसी सेटअप के लिए उपयोग की जाने वाली विभिन्न फिल्मों और टीवी शो को स्टोर करता हूं। यह मूल रूप से btrfs1TB WD बाहरी ड्राइव पर , उपयोग करके स्थापित किया गया था ।

बाद में, मैंने एक और ड्राइव खरीदने का फैसला किया, इस फाइलसिस्टम RAID1 मिररिंग क्षमताओं को देने के लिए। यह ड्राइव सीगेट बाराकुडा (2TB, BARRACUDA 7200.14 परिवार) है। दुर्भाग्य से, यह ड्राइव का एक अच्छा विकल्प नहीं था। ड्राइव ने शीघ्र ही बड़ी मात्रा में पढ़ने की त्रुटियों को विकसित करना शुरू कर दिया, हालांकि BTRFS उन्हें सही करने में सक्षम था।

हाल ही में, इस ड्राइव से रीड एरर की मात्रा में गिरावट आई है, इसकी स्थिति लगातार बिगड़ती जा रही है। BTRFS अब क्रैश होने लगी है:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

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

मुझे पता है कि एक निम्नलिखित चला सकता है:

sudo btrfs balance start -dconvert=single /media

डेटा प्रोफ़ाइल को singleमोड में बदलने के लिए , लेकिन मैं अनिश्चित हूं कि सिर्फ डेटा कहां रखा जाएगा। जैसा कि ड्राइव में से एक विफल हो रहा है, मैं यह सुनिश्चित करने में सक्षम होना चाहता हूं कि BTRFS अच्छी ड्राइव पर सभी डेटा को सावधानीपूर्वक मिटा नहीं देता है, और खराब ड्राइव पर एक ही कॉपी रखता है - इसके बजाय, मैं बस करना चाहूंगा अन्य ड्राइव के रूप में मौजूद नहीं है के रूप में कार्य (के रूप में, मेरे पुराने सेटअप में वापस कन्वर्ट)

यह काम नहीं करता है:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

मुझे क्या करना है? मदद की बहुत सराहना की जाएगी।

TL; DR: BTRFS में 1 ड्राइव के साथ शुरू हुआ single, एक और ड्राइव जोड़ा, इसे बनाया RAID1, अन्य ड्राइव अब गलत है, मैं सिर्फ एक ड्राइव पर कैसे लौटूं (विशेष रूप से ज्ञात अच्छा वाला) single?


अद्यतन: कोशिश कर रहा है कि dconvert=singleएक चंक के लिए केवल वही होता है जो मुझे डर था और ज्ञात अच्छी प्रतिलिपि को हटा देता है। :(
eeeeeta

जवाबों:


11

ठीक है, मैंने इस ट्रेलो लिंक की मदद से इसका पता लगाया । यदि कोई अन्य व्यक्ति ऐसा करना चाहता है, तो यहां प्रक्रिया है।

प्रक्रिया

दो डिस्क के एक RAID1 सरणी से, /dev/sdaजो दोषपूर्ण है और एक अन्य /dev/sdcज्ञात-अच्छा है:

  1. में इस सरणी की अक्षम ऑटो बढ़ते /etc/fstab, रिबूट । असल में, हम चाहते हैं कि इस सरणी को भुला दिया जाए क्योंकि यह एक बग है जहां यह अभी भी ड्राइव में से एक का उपयोग करने की कोशिश करेगा यदि यह अनप्लग है।
  2. अब जब आपका सरणी अनमाउंट हो गया है, तो निष्पादित करें:

    echo 1 | sudo tee /sys/block/sda/device/delete

    sdaदोषपूर्ण डिवाइस के नाम के साथ प्रतिस्थापित करना। यह डिस्क को स्पिन करने का कारण बनता है (आपको इसे dmesg में सत्यापित करना चाहिए) और कर्नेल के लिए दुर्गम हो जाता है।

    वैकल्पिक रूप से : बस बूटिंग से पहले कंप्यूटर से ड्राइव को बाहर निकालें! मैंने इस पद्धति का विकल्प नहीं चुना, क्योंकि उपरोक्त कार्य मेरे लिए ठीक है।

  3. -o degradedमोड के साथ अपने सरणी माउंट करें ।
  4. के साथ एक रीबैलेंसिंग ऑपरेशन शुरू करें sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint। यह ज्ञात-अच्छी ड्राइव पर विस्तार को पुनर्गठित करेगा, उन्हें single(गैर-RAID) में परिवर्तित करेगा । आपकी ड्राइव की गति और आपके सरणी के आकार के आधार पर, इसे पूरा होने में लगभग एक दिन लगेगा। (मेरा ~ mine०० GiB था, और प्रति मिनट १ १GiB चंक की दर से पुनर्संतुलित किया गया) सौभाग्य से, इस ऑपरेशन को रोका जा सकता है, और यह होने पर सरणी को ऑनलाइन रखेगा।
  5. एक बार यह हो जाने के बाद, आप sudo btrfs device remove missing /mountpoint'लापता' दोषपूर्ण डिवाइस को हटाने के लिए जारी कर सकते हैं ।
  6. sudo btrfs balance start -mconvert=dup /mountpointमेटाडेटा अतिरेक को बहाल करने के साथ एक दूसरा असंतुलन शुरू करें । मेरे सिस्टम पर कुछ मिनट लगते हैं।
  7. हो गया! आपका एरे अब singleमोड है, सभी अतिरेक को हटा दिया गया है।
  8. अपनी दोषपूर्ण ड्राइव को बाहर निकालें, और इसे हथौड़े से मारें।

समस्या निवारण

  • मदद, btrfs ने मेरी दोषपूर्ण डिस्क को लिखने की कोशिश की, उसे गलत तरीके से समझा, और उसे पढ़ने के लिए मजबूर किया!
    • क्या आपने चरण 1 का पालन किया, और जारी रखने से पहले रिबूट किया? यह संभावना है कि btrfs अभी भी सोचता है कि आपके द्वारा चलाया गया ड्राइव मौजूद है। रिबूटिंग किसी भी त्रुटि को भूलने के लिए btrfs का कारण होगा, और आपको जारी रखने देगा।

2
यह काम नहीं करता है। मैं उबंटू 16.04 (कर्नेल 4.4) पर हूं। dmesg का कहना है कि "लापता डिवाइस (1) सीमा से अधिक है (0), लेखन योग्य माउंट की अनुमति नहीं है"। इस प्रकार मैं "माउंट -o डिग्रेडेड" चरण
हेल्ससम

@ हेलोसम: शायद यह बग है। Bbs.archlinux.org/viewtopic.php?id=210541
jaltek

,softप्रत्येक convert=को जोड़ने के बाद विखंडू पर विचार करें, जिसमें पहले से ही लक्ष्य प्रोफ़ाइल है (जो उन सभी को होना चाहिए)।
टॉम हेल

9

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

यहाँ मैं क्या पाया है। जड़ के रूप में:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

प्रत्येक ड्राइव के लिए सूचीबद्ध डिवाइड पर ध्यान दें। Brtrfs बैलेंस के लिए मैन ने मुझे डिविड विकल्प पर ले जाया, एक कपल ने यह पता लगाने की कोशिश की कि फिल्टर कैसे काम करते हैं (शुरू में डिवाइड = / dev / sdb1)। तो आपका पहला प्रयास कुछ इस तरह दिखने वाला है।

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

जिससे मुझे एक त्रुटि मिली।

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

यहाँ dmesg से त्रुटि है:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

तो यह अंतिम है कि काम किया है:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

उम्मीद है कि यह किसी और की मदद करता है।


यदि आप एक ड्राइव को दूसरे के साथ बदलना चाहते हैं, तो आप इसका उपयोग कर सकते हैं btrfs replace
dma_k

यह मेरे लिए एक या एक साल पहले काम किया है, लेकिन आज नहीं है। इससे कोई फर्क नहीं पड़ता कि मैं क्या टाइप करता हूं devid=, जिसके परिणामस्वरूप एकल डेटा डिवाइस 1 पर रखा गया है
YtvwlD

-sconvertसिस्टम विखंडू को बदलने के लिए भी देखें ।
टॉम हेल

संतुलन के लिए मैन पेज के |बजाय उपयोग करने पर विचार करें ,:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
टॉम हेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.