Page 1 of 1

Скритп клонирования системного диска / System hdd Clone Script

Posted: Tue Sep 19, 2017 10:05 am
by ahouse
Вроде как готов скриптец.

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

Нужно такое сюда? Делал специально для хоста на котором vesta

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

Posted: Wed Sep 20, 2017 10:08 am
by skurudo
Конечно, всегда интересно.

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

Posted: Wed Sep 20, 2017 12:51 pm
by ahouse

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 "Диск-источник клонирован!"

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

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

Posted: Fri May 04, 2018 12:45 pm
by ahouse
Очередная версия скрипта для клонирования или переноса системного жесткого диска linux на новый диск.
Небольшие правки замеченных багов и неточностей в прошлой версии.

Code: Select all

#!/bin/bash
# (C) AHouse
# HDD Clone v0.0.2 04.05.2018
# Даный скрипт предназначен для клонирования системного жетского диска с рабочей OS
# Тестирование происходили на Ubuntu 16.04.4
# Перед запуском, в обязательном порядке необходимо указать номер раздела с которого грузится
# клонируемая OS - за ото отвечает конфигурацуионная переменная srcBootSlice=1 ( до автоматического определения - не дошли руки.)
# Если Вас не устраивает моя разметка геометрии диска-получателя - измените соответствующие разделы.
#
########################################################################################
#
# CONFIGURATION
#

# debug=1 - вывод сообщений в консоль и в лог файл, debug=0 отсутствие сообщений
debug=1

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

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

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

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

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

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

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

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

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

clear
rm clone.log

function debuger(){
if [ $debug -eq 1 ]
then.
    echo ""
    echo "###########################################################################################"
    echo -e $1
    echo "###########################################################################################"
    echo ""
    echo `date ` $1 >> ./clone.log
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 "Отключаем сервисы:\n 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

if ! [ -d $newHDD ]; then
    mkdir $newHDD
    debuger "Создаем дирректорию: $newHDD"
fi

# Вычисляем UUID boot-раздела диска-источника
srcDevROOT=$(mount | grep '/ type' | awk '{print $1}')
srcROOTUUID=`lsblk -no UUID $srcDevROOT`
srcBOOTUUID=`lsblk -no UUID /dev/$srcHDD$srcBootSlice`

debuger "UUID boot-раздела диска-источника: $srcBOOTUUID"

unmounter $dstHDD
debuger "Проверяем, не примонтирован ли куда диск получатель $dstHDD"


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

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

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

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 = Все доступное"


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 загрузочного слайса диска-приемника
dstBOOTUUID=`lsblk -no UUID /dev/${dstHDD}1`

chmod 644 ${newHDD}/boot/grub/*
debuger "${srcBOOTUUID}  -->  ${dstBOOTUUID}"
sed -i "s/${srcBOOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/menu.lst
sed -i "s/${srcBOOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/menu.lst~
sed -i "s/${srcBOOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/grub.cfg

sed -i "s/${srcROOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/menu.lst
sed -i "s/${srcROOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/menu.lst~
sed -i "s/${srcROOTUUID}/${dstBOOTUUID}/g" ${newHDD}/boot/grub/grub.cfg

sed -i 's:/vmlinuz-:/boot/vmlinuz-:g' ${newHDD}/boot/grub/grub.cfg
sed -i 's:/initrd.img-:/boot/initrd.img-:g' ${newHDD}/boot/grub/grub.cfg
sed -i 's:\ root='$srcDevROOT':\ root=UUID='${dstBOOTUUID}':g' ${newHDD}/boot/grub/grub.cfg

sed -i 's:/vmlinuz-:/boot/vmlinuz-:g' ${newHDD}/boot/grub/menu.lst
sed -i 's:/initrd.img-:/boot/initrd.img-:g' ${newHDD}/boot/grub/menu.lst
sed -i 's:\ root='$srcDevROOT':\ root=UUID='${dstBOOTUUID}':g' ${newHDD}/boot/grub/menu.lst

sed -i 's:/vmlinuz-:/boot/vmlinuz-:g' ${newHDD}/boot/grub/menu.lst~
sed -i 's:/initrd.img-:/boot/initrd.img-:g' ${newHDD}/boot/grub/menu.lst~
sed -i 's:\ root='$srcDevROOT':\ root=UUID='${dstBOOTUUID}':g' ${newHDD}/boot/grub/menu.lst~

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 "Диск-источник клонирован!"