ZFS. Клонирование раздела ZFS (используя снэпшоты) на другой физический диск ZFS (локально или по сети)

Материал из Wiki
Версия от 12:14, 27 июня 2023; Cless (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Клонирование

Форматируем диски в ZFS с GPT-LABEL

gpart create -s gpt ada1

gpart create -s gpt ada2

gpart add -t freebsd-zfs -l stripe1 ada1

gpart add -t freebsd-zfs -l stripe2 ada2

При ошибке "gpart: geom 'ada0': File exists" делаем:

gpart delete -i 1 ada0

gpart destroy ada0

Создаем пулы и датасеты на них с видимыми снэпшотами в файловой системе (директория со снэпшотами: ".zfs" в корне датасета)

zpool create -m /mnt/stripe1 stripe1 /dev/gpt/stripe1

zpool create -m /mnt/stripe2 stripe2 /dev/gpt/stripe2

zfs create -o snapdir=visible stripe1/dataset1

zfs create -o snapdir=visible stripe2/dataset2

Изменяем файл test.txt на датасете первого диска (stripe1/dataset1) и каждый раз после изменения делаем снэпы (с именами 1,2,3) датасета "stripe1/dataset1"

echo "1" > /mnt/stripe1/dataset1/test.txt

zfs snapshot stripe1/dataset1@1

echo "2" > /mnt/stripe1/dataset1/test.txt

zfs snapshot stripe1/dataset1@2

echo "3" > /mnt/stripe1/dataset1/test.txt

zfs snapshot stripe1/dataset1@3

Проверяем наличие снэпов

zfs list -r -t snapshot -o name,creation stripe1/dataset1

...

NAME                CREATION

stripe1/dataset1@1  Thu Jan 30  0:27 2020

stripe1/dataset1@2  Thu Jan 30  0:27 2020

stripe1/dataset1@3  Thu Jan 30  0:27 2020

...

ls -lh /mnt/stripe1/dataset1/.zfs/snapshot/

...

total 2

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 1

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 2

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 3

...

Клонируем датасет первого диска "stripe1/dataset1" рекурсивно со снэпшотами (начиная с последнего снэпшота "3") на пустой датасет второго диска "stripe2/dataset2"

-R - клонировать все снэпшоты рекурсивно от самого нового до самого старого

-F - перезаписать файловую систему stripe2/dataset2, иначе будет ошибка что пул и датасет stripe2/dataset2 существуют

-Pev - отображать прогресс

На локальный диск

zfs send -Pev -R stripe1/dataset1@3 | zfs recv -F stripe2/dataset2

На другой сервер по сети используя SSH

zfs send -Pev -R stripe2/dataset2@3 | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@192.168.199.185 zfs recv -F stripe2/dataset2

Проверка

Проверяем что на новом датасете второго диска ("stripe2/dataset2") файл "test.txt" и снэпы датасета клонированы корректно

zfs list -r -t snapshot -o name,creation stripe2/dataset2

...

NAME                CREATION

stripe2/dataset2@1  Thu Jan 30  0:27 2020

stripe2/dataset2@2  Thu Jan 30  0:27 2020

stripe2/dataset2@3  Thu Jan 30  0:27 2020

...

ls -lh /mnt/stripe2/dataset2/test.txt

...

-rw-r--r--  1 root  wheel     2B Jan 30 00:27 /mnt/stripe2/dataset2/test.txt

...

ls -lh /mnt/stripe2/dataset2/.zfs/snapshot/

...

total 2

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 1

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 2

drwxr-xr-x  2 root  wheel     3B Jan 30 00:26 3

...

Для проверки можно откатиться на самый старый снэпшот "1" и убедиться что содержимое test.txt также откатилось

Проверяем содержимое файла до откатывания

cat /mnt/stripe2/dataset2/test.txt

...

3

...

Откатываемся на снэпшот "1"

zfs rollback -r stripe2/dataset2@1

Проверяем содержимое файла после откатывания

cat /mnt/stripe2/dataset2/test.txt

...

1

...