null

Клонирование корневого пула ZFS

Иногда возникает задача склонировать боевую систему без ее остановки и оттестировать на ней ту или иную процедуру (в моем случае - это процедура 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:

ok boot cdrom -s


Для 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

К списку статей

 

Интересуюсь по большей части системным анализом программного обеспечения: поиском багов и анализом неисправностей, а также системным программированием (и не оставляю надежд запилить свою операционку, хотя нехватка времени сказывается :) ). Программированием увлекаюсь с 12 лет, но так уж получилось, что стал я инженером.

Основная сфера моей деятельности связана с поддержкой Solaris и оборудования Sun/Oracle, хотя в последнее время к ним прибавились технологии виртуализации (линейка Citrix Xen) и всякое разное от IBM - от xSeries до Power. Учусь на кафедре Вычислительной Техники НИУ ИТМО.

See you...out there!

http://www.facebook.com/profile.php?id=100001947776045
https://twitter.com/AnnoyingBugs

Ничего не найдено. n is 0