ad.backup.zfs
Yohn Y.
2026-05-17
0:00bb6c16b4b6
Go to Latest
ad.backup.zfs/lib/main.sh
.. init
. По сути архивация имеющегося самопиского решания для памяти.
2 # devel.a0fs.net: zfsbackup.lib.log - v0.1 by awgur
4 # Файл содержит процедуры и функции организации определения и исполнения
5 # заданий на резервное копирование наборов данных ZFS
7 # Определяем корень иерархии файлов относительно файла задания $dir_root/task/$task_name
8 # при условии что данная переменная не определена в вызывающем скрипте
9 dir_root="${dir_root:-$(dirname
"$(dirname
"$(readlink
-f
"$0")")")}"
10 dir_lib="${dir_lib:-${dir_root}/lib}" # Директория с библиотеками
14 sys_propNamePrefix="net.a0fs.zfsbackup" # префикс для свойств набора данных ZFS,
15 # в которые будут сохранятся параметры
17 sys_backupType_d="daily"
18 sys_backupType_h="hourly"
19 sys_date_now="$(date
'+%Y%m%d-%H%M%S')"
20 sys_date_today="$(date
'+%Y%m%d')"
21 sys_date_thisHour="$(date
'+%Y%m%d-%H')"
24 # Проверяет, является ли аргумент числом
25 echo "$1" | grep
-vE
'^[[:space:]]*$' | sed
's/[[:space:]]//g' | tr
-d
'\n\r' | grep
-E
'^[0-9]+$' >
/dev/null
2>
&1
29 # Конструктор имени снимка. Для однотипного именования по всему скрипту
31 # dataset_name : Имя набора данных, для которого получаем снимок
32 # backup_type : Имя типа резервного копирования
33 # timeMark : Метка времени
34 if !
[ "$1" -a
"$2" -a
"$3" ] ; then
35 log_err
"svc_makeName(): Not enough arguments (dataset_name='$1', backup_type='$2', timeMark='$3')"
38 echo "$1@${sys_propNamePrefix}_${3}_${2}"
41 svc_date_getSnapTime
() {
42 # Получение временной метки из имени снимка
48 echo "$1" | sed
"s/.*@${sys_propNamePrefix}_//" | cut
-f
1 -d
'_'
52 # Проверка, сделан ли снимок набора данных в день проверки
58 svc_date_getSnapTime
"$1" | grep
-E
"^${sys_date_today}" >/dev/null
2>
&1
61 svc_date_isThisHour
() {
62 # Проверка, сделан ли снимок набора данных в час проверки
68 svc_date_getSnapTime
"$1" | grep
-E
"^${sys_date_thisHour}" >/dev/null
2>
&1
72 # Получить список снимков для данного в аргументах набора.
73 # ВНИМАНИЕ! Снимки сортируются в обратном порядке
75 # dataset_name : Имя набора, для которго получаем снимки
76 # backup_type : Имя типа резервного копирования
77 if !
[ "$1" -a
"$2" ] ; then
78 log_err
"zfs_getSnaps(): Dataset or backup type not set: dataset='$1' backup_type='$2'"
82 zfs
list
-Ho
name
-d
1 -r
-t
snapshot
"$1" \
83 | grep
-E
"@${sys_propNamePrefix}_[0-9]{8}-[0-9]{6}_${2}\$" \
88 # Получить последний снимок созданный системой резервного копирования
90 # dataset_name : Имя набора, для которого получаем снимок
92 log_err
"zfs_getLastSnap(): Dataset not set"
96 zfs
list
-Ho
name
-d
1 -r
-t
snapshot
"$1" \
97 | grep
-E
"@${sys_propNamePrefix}_[0-9]{8}-[0-9]{6}_" \
102 # Получить значение свойства из zfs, относящиеся к системе резервного копирования
104 # dataset_name : Имя набора данных
105 # prop_name : Имя свойства
108 if !
[ "$1" -a
"$2" ] ; then
111 res=$(zfs
get
-Hp
-o
value
"${sys_propNamePrefix}:$2" "$1")
113 if [ "${res}" = "-" ] ; then
120 # Установить значение свойства в zfs, относящиеся к системе резервного копирования
122 # dataset_name : Имя набора данных
123 # prop_name : Имя свойства
124 # prop_value : Значение свойства
125 if !
[ "$1" -a
"$2" -a
"$3" ] ; then
129 zfs
set "${sys_propNamePrefix}:$2"="$3" "$1"
130 log
"zfs_setProp(): Property changed for '$1': user='$(whoami
2>/dev/null
)' uid='$(id
-u
)' property='$2' value='$3'"
134 # Необходимо ли резервное копирование для данного набора данных
136 # dataset_name : Имя исследуемого набора данных
137 case "$(zfs_getProp
"$1" "enable")" in
148 # Удаление устаревших резервных копий
150 # dataset_name : Набор данных для которого производится операция
151 # backup_type : Тип резервной копии
152 # count : Количество копий, которые необходимо сохранить
155 if !
svc_isNum
"$3" ; then
156 log_err
"zfs_clean(): Wrong backup count: %3 (dataset_name='$1', backup_type='$2')"
159 cnt="$(( $cnt + 1 ))"
161 zfs_getSnaps
"$1" "$2" \
162 | tail
-n
"+${cnt}" | xargs
-n
1 zfs
destroy
-v
\
163 | awk
"{print \"$1: \" \$0 }" | log