Перенос Linux на другой жесткий диск с сохранением работоспособности

Предстоял мне вчера перенос Linux на сервере с Fujitsu MPE3064AT (6 гиг) на MPG3409AT (40 гиг). Перенести надо было быстро и так, чтобы никто подмены не заметил ;)

То есть главное требование полное сохранение работоспособности сервера после замены диска - никаких переустановок.

Итак, мой 6-гиговый разбит был так:

  • /dev/hda1 (127M) - swap
  • /dev/hda2 (32M) - ext2fs (/tmp)
  • /dev/hda3 (450M) - ext2fs (/)
  • /dev/hda4 (все остальное) - ext2fs (/var)
Домашние каталоги пользователей были в /var/home, куда вела ссылка из /home. Таким образом на 450-мегабайтном разделе были /root, /etc, /bin, /sbin, /usr, /proc и /dev, а /var и /home были на отдельном большом разделе, занимавшем весь остальной объем диска. Ядро версии 2.4.5 (дистрибутив RedHat 6.2)

Итак, мои действия:

1. Потушил сервак (/sbin/halt), поставил в него новый винт как /dev/hdb

2. Загрузился, сделал fdisk /dev/hdb и разметил его, но немного по-другому:

  • /dev/hdb1 (127M) - swap
  • /dev/hdb2 (127M) - ext2fs (/boot), сам не знаю зачем, но говорили о проблемах с большими дисками и невозможности грузить ядро расположенное за 1024 цилиндром, я-то о проблеме знал, но столкнулся с совсем другой, о которой позже
  • /dev/hdb3 (1020M) - ext2fs (/)
  • /dev/hdb4 (все остальное) - ext2fs (/var)

3. Отформатировал разделы:

  • mkswap /dev/hdb1
  • mke2fs /dev/hdb2
  • mke2fs /dev/hdb3
  • mke2fs /dev/hdb4

4. Прописал hdb2, hdb3 и hdb4 в /etc/fstab строками:

  • /dev/hdb2 /mnt/boot ext2 defaults 1 1
  • /dev/hdb3 /mnt/root ext2 defaults 1 1
  • /dev/hdb4 /mnt/var ext2 defaults 1 1

5. Создал каталоги /mnt/boot, /mnt/root и /mnt/var

6. Примонтировал туда новые разделы:

  • mount /mnt/boot
  • mount /mnt/root
  • mount /mnt/var

7. В Midnight Commander (mc) скопировал:

  • содержимое /boot в /mnt/boot
  • содержимое /var в /mnt/var
  • содержимое / (кроме, разумеется, /mnt и /proc) в /mnt/root
Главное при копировании НЕ включать Follow Symlinks, иначе скопируются не ссылки (которые нам надо сохранить в целости и сохранности), а то, на что они указывают.

8. Создал каталог /mnt/root/proc

9. Отредактировал /mnt/root/etc/fstab приведя в соответствие нумерации разделов нового винта.

10. Потушил сервак, переставил новый винт как /dev/hda, старый вообще пока отключил.

11. Перезагрузился с новым винтом в качестве /dev/hda. Загрузиться с системной дискеты (при установке дистрибутива наверянка было предложение таковую создать). При загрузке с нее в приглашении LILO вводим: linux single root=/dev/hda3

12. Сделал /sbin/lilo, дабы записать в MBR нового винта загрузчик и распрощаться с загрузочной дискетой ;)

Примечание. Пришлось столкнуться с проблемой больших винтов. LILO после прописывания себя в MBR 40-гигабайтного винта, все равно отказывалось загружаться (вернее загружать /boot/boot.b - несмотря на то, что он был в первых 1024 цилиндрах, вроде бы...). Я взял lilo новее (из дистрибутива RedHat 7.1, обновил его (rpm -U ), прописал вместо linear в lilo.conf строку lba32, снова переписал MBR (/sbin/lilo) и все заработало.

Готово! Ничего не переустанавливая (не считая обновления старой версии lilo), мы перенесли всю настроенную ОС со всеми ее разделами на другой винт.