LINUX.ORG.RU

Сдох раздел, плохой блок в «шапке». Что делать?

 ,


1

1

Прогнал badblocks: в системной области («шапке») раздела на reiserfs наличествуют плохие блоки. В результате получаю:

reiserfsck -B sdb2 /dev/sdb2 --rebuild-tree
…
create_badblock_bitmap: block number (3781) belongs to system reiserfs area. It cannot be relocated.

Возможно ли как-то указать ему переместить «шапку» в другую область?

Скопировать не вариант: некуда (у меня острая нехватка жестких дисков, да и сложно найти где-нибудь место для раздела в 1.2ТБ).

☆☆☆☆☆

Как хотя бы «убедить» reiserfs, что она чиста, не производя проверку? Тогда можно было бы при помощи reiserfstune отключить журнал…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

При помощи gparted физически переместить начало раздела. Ну или воспользоваться низкоуровневыми редакторами диска отключив область блоков.

rezedent12 ☆☆☆
()
Ответ на: комментарий от rezedent12

физически переместить начало раздела

Это невозможно: пострадает же все содержимое. Да и раздел почти под завязку забит.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Kuzz

MHDD/Victoria

yaourt mhdd
1 aur/mhddfs 0.1.39-1 (20)
    fuse filesystem that combines several mount points into a single one.

Сдается мне, что это немного не то…

Eddy_Em ☆☆☆☆☆
() автор топика

Возможно ли как-то указать ему переместить «шапку» в другую область? (3781)

Это журнал вроде. И его можно переместить в другое место. Теоретически.

Я бы попробовал через /sbin/debugreiserfs найти пустое место и потом указать журналу быть там. 4 байта по смещению 0xc в суперблоке.

А, да, суперблок начинается с 65536-го байта.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Я бы попробовал через /sbin/debugreiserfs найти пустое место и потом указать журналу быть там

Проблема в том, что reiserfstune не хочет запускаться, пока установлен флаг unclean.

А, да, суперблок начинается с 65536-го байта.

Тогда вот:

dd if=/dev/sdb2 bs=2 count=1 skip=65568 of=aaa
hexdump aaa
0000000 ffff                                   
0000002

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Нули в файле…

Я забыл написать, что это в суперблоке. Он по смещению 65536 байт (для любого размера блоков).

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Черт знает что:

dd if=/dev/sdb2 bs=1 count=34 skip=65536 of=aaa
hexdump aaa
0000000 ebe0 0e33 e281 01db 8011 039e 0012 0000
0000010 0000 0000 2000 0000 0400 0000 d3d2 7598
0000020 0384                                   
0000022

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Тьфу ты! 32 — в шестнадцатеричной!

Вот:

dd if=/dev/sdb2 bs=1 count=2 skip=65586 of=aaa

hexdump aaa
0000000 0002                                   
0000002

А как мне теперь туда единичку записать?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А как мне теперь туда единичку записать?

1. Сделай резервную копию 4096 байт со смещения 65536
2. Копию этого файла открой в mcview
3. Переключи просмотр в hex
4. F2 включает режим редактирования
5. найди нужный байт, поменяй значение
6. выйди из редактора, сохранись

i-rinat ★★★★★
()
Ответ на: комментарий от Eddy_Em

Они помогут винту. Если есть блоки в резерве - контроллер сделает ремап на резервный блок. Тогда для ФС этот блок не будет битым

Kuzz ★★★
()
Ответ на: комментарий от i-rinat

Как раз ~118ГБ и было забито ☺

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Лучше купи новый, а этот выбрось. И не мучай народ, используй hexdump -C, а то читать middle-endian то ещё развлечение.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

купи новый

Жду — не дождусь, пока подешевеют. Но что-то они до сих пор мегадорогие. А вообще, хотелось бы, конечно, еще штучек 5 двух--трехтерабайтников прикупить. Авось, лет на 5 хватит…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Но что-то они до сих пор мегадорогие.

+45%. Ну и как обычно — выбираешь, что дороже: данные или стоимость диска.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Пока что диск дороже. Вот если я за свою месячную зарплату смогу купить петабайтный диск, тогда ладно…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от vahtu

