ZFS. Клонирование раздела ZFS (используя снэпшоты) на другой физический диск ZFS (локально или по сети): различия между версиями
Cless (обсуждение | вклад) |
Cless (обсуждение | вклад) |
||
| (не показаны 2 промежуточные версии этого же участника) | |||
| Строка 1: | Строка 1: | ||
= Клонирование = | |||
=== Форматируем диски в ZFS с GPT-LABEL === | |||
<code>gpart create -s gpt ada1</code> | |||
<code>gpart create -s gpt ada2</code> | |||
<code>gpart add -t freebsd-zfs -l stripe1 ada1</code> | |||
<code>gpart add -t freebsd-zfs -l stripe2 ada2</code> | |||
При ошибке "gpart: geom 'ada0': File exists" делаем: | При ошибке "gpart: geom 'ada0': File exists" делаем: | ||
<code>gpart delete -i 1 ada0</code> | |||
<code>gpart destroy ada0</code> | |||
=== Создаем пулы и датасеты на них с видимыми снэпшотами в файловой системе (директория со снэпшотами: ".zfs" в корне датасета) === | |||
<code>zpool create -m /mnt/stripe1 stripe1 /dev/gpt/stripe1</code> | |||
<code>zpool create -m /mnt/stripe2 stripe2 /dev/gpt/stripe2</code> | |||
<code>zfs create -o snapdir=visible stripe1/dataset1</code> | |||
<code>zfs create -o snapdir=visible stripe2/dataset2</code> | |||
=== Изменяем файл test.txt на датасете первого диска (stripe1/dataset1) и каждый раз после изменения делаем снэпы (с именами 1,2,3) датасета "stripe1/dataset1" === | |||
<code>echo "1" > /mnt/stripe1/dataset1/test.txt</code> | |||
<code>zfs snapshot stripe1/dataset1@1</code> | |||
<code>echo "2" > /mnt/stripe1/dataset1/test.txt</code> | |||
<code>zfs snapshot stripe1/dataset1@2</code> | |||
<code>echo "3" > /mnt/stripe1/dataset1/test.txt</code> | |||
<code>zfs snapshot stripe1/dataset1@3</code> | |||
=== Проверяем наличие снэпов === | |||
<code>zfs list -r -t snapshot -o name,creation stripe1/dataset1</code><blockquote>... | |||
<blockquote>... | |||
NAME CREATION | NAME CREATION | ||
| Строка 48: | Строка 49: | ||
stripe1/dataset1@3 Thu Jan 30 0:27 2020 | stripe1/dataset1@3 Thu Jan 30 0:27 2020 | ||
...</blockquote> | ...</blockquote><code>ls -lh /mnt/stripe1/dataset1/.zfs/snapshot/</code><blockquote>... | ||
<blockquote>... | |||
total 2 | total 2 | ||
| Строка 62: | Строка 61: | ||
...</blockquote> | ...</blockquote> | ||
=== Клонируем датасет первого диска "stripe1/dataset1" рекурсивно со снэпшотами (начиная с последнего снэпшота "3") на пустой датасет второго диска "stripe2/dataset2" === | |||
-R ''- клонировать все снэпшоты рекурсивно от самого нового до самого старого'' | '''''-R''''' ''- клонировать все снэпшоты рекурсивно от самого нового до самого старого'' | ||
-F ''- перезаписать файловую систему stripe2/dataset2, иначе будет ошибка что пул и датасет stripe2/dataset2 существуют'' | '''''-F''''' ''- перезаписать файловую систему stripe2/dataset2, иначе будет ошибка что пул и датасет stripe2/dataset2 существуют'' | ||
-Pev ''- отображать прогресс'' | '''''-Pev''''' ''- отображать прогресс'' | ||
=== | ==== На локальный диск ==== | ||
<code>zfs send -Pev -R stripe1/dataset1@3 | zfs recv -F stripe2/dataset2</code> | |||
==== Проверяем что на новом датасете второго диска ("stripe2/dataset2") файл "test.txt" и снэпы датасета клонированы корректно | ==== На другой сервер по сети используя SSH ==== | ||
<code>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</code> | |||
<blockquote>... | |||
= Проверка = | |||
=== Проверяем что на новом датасете второго диска ("stripe2/dataset2") файл "test.txt" и снэпы датасета клонированы корректно === | |||
<code>zfs list -r -t snapshot -o name,creation stripe2/dataset2</code><blockquote>... | |||
NAME CREATION | NAME CREATION | ||
| Строка 84: | Строка 87: | ||
stripe2/dataset2@3 Thu Jan 30 0:27 2020 | stripe2/dataset2@3 Thu Jan 30 0:27 2020 | ||
...</blockquote> | ...</blockquote><code>ls -lh /mnt/stripe2/dataset2/test.txt</code><blockquote>... | ||
<blockquote>... | |||
-rw-r--r-- 1 root wheel 2B Jan 30 00:27 /mnt/stripe2/dataset2/test.txt | -rw-r--r-- 1 root wheel 2B Jan 30 00:27 /mnt/stripe2/dataset2/test.txt | ||
...</blockquote> | ...</blockquote><code>ls -lh /mnt/stripe2/dataset2/.zfs/snapshot/</code><blockquote>... | ||
<blockquote>... | |||
total 2 | total 2 | ||
| Строка 104: | Строка 103: | ||
...</blockquote>Для проверки можно откатиться на самый старый снэпшот "1" и убедиться что содержимое test.txt также откатилось | ...</blockquote>Для проверки можно откатиться на самый старый снэпшот "1" и убедиться что содержимое test.txt также откатилось | ||
=== Проверяем содержимое файла до откатывания === | |||
<code>cat /mnt/stripe2/dataset2/test.txt</code><blockquote>... | |||
<blockquote>... | |||
3 | 3 | ||
| Строка 112: | Строка 110: | ||
...</blockquote> | ...</blockquote> | ||
=== Откатываемся на снэпшот "1" === | |||
<code>zfs rollback -r stripe2/dataset2@1</code> | |||
=== Проверяем содержимое файла после откатывания === | |||
<code>cat /mnt/stripe2/dataset2/test.txt</code><blockquote>... | |||
<blockquote>... | |||
1 | 1 | ||
| Строка 125: | Строка 122: | ||
__ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__ | __ОБЯЗАТЕЛЬНОЕ_ОГЛАВЛЕНИЕ__ | ||
[[Категория:XigmaNAS (NAS4free)]] | [[Категория:XigmaNAS (NAS4free)]] | ||
[[Категория:FreeBSD]] | |||
Текущая версия на 12:14, 27 июня 2023
Клонирование
Форматируем диски в 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
...