vintbsd,
Ок
Скрипт востановления
Код: Выделить всё
#!/bin/sh
# Переменные
# Перед выполнением проверить и отредактировать!
# Имя диска (устройства)
dev=ada0
# Имя создаваемого пула
tank="tank0"
# Имя востанавливаемого Сервера (uname -n)
Uname="exemple.com"
# имя сетевого интерфейса
if_lan=em0
# адрес хоста на момент восстановления
ip_host="192.168.0.116"
# адрес шлюза
ip_gw="192.168.0.1"
# адрес ftp сервера c файлами восстановления
ip_ftp="192.168.0.11"
# порт ftp сервера c файлами восстановления
port_ftp="21"
# логин и пароль ftp сервера c файлами восстановления
usr="backup"
pass="mysuperpass"
awk="/usr/bin/awk"
# Строка даты и времени резервной копии
backup_data="25-04-2016"
# ================= Расcчитываемыt занчения, для, справки ======================
# имя файла-архива с запакованным пулом
#backup_f="$Uname.tank0.${backup_data}.img.gz"
# имя резервных копий файлов загрузчиков
backup_gptzfsboot="$Uname.${tank}.${backup_data}.gptzfsboot"
backup_pmbr="$Uname.${tank}.${backup_data}.pmbr"
backup_snapshot="$Uname.snapshot.${backup_data}.txt"
### =============== Разбивка диска, для, справки ===============================
# =========== Тело скрипта ===================================================
echo "script: Create GPT, add partitions..."
gpart create -s gpt $dev
echo "script: add freebsd-boot partition boot0"
gpart add -b 34 -s 64k -t freebsd-boot -l boot0 ${dev}
echo "script: add freebsd-swap partition swap0"
gpart add -s 4G -t freebsd-swap -l swap0 ${dev}
echo "script: add freebsd-zfs partition disk0"
gpart add -t freebsd-zfs -l disk0 ${dev}
echo " "
echo "script: GPT on $dev created, partitions added."
echo " "
sleep 5
# Настраиваем сеть
ifconfig ${if_lan} inet ${ip_host} netmask 255.255.255.0
# Пропишем шлюз по умолчанию команда route:
route add default ${ip_gw}
#Обязательно задержка, а то сразу сеть не поднимается!
sleep 10
#Загружаем с FTP серевера резервные копии загрузчиков
# /boot/pmbr и /boot/gptzfsboot
echo "script: Download backup boot records from ftp start...."
ftp -i -A -P ${port_ftp} -o /tmp/gptzfsboot ftp://${usr}:${pass}@${ip_ftp}/${backup_gptzfsboot}
ftp -i -A -P ${port_ftp} -o /tmp/pmbr ftp://${usr}:${pass}@${ip_ftp}/${backup_pmbr}
ftp -i -A -P ${port_ftp} -o /tmp/snapshot ftp://${usr}:${pass}@${ip_ftp}/${backup_snapshot}
#Имя Пула который востанавливаем
Snapshot=`cat /tmp/snapshot | awk -F@ 'FNR==1 {print $1}'`
# Записываем загрузчик в загрузочную область.
# Корректно делать резервную копию /boot/pmbr и /boot/gptzfsboot
# с последующим восстановлением из нее, а не а не с того,
# что подвернется на загрузочной флешке.
# Это нужно, чтобы загрузчик совпадал с загрузчиком исходной системы
# Поэтому вместо
#gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${dev}
# пишем:
gpart bootcode -b /tmp/pmbr -p /tmp/gptzfsboot -i 1 ${dev}
gpart show ${dev}
sleep 3
gpart show -l ${dev}
sleep 5
# Create ZFS pool
echo "script: Create ZFS pool..."
# Работаем над обеспечением геометрии с 4K
gnop create -S 4096 /dev/gpt/disk0
zpool create -f -o altroot=/mnt -o version=28 -o cachefile=/var/tmp/zpool.cache ${tank} /dev/gpt/disk0.nop
zpool export ${tank}
gnop destroy /dev/gpt/disk0.nop
mkdir /tmp/${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}
# указываем, что пул загрузочный
zpool set bootfs=${tank} ${tank}
sleep 3
# Create ZFS-filesystem
echo "script: Create filesystem..."
# ну зачем же? для быстродействия синтетического теста? За уши?
zfs set atime=off ${tank}
# Включаем контрольные суммы посерьезнее.
zfs set checksum=fletcher4 $tank
########################
# А так получаем нужный нам поток:
# ftp -i -A -P 8022 -o - ftp://proxy3:proxy3@192.168.16.19/$Uname.tank.2012.11.01_1735.img.gz
# С распаковкой и передачей на вход zfs:
# ftp -i -A -P 8022 -o - ftp://proxy3:proxy3@192.168.16.19/$Uname.tank.2012.11.01_1735.img.gz | gzip -d -с | zfs receive -vF -d tank
# итого с учетом переменных для возможности настройки:
echo "script: Receive system from ftp start...."
cat /tmp/snapshot | $awk '/'${tank}'/ {print $1}' | while read line
do
echo $line
pool=`echo $line | $awk '/'${tank}'/ {gsub("\/",".") ; print $1}'`
echo $pool
ftp -i -A -P ${port_ftp} -o - ftp://${usr}:${pass}@${ip_ftp}/$Uname.${pool}.img.gz | gzip -d -c | zfs receive -vF -d ${tank}
done
echo "script: Receive system from ftp finish"
sleep 5
# вообще это лишнее, но не мешает
#mkdir /tmp/root
# что бы добраться до результирующего "/boot/zfs/zpool.cache"
# приходится стучать в бубен
zfs set mountpoint=/tmp/root ${tank}
# то же лишнее
cd /tmp
zpool export ${tank}
zpool import -o altroot=/tmp/${tank} -o cachefile=/var/tmp/zpool.cache ${tank}
echo "script: Copy zpool cache..."
# Копируем zpool.cache на своё место. Только не пропустите этот шаг, были случаи )
# Сей чудовый путь забавен, но логически верен. Проверено.
# И запись выше "mkdir /tmp/root" вообще лишняя
cp /var/tmp/zpool.cache /tmp/${tank}/tmp/root/boot/zfs/zpool.cache
# отмотируем все это безобразие
zfs unmount -af
# вернем пул в корень
zfs set mountpoint=/ ${tank}
echo "script: done!"
echo "enter please command 'reboot'"
# reboot systemm
#reboot
Только внимание этот скрипт тебе не подойдет потому что у тебя вся система в одном файле у меня разбито по партициям
Для справки скрипт резервного копирования
Код: Выделить всё
#!/bin/sh
# резервное копирование
#имя пула
poolname='tank0'
#дата и время
DATE=`date +%d-%m-%Y`
cd /tmp/
pwd
Uname=`uname -n`
#Делаем рекурсивный снапшот пула с корня
zfs snapshot -r ${poolname}@${DATE}
#рисуем результат
zfs list -t snapshot |awk 'FNR>1 {print}' > /tmp/$Uname.snapshot.${DATE}.txt
ftpkeys="-i -a -A -P 21"
usr="backup"
pass="mysuperpass"
ftpsrv="192.168.0.11"
#отправляем на сервер
uname -n > /tmp/$Uname.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.txt
rm /tmp/$Uname.txt
#отправляем загрузчик и загрузочную область на сервер
gpart show > /tmp/$Uname.gpart.${DATE}.txt
cp /boot/pmbr /tmp/$Uname.${poolname}.${DATE}.pmbr
cp /boot/gptzfsboot /tmp/$Uname.${poolname}.${DATE}.gptzfsboot
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.gpart.${DATE}.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.snapshot.${DATE}.txt
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.${poolname}.${DATE}.pmbr
ftp -i -A -P 21 -u ftp://${usr}:${pass}@${ftpsrv}/ $Uname.${poolname}.${DATE}.gptzfsboot
#Вариант полный, с запаковкой, медленный
#1160334296 bytes sent in 18:26 (1.00 MiB/s)
#Тут узкое место по времени - процесс сжатия,
#можно попробовать сжимать с меньшей эффективностью,
#но не вижу пока необходимости.
cat $Uname.snapshot.${DATE}.txt | awk '/'${poolname}'/ {print $1}' | while read line
do
#echo $line
pool=`echo $line | awk '/'${poolname}'/ {gsub("\/","."); print $1}'`
#echo $pool
zfs send $line | gzip -7 | ftp ${ftpkeys} -u ftp://${usr}:${pass}@${ftpsrv}/$Uname.$pool.img.gz -
done
###zfs send -R ${poolname}@${DATE} | gzip -4 | ftp ${ftpkeys} -u ftp://${usr}:${pass}@${ftpsrv}/$Uname.${poolname}.${DATE}.img.gz -
###echo "------- end send snapshot '${poolname}.${DATE}', sleep 4c ----"
#Вариант полный, без запаковки, быстрый
#4814869016 bytes sent in 01:07 (68.14 MiB/s)
#zfs send -R ${poolname}@${DATE} | ftp ${ftpkeys} -u \
#ftp://${usr}:${pass}@${ftpsrv}/$Uname.${poolname}.${DATE}.img -
#echo "------- end send snapshot '${poolname}.${DATE}', sleep 4c ----"
sleep 4
echo 'Backup Complete'
#удаляем снапшот
zfs destroy -r ${poolname}@${DATE}
rm /tmp/$Uname.${poolname}.${DATE}.pmbr
rm /tmp/$Uname.${poolname}.${DATE}.gptzfsboot
rm /tmp/$Uname.snapshot.${DATE}.txt
rm /tmp/$Uname.gpart.${DATE}.txt
Отправлено спустя 20 минут 2 секунды:
lazhu,
Загружаться не будет только, если забыли кэш положить в /boot/zfs.
Да все верно.
Я сужу по логам которые выкладывал
vintbsd,
receiving full stream of tank/ROOT@2016.05.08_2213 into tank/ROOT@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT/default@2016.05.08_2213 into tank/ROOT/default@2016.05.08_2213
У него какой то из этих разделов смонтирован в корень. Из этого следует чтоб нормально заработало нужно правильно смонтировать корневой раздел.
vintbsd писал(а): cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory
В этом месте вместо tank должен быть tank/ROOT или tank/ROOT/default
Зделать вывод команды
Мой совет после копирования zpool cache закоментировать все что осталось до конца и вручную посмотреть по какому пути находиться кеш пула и вручнуб его скопировать.
После того как вручную скопировали выполнить команды которые остались.
dimidrol80 писал(а): zfs unmount -af
# вернем пул в корень
zfs set mountpoint=legacy ${tank}
reboot
Отправлено спустя 17 секунд:
lazhu,
Загружаться не будет только, если забыли кэш положить в /boot/zfs.
Да все верно.
Я сужу по логам которые выкладывал
vintbsd,
receiving full stream of tank/ROOT@2016.05.08_2213 into tank/ROOT@2016.05.08_2213
received 41.7KB stream in 1 seconds (41.7KB/sec)
receiving full stream of tank/ROOT/default@2016.05.08_2213 into tank/ROOT/default@2016.05.08_2213
У него какой то из этих разделов смонтирован в корень. Из этого следует чтоб нормально заработало нужно правильно смонтировать корневой раздел.
vintbsd писал(а): cp: /tmp/tank/tmp/root/boot/zfs/zpool.cache: No such file or directory
В этом месте вместо tank должен быть tank/ROOT или tank/ROOT/default
Зделать вывод команды
Мой совет после копирования zpool cache закоментировать все что осталось до конца и вручную посмотреть по какому пути находиться кеш пула и вручнуб его скопировать.
После того как вручную скопировали выполнить команды которые остались.
dimidrol80 писал(а): zfs unmount -af
# вернем пул в корень
zfs set mountpoint=legacy ${tank}
reboot