Дык, увы, но «дефолтных» (в смысле — чтобы ведро без проблем с ними работало) больше и нет хороших…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от vahtu

ХМ, а ведь есть. Правда, модулем:

CONFIG_UFS_FS=m

Eddy_Em ☆☆☆☆☆
() автор топика

Итак, сделал:

dd if=/dev/sdb2 bs=1 count=2 skip=65586 of=aaa
отредактировал в mcview (F4 для просмотра в hex, F2 для редактирования, F6 для записи). Хотя, можно было бы и файлик сделать при помощи
echo -en "\001\000" > aaa
Потом записал обратно:
dd if=aaa bs=1 count=2 seek=65586 of=/dev/sdb2
Проверил — все ОК. Изменилось.

Заранее у меня был подготовлен файлик с бэдблоками, который я сделал так:

badblocks /dev/sdb2 -b 4096 -o sdb2

Сразу же восстановить таблицу бэдов не вышло, т.к. повреждена системная область:

reiserfstune /dev/sdb2 -b sdb2 -f
create_badblock_bitmap: block number (3781) belongs to system reiserfs area. It cannot be relocated.
reiserfstune: Failed to initialize the bad block bitmap.

Не помогло и такое:

reiserfstune /dev/sdb2 -b sdb2 --journal-new-device journalsdb2

Тогда я попробовал подмонтировать (мало ли). Получил:

mount /dev/sdb2 /Big
mount: wrong fs type, bad option, bad superblock on /dev/sdb2,
       missing codepage or helper program, or other error
       In some cases useful info is found in syslog - try
       dmesg | tail or so

Дальше я попытался сделать «внешний журнал»:

dd if=/dev/zero of=journalsdb2 count=1000k
modprobe loop
losetup /dev/loop0 journalsdb2
reiserfstune /dev/sdb2 -b sdb2 --journal-new-device /dev/loop0 

Однако, и здесь фигвам.

Дальше — попытался схитрить:

reiserfstune /dev/sdb2 -b sdb2 -j /dev/loop0 --no-journal-available
И опять та же история.


Дальше сделал так:

reiserfsck --rebuild-sb /dev/sdb2
И получил странный ответ:
Super block seems to be correct

В общем. Фигвам. Как оказалось, журнал в reiserfs отключить нельзя; перенос журнала тоже не сработал. Буду ждать покупки нового HDD — тогда и попытаюсь восстановить то, что было на этом.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Ну, тогда только низкоуровневое редактирование. 1. Копируешь все данные на другой носитель. 2. Создаёшь новую ФС смещённой

Вообще, не рекомендуется использовать reiserfs на диске с явными плохими блоками. И не говори что это безвредно, у меня от этого /var умер!

rezedent12 ☆☆☆
()
Ответ на: комментарий от rezedent12

1. Копируешь все данные на другой носитель

Его-то у меня и нет. Буду ждать, пока денежка появится. Авось, к НГ восстановлю, что там было.

2. Создаёшь новую ФС смещённой

Не обязательно: достаточно при форматировании бэды указать.

не рекомендуется использовать reiserfs на диске с явными плохими блоками

Да там всего-то пострадало полтора десятка блоков. Не рекомендуется пользоваться «сыплющимся» диском, а здесь ситуация несколько иная: повреждения-то физические!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Как оказалось, журнал в reiserfs отключить нельзя

Можно сделать его маленьким, чтобы до первого бэда он уже закончился

перенос журнала тоже не сработал

а что, журнал на другом устройстве в reiserfs реализован? Да и я говорил про перенос на другое место этого же раздела. В суперблоке есть поле для указания, с какого смещения журнал начинается.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Можно сделать его маленьким, чтобы до первого бэда он уже закончился

Да там, похоже, первый бэд в самом начале журнала.

а что, журнал на другом устройстве в reiserfs реализован?

Вроде да. Только я не понял, как это сделать. А указать, куда пихать журнал внутри раздела не могу: откуда я узнаю, где там есть свободное место в достаточном количестве?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Да там, похоже, первый бэд в самом начале журнала.

