Миграция установленного Linux’а на другую машину

Перенос Linux’а на другой компьютер

Причин для переноса установленного Linux’а на другой компьютер или виртуальную машину может быть множество. У меня причина простая, я наигрался с CentOS’ом в Parallels Desktop’е на ноутбуке и решил его перенести в виртуальную машину на Mac mini, где у меня запущен VMware ESXi 5.5.

Переносить можно по-разному, можно сделать бэкап какой-нибудь сторонней утилитой, а затем восстановить операционную систему уже на новом месте. Но я выбрал самый простой вариант — перенос содержимого диска по сети используя утилиты dd и NetCat (в случае если будет использоваться незащищённый канал связи, можно использовать вместо netcat’а — ssh, это на порядок медленнее, зато безопаснее).

Порядок действий для переноса:

  • Создаём в VMware ESXi виртуальную машину с аналогичным размером виртуального диска (под понятие создаём виртуальную машину попадает: создание виртуальной машины, прописывание ей определённого MAC-адреса, создание статической записи в DHCP-сервере для этого MAC-адреса и соответствующего ему IP-адреса и назначение имени для IP-адреса в сервере DNS).

    В дефолтном ядре CentOS 7 драйвера для SCSI-контроллеров LSI и VMware Paravirtual скомпилированы как модули, поэтому если создать виртуальную машину со SCSI-диском – она не загрузится. Так что лучше создавать IDE-диск.

  • Скачиваем и загружаем SystemRescueCD и в виртуальной машине донора, и в виртуальной машине реципиента.
  • На машине донора подключаем SystemRescueCD как виртуальный диск и загружаемся с него (в меню выбирайте самый верхний пункт).
    screen_01_systemrescuecd_menu
  • На предложение выбрать раскладку можно, в принципе, не реагировать, всё равно русский язык нам не понадобится. Но если перфекционизм — ваш конёк, можно ввести 31 и нажать «Enter». 🙂
    screen_02_systemrescuecd_locale
  • После загрузки увидим стандартную Linux’овую консольку с небольшой инструкцией по настройке сети, а так же с перечнем предустановленных утилит.
    screen_03_systemrescuecd_shell
  • На машине реципиента так же подключаем SystemRescueCD как виртуальный диск и загружаемся с него.
  • На обеих машинах первым делом устанавливаем пароль для root’а, для того чтобы можно было подключаться к машине используя ssh:

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


    а на реципиенте команду:

  • Теперь проверяем что на нашем доноре работает сеть:


    Если с DHCP-сервером всё хорошо, то вручную настраивать сеть не нужно будет, в противном случае необходимо будет настроить сеть используя следующую команду:

  • Обратите внимание, что сетевой интерфейс не обязательно будет называться eth0, при загрузке SystemRescueCD в VMware ESXi, сетевой интерфейс, к примеру, называется ens160:

  • Пароль для root’а задали, сеть настроили, теперь осталось только проверить ping с машины на машину и можно приступать к главному, к переносу информации с диска на диск.
  • Для начала необходимо узнать как в наших системах называются жёсткие диски, для этого выполняем следующую команду на доноре:


    И аналогичную команду на реципиенте:


    В обоих случаях диск называется /dev/sda, запомним это и приступим к переносу.

  • Сначала на машине реципиента запустим серверную часть утилиты NetCat, которая будет записывать на диск всё что получит по сети с другой машины:

    <!— [Format Time: 0 plavix 75 mg.0011 seconds] —>

  • Теперь на машине донора запусти клиентскую часть утилиты NetCat, которая будет считывать данные с исходного диска и передавать по сети на другую машину:

  • Выше описан вполне рабочий вариант, но его можно улучшить добавив сжатие на лету:


    Вместо gzip’а можно использовать команду bzip2 или даже lzma с теми же ключами. Просто gzip хоть и сжимает похуже, но зато работает намного быстрее.

  • А вариант со сжатием можно ещё улучшить добавив визуализацию:


    Теперь, во время копирования содержимого диска будет не просто чёрный экран, а вполне себе информативное сообщение:

  • Но и предыдущий вариант можно немного видоизменить, добавив ещё больше красоты:


    screen_04_systemrescuecd_progress

    Единственную проблему заметил с этим pv, если не заворачивать пайп с dd на pv, а напрямую читать диск с помощью pv, то в конце, когда всё прочитано – pv не завершается и приходится нажимать Ctrl+C. Но лучше подождать, пока в консоли реципиента не появится сообщение о том что всё прочитано и записано:

  • Update: 2016-01-01: В dd начиная с CentOS 7.2 появился новый ключ status=progress, если его добавить к команде, то в консоли ежесекундно будет отображаться статус, аналогичный тому что появляется в самом конце выполнения команды.
  • После копирования можно проверить, одинаково ли скопировалось командами:


    Как видим, в моём случае контрольная сумма совпадает, значит содержимое дисков идентично.

