Клонирование системного диска

Section with additional software for Vesta
Forum rules
Before creating a new topic or reply on the forum you should fill out additional fields "Os" and "Web" in your profile section.
In case of violation, the topic can be closed or response from the support will not be received.
ahouse
Posts: 89
Joined: Fri Sep 01, 2017 1:05 pm

Os: Ubuntu 16x
Web: apache + nginx

Клонирование системного диска

Postby ahouse » Tue Sep 19, 2017 10:05 am

Вроде как готов скриптец.

Делает клон, есть возможность переразметки получателя, тоесть можно мигрировать между винтами с разными размерами, лиш бы данные влазили.

Нужно такое сюда? Делал специально для хоста на котором vesta
Last edited by ahouse on Thu Sep 21, 2017 8:52 am, edited 1 time in total.

skurudo
VestaCP Team
Posts: 7808
Joined: Fri Dec 26, 2014 2:23 pm
Contact:

Re: Клонирование системного диска

Postby skurudo » Wed Sep 20, 2017 10:08 am

Конечно, всегда интересно.
-> DigitalOcean competition - please, support us
-> fix for phpmyadmin - nice and sweet now

ahouse
Posts: 89
Joined: Fri Sep 01, 2017 1:05 pm

Os: Ubuntu 16x
Web: apache + nginx

Re: Клонирование системного диска

Postby ahouse » Wed Sep 20, 2017 12:51 pm

Code: Select all


#!/bin/bash
# (С) AHouse
########################################################################################
#
# CONFIGURATION
#

debug=1

# Имя диска-источника, с которого будет делаться копия
srcHDD="sda"

# Имя диска-получателя, на который будет делаться копия
dstHDD="sdc"

# Номер boot-раздела диска-источника
srcBootSlice=1

# Папка к которой  будет монтироваться диск-получатель, во время операций клонирования
# mountPoint - не имзенять!!!
mountPoint="/mnt"
newHDD="$mountPoint/newHDD"

# Размер корневого раздела
rootSliceSize="32G"

# Размер своп-раздела (=2*RAM)
swapSliceSize="8G"

# Размер tmp-раздела
tmpSliceSize="16G"

# Размер var-раздела
varSliceSize="16G"


# Выключать сервисы на момент работы скрипта клонирования
# 1 - Выключать

serviceShutdown=1






##########################################################################################
#
# ENTRY POINT
#
#

clear

function debuger(){
if [ $debug -eq 1 ]
then
    echo ""
    echo "###########################################################################################"
    echo $1
    echo "###########################################################################################"
    echo ""
fi
}


function unmounter(){
    # Проверяем, примонтирован ли куда-либо какой-нибудь раздел диска-получателя. Если да - размантируем.
    for dstSlice in `mount | grep $1 | awk ' {print $1} ' | sort -r -k1 -n`
    do
        mount | grep $dstSlice > /dev/null #check whether this share already mounted
       if [ $? -eq 0 ]; then
       debuger "Размантируем $dstSlice"
           umount $dstSlice
   fi
    done
}



if [ $serviceShutdown -eq 1 ]
then
    # Выключаем все сервисы, которые могут повлиять на потерю или неполучение данных
    # фаервол и банилку оставляем в рабочем состоянии.

    debuger "Отключаем сервисы:
apache2\n
nginx\n
bind9\n
exim4\n
dovecot\n
clamav-daemon\n
spamassassin\n
mysql\n
proftpd\n
cron"


    service apache2 stop
    service nginx stop
    service bind9 stop
    service exim4 stop
    service dovecot stop
    service clamav-daemon stop
    service spamassassin stop
    service mysql stop
    service proftpd stop
    service cron stop   



fi


mkdir $newHDD
debuger "Создаем дирректорию: $newHDD"


# Вычисляем UUID boot-раздела диска-источника
srcBOOTUUID=`lsblk -no UUID /dev/${srcHDD}${srcBootSlice}`
debuger "UUID boot-раздела диска-источника: $srcBOOTUUID"

unmounter $dstHDD



# Удаляем всю существующую разметку и нарезаем новую

# sdb1 - / 32GByte
# sdb2 - swap - 8G = 2*RAM
# sdb3 - Extended Logical Slice - All Available
# sdb5 - /tmp - 16G
# sdb6 - /var - 16G
# sdb7 - /home - All Available

debuger "Размечаем диск-получатель $dstHDD :"
debuger ""

debuger "${dstHDD}1 = / = $rootSliceSize"
debuger "${dstHDD}2 = swap = $swapSliceSize"
debuger "${dstHDD}3 = Extended Logical Slice = All Available"
debuger "${dstHDD}5 = /tmp = $tmpSliceSize"
debuger "${dstHDD}6 = /var = $varSliceSize"
debuger "${dstHDD}7 = /home = All Available"


fdisk -u  /dev/${dstHDD} <<EOF
o
n
p
1

