Наши партнеры

UnixForum






Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Меняем «коня» на скаку

(C) Виктор Костромин

Статья была опубликована в журнале "Открытые системы", #10 за 2002 год.

О смене компьютерного "железа" с сохранением всего программного обеспечения и наработанного файлового багажа.

Смена поколений компьютерной техники происходит сегодня стремительными темпами -- давно ли Pentium 2/233 казался чудом техники? В результате, по крайней мере, раз в два года приходится целиком обновлять "железо". А отдельные компоненты, в частности, жесткий диск иногда приходится менять и независимо от остальных составляющих компьютера. И возникает проблема переезда с одного компьютера на другой или со старого диска на новый. А как гласит народная мудрость – два переезда равны одному пожару. Вот и получается, что смена компьютера грозит потерей половины того, что было наработано в старой системе. Мы столько времени потратили на обустройство своей системы: установку необходимых пакетов, их настройку, прилаживание всяких красивостей и просто накопили массу полезных файлов, потерять которые в спешке переезда вовсе не хочется. А восстановить все это хозяйство, даже если была сделана полная резервная копия системы, непросто [1].

Вот и передо мной недавно встала такая проблема -- получил новый компьютер, а старый нужно было сдать. Требовалось перебраться на новый компьютер со всей настроенной, обжитой и привычной средой, основу которой составляет ОС Linux. Причем имелась еще лицензированная система виртуальных машин VMware, в которой вполне удовлетворительно работала NT 4.0 с MS Office. Если устанавливать на новый компьютер все заново, то пришлось бы устанавливать две операционных системы и массу ПО. Просто обменять жесткие диски старого и нового компьютера тоже не хотелось -- старый был объемом 10, а новый 20 Гбайт. Поэтому возникло желание переместить ОС Linux со всем ПО, которое под ней работает, на новый диск. Задача осложнялась тем, что на новом диске была уже установлена лицензионная ОС Windows 98, а на старом лицензионная ОС Windows 2000 и организована многовариантная загрузка. Хотя я и редко перезагружался в Windows 2000, довольствуясь работой NT в окне Linux, но терять лицензионные версии тоже не хотелось -- не все пользователи перешли пока на Linux и компьютеры с лицензионным ПО еще какое-то время послужат.

Первой мыслью было воспользоваться продуктом Acronis Migrate Easy, как раз предназначенным для переноса программного обеспечения с одного диска на другой. Однако, как оказалось, для этого требуется, чтобы новый диск был девственно чист. В конце концов, после нескольких неудачных попыток мне удалось совершить переезд именно так, как того хотелось, причем используя только стандартные средства ОС Linux и программу переразбиения диска Partition Magic Pro 7.0 фирмы Power Qwest . Однако, прежде чем приступить к изложению, хочу повторить обычное в таких случаях предупреждение: автор не несет ответственности за последствия операций, которые будет производить читатель со своей системой, прочитав статью.

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

Шаг 1. Создадим загрузочную дискету для старой системы:
[root]# mkbootdisk --device /dev/fd0 2.4.2-2
где "2.4.2-2" нужно заменить на версию установленного у вас ядра, причем должен существовать каталог /lib/modules/2.4.2-2. Если у вас уже есть загрузочная дискета, то на всякий случай предварительно произведите загрузку с ее помощью (для проверки ее пригодности).

Шаг 2. Подключаем новый жесткий диск к старому компьютеру (я подключил новый диск как Secondary Slave, так что в соответствии с принятыми в Linux соглашениями он обозначается как /dev/hdd) и создаем на нем разделы для Linux. Если вы просто меняете жесткий диск, то можно попытаться создать на новом диске точную копию разделов старого диска . У меня же на новом диске уже были два раздела FAT32: один для ПО производителя компьютера, а второй для Windows 98, которые я хотел сохранить, поэтому я воспользовался программой Partition Magic Pro 7.0 от Power Qwest, которая позволяет изменять разбиение диска без потери информации. С ее помощью я уменьшил размер раздела для Windows 98, освободив место для расширенного раздела. К сожалению, мне по каким-то причинам не удалось с помощью Partition Magic отвести третий раздел для ОС Linux. После корректировки разбиения и запуска программы /sbin/sfdisk -l /dev/hdd третий раздел все время оказывался расширенным разделом типа Win95 (Id = b). Тогда я воспользовался программой fdisk из Linux и с ее помощью сначала удалил все вновь созданные разделы (сохранив два первых, где было предустановленное производителем ПО), а затем создал разделы, подобные разделам на первом диске. Вот что было на первом диске:

