Linux BTRFS - конвертувати в єдиний з невдалим накопичувачем


12

Невелика кількість посібників:

У мене є невелика медіа-файлова система, в якій я зберігаю різні фільми та телепередачі, які використовуються для моєї настройки HTPC. Спочатку це було встановлено за допомогою btrfsзовнішнього накопичувача WD 1 TB.

Пізніше я вирішив придбати ще один диск, щоб надати цій файловій системі дзеркальне відображення можливостей RAID1. Цей привід - Seagate Barracuda (2 Тб, 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: почався з 1 диска в BTRFS single, додав ще один диск, зробив це RAID1, інший диск зараз помиляється, як я повернусь до одного диска (СПЕЦІФІКАЛЬНО відомого хорошого) з 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 Гбіт і перебалансировано зі швидкістю 1 1 Гбіт шматок в хвилину) На щастя, цю операцію можна призупинити, і вона буде зберігати масив в Інтернеті, поки він відбудеться.
  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), кріплення для запису заборонено". Таким чином, я застряг на кроці "
горіння-

@HelloSam: Можливо, це помилка. Дивіться 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 привела мене до варіанту 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=
ввожу

Також перевірте, -sconvertчи конвертувати шматки системи.
Том Хейл

Подумайте, |а замість того ,, щоб profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Том Хейл,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.