Миграция на SSD при наличии битых блоков

Все-таки я иногда бываю феерическим тормозом.

Предыстория такова: на жестком диске моего ноутбука обнаружились битые блоки. Это может быть предвестником скорой смерти диска, может не быть, но рисковать все равно как-то не хочется. Поэтому было принято решение жесткий диск менять. "А раз уж все равно менять, - подумал я, - то почему бы благородному дону не перейти на более современные технологии и не поставить себе SSD?"

Учитывая не сильно гуманные цены на SSD, пришлось немножко повоевать с жабой. Оптимальным вариантом выглядел диск на 240 гигабайт. Я прикинул, что из имеющихся у меня в наличии в данный момент 320 большая часть занята фильмами, которыми можно спокойно пожертвовать, а все остальное влезет на 240 и еще место останется. Жаба настойчиво советовала ограничиться и вовсе 120-гигабайтным диском (что почти вдвое дешевле), но голос разума подсказывал, что в таких тесных рамках чувствовать себя комфортно не получится. А если не будет комфорта - то незачем и затевать всю эту авантюру. Так что выбор был сделан в пользу Kingston на 240 гигабайт. Осталась мелочь: заменить диск на ноутбуке так, чтобы он остался при этом рабочим. Проще говоря, перенести операционку на новый диск.

Миграция - Windows

В Интернете писали, что под Windows 7 полно бесплатных программ, которые могут производить миграцию операционки с диска на диск. При этом они спокойно работают с подключенными через USB внешними дисками, а также умеют и подгонять размеры разделов под размеры нового диска. И работают прямо из-под мигрируемой операционки. И даже умеют убирать нафиг никому не нужный 20-гигабайтный "раздел восстановления заводских настроек", высвобождая пространство под пользовательские нужды. Это в теории.

На практике я столкнулся с неожиданной проблемой. Я нашел как минимум две бесплатных программы, умеющих делать все вышеописанное: EaseUS Todo Backup и AOMEI Partition Assistant. Обе они бодро брались за копирование, но на середине отваливались с ошибкой чтения. Причем, как показал анализ ситуации, спотыкались они именно об те блоки, которые уже давно найдены и отмечены как битые. Возникает резонный вопрос: почему программы, способные интеллектуально (т.е. в том числе и с изменением размера) скопировать раздел с работающей операционкой, оказались настолько тупыми, что не понимают, что не надо пытаться скопировать данные с битых блоков?

В процессе курения Интернета на эту тему я выяснил, что у NTFS есть одна особенность. Все блоки, отмеченные файловой системой как битые, на деле попросту объявляются принадлежащими невидимому системному файлу по имени $BadClus. На уровне простого пользователя этот файл недоступен, а вот при тупом низкоуровневом копировании раздела, файл за файлом, рано или поздно натыкаешься на этот злосчастный $BadClus, попытка чтения содержимого которого приведет к чтению с битого блока. Почему такая ситуация не была предусмотрена в EaseUS Todo и AOMEI Partition Assistant - не понимаю.

У современных жестких дисков есть функция прозрачной подмены битых блоков на резервные. То есть есть некоторое количество "запасных" блоков, которые изначально недоступны для использования. И если в какой-то момент жесткий диск понимает, что один из рабочих блоков сбоит, он просто выводит этот блок из обслуживания, а вместо него использует другой, из списка резервных. Подмена полностью прозрачна - все программные средства "думают", что ничего не изменилось, и что они работают со старым блоком.

Однако такая подмена происходит только в одном из двух случаев:

  • если произошел сбой во время операции записи в блок - тогда вместо битого блока сразу же начинает использоваться резервный;
  • если удалось прочитать данные из блока, который ранее выдавал ошибку чтения - тогда считанные данные копируются в резервный блок, который после этого начинает работать вместо битого.

Логика тут понятна: пользовательские данные превыше всего. Списывать блок в утиль можно только того, как удалось прочитать с него данные - либо после того, как пользователь (в лице операционной системы) явно дал "добро" на перезапись содержимого. Однако в данном случае получалась патовая ситуация: на уровне файловой системы блок уже помечен как битый, поэтому операционка к нему не пускает ни на запись, ни на чтение. Следовательно, чтобы заставить жесткий диск вывести битый блок из обслуживания, у меня есть два варианта на выбор: либо надеяться, что при низкоуровневом чтении битый блок вдруг волшебным образом все-таки прочитается, либо переформатировать нафиг весь диск. Первое практически нереально, так как вероятность прочитать данные с давно битого блока равна нулю. Второе делать бессмысленно, если стоит задача скопировать диск "как есть".

Миграция - Linux

Исчерпав рабочие средства, работающие под Windows 7, я задумался о средствах, которые работают с загрузочного образа Linux. Их нашлось два: CloneZilla и ddrescue - про оба эти инструмента писали, что они-то как раз не спотыкаются об эти дурацкие битые блоки. Ни тот, ни другой инструмент менять размер раздела на лету не умеет, но тут уже, что называется, не до жиру - хоть как-нибудь бы скопировать.

До сих пор не понимаю, что пошло не так, но ни один образ Linux у меня на ноутбуке по-нормальному не стартовал. Стартует и тут же виснет. Я приуныл.

И только через два дня мучительных размышлений, экспериментов со встроенной функцией Windows 7 backup/restore (которая все равно оказалась непригодна) я вдруг вспомнил, что:
- у меня в уголке стоит сервер с Linux на борту;
- на нем куча свободного места (500Gb наберется запросто);
- в нем есть пустые салазки для жесткого диска;
- разъемы для подключения дисков 3.5" и 2.5" одинаковые!

Ну и какого, спрашивается, я тут дурака валял? Задачка-то решается в три хода:

  1. Берем EaseUS или AOMEI на выбор и уменьшаем размер рабочего раздела так, чтобы суммарный объем всех разделов не превышал 240Gb. Уж на это-то их хватит, операция битые блоки не затрагивает.
  2. Вынимаем диск из ноутбука, вставляем в сервер, создаем образ диска при помощи ddrescue:
    sudo ddrescue -v -n /dev/sdd /mnt/local/laptop-hdd ddr-save.log
  3. Вынимаем диск из сервера, вставляем на его место SSD и пишем на него образ.sudo ddrescue -v -f /mnt/local/laptop-hdd /dev/sdd ddr-restore.log

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