Иногда возникает задача склонировать боевую систему без ее остановки и оттестировать на ней ту или иную процедуру (в моем случае - это процедура LiveUpgrade). К счастью, с приходом ZFS снапшоты файловой системы стали простыми и удобными в использовании, а значит и создать клона нам будет несложно. Итак дано: боевая система и система, на которой проинсталлирован Solaris с двумя дисками - один с собственно Solaris, второй под клона боевой системы.
Создаем пул newrpool
Копируем таблицу слайсов VTOC (EFI-метка не подходит, т.к. Solaris с нее не умеет грузиться), также если необходимо на диске-клоне делаем 100% Solaris Partition (касается только платформы x86)
productive# prtvtoc /dev/dsk/c1t0d0s2 > /tmp/rpool.vtoc
Копируем rpool.vtoc на машину-клона и размечаем диск:
clone# fmthard -s /tmp/rpool.vtoc /dev/rdsk/c1t0d0s2
Здесь и далее я буду обозначать синим - продуктивную систему, зеленым - клона. c1t0d0 - соответственно в нашем случае исходный диск, c1t0d0 - диск -клон.
Создаем на новоразмеченном диске
clone# zpool create newrpool c0d1s0
Клонируем файловые системы
productive# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 6,92G 12,6G 32,5K /rpool
rpool/ROOT 5,42G 12,6G 21K legacy
rpool/ROOT/s10x_u9wos_14a 5,42G 12,6G 5,42G /
rpool/dump 1020M 12,6G 1020M -
rpool/export 44K 12,6G 23K /export
rpool/export/home 21K 12,6G 21K /export/home
rpool/swap 512M 13,1G 84,5M -
Тома под swap и dump создаем вручную в соответствии с размерами из zfs list
clone# zfs create -V 1020M newrpool/dump
clone# zfs create -V 512M newrpool/swap
Теперь время копировать данные. Можно воспользоваться рекурсивным снапшотом, но я создавал снимки для каждого датасета отдельно:
productive# zfs snapshot rpool@clonetime
productive# zfs snapshot rpool/ROOT@clonetime
productive# zfs snapshot rpool/ROOT/s10x_u9wos_14a@clonetime
productive# zfs snapshot rpool/export@clonetime
productive# zfs snapshot rpool/export/home@clonetime
Замечу, что это лишь один из вариантов разметки корневых файловых систем - например имя датасета s10x_u9wos_14a для sparc может иметь вид s10x_u9wos_14a или вообще быть изменено на нестандартное.
productive# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
rpool/ROOT@clonetime 0 - 21K -
rpool/ROOT/s10x_u9wos_14a@clonetime 26,5K - 5,42G -
rpool/export@clonetime 0 - 23K -
rpool/export/home@clonetime 0 - 21K -
Собственно копируем данные
productive# zfs send rpool@clonetime |
ssh clone zfs receive -F newrpool@clonetime
productive# zfs send rpool/ROOT@clonetime |
ssh clone zfs receive newrpool/ROOT@clonetime
productive# zfs send rpool/ROOT/s10x_u9wos_14a@clonetime |
ssh clone zfs receive newrpool/ROOT/s10x_u9wos_14a@clonetime
productive# zfs send rpool/export@clonetime |
ssh clone zfs receive newrpool/export@clonetime
productive# zfs send rpool/export/home@clonetime |
ssh clone zfs receive newrpool/export/home@clonetime
Подчищаем за собой
clone# zfs rollback newrpool@clonetime
clone# zfs rollback newrpool/ROOT@clonetime
clone# zfs rollback newrpool/ROOT/s10x_u9wos_14a@clonetime
clone# zfs rollback newrpool/export@clonetime
clone# zfs rollback newrpool/export/home@clonetime
clone# zfs destroy newrpool@clonetime
clone# zfs destroy newrpool/ROOT@clonetime
clone# zfs destroy newrpool/ROOT/s10x_u9wos_14a@clonetime
clone# zfs destroy newrpool/export@clonetime
clone# zfs destroy newrpool/export/home@clonetime
productive# zfs destroy rpool@clonetime
productive# zfs destroy rpool/ROOT@clonetime
productive# zfs destroy rpool/ROOT/s10x_u9wos_14a@clonetime
productive# zfs destroy rpool/export@clonetime
productive# zfs destroy rpool/export/home@clonetime
Теперь запомним установки canmount и mountpoint - они нам потребуются в дальнейшем
productive# zfs get canmount,mountpoint | grep '^rpool'
rpool canmount on local
rpool mountpoint /rpool local
rpool/ROOT canmount on default
rpool/ROOT mountpoint legacy local
rpool/ROOT/s10x_u9wos_14a canmount noauto local
rpool/ROOT/s10x_u9wos_14a mountpoint / local
rpool/dump canmount - -
rpool/dump mountpoint - -
rpool/export canmount on default
rpool/export mountpoint /export local
rpool/export/home canmount on default
rpool/export/home mountpoint /export/home inherited from rpool/export
rpool/swap canmount - -
rpool/swap mountpoint - -
Окончательная настройка пула
Теперь, когда мы скопировали данные - необходимо превратить наш пул в полноценный загрузочный. Делать это в уже загруженном Solaris затруднительно ибо rpool там уже есть, поэтому загрузим машину-клона по сети или с дистрибутива на DVD в Single User Mode:
Для x86 потребуется дописать опцию -s в строку kernel в Grub и выбрать 6 в предложенном меню
Проверим доступность нашего пула
clone# zpool import
pool: rpool
id: 12988330641844115400
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
rpool ONLINE
c1t0d0s0 ONLINE
pool: newrpool
id: 9782599407514970749
state: ONLINE
action: The pool can be imported using its name or numeric identifier.
config:
newrpool ONLINE
c1t8d0s0 ONLINE
Собственно импортируем его, при этом переименовывая его
clone# zpool import -f newrpool rpool
ZFS попытается создать соответсвующие точки монтирования и выдаст соответствующие ошибки, их можно игнорировать
Установим опцию bootfs, необходимую для загрузчика:
clone# zpool set bootfs=rpool/ROOT/s10x_u9wos_14a
Теперь надо удалить файл /etc/zfs/zpool.cache, хранящий кеш импортированных пулов, дабы избежать конфликтов при загрузке клона Solaris:
clone# mkdir /tmp/new_root
clone# zfs set mountpoint=/tmp/new_root rpool/ROOT/s10x_u9wos_14a
clone# zfs mount rpool/ROOT/s10x_u9wos_14a
clone# rm /tmp/new_root/etc/zfs/zpool.cache
clone# zfs unmount rpool/ROOT/s10x_u9wos_14a
Установим опции canmount и mountpoint в соответствии с установками rpool на оригинальной системе
clone# zfs set canmount=noauto rpool/ROOT/s10x_u9wos_14a
clone# zfs set canmount=on rpool
clone# zfs set mountpoint=/rpool rpool
clone# zfs set mountpoint=legacy rpool/ROOT
clone# zfs set mountpoint=/ rpool/ROOT/s10x_u9wos_14a
clone# zfs set mountpoint=/export rpool/export
Пропишем загрузчик для SPARC:
clone# installboot -F zfs /usr/platform/`uname -i`/lib/fs/zfs/bootblk /dev/rdsk/c0t1d0s0
Или для платформы x86
clone# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c0t1d0s0
Настройка пула закончена - можно перезагружаться
clone# zpool export rpool
clone# init 0
...
ok boot disk6
Ссылки
http://waddles.org/content/replicating-zfs-root-disks - Replicating ZFS Root Disks