+${rootSliceSize}
n
p
2

+${swapSliceSize}
n
e
3


n

+${tmpSliceSize}
n

+${varSliceSize}
n


a
1
t
2
82
w
EOF



# Форматирем новые слайсы
debuger "Форматируем ${dstHDD}1"
mkfs.ext4 -F /dev/${dstHDD}1
debuger "Форматируем ${dstHDD}1"
mkswap /dev/${dstHDD}2
debuger "Форматируем ${dstHDD}5"
mkfs.ext4 -F /dev/${dstHDD}5
debuger "Форматируем ${dstHDD}6"
mkfs.ext4 -F /dev/${dstHDD}6
debuger "Форматируем ${dstHDD}7"
mkfs.ext4 -F /dev/${dstHDD}7




# Монтируем и начинаем синхронизацию файловой структуры
debuger "Монтируем ${dstHDD}1"
mount /dev/${dstHDD}1 $newHDD
debuger "Синхронизируем / файловую систему..."
rsync -aAXv /* $newHDD --exclude={/mnt/*,lost+found/,/proc/*,/sys/*,/dev/*,/tmp/*,/var/*,/home/*}

debuger "Установка прав доступа на папку GRUB"
chmod 644 ${newHDD}/boot/grub/*
chmod 755 ${newHDD}/boot/grub/i386-pc/

debuger "Монтируем ${dstHDD}5 /tmp"
mount /dev/${dstHDD}5 ${newHDD}/tmp

debuger "Монтируем ${dstHDD}6 /var"
mount /dev/${dstHDD}6 ${newHDD}/var
debuger "Синхронизация /var файловой системы..."
rsync -aAXv /var/* ${newHDD}/var

debuger "Монтируем ${dstHDD}7 /home"
mount /dev/${dstHDD}7 ${newHDD}/home
debuger "Синхронизация /home файловой системы..."
rsync -aAXv /home/* ${newHDD}/home




debuger "Установка загрузчика GRUB..."
# Устонавливаем загрузчик grub в корневой раздел диска-получателя
grub-install --recheck --no-floppy --root-directory=${newHDD} /dev/${dstHDD}

debuger "Корректировка файлов конфигурации загрузчика ..."
# Корректируем старый конфиг загрузчика на новый UUID загрузочного слайса диска-приемника
chmod 644 ${newHDD}/boot/grub/*
sed -i "s/${srcBOOTUUID}/`lsblk -no UUID /dev/${dstHDD}1`/g" ${newHDD}/boot/grub/menu.lst
sed -i "s/${srcBOOTUUID}/`lsblk -no UUID /dev/${dstHDD}1`/g" ${newHDD}/boot/grub/menu.lst~
sed -i "s/${srcBOOTUUID}/`lsblk -no UUID /dev/${dstHDD}1`/g" ${newHDD}/boot/grub/grub.cfg
#sed -i "s/${srcBOOTUUID}/`lsblk -no UUID /dev/${dstHDD}1`/g" ${newHDD}/boot/grub/i386-pc/load.cfg




debuger "Генерируем новый /etc/fstab на диске-получателе ..."


echo "UUID="`lsblk -no UUID /dev/${dstHDD}1`" /   ext4    errors=remount-ro    0       1" > ${newHDD}/etc/fstab
echo "UUID="`lsblk -no UUID /dev/${dstHDD}2`" none            swap    sw              0       0" >> ${newHDD}/etc/fstab
echo "UUID="`lsblk -no UUID /dev/${dstHDD}5`" /tmp    ext4   defaults,errors=remount-ro    0       2" >> ${newHDD}/etc/fstab
echo "UUID="`lsblk -no UUID /dev/${dstHDD}6`" /var    ext4   defaults,errors=remount-ro    0       3" >> ${newHDD}/etc/fstab
echo "UUID="`lsblk -no UUID /dev/${dstHDD}7`" /home    ext4   errors=remount-ro,usrquota,grpquota,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0       4" >> ${newHDD}/etc/fstab



unmounter $dstHDD
rmdir $newHDD



if [ $serviceShutdown -eq 1 ]
then
    # Включаем все сервисы, если выключали
   
    debuger "Поднимаем сервисы:\n
    apache2\n
    nginx\n
    bind9\n
    exim4\n
    dovecot\n
    clamav-daemon\n
    spamassassin\n
    mysql\n
    proftpd\n
    cron"

   
    service apache2 start
    service nginx start
    service bind9 start
    service exim4 start
    service dovecot start
    service clamav-daemon start
    service spamassassin start
    service mysql start
    service proftpd start
    service cron start
   
fi


debuger "Диск-источник клонирован!"



Пользуйтесь в помощь, коллеги! Буду рад прислушаться к замечаниям и предложениям!


Return to “3rd Party Software”



Who is online

Users browsing this forum: No registered users and 1 guest

cron