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