Клонирование системы Clonehdd, dd, Pax | FreeBSD

=========
=CloneHdd=
=========
Понадобилось склонировать диск – старая скази начала сыпаться.

Ставим clonehdd из портов. Смотрим диски

#cd /dev
#ls
#df -h

Выясняем на каком диске стоит система, какой диск целевой. Формат такой – ad0s1a (ad0 – первый диск, s1 – первый слайс, a – раздел). Нам достаточно знать что ad0 – это в моем случае первый ide диск, источник с которого будем копировать – amrd0 (рейд со сказей).

#clonehdd -src=amrd0 -dst=ad0 -fstab -swap=2048

(-src и -dst – диск с которого клонируем и диск куда клонируем, -swap – размер раздела свопа, -fstab – записать файл fstab (c перечнем разделов старого диска, его потом надо будет поправить).

По поводу fstab можно указать сразу имя нового харда:

-fstab=ad0

Предупредит и склонирует. Подводные камни – не стоит просто копировать и править fstab со старого диска, говорят что clonehdd может поменять порядок разделов.
После клонирования может понадобиться запустить sysinstall (или fstab) и сделать новый диск загрузочным. Перед этим надо сделать:

#sysctl kern.geom.debugflags=16

Если поймали ошибку:

umount: /mnt/clone: not a file system root directory

Удаляем директорию /mnt/clone.

========
=dd=====
========

Более простым вариантом может быть просто побитовое копирование диска с помощью dd (есть во всех дистрибутивах, работает быстро (если увеличить буфер).

#dd if=/dev/amrd0 of=/dev/ad0 conv=noerror,sync bs=32k

if=/dev/amrd0 – исходный диск
of=/dev/ad0 – целевой диск
noerror — продолжать после ошибок чтения
sync — дополнять каждый входной блок до размера ibs путем добавления нулевых байт
bs – размер блока (для чтения, записи). Чтобы ускорить работу команды можно увеличить. Но это для случаев когда у нас исходный диск с которого мы переносим систему не сбойный. Если есть сбойные сектора – то лучше уменьшить (в ущерб скорости), но потерянных данных будет меньше (если попадется сбойный блок – то потеряем данных равным значению bs. Диск 62Гб с bs=32k у меня копировался минут сорок.
Для просмотра статуса работы – заходим во вторую консоль н этой же машине и вводим:

#killall -SIGINFO dd

На первой консоли увидим сколько байт скопировано, скорость и время.

После копирования загружаемся со старого диска или загрузочного, запускаем sysinstall идем в Configure, Label выбираем новый диск, первый раздел ad0s1a в нашем случае, и указываем точку монтирования (например каталог /mnt). Затем W изменений. Команда прочекает диск и подмонтирует. На подмонтированном ad0s1a (это рут нового диска) правим fstab. Все можно пробовать грузиться с нового диска. Естественно если перебрасываем железки по контроллерам (SATA0, 1 и т.д.) – то и пути изменяем (ad6, ad7 и т.д).

==========
=PAX======
==========

Для полноты картины упомянем PAX который есть в стандартной поставке, и говорят очень быстрый. Проблема там только с тем что надо руками поготовить всю структуру разделов до применения pax.
Через sysinstall на новом диске создаем слайс и разделы (надо предварительно записать структуру старого диска и создать аналогичную). Рут / должен быть первым разделом (ad0s1a например), слайс – загружаемым. Создаем на старом диске точки монтирования. Монтируем созданные разделы. И запускаем перенос файлов

#cd / && pax -p eme -X -rw . /mnt/root 
#cd /var && pax -p eme -X -rw . /mnt/var
#cd /usr && pax -p eme -X -rw . /mnt/usr

Поскольку там есть сложности с тем что надо точно создать структуру разделов совпадающую со старым диском, и рут у вас не всегда получится сделать вида ad0s1a (бить диск надо в single mode или с диска загружаемого), я не стал использовать pax и остановился на dd.

  1. А по сети clonehdd умеет? Ну, как-то так:

    # clonehdd -src=amrd0 -fstab -swap=2048 | ssh -l user host:port ‘-dst=ad0′