Compare commits
No commits in common. "909b5bbb49d5c66c1bb1e28b446d4342eb81536a" and "f55223926f6b6d831ed8448537cce37550ec990d" have entirely different histories.
909b5bbb49
...
f55223926f
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
log*
|
|
||||||
59
zfs_send.zsh
59
zfs_send.zsh
@ -2,12 +2,16 @@
|
|||||||
|
|
||||||
#TODO list
|
#TODO list
|
||||||
# 1. Скрипт не определяет, что нужно остановиться
|
# 1. Скрипт не определяет, что нужно остановиться
|
||||||
# 2. Нужно автоматически определить, если копирование уже запущено то предложить остановить и вывести процесс резервирования
|
# 2. Возникают ошибки:
|
||||||
# Нет проверки на верность введённых параметров
|
# sending main_pool/3D_Design@manual-20250327 (99%: 21.9G/21.9G) 25.6M/s date: invalid date ‘@0.’
|
||||||
|
# date: invalid date ‘@954.’
|
||||||
|
# sending main_pool/3D_Design@manual-20250327 (100%: 21.9G/21.9G) 25.6M/s date: invalid date ‘@-1.’
|
||||||
|
# date: invalid date ‘@954.’
|
||||||
|
# 3. Нужно автоматически определить, если копирование уже запущено то предложить остановить и вывести процесс резервирования
|
||||||
# смотреть нужно сразу на всей системе. Не будем запускать несколько параллельных резервирований.
|
# смотреть нужно сразу на всей системе. Не будем запускать несколько параллельных резервирований.
|
||||||
|
|
||||||
|
|
||||||
backup_server="192.168.0.120" # Сервер для резервирования
|
backup_server="192.168.0.162" # Сервер для резервирования
|
||||||
backup_user="root" # Пользователь на сервере
|
backup_user="root" # Пользователь на сервере
|
||||||
inc_snapshot="manual-$(date +%Y%m%d)" # Новый создаваемый снисмок
|
inc_snapshot="manual-$(date +%Y%m%d)" # Новый создаваемый снисмок
|
||||||
incremental=false
|
incremental=false
|
||||||
@ -47,7 +51,7 @@ while [[ "$#" -gt 0 ]]; do
|
|||||||
echo " --no-check";
|
echo " --no-check";
|
||||||
echo " --stop";
|
echo " --stop";
|
||||||
echo "-i | --incremental" ;
|
echo "-i | --incremental" ;
|
||||||
exit 0;;
|
echo "-p | --progress" ;;
|
||||||
*) echo "Неизвестные параметры: $1"; exit 1 ;;
|
*) echo "Неизвестные параметры: $1"; exit 1 ;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
@ -86,20 +90,16 @@ find_ssh_key() {
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Если ключей нет, создаем новый
|
# Если ключей нет, создаем новый
|
||||||
if [ ! -f ~/.ssh/id_ed25519 ]; then
|
# echo "Создаём новый ключ..."
|
||||||
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
|
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 >&2
|
||||||
# echo "Создаём новый ключ..."
|
echo "~/.ssh/id_ed25519"
|
||||||
ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 >&2
|
|
||||||
echo "~/.ssh/id_ed25519"
|
|
||||||
else
|
|
||||||
echo "Ключей для этого сервера не найдено. Ключ по умолчанию ~/.ssh/id_ed25519 уже существует. Создание нового ключа прервано"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Определение ключа
|
# Определение ключа
|
||||||
key_path=$(find_ssh_key)
|
key_path=$(find_ssh_key)
|
||||||
key_pub_path="${key_path}.pub"
|
key_pub_path="${key_path}.pub"
|
||||||
|
|
||||||
|
|
||||||
check_ssh_connection() {
|
check_ssh_connection() {
|
||||||
ssh -o "BatchMode=yes" -o "ConnectTimeout=5" "$backup_user@$backup_server" exit 2>/dev/null
|
ssh -o "BatchMode=yes" -o "ConnectTimeout=5" "$backup_user@$backup_server" exit 2>/dev/null
|
||||||
return $?
|
return $?
|
||||||
@ -282,13 +282,12 @@ fi # Конец блока наличия переданных параметр
|
|||||||
# Словарь со списком последких снапшотов для датасетов
|
# Словарь со списком последких снапшотов для датасетов
|
||||||
declare -A last_loc_snaps
|
declare -A last_loc_snaps
|
||||||
echo -ne "Проверяю на наличие $inc_snapshot...\033[2K\r"
|
echo -ne "Проверяю на наличие $inc_snapshot...\033[2K\r"
|
||||||
column_widths="%-45s * %-45s\n"
|
|
||||||
for loc_ds bak_ds in ${(kv)work_datasets}; do
|
for loc_ds bak_ds in ${(kv)work_datasets}; do
|
||||||
# Запросить последние снимки
|
# Запросить последние снимки
|
||||||
loc_snap="$(zfs list -t snapshot -o name ${loc_ds} 2>/dev/null | grep 'manual' | tail -n1 | egrep -o '@.+' )"
|
loc_snap="$(zfs list -t snapshot -o name ${loc_ds} | grep 'manual' | tail -n1 | egrep -o '@.+' )"
|
||||||
loc_snap=${loc_snap:1} # удалить @ в начале строки
|
loc_snap=${loc_snap:1} # удалить @ в начале строки
|
||||||
if [[ $incremental = true ]]; then
|
if [[ $incremental = true ]]; then
|
||||||
bak_snap=$(ssh $backup_user@$backup_server zfs list -t snapshot -o name ${bak_ds} 2>/dev/null | grep 'manual' | tail -n1 | egrep -o '@.+')
|
bak_snap=$(ssh $backup_user@$backup_server zfs list -t snapshot -o name ${bak_ds} | grep 'manual' | tail -n1 | egrep -o '@.+')
|
||||||
bak_snap=${bak_snap:1} # удалить @ в начале строки
|
bak_snap=${bak_snap:1} # удалить @ в начале строки
|
||||||
fi
|
fi
|
||||||
# echo "$loc_ds @ $loc_snap -> $bak_ds @ $bak_snap"
|
# echo "$loc_ds @ $loc_snap -> $bak_ds @ $bak_snap"
|
||||||
@ -296,12 +295,12 @@ for loc_ds bak_ds in ${(kv)work_datasets}; do
|
|||||||
if [[ "$loc_snap" = "$inc_snapshot" ]]; then
|
if [[ "$loc_snap" = "$inc_snapshot" ]]; then
|
||||||
if [[ $incremental = true ]] && [[ "$loc_snap" = "$bak_snap" ]]; then
|
if [[ $incremental = true ]] && [[ "$loc_snap" = "$bak_snap" ]]; then
|
||||||
# Если последние снимки на обеих машинах совпадают в инкрементном режиме
|
# Если последние снимки на обеих машинах совпадают в инкрементном режиме
|
||||||
printf $column_widths "${loc_ds}@${loc_snap}" "существует на обеих машинах. Исключено из списка резервируемых"
|
echo "${loc_ds}@${loc_snap} * существует на обеих машинах. Исключено из списка резервируемых"
|
||||||
unset "work_datasets[$loc_ds]"
|
unset "work_datasets[$loc_ds]"
|
||||||
else
|
else
|
||||||
# Если на удалённой машине нет такого снимка, то предложить удалить.
|
# Если на удалённой машине нет такого снимка, то предложить удалить.
|
||||||
printf $column_widths "${loc_ds}@${loc_snap}" "существует на исходной машине, но отсутвует на $backup_server"
|
echo "Датасет $loc_ds уже имеет последний снимок $inc_snapshot"
|
||||||
read "act?ok: резервировать | re: пересоздать (удаляет сразу!!!) | по умолчанию исключить из работы : "
|
read "act?ok: резервировать | re: пересоздать (удаляет сразу!) | исключить из работы по умолчанию : "
|
||||||
case $act in
|
case $act in
|
||||||
re) zfs destroy "${loc_ds}@${loc_snap}";
|
re) zfs destroy "${loc_ds}@${loc_snap}";
|
||||||
loc_snap="$(zfs list -t snapshot -o name ${loc_ds} | grep 'manual' | tail -n1 | egrep -o '@.+' )";
|
loc_snap="$(zfs list -t snapshot -o name ${loc_ds} | grep 'manual' | tail -n1 | egrep -o '@.+' )";
|
||||||
@ -318,7 +317,6 @@ for loc_ds bak_ds in ${(kv)work_datasets}; do
|
|||||||
last_loc_snaps[$loc_ds]=$loc_snap
|
last_loc_snaps[$loc_ds]=$loc_snap
|
||||||
else
|
else
|
||||||
if [[ $incremental = true ]]; then
|
if [[ $incremental = true ]]; then
|
||||||
printf $column_widths "${loc_ds}" "Не имеет снимков. Не возможно сделать инкрементный резерв."
|
|
||||||
unset "work_datasets[$loc_ds]"
|
unset "work_datasets[$loc_ds]"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@ -453,8 +451,8 @@ echo $pids
|
|||||||
time_changed_percent_value=$TS1
|
time_changed_percent_value=$TS1
|
||||||
|
|
||||||
n_tasks=$(< /dev/shm/backup_n_tasks)
|
n_tasks=$(< /dev/shm/backup_n_tasks)
|
||||||
while [[ $i_task -lt $n_tasks ]]; do # выводим статус пока не завершены все задачи
|
i_task=$(< /dev/shm/backup_i_task)
|
||||||
i_task=$(< /dev/shm/backup_i_task)
|
while [[ $i_task != $n_tasks ]]; do # выводим статус пока не завершены все задачи
|
||||||
progress=$(ps -u | grep "sending" | grep -v "grep" | sed -r "s/(.*) zfs: (.*)/\2/")
|
progress=$(ps -u | grep "sending" | grep -v "grep" | sed -r "s/(.*) zfs: (.*)/\2/")
|
||||||
|
|
||||||
# Извлекаем объем и процент
|
# Извлекаем объем и процент
|
||||||
@ -541,15 +539,8 @@ echo $pids
|
|||||||
elapsed_total=$(( $(date +%s) - TS1 ))
|
elapsed_total=$(( $(date +%s) - TS1 ))
|
||||||
fi
|
fi
|
||||||
time_part_of_percent=$(( now - time_changed_percent_value )) # Время с последнего изменения процента
|
time_part_of_percent=$(( now - time_changed_percent_value )) # Время с последнего изменения процента
|
||||||
# Используем awk для более точных расчётов
|
estimated_total=$(( 100 / percent * elapsed_total )) # Всего времени на задачу
|
||||||
# estimated_total - Всего времени на задачу
|
estimated_remain=$(( estimated_total - elapsed_total - time_part_of_percent )) # Осталось времени на задачу
|
||||||
# estimated_remain - Осталось времени на задачу
|
|
||||||
read estimated_total estimated_remain <<< $(awk -v p="$percent" -v t="$elapsed_total" -v tp="$time_part_of_percent" '
|
|
||||||
BEGIN {
|
|
||||||
total = (p > 0 ? (100 / p * t) : 0);
|
|
||||||
remain = (total > 0 ? (total - t - tp) : 0);
|
|
||||||
printf("%d %d", total, remain)
|
|
||||||
}')
|
|
||||||
if (( estimated_remain >= 86400 )) || (( estimated_total >= 86400 )); then # Если осталось более чем сутки, то отобразить дни
|
if (( estimated_remain >= 86400 )) || (( estimated_total >= 86400 )); then # Если осталось более чем сутки, то отобразить дни
|
||||||
estimated_remain_days=$(( estimated_remain / 86400 )); estimated_remain_time=$(( estimated_remain % 86400 ))
|
estimated_remain_days=$(( estimated_remain / 86400 )); estimated_remain_time=$(( estimated_remain % 86400 ))
|
||||||
estimated_total_days=$(( estimated_total / 86400 )); estimated_total_time=$(( estimated_total % 86400 ))
|
estimated_total_days=$(( estimated_total / 86400 )); estimated_total_time=$(( estimated_total % 86400 ))
|
||||||
@ -573,11 +564,9 @@ echo $pids
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Удалить временные файлы состояний, если они существуют
|
# Удалить временные файлы состояний, если они существуют
|
||||||
[ -f /dev/shm/backup_i_task ] && rm /dev/shm/backup_i_task
|
[ -f /dev/shm/backup_i_task ] && rm /dev/shm/backup_i_task
|
||||||
[ -f /dev/shm//dev/shm/backup_time_start ] && rm /dev/shm/backup_time_start
|
[ -f /dev/shm//dev/shm/backup_time_start ] && rm /dev/shm/backup_time_start
|
||||||
[ -f /dev/shm//dev/shm/backup_time_circle ] && rm /dev/shm/backup_time_circle
|
[ -f /dev/shm//dev/shm/backup_time_circle ] && rm /dev/shm/backup_time_circle
|
||||||
# Обнуляем переменные после завершения задачи, чтобы избежать ошибок при повторном запуске
|
|
||||||
unset last_volume last_volume_time last_update_time last_percent time_changed_percent_value
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user