Disk /dev/hda: 1306 cylinders, 240 heads, 63 sectors/track
Units = cylinders of 7741440 bytes, blocks of 1024 bytes, counting from 0

    Device Boot Start     End   #cyls   #blocks   Id  System
  /dev/hda1  *      0+      1       2-    15088+  12  Compaq diagnostics
  /dev/hda2         2     321     320   2419200    b  Win95 FAT32
  /dev/hda3       322     490     169   1277640   83  Linux
  /dev/hda4       491    1305     815   6161400    f  Win95 Ext'd (LBA)
  /dev/hda5       491+    499       9-    68008+  82  Linux swap
  /dev/hda6       500+    848     349-  2638408+  83  Linux
  /dev/hda7       849+   1305     457-  3454888+  83  Linux

и вот что получилось на втором:

Disk /dev/hdd: 2498 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

  Device Boot Start     End   #cyls   #blocks   Id  System
/dev/hdd1  *      0+    382     383-  3076416    b  Win95 FAT32
/dev/hdd2       383     498     116    931770    b  Win95 FAT32
/dev/hdd3       499     669     171   1373557+  83  Linux
/dev/hdd4       670    2497    1828  14683410    f  Win95 Ext'd (LBA)
/dev/hdd5       670+    702      33-   265041   82  Linux swap
/dev/hdd6       703+   1259     557-  4474071   83  Linux
/dev/hdd7      1260+   2497    1238-  9944203+  83  Linux

Видно, что разбиения существенно различаются, но это нам не помешает. Единственное требование, которое тут надо соблюсти -- новые разделы для Linux по объему должны быть не меньше старых.

Шаг 3. Монтируем все разделы типа 83 (Linux) нового диска в работающую систему и выполняем для каждого из них команду

[root]# mke2fs /dev/hddN

(в моем случае N принимало значения 3,6,7), а для swap-раздела - команду

[root]# mkswap /dev/hdd5.

Шаг 4. Теперь можно выполнить копирование каждого раздела со старого диска в соответствующий раздел нового диска. Для разделов, не содержащих каталога /boot (у меня это был корневой раздел), можно выполнить такое копирование с помощью программы Midnight Commander (как обычно, с помощью клавиши F5) или же командами
[root]# cp -Rpd /usr /mnt/hdd6
[root]# cp -Rpd /home /mnt/hdd7
(не забудьте про опции). А вот раздел, содержащий каталог /boot, копировать таким образом не имеет смысла. Для него лучше использовать команду

[root]# dd if=/dev/hda3 of=/dev/hdd3
причем раздел /dev/hdd3 нового диска предварительно лучше размонтировать. Размонтировать создаваемый раздел я рекомендую потому, что вначале я выполнил эту команду, не размонтировав /dev/hdd3. Когда копирование закончилось, я попробовал войти в каталог /mnt/hdd3, то есть во вновь скопированный раздел, однако получил сообщение об ошибке. Запуск команды [root]# /sbin/fsck /dev/hdd3 показал, что ошибок в файловой системе раздела /dev/hdd3 просто огромное количество (возможно такой эффект стал следствием того, что операция копирования занимает довольно большое время, и я что-то еще делал в это время в системе).

После завершения процедур копирования имеет смысл проверить файловые системы на новых разделах, для чего выполнить команды (учтите, что команда fsck предпочитает работать с размонтированными разделами):
[root]# /sbin/fsck /dev/hdd3
[root]# /sbin/fsck /dev/hdd6
[root]# /sbin/fsck /dev/hdd7

При выполнении команды fsck для корневого раздела (/dev/hdd3) у меня появилось несколько сообщений об ошибках, но fsck их успешно исправила.

Вероятно у вас здесь возникает вопрос: почему для раздела с каталогом /boot используется команда dd, а остальные разделы переносятся простым копированием? Потерпите, небольшие пояснения будут даны на шаге 7.

