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

Section with additional software for Vesta
ahouse
Posts: 19
Joined: Fri Sep 01, 2017 1:05 pm

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

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: 7791
Joined: Fri Dec 26, 2014 2:23 pm
Location: Moscow
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: 19
Joined: Fri Sep 01, 2017 1:05 pm

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: atolodas and 4 guests