После этой процедуры на реципиенте можно уже загружаться с записанного диска.

Увеличение раздела и LVM’а

Итак, допустим Вы перенесли содержимое одного диска меньшего размера на другой диск большего размера. Так как при побайтовом копировании используя команду dd копируется и таблица разделов, у нас может получиться примерно так:

Как мы видим, у нас размер диска 68.7GB, а 2-й раздел с LVM’ом заканчивается где-то на отметке 54.2GB. Т.е. 14,5 гигабайт у нас осталось неразмеченным. Попробуем исправить эту ситуацию.
Существует два варианта увеличения раздела.

Вариант с удалением существующего и созданием на его месте нового раздела с другим размером

Для начала запустим parted, и сделаем так, чтобы он оперировал секторами:

Обязательно запишите свои значения номеров начального (Start) и конечного (End) секторов разделов. Это пригодится в дальнейшем.
Теперь удалим существующий 2-й раздел:

Если Вы пытаетесь пересоздавать разделы по-живому, то скорее всего Вы получите такую ошибку:

Здесь можно ответить «Ignore», но после пересоздания разделов – лучше перезагрузить сервер.

И на месте удалённого раздела создадим новый:

При создании нового раздела, в качестве номера начального сектора раздела указываем то же значение, что и было у того раздела, что мы удалили, а в качестве номера конечного сектора раздела указываем -1s, что означает последний сектор. Т.е. создаём раздел максимального размера. А команда «set 2 lvm on» означает что для раздела #2 указываем его предназначение – LVM.
После создания нового раздела – можно выйти из parted’а:

Вариант с увеличением раздела без удаления

Но есть проблема. Команду resize и resizepart убрали из последних версий parted’а, по крайней мере в CentOS 7 этих команд в parted’е нет. Поэтому лучше пользоваться первым вариантом с удалением и пересозданием раздела.

После того как раздел увеличили, необходимо увеличить физический том LVM на этом разделе. Сначала выполняем команду:

Как видим, размер нашего LVM’а 50 GiB. Для увеличения физического тома LVM выполним следующую команду:

Эта команда означает что нужно расширить физический том LVM на всю величину раздела. Если в результате мы видим что размер LVM увеличился – значит всё хорошо, если же нет – значит нужно сначала перезагрузить сервер, а потом повторить выполнение этих двух команд.

Пробуем после перезагрузки:

Как видим, после перезагрузки всё получилось так как и планировали. Размер нашего LVM’а увеличился.

Вообще лучше всего изменять разделы и файловые системы загрузившись в SystemRescueCD, а не напрямую изнутри.

Comments

  1. Последнее с изменением размера не понятно, первый раз перенес ввожу parted print важный раздел весит 29 mb, ждал перенос полчаса

  2. Первый раз почему то ввожу parted print важный раздел весит 29 мб,
    Щас второй раз пробую
    Пункт про изменение размера диска не понятен, что значит удаление? мне нужно перенос а не с нуля ставить)

    Использовал это
    (target) root@sysresccd /root % nc -l -p 19000 | pv | dd bs=16M of=/dev/sda conv=notrunc,noerror
    (source) root@sysresccd /root % pv /dev/sda | nc centos2.acmelabs.spb.ru 19000

    Я без сжатия начал, потому проц тупит

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.