Шаг 6. Возвращаем новый диск на его законное место в новый компьютер. Однако пытаться загрузиться с него еще рано -- в загрузочной записи (MBR) у него по-прежнему прописан стандартный загрузчик от Microsoft, который знать не знает о Linux. Установленная ранее на компьютере Windows 98 загрузится без проблем, а новых разделов вы не увидите. Копировать главную загрузочную запись со старого диска на новый не имеет никакого смысла -- таблицы разбиения дисков различаются. Я, впрочем, попытался скопировать программу-загрузчик из MBR старого диска, не трогая таблицу разбиения, что делается командой
[root]# dd if=/dev/hda of=/dev/hdd bs=446 count=1, однако это к желаемой цели не привело: загрузчик lilo, который стоял на старом компьютере остановился на полпути, выдав на экран только две буквы: LI. Поэтому не стоит копировать загрузочную запись, лучше переустановить LILO, для чего надо запустить систему с помощью заготовленной на шаге 1 загрузочной дискеты. В процессе загрузки Linux с дискеты утилита проверки конфигурации аппаратного обеспечения kudzu обнаруживает, что это самое аппаратное обеспечение существенно изменилось (естественно, что пакет kudzu должен быть у вас установлен). Сначала kudzu сообщает, что некоторые аппаратные составляющие удалены и предлагает либо удалить соответствующие настройки, либо сохранить их. Я выбирал вариант "Удалить настройки". Затем kudzu обнаруживает новое оборудование (видеокарту, монитор, сетевую плату, USB-порты и т.д.) и предлагает настроить новые устройства, с чем, конечно, нужно соглашаться.

После того, как процесс загрузки системы с дискеты завершен, необходимо переустановить lilo командой [root]# /sbin/lilo.

Шаг 7. Теперь уже можно перезагрузиться без дискеты и вы имеете возможность работы в привычной программной среде. Однако нужно еще ликвидировать некоторые потери, явившиеся следствием использования команды dd для копирования корневого раздела. Дело в том, что первоначальным применением команды dd было создание копии всей файловой системы [1, стр.223]. Что мы и сделали на шаге 5, скопировав файловую систему с корневым разделом в новый раздел /dev/hdd3. При этом все файлы, включая ядро, размещенное в каталоге /boot, копировались по-блочно, с сохранением относительного порядка блоков, отведенных каждому файлу. Если попытаться на шаге 5 копировать раздел /dev/hdd3 с помощью команды cp, то загрузчику lilo, даже после его переустановки загрузить систему не удается. Вероятно, это является следствием того, что нарушается непрерывность размещения ядра на диске и загрузчик уже не может его отыскать. Однако, поскольку с помощью dd мы скопировали файловую систему целиком из раздела, имевшего меньший размер, чем новый раздел /dev/hdd3, та часть нового раздела, которая осталась за пределами файловой системы, стала нам недоступна. Это и есть те потери, которые были упомянуты выше. С этим можно бороться по разному. Можно попытаться на шаге 2 создать этот раздел по размеру в точности равным аналогичному разделу на старом диске. Если размеры соответствующих разделов различаются незначительно, можно просто смириться с небольшими потерями. Я использовал третий вариант, заключающийся в повторном применении утилиты переразбиения дисков Partition Magic. Она умеет трансформировать разделы диска с сохранением всех данных, а значит умеет правильно преобразовывать файловые системы. Поскольку полезная информация занимает не весь раздел /dev/hdd3, можно с помощью программы Partition Magic вначале уменьшить объем этого раздела, а затем расширить один из других разделов, отдав ему освободившееся пространство. В процессе этого преобразования Partition Magic успешно возвратила все потерянные области диска.

На этом процесс переезда можно считать завершенным. По крайней мере у меня все получилось: после перезапуска я снова оказался в привычной программной среде. Даже система Vmware с Windows NT 4.0 запустилась без проблем.

В заключение одно замечание по поводу возможных опасностей, которые могут вас подстерегать при таком переезде. Если просто поменять жесткий диск, то особых опасностей нет, но вот если целиком сменить компьютер, то о некоторых последствиях надо подумать заранее. Во-первых, если вы компилировали ядро под свою конфигурацию аппаратного обеспечения, то на новом компьютере могут возникнуть проблемы с запуском. Во-вторых, чтобы переезд прошел гладко, надо установить пакет kudzu. И третья опасность связана с правильным заданием параметров для частот вертикальной и горизонтальной разверток монитора [3]. Поэтому стоит перед началом описанных манипуляций отключить автоматический переход в графический режим и проводить всю процедуру в текстовом режиме, а после ее завершения до первой загрузки графической оболочки проверить задание параметров в файле /etc/X11/XF86Config-4 (или /etc/X11/XF86Config).



Литература

[1] "Обновление Linux", http://linuxbegin.by.ru/articles/article20.shtml

[2] Э.Немет, Г.Снайдер, С.Сибасс, Т.Хейн. "UNIX: руководство системного администратора", пер. с англ. С.М.Тимачева, К., BHV, 1999 г.

[3] В.А.Костромин, "Linux для пользователя", изд."БХВ-Петербург", Санкт-Петербург, серия «Самоучитель», 2002 г.