Cloning
Содержание
Клонирование различными способами
dd, nc, ansible (клонирование "гирляндой")
Почти как широковещательное, только лучше :-) Наверное...
apt-get install ansible mkdir /opt/ansible_cloning cd /opt/ansible_cloning cat << EOF > ansible.cfg [defaults] host_key_checking = false inventory = ./hosts.txt EOF cat << EOF > hosts.txt src ansible_host=172.16.223.166 ansible_user=root ansible_ssh_pass=partedmagic dst1 ansible_host=172.16.223.53 ansible_user=root ansible_ssh_pass=partedmagic dst2 ansible_host=172.16.223.173 ansible_user=root ansible_ssh_pass=partedmagic EOF cat << EOF > clone.sh #!/bin/bash #ansible dst1,dst2 -m shell -a "wipefs -af /dev/sda" # if need ansible dst2 -m shell -a "nc -l -p 19000 | dd of=/dev/sda status=progress 2> /cloning.log" & sleep 1s; ansible dst1 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/sda) | nc 172.16.223.173 19000'" & sleep 1s; ansible src -m shell -a "dd if=/dev/sda | nc 172.16.223.53 19000" ansible all -m shell -a "killall nc" EOF
Пример для клонирования машин 5, 6 и 14 с машины 3 в лаборатории МРП
Все машины должны быть загружены в LiveCD с доступом по ssh и наличием утилит dd и nc
Создаём файл хостов:
cat << EOF > hosts.txt src ansible_host=172.16.99.3 ansible_user=root ansible_ssh_pass=partedmagic dst1 ansible_host=172.16.99.1 ansible_user=root ansible_ssh_pass=partedmagic dst2 ansible_host=172.16.99.2 ansible_user=root ansible_ssh_pass=partedmagic dst4 ansible_host=172.16.99.4 ansible_user=root ansible_ssh_pass=partedmagic dst5 ansible_host=172.16.99.5 ansible_user=root ansible_ssh_pass=partedmagic dst6 ansible_host=172.16.99.6 ansible_user=root ansible_ssh_pass=partedmagic dst7 ansible_host=172.16.99.7 ansible_user=root ansible_ssh_pass=partedmagic dst8 ansible_host=172.16.99.8 ansible_user=root ansible_ssh_pass=partedmagic dst9 ansible_host=172.16.99.9 ansible_user=root ansible_ssh_pass=partedmagic dst10 ansible_host=172.16.99.10 ansible_user=root ansible_ssh_pass=partedmagic dst11 ansible_host=172.16.99.11 ansible_user=root ansible_ssh_pass=partedmagic dst12 ansible_host=172.16.99.12 ansible_user=root ansible_ssh_pass=partedmagic dst13 ansible_host=172.16.99.13 ansible_user=root ansible_ssh_pass=partedmagic dst14 ansible_host=172.16.99.14 ansible_user=root ansible_ssh_pass=partedmagic EOF
Создаём скрипт клонирования "гирляндой"
Суть: запускаем в фоне команды на прослушивание порта 19000 через nc и "хвост гирлянды" забирает поток с nc и направляет его на утилиту dd последнего узла в "гирлянде". И заодно на нём же можно смотреть прогресс утилиты dd (это значит что точно такой же прогресс уже прошёл через все остальные узлы гирлянды)
Остальные узлы принимают на nc поток, разветвляют его через tee и одну ветвь направляют на свой жёстки диск, а вторую отправляют дальше по цепочке в соседний узел гирлянды (через nc).
Последней по списку запускается команда считывания диска-источника и направления его в следующий после узла-источника узел "гирлянды". Эта команда уже не фоновая. Её завершение завершает весь скрипт.
Между командами задержки в 1 секунду. Чтобы успели открыться порты nc.
cat << EOF > clone.sh #!/bin/bash #14 ansible dst14 -m shell -a "nc -l -p 19000 | dd of=/dev/nvme0n1 status=progress 2> /cloning.log" & sleep 1s; #6 ansible dst6 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/nvme0n1) | nc 172.16.99.14 19000'" & sleep 1s; #5 ansible dst5 -m shell -a "bash -c 'nc -l -p 19000 | tee >(dd of=/dev/nvme0n1) | nc 172.16.99.6 19000'" & sleep 1s; # src ansible src -m shell -a "dd if=/dev/nvme0n1 | nc 172.16.99.5 19000" #ansible all -m shell -a "killall nc" EOF
dd через ssh
- загрузить две машины с pmagic (определить, кто будет донором, кто реципиентом)
- настроить сеть между этими машинами (обычно DHCP это делает за вас), выяснить ip-адреса донора и реципиента
- на доноре дать команду
dd if=/dev/устройство_донор | ssh root@ip_address_реципиента /bin/dd of=/dev/устройство_реципиент
например:
dd if=/dev/sda | ssh root@ip_address_реципиента /bin/dd of=/dev/sda
tar через ssh
- загрузить две машины с pmagic (определить, кто будет донором, кто реципиентом)
- настроить сеть между этими машинами (обычно DHCP это делает за вас), выяснить ip-адреса донора и реципиента
- смонтировать устройства в директории на доноре и реципиенте
- на доноре дать команду
cd /mnt/директория_донор tar cvf - . | ssh root@ip_address_реципиента 'cd /mnt/директория_реципиент; tar xf -'
например:
tar cvf - . | ssh root@192.168.155.9 'cd /mnt/lin; tar xf -'