Перенос raid массива с контроллера nforce на intel

Feb 27, 2008 17:56


Некоторое время у домашнего компьютера умерла материнка на чипсете Nforce 4 Ultra производства Gigabyte. На ней был сконфигурирован RAID0 из двух SATA дисков размером 400Гб. Диски были подключены к контроллеру nforce (хотя еще был silicon image, но почему-то я выбрал nvidia).

Короче компьютер перестал включаться, и я решил его не чинить, а апгрейдиться на современное железо. Новую материнку я купил на чипсете P35, и райд на ней соответственно на контроллере интел. В связи с таким апгрейдом встал вопрос о том как бы сохранить данные на райд массиве в новом компьютере. В большинстве статей в интернете (например вот в этой) пишут что при смене производителя массив не переносится. Это происходит потому что каждый производитель хранит информацию о массиве в своем собственном формате, и формат и место нахождения этой информации никак не стандартизован. Структуру её можно посмотреть в исходниках линуксовой утилиты dmraid поскольку ей она и пользуется.

Сами же данные на райд массивах хранятся похожим образом у всех производителей, поэтому есть надежда что переделав только информацию о массиве получится оставить все данные как есть. Спасибо ivanrt, без его помощи я врядли бы сделал перенос.

Для переноса необходим загрузочный диск с линуком и флэшка куда будет сохраняться временная информация. Для работы я пользовался дистрибутивом knoppix поскольку на диске с ним есть утилита dmraid, и он наиболее удобен для работы без жестких дисков.

Первым делом надо было поставить диски в правильном порядке. То есть так же как и на старой плате. Как это сделать в случае если дисков не два, а больше, не знаю, возможно только подбором. Когда дисков два, то на первом должны обнаруживаться разделы, так как MBR массива попадает на MBR первого диска, и линукс думает что на нём есть нормальный partition table. Так что я загружаясь с сидюка первым делом проверил что устройство sda имеет ещё и разделы sda1, sda2, sda3, sda4. Тут есть первая опасность, knoppix не только находит эти разделы, он может и пользоваться ими тоже. В частности, sda3 у меня это был linux swap. Если бы knoppix подключил этот раздел как swap, он мог бы попортить файловую систему за ним, потому что в raid0 все данные должны располагаться не на одном диске, а на обоих по очереди. Поэтому knoppix я грузил строго с опцией noswap чтобы он не пытался найти и подключить никаких swap разделов.

Загрузить knoppix сразу тоже не получилось, у моей материнки контроллер parallel ATA производства marvell, а его линукс то ли не поддерживает, то ли он слишком новый. Поискав немного в интернете я обнаружил опцию ядра all-generic-ide которая позволяет использовать generic ide драйвер для parallel ATA устройств.

После загрузки я был приятно удивлён что knoppix автоматом определил мой raid0 на nvidia по метаданным которые остались на дисках, и сразу создал блочное устройство в /dev/mapper, как это было у меня на старой материнке. Так что в принципе для спасения данных с дисков этого уже было достаточно, разделы найдены, их можно монтировать, читать с переносить куда угодно по сети. Никакой контроллер nvidia для этого не нужен. Так что первым делом я скачал с дисков наиболее ценную информацию через ssh.

После этого, как посоветовал ivanrt я сохранил MBR сектора обоих дисков sda и sdb. Командой dd это делается так: dd if=/dev/sda of=mbr-sda.bin count=1. Сохранил таблицу разделов с диска sda и устройства в /dev/mapper (они должны совпадать, потому что это один и тот же сектор) в текстовом виде, как её показывает fdisk, причём в двух видах, в единицах по умолчанию, и в секторах (смена единиц измерения делается буквой u). На всякий случай я ещё сохранил метаданные о массиве в формате nvidia (позже оказалось что они понадобятся!). С помощью команды dmraid это делается так: dmraid -r -D. Всё это я сложил на флэшку,