Ты ж вроде писал, что 3781-й блок. Сделай журнал длиной в 3072 блока, так он с запасом кончится до бэда.

Вроде да. Только я не понял, как это сделать.

Глянул в код, там нет такой возможности. Задел есть, но реализация напрочь отсутствует.

А указать, куда пихать журнал внутри раздела не могу: откуда я узнаю, где там есть свободное место в достаточном количестве?

Так я ж говорил, debugreiserfs. Муторно, правда, но что делать?

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Сделай журнал длиной в 3072 блока

Что-то в манах я не нашел, как это сделать. В гугле нашел предостаточно историй, аналогичных моей. Все заканчивались тем, что ТС сливал образ битого раздела на другой носитель, а потом переформатировал раздел.

Задел есть, но реализация напрочь отсутствует.

Тогда понятно. Я-то думал, можно.

Так я ж говорил, debugreiserfs

Ладно. Не хочу рисковать — убью еще раздел совсем… А там уйма сериалов, для которых бэкапов я не наделал, а качать их заново — года 2-3 понадобится.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Что-то в манах я не нашел, как это сделать.

просто поменяй значение в суперблоке. Я ж давал ссылку, http://homes.cerias.purdue.edu/~florian/reiser/figures/superblock.gif , смещение 0x14, 4 байта, little-endian, указывается в блоках. У тебя сейчас там стоит 8192 блока, то есть 32 МБ.

Там на картинке нарисовано ещё «journal block count», но это ошибка, часть какого-то старого формата. Там уже давно journal magic.

Вообще reiserfs кажется такой продуманной, но как начнёшь код смотреть, жуть. И документация не всегда совпадает с реализацией.

i-rinat ★★★★★
()
Ответ на: комментарий от Eddy_Em

Ссыкотно hex-редактором ковырять.

Давай уже, сделай. В коде используется длина журнала, берётся из суперблока, так что всё сработает.

Журнал начинается с 18-го блока (0x12 в hex), считается от начала раздела (если вдруг понадобится).

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Дык, ему-то нужен полноценный журнал. А тут будет кастрированная версия.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Дык, ему-то нужен полноценный журнал. А тут будет кастрированная версия.

Пофигу какого размера журнал, хоть 1 МБ, хоть 1024 МБ, главное чтобы больше одного batch в длину. Традиционно reiserfs делает 32, но даже 12 метров — это со значительным запасом.

Что-то не понял: у меня в размере журнала написано 00200000, т.е. 2097152, что != 8192. WTF?

little-endian, так что 00 20 00 00 это 0x00002000

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

little-endian, так что 00 20 00 00 это 0x00002000

Понял, там вообще через жопу все! Сейчас пощупаю. Попробую E00 сделать. Т.е. меняю 20 на 0E…

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А вот фигушки!

reiserfs_open_journal: wrong journal parameters found in the super block. 

Подавай ему 8192 блока, и хоть ты тресни!

dmesg:

[19932.278017] REISERFS warning (device sdb2): sh-462 check_advise_trans_params: bad transaction max size (234193). FSCK?
[19932.278434] REISERFS warning (device sdb2): sh-2022 reiserfs_fill_super: unable to initialize journal space

Eddy_Em ☆☆☆☆☆
() автор топика
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

bad transaction max size

он ещё проверяет, что максимальная длина транзакции меньше половины журнала. Надо по смещению 0x18 поменять 00 04 00 00 на 00 01 00 00, это уменьшит максимальную транзакцию с 1024 блоков до 256.

И ещё было бы неплохо уменьшить четырёхбайтное число по смещению 0x20, тоже в 4 раза, ибо в описании написано, что это тоже максимальная длина транзакции. Было бы круто, если и длину журнала ты уменьшил в 4 раза, до 0x800 блоков. Пропорционально, так сказать.

Понял, там вообще через жопу все!

Это же родной порядок для x86.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Хорошо, что у меня UPS: сейчас гроза хорошая, свет отключался. Чует моя задница, и у нас потоп будет…

А с HDD я уже намучился. Ну его нафиг! Как будет новый, попытаюсь спасти что-нибудь.

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.