16 нояб. 2008 г.

Перенос системы на другой раздел

Когда возникает необходимость перенести рабочую систему на новый раздел или жесткий диск, многие, наверняка, выберут просто инсталляцию с нуля и копирование конфигов. Однако, такой подход не слишком практичен. Во-первых, это время. Нужно прожигать инсталляционный образ, тысячу раз перезагружаться и т.д. Да и образ не всегда бывает под рукой. Во-вторых, все-таки придется доустановить нужные пакеты и вообще привести систему в порядок. Гораздо быстрее и практичнее просто перенести уже рабочую систему на новое место со всеми пакетами/настройками и т.п. Это только звучит страшно, но на самом деле с помощью обычных gnu-утилит делается очень легко, быстро и просто.

1. Приготовления
Во-первых, советую весь процесс выполнять с Live CD, а не непосредственно с рабочей системы (хотя я делал и так без проблем). Это исключит вероятность несоответствия исходных и конечных данных.
Во-вторых, следует создать все нужные разделы для нового расположения системы.
И, в-третьих, примонтировать те разделы, информацию с которых предстоит переносить и те, на которые будет произведен перенос. Предположим, что исходный раздел - /media/old_root, а конечный - /media/new_root.

2. Процесс
В нижеследующих командах подразумевается, что у вас есть полный доступ к разделам или вы знаете, что такое sudo.
1)

cp -xpr /media/old_root /media/new_root
Тем самым мы просто скопируем исходный корень в конечный, со всеми атрибутами исходных файлов и директорий, а также будем держаться в пределах одной файловой системы (то есть, если у вас что-то примонтировано в /media/old_root/mnt/disk - оно не скопируется). Процесс длительный. Можно добавить в начало команды time, чтобы в конце узнать, сколько длилось копирование :)
2)
mount --bind /dev /media/new_root/dev
Монтируем текущий /dev в новый раздел, чтобы новая система "видела" установленные устройства. Это нужно для корректной установки загрузчика.
3)
chroot /media/new_root
Входим в окружение новой системы.
4)
mount -t proc proc /proc
Монтируем файловую систему /proc.
5)
mkswap /dev/new_swap
Говорим системе, где находится новый, предварительно созданный swap-раздел. Например, /dev/sda3.
6)
grub -> root(hd0,0) -> setup(hd0)
Этими командами мы установим загрузчик grub (директория которого находится в hd0,0) на новый диск hd0 (т.е., в MBR). Выполнять это следует только при переносе системы на новый HDD. При переносе просто на другой раздел текущего HDD старый загрузчик останется в рабочем состоянии и нужно будет только подправить его конфиг.
7)
nano /boot/grub/menu.lst
Подправим конфиг загрузчика - теперь он должен указывать на свежесозданные разделы. Если вы переносите систему только на другой раздел, то править нужно старый menu.lst - /media/old_root/boot/grub/menu.lst
8)
nano /etc/fstab
Также необходимо подправить конфиг монтируемых при загрузке устройств.

Всё готово. Советую не удалять сразу старый раздел, а предварительно убедиться в работоспособности нового.

3. Дополнения
1) Прописывать новые разделы в menu.lst и fstab лучше всего по UUID (Universally Unique Identifier) этих разделов. Это исключит вероятность того, что именование ваших разделов будет отличным от текущего и в любом случае ядро сможет правильно работать именно с нужными вам разделами. Узнать идентификаторы можно командой ls -l /dev/disk/by-uuid/.
В menu.lst формат будет таким:
kernel /vmlinuz26 root=/dev/disk/by-uuid/1ce08b86-b671-4013-beda-2d521ab187ec ro quiet vga=794 splash

А для fstab таким:
UUID=1ce08b86-b671-4013-beda-2d521ab187ec / ext3 defaults 0 1

2) В Arch Linux я столкнулся с проблемой при перезагрузке:
kinit: opening console: no such file or directory

В данном случае достаточно выполнить данную команду:
mknod -m 600 /dev/console c 5 1

Выполнять, естественно, надо в chroot. Или можно просто скопировать этот файл со старой системы (cp -a).
Также рекомендую пересоздать загрузочный образ:
mkinitcpio -p kernel26

из chroot.

4. Вот и всё
Перезагружаемся, проверяем всё ли работает.
???
PROFIT!

При написании данного очерка использовались материалы из данного топика на forum.ubuntu.ru А также 4 жестких диска и дистрибутивы Arch Linux "Overlord" и Debian Etch. Ни один из них в результате не пострадал.

3 комментария:

Анонимный комментирует...

Как раз в тему, переразбил винт и надо перенести корневой раздел на другой, а то он у меня самый последний, не хорошо как то))
Еще по теме вопрос, весь этот процесс происходит с запущенного с livecd?

Alsvartr комментирует...

Можно и с livecd (даже правильнее). Но я делал прямо с рабочей системы.

Константин комментирует...

Очень помог твой пост! Большое спасибо!