Дальше надо было точно установить stripe size райд массива. В принципе я помнил что он вроде бы 64Кб, но не был точно в этом уверен. Вообще эту информацию показывает dmraid с ключами -s и -n. Но он не пишет единиц измерения, так что не до конца понятно что это, килобайты, сектора, блоки или ещё что-то. Например, про мой массив dmraid -s писал что stride у меня 128. Как выяснилось это сектора, а не килобайты.

Так что я попробовал выяснить это руками. Через dd я считал блоки размером по 128Кб с райда, и дисков sda, sdb. Потом с помощью команды cmp я стал сравнивать их с разными смещениями, и выяснил что блок с sda заканчивается после 64Кб, потом начинается блок с sdb. Так что размер stripe у меня был 64Кб. Теперь можно было перезагружаться, и создавать массив для контроллера интел.

Посмотрев исходники dmraid я выяснил что intel и nvidia хранят свою мета информацию в одном и том же секторе. Поэтому интеловская утилита должна была затереть то что было записано на дисках для nvidia. Если бы они хранили её в разных секторах, стоило бы стереть старую, чтобы dmraid не находил сразу 2 разных формата данных. Это можно было бы сделать через dmraid -r -E.

В утилите создания массива я проверил по серийным номерам порядок подключения дисков в массив, чтобы первым был именно sda, а не sdb. Когда подключены всего 2 диска, интеловская утилита не даёт выбирать диски самому, так как понятно что в массив попадут оба, поэтому порядок дисков должен быть правильным, и поменять его можно только переподключив диски к контроллеру.

После загрузки обратно в knoppix я первым делом восстановил MBR сектора на обоих дисках. Интеловская утилита создания райда, как правильно мне говорил ivanrt действительно их стирает. Видимо это делается для тех случаев когда пользователь, имевший диски по отдельности, со своими таблицами разделов, не стал бы удивляться, как это у него на вновь созданном массиве уже есть какие-то там разделы, ведь таблица будет читаться с первого диска.

После восстановления MBR я попробовал активировать массив. dmraid его нормально нашел, и даже создал девайсы для разделов в /dev/mapper. Все кроме последнего, последний не создался с ошибкой что конец раздела выходит за размеры устройства... Это было немного не ожиданно для меня. Я запустил fdisk и при верификации таблицы разделов выяснилось что массив у интел короче массива у nvidia на 386 секторов, и последний раздел торчит за пределы нового устройства.

Просто подправить таблицу разделов было бы не достаточно, файловую систему надо было подправить тоже, чтобы не было попыток обращения за пределы устройства. Хорошо что у меня на последнем разделе был reiserfs, а на knoppix программа resize_reiserfs. Но для того чтобы менять размер надо было получить полностью функционирующее устройство с последними 386 секторами. Для этого и пригодилась мета-информация. Я деактивировал массив через dmraid -an, и залил на место интеловской старую информацию от nvidia. Как это сделать написано в man dmraid, делается простым скриптом через dd.

Сделав обратно массив в формате nvidia я получил обратно 386 секторов в конце устройства. Потом через resize_reiserfs я ужал файловую систему на 1Мб. Считать точно насколько её надо ужимать я не стал, решил ужать с запасом потому что раздвинуть потом файловую систему гораздо легче. После этой операции я пересоздал массив в интеловском формате и снова получил ошибку о том что последний раздел торчит за пределы устройства. Я просто удалил его, и создал заново максимального размера, убедившись что начало попало на тот же сектор (тут помогает смотреть таблицу в fdisk именно в секторах, а не в блоках). Потом раздвижка файловой системы на весь раздел делается через resize_reiserfs элементарно.

Дальше предстоит пересобрать ядро с поддержкой нового железа, оживить windows как написано тут и там тоже поставить драйвера для нового железа. Но основная задача выполнена, так как диск работает на новом контроллере, а все данные остались на месте.

Я написал этот текст потому что в интернете везде пишут что такая операция не возможна. Может кому-то он пригодится для совершения похожей операции. В принципе, если понимать что происходит, и достаточно повезёт, то ничего сверхестественного тут нет :)

computer, linux

Previous post Next post
Up