Как вернуть устройство bcache в файловую систему
У меня на ноутбуке 20 ГБ SSD-устройство, на котором я решил попробовать bcache. Казалось, работает, но в течение некоторого времени я получаю сообщение об ошибке при загрузке:
error on 0f3bbb55-6839-4ed6-8127-7976a969f726: corrupted btree at bucket 17571, block 483, 61 keys, disabling caching
Я полагаю, я мог бы попытаться исправить это, но я решил, что мне, вероятно, лучше просто отключить bcache - я не знаю достаточно об этом, чтобы рискнуть потерять данные / волосы, если что-то сломается, и я думаю, что я был бы лучше отключить использование раздела в качестве свопа для более быстрой спячки.
У меня вопрос, как мне безопасно прекратить использование bcache на устройстве, не переформатируя устройство резервного копирования?
Я использую /dev/sda7 в качестве устройства поддержки и /dev/sdb2 в качестве устройства кэширования (/dev/sdb1 является пользователем root).
Если это имеет значение, я использую Ubuntu 14.04 с ядром 3.13.0-21-generic.
Обновление: я в основном ищу решение, которое отменяет изменения, сделанные make-bcache -B. FWIW, я закончил тем, что "решил" это, переместив все в новый раздел и удалив старый (см. Комментарий ниже), но я оставлю этот вопрос на случай, если у кого-то будет реальное решение.
3 ответа
Недавно у меня возникла проблема с указанием времени, и следующий текст спас мой бекон:
D) Восстановление данных без bcache:
Если bcache недоступен в ядре, файловая система на устройстве поддержки все еще доступна со смещением 8 КБ. Так что либо с помощью loopdev устройства поддержки, созданного с помощью --offset 8K, либо с помощью любого значения, определенного с помощью --data-offset, когда вы изначально отформатировали bcache с помощью
make-bcache
,Например:
losetup -o 8192 /dev/loop0 /dev/your_bcache_backing_dev
С https://www.kernel.org/doc/Documentation/bcache.txt.
Это дает дополнительное преимущество, заключающееся в том, что вы не изменяете таблицу разделов на диске, поэтому вы можете скопировать некоторые данные и, возможно, перемонтировать их обратно на исходный хост.
Это не очень сложно, если вы знаете внутренности. Я читал из блоков, чтобы знать, что для того, чтобы преобразовать обычный раздел в bcache, он немного сжимает раздел, а затем добавляет туда суперблок bcache. Таким образом, данные раздела остаются там. Я сделал тест, чтобы выяснить, что суперблок bcache имеет размер 8192 байта:
for i in {1..20}; do dd if=my_bcache_device skip=$i | file -; done
Итак, чтобы преобразовать его обратно, просто измените таблицу разделов так, чтобы она начиналась с 8192 байтов позже. С помощью gdisk (или fdisk, если вы используете MBR) удалите раздел, а затем заново создайте его на новом месте, и все готово:-) Вы можете увеличить его позже, если хотите (но я этого не пробовал).
Обратите внимание, что если ваш bcache загрязнен (и вы больше не можете его использовать), вам придется fsck вашего раздела и связываться с поврежденными данными. Мне повезло, что только несколько файлов были повреждены после ручного fsck.
Одним из решений является отключение устройства от кеша и использование его в no cache
или сквозной режим. Для этого запустите как root
:
echo 1 > /sys/block/<device>/bcache/detach
(где <device>
является устройством поддержки кеша, /dev/sda7
в твоем случае).
Это отсоединит резервное устройство от кеша, так что кеш больше не используется, а к диску обращаются напрямую для всех операций чтения и записи. Если ваш кэш не был в поврежденном состоянии, это также записало бы любые грязные данные из кэша обратно на резервное устройство; в вашем испорченном состоянии вам, вероятно, не повезло.
Вам все равно придется получить доступ к устройству через /dev/bcache0/
интерфейс, но кеширование не будет выполнено.