Вот моя ситуация:
/dev/sda
отличается менее чем на 10 МБ, но массив целевого сервера почему-то на несколько мегабайт меньше.Что я хочу сделать:
fsck
на обоих концах (источник и место назначения), чтобы убедиться, что файловая система в порядке до и после передачи./
раздел./
раздел, так что при копировании его размер изменяется, чтобы соответствовать чуть меньшему размеру целевого диска.Мои вопросы:
/dev/sda
на каждом сервере, а затем используйте e2resize
для неразрушающего уменьшения размера /
раздел на стороне источника чтобы он уместился в пространстве назначения стороной?dd
на необработанном блочном устройстве, /dev/sda
от источника до места назначения (более ssh
), или должен ли я создать эквивалентный макет раздела в месте назначения и запустить dd
на каждой раздел? Обратите внимание, что обработка раздела за раз оставляет мне проблему с загрузчиком, но если я не делаю это по разделам за раз, тогда dd
необходимо знать, чтобы прекратить передачу данных после того, как он записал столько байтов, сколько может вместить адресат (что, надеюсь, «закроет» самый конец /
раздел на последнем блоке, который логически находится «справа» от всех остальных разделов в схеме разделов исходного кода).Несколько разное. особенности:
Это грязно, но выполнимо.
Я предполагаю здесь, что /
на /dev/sda3
и это /boot
на /dev/sda1
.
Уменьшите файловую систему на старом сервере до минимально возможного размера.
oldserver # resize2fs -M /dev/sda3
Разбейте диск нового сервера на разделы одинакового размера. /boot
, swapspace и новые /
раздел (и все, что вам нужно).
newserver # parted /dev/sda
Скопируйте /
и /boot
файловые системы.
oldserver # dd if=/dev/sda1 | ssh root@newserver "dd of=/dev/sda1"
oldserver # dd if=/dev/sda3 | ssh root@newserver "dd of=/dev/sda3"
Поскольку раздел на новом сервере будет немного меньше, чем раздел на старом сервере, вы получите ложный No space left on device
сообщение в конце этого. Однако, поскольку вы уменьшили файловую систему на шаге 1, это не имеет значения.
Измените размер файловой системы на новом сервере до размера раздела.
newserver # resize2fs /dev/sda3
Установите GRUB на новый диск.
newserver # mount /dev/sda3 /mnt
newserver # mount /dev/sda1 /mnt/boot
newserver # mount -o bind /dev /mnt/dev
newserver # mount -o proc proc /mnt/proc
newserver # chroot /mnt /bin/bash
newserver(chroot) # grub-install /dev/sda
newserver(chroot) # exit
Завершите остальные настройки (IP-адрес и т. Д.).
Вероятно, вы можете найти способ избежать копирования свободного пространства раздела, но, вероятно, вам потребуется больше времени, чтобы исследовать, чем просто скопировать все это ...
мне бы mkfs
свежие файловые системы на новом сервере, затем rsync
их со старого сервера. Это перезапускаемый, согласованный, и каждый файл легко проверяется индивидуально. Когда вы отбрасываете неиспользуемые разделы файловой системы (а не судебную копию), я не вижу причин не использовать этот метод. Вам придется повторно запустить GRUB, но это не должно быть проблемой.
Объяснение необработанной копии, поддерживающей файловую систему, займет у меня некоторое время, поэтому, если вы не прокомментируете, почему мое решение rsync не работает, я избавлю себя от набора текста.
Если вы ДЕЙСТВИТЕЛЬНО хотите передавать данные на уровне блочного устройства, я могу придумать один довольно полезный трюк, который я использовал для миграции серверов с минимальным временем простоя.
Дело в том, что вы можете создать деградированное зеркало на исходном сервере с вашим разделом данных, являющимся единственной активной половиной зеркала, а затем экспортировать целевой раздел со второго сервера через АОЕ (Полагаю, оба ваших сервера находятся в одном широковещательном домене). Затем на исходном сервере вы подключаете сетевое блочное устройство к деградировавшему зеркалу, чтобы оно начало восстанавливать. Дождитесь завершения восстановления, остановите зеркало, удалите устройство, экспортированное с помощью AOE, и все в порядке.
Чуть больше деталей (я постараюсь быть краткими).
Составные части:
mdadm
с этими строить режим (специальное зеркало без метаданных);vblade
для экспорта блочного устройства как сетевого устройства AOE;aoe-tools
для импорта сетевого блочного устройства AOE.Вам нужно создать таблицу разделов на целевом сервере, а затем сжать исходный раздел, чтобы он соответствовал назначению. Вы можете легко установить GRUB в новую MBR; синхронизация только разделов по вновь созданной таблице разделов немного менее подвержена ошибкам.
На принимающей стороне вы должны экспортировать свой раздел с помощью vblade
инструмент, на исходном сервере вы можете увидеть экспортированные устройства после установки aoe-tools
(бегать aoe-discover
тогда посмотри на /dev/ether/
для устройств).
Затем вы должны собрать устройство raid1 на исходном сервере с вашим источник водить машину:
mdadm --build /dev/md0 -n2 -l1 --force /dev/sda
После этого вы можете осмотреть только что построенное зеркало:
mdadm --detail /dev/md0
cat /proc/mdstat
На этом этапе вы можете безопасно присоединить экспортированный целевой раздел к этому зеркалу:
mdadm /dev/md0 --add /dev/ether/eX.Y
Тогда просто наблюдайте за процессом синхронизации:
watch -n5 cat /proc/mdstat
После завершения синхронизации просто остановите зеркало: mdadm --stop /dev/md0
на исходном сервере прекратить vblade
на целевом сервере, установите GRUB на втором сервере, измените свои IP-адреса и т. д.
Фактически, с помощью этого трюка можно почти вживую перемещать сервер между ящиками, с простоями только для перезагрузки синхронизированных ящиков.
По соображениям производительности я также предлагаю вам увеличить MTU вашего канала (или, если возможно, настроить отдельную VLAN с включенными кадрами jumbo).
Обратите внимание, вы также можете использовать что-то вроде nbd-server
/nbd-client
(или даже iSCSI, если хотите грубо) в качестве альтернативы AOE, но AOE (vblade
+ aoe-tools
) иметь очень простой интерфейс и отличная производительность (без накладных расходов TCP / IP),