Linux BTRFS - แปลงเป็นไฟล์เดียวกับไดรฟ์ที่ล้มเหลว


12

backstory จำนวนเล็กน้อย:

ฉันมีระบบไฟล์สื่อขนาดเล็กที่ฉันเก็บภาพยนตร์และรายการทีวีต่าง ๆ ที่ใช้สำหรับการตั้งค่า HTPC ของฉัน ตอนนี้ได้มีการตั้งค่าโดยใช้btrfsบนไดรฟ์ภายนอกขนาด 1TB WD

ต่อมาฉันตัดสินใจซื้อไดรฟ์อื่นเพื่อให้ความสามารถในการทำมิรเรอร์ RAID1 ของระบบไฟล์นี้ ไดรฟ์นี้คือ Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILY) น่าเสียดายที่นี่ไม่ใช่ตัวเลือกไดรฟ์ที่ดี ไดรฟ์เริ่มพัฒนาข้อผิดพลาดการอ่านจำนวนมากในไม่ช้าแม้ว่า 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: เริ่มต้นด้วย 1 ไดรฟ์ใน BTRFS singleเพิ่มไดรฟ์อื่นทำให้มันเป็นRAID1ไดรฟ์อื่น ๆ อยู่ในขณะนี้ erroring ฉันจะกลับไปเพียงหนึ่งในไดรฟ์ (เฉพาะที่รู้จักกันดีอย่างหนึ่ง) ด้วยsingle?


อัปเดต: การลองdconvert=singleสำหรับชิ้นเดียวทำในสิ่งที่ฉันกลัวและลบสำเนาที่ดีที่รู้จัก :(
eeeeeta

คำตอบ:


11

เอาล่ะฉันคิดออกด้วยความช่วยเหลือของลิงค์ Trelloนี้ ในกรณีที่คนอื่นต้องการทำเช่นนี้เป็นขั้นตอน

ขั้นตอน

จากอาเรย์ RAID1 ของดิสก์สองตัวอันหนึ่ง/dev/sdaซึ่งมีข้อบกพร่องและอีกตัวที่/dev/sdcรู้จักกันดี:

  1. ปิดการใช้งานอัตโนมัติติดตั้งของอาร์เรย์นี้/etc/fstab, รีบูต โดยทั่วไปเราต้องการให้ btrfs ลืมอาเรย์นี้เนื่องจากมีข้อผิดพลาดที่มันจะพยายามใช้หนึ่งในไดรฟ์หากไม่ได้เสียบปลั๊ก
  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) การดำเนินการนี้จะใช้เวลาเกือบหนึ่งวันจึงจะเสร็จสมบูรณ์ขึ้นอยู่กับความเร็วของไดรฟ์และขนาดของอาเรย์ของคุณ (ของฉันมี ~ 700 GiB และปรับสมดุลที่อัตรา 1 1GiB ต่อนาที) โชคดีการดำเนินการนี้สามารถหยุดชั่วคราวและจะทำให้อาร์เรย์ออนไลน์ในขณะที่มันเกิดขึ้น
  5. เมื่อเสร็จแล้วคุณสามารถออกsudo btrfs device remove missing /mountpointอุปกรณ์ที่ผิดพลาด 'หายไป'
  6. เริ่มต้นการปรับสมดุลครั้งที่สองด้วยsudo btrfs balance start -mconvert=dup /mountpointเพื่อคืนค่าความซ้ำซ้อนของข้อมูลเมตา ระบบของฉันใช้เวลาสองสามนาที
  7. คุณทำเสร็จแล้ว! ตอนนี้อาร์เรย์ของคุณคือsingleโหมดโดยลบความซ้ำซ้อนทั้งหมด
  8. ขับรถผิดปกติออกไปข้างนอกแล้วทุบด้วยค้อน

การแก้ไขปัญหา

  • ช่วยด้วย btrfs พยายามเขียนลงดิสก์ที่ผิดพลาดของฉันเกิดข้อผิดพลาดและบังคับให้อ่านได้อย่างเดียว!
    • คุณทำตามขั้นตอนที่ 1 และรีบูตก่อนดำเนินการต่อหรือไม่ เป็นไปได้ว่า btrfs ยังคงคิดว่ามีไดรฟ์ที่คุณปั่นลงมา การรีบูตจะทำให้ btrfs ลืมข้อผิดพลาดและจะให้คุณดำเนินการต่อ

2
มันใช้งานไม่ได้ ฉันใช้ Ubuntu 16.04 (เคอร์เนล 4.4) dmesg กล่าวว่า "อุปกรณ์ที่ขาดหายไป (1) เกินขีด จำกัด (0) ไม่อนุญาตให้เมาท์แบบเขียนได้" ดังนั้นฉันจึงติดอยู่ที่ขั้นตอน "mount -o
degraded

@HelloSam: อาจเป็นข้อผิดพลาด ดูbbs.archlinux.org/viewtopic.php?id=210541
jaltek

พิจารณาเพิ่ม,softแต่ละรายการconvert=เพื่อข้ามกลุ่มที่มีโปรไฟล์เป้าหมายอยู่แล้ว (ซึ่งควรเป็นทั้งหมด)
Tom Hale

9

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

นี่คือสิ่งที่ฉันพบ ในฐานะที่เป็นราก:

# 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

หมายเหตุ devid ที่แสดงรายการสำหรับแต่ละไดรฟ์ ชายคนหนึ่งสำหรับยอดคงเหลือ brtrfs นำฉันไปที่ตัวเลือก devid, คู่พยายามที่จะคิดออกว่าตัวกรองทำงานอย่างไร (ตอนแรกพยายาม devid = / 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เพื่อแปลงชิ้นส่วนของระบบ
Tom Hale

ลองใช้|แทน,เป็นหน้าคนเพื่อความสมดุลพูดว่า:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.