При выполнении обычного клонирования зоны, нужно выключать исходную, делать клон и потом включать обратно. Но если выключение зоны критично, то такой метод клонирования не подходит. Но можно обойти это ограничение с помощью некоторых манипуляций.
Тестовый стенд: Solaris 11.1
Суть метода такова: делаем снапшоты всех zfs, какие нужны для зоны, копируем их на удалённый хост, создаём там зону и деаем ей просто attach, так как файлы уже присутствуют.
Примечание: данный пример можно использовать только для копирования между разными серверами, так как имя zfs после такого переноса остаётся прежним. Если хотите использовать этот метод для копирования в пределах одного сервера, можно попробовать нижеописанный хак (хак не тестировался!!!):
# zfs send -rv rpool/export/z/search@clone | zfs receive -e rpool/export/z/tmp
В итоге получаем промежуточную zfs = rpool/export/z/tmp/search (со всеми потомками). Теперь просто переименовываем:
# zfs rename rpool/export/z/tmp/search rpool/export/z/new_search
1) Пересылка zfs снапшотов.
Создаём рекурсивно снапшоты:
old_server# zfs snapshot -r rpool/export/z/search@clone
Копируем их на удалённый хост:
old_server# zfs send -rv rpool/export/z/search@clone | ssh user@remotehost "sudo /usr/sbin/zfs receive -Fd devel"
Для вывода процесса копирания используем в связке с pv:
# zfs send pool/opt@snap1 | pv | zfs recv tank/opt 8.58GB 0:02:37 [95.7MB/s]
2) Подготовка и создание новой зоны.
Делаем экспорт конфигурации исходной зоны:
old_server# zonecfg -z search export > /tmp/search.cfg
Переносим на удалённый хост, правим, и используем его для создания зоны
new_server# zonecfg -z search -f /export/home/user/search.cfg
Проверяем, что бы у всех zfs на новом месте были правильные точки монтирования: корневая zfs devel/export/z/search для зоны search должны иметь точку монтирования относительно global зоны. Все остальные – относительно самой зоны. Вот как это будет выглядеть:
devel/export/z/search 26.7G 1001G 33K /devel/export/z/search devel/export/z/search/rpool 26.7G 1001G 31K /rpool devel/export/z/search/rpool/ROOT 4.63G 1001G 31K legacy devel/export/z/search/rpool/ROOT/solaris-0 4.63G 1001G 2.90G / devel/export/z/search/rpool/ROOT/solaris-0/var 1.71G 1001G 1.69G /var devel/export/z/search/rpool/VARSHARE 480M 1001G 480M /var/share devel/export/z/search/rpool/export 21.6G 1001G 32K /export devel/export/z/search/rpool/export/home 21.6G 1001G 8.36G /export/home devel/export/z/search/rpool/export/home/user 40.5K 1001G 40.5K /export/home/user
По умолчанию оно так и есть, но лучше лишний раз перепроверить. Теперь делаем attach и запуск:
new_server# zoneadm -z search attach -u && zoneadm -z search boot
Если посмотреть теперь на zfs для запущенной зоны из global зоны, то точки монтирования будут выглядеть уже по другому (пути будут указаны относительно global-зоны):
devel/export/z/search 26.7G 1001G 33K /devel/export/z/search devel/export/z/search/rpool 26.7G 1001G 31K /devel/export/z/search/root/rpool devel/export/z/search/rpool/ROOT 4.63G 1001G 31K legacy devel/export/z/search/rpool/ROOT/solaris-0 4.63G 1001G 2.90G /devel/export/z/search/root devel/export/z/search/rpool/ROOT/solaris-0/var 1.71G 1001G 1.69G /devel/export/z/search/root/var devel/export/z/search/rpool/VARSHARE 480M 1001G 480M /devel/export/z/search/root/var/share devel/export/z/search/rpool/export 21.6G 1001G 32K /devel/export/z/search/root/export devel/export/z/search/rpool/export/home 21.6G 1001G 8.36G /devel/export/z/search/root/export/home devel/export/z/search/rpool/export/home/user 40.5K 1001G 40.5K /devel/export/z/search/root/export/home/user