среда, 8 декабря 2010 г.

Зоны Solaris VI: Перемещение зон

Хотя зоны Solaris и не являются полной реализацией виртуализации и, например, такая функциональность, как телепорт, в них отсутствует, тем не менее существует возможность перемещения зон внутри родительского хоста и между хостами, причем при использовании датасетов ZFS это происходит достаточно легко и просто. И даже достаточно быстро.

Технически описание процесса переноса есть здесь, хотя и не показаны конкретные примеры, как именно проделывать ту или иную операцию.

Давайте посмотрим, как это делается, на практике.

Перемещение зоны в другую файловую систему, в том числе на другой хост

Итак, у нас есть две неглобальных зоны, одну из которых мы хотели бы переместить:

root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
1 zone2 running /data/zone2 native shared
2 zone1 running /data/zone1 native shared
root @ pegasus / # zoneadm -z zone2 detach
zoneadm: zone 'zone2': detach operation is invalid for running zones.

Упс, работающая зона не может быть отсоединена. Как и было сказано. Остановим ее и выполним detach:

root @ pegasus / # zoneadm -z zone2 halt
root @ pegasus / # zoneadm -z zone2 detach

Давайте для начала переместим зону в другой датасет на том же самом хосте. Сначала переместим сам датасет средствами zfs rename:

root @ pegasus / # zfs rename data/zone2 data/zones/zone2
cannot create 'data/zones/zone2': parent does not exist
root @ pegasus / # zfs create data/zones
root @ pegasus / # zfs rename data/zone2 data/zones/zone2

Готово. Датасет перемещен. Осталось поменять параметр zonepath перенесенной зоны и можно ее стартовать:

root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
2 zone1 running /data/zone1 native shared
- zone2 configured /data/zone2 native shared

root @ pegasus / # zonecfg -z zone2 set zonepath=/data/zones/zone2
root @ pegasus / # zoneadm -z zone2 attach
zoneadm: /data/zones/zone2: No such file or directory
could not verify zonepath /data/zones/zone2 because of the above errors.
zoneadm: zone zone2 failed to verify

Нет, стартовать еще нельзя. Почему?

Потому что точка монтирования нового датасета осталась прежней. Изменим ее:

root @ pegasus / # zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 11.0G 8.61G 41K /data
data/zone1 313M 1.69G 313M /data/zone1
data/zones 3.37G 8.61G 21K /data/zones
data/zones/zone2 3.37G 642M 3.37G /data/zone2

root @ pegasus / # zfs set mountpoint=/data/zones/zone2 data/zones/zone2
root @ pegasus / # zoneadm -z zone2 attach
root @ pegasus / # zoneadm -z zone2 boot

Порядок. Внутри хоста зону перенесли в другой датасет.

Просто для очистки совести перенесем и вторую зону в тот же самый датасет:

root @ pegasus / # zoneadm -z zone1 halt
root @ pegasus / # zoneadm -z zone1 detach
root @ pegasus / # zfs rename data/zone1 data/zones/zone1
root @ pegasus / # zfs set mountpoint=/data/zones/zone1 data/zones/zone1
root @ pegasus / # zonecfg -z zone1 set zonepath=/data/zones/zone1
root @ pegasus / # zoneadm -z zone1 attach
root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /data/zones/zone1 native shared
- zone2 installed /data/zones/zone2 native shared
root @ pegasus / # zoneadm -z zone1 boot
root @ pegasus / # zoneadm -z zone2 boot
root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
9 zone1 running /data/zones/zone1 native shared
10 zone2 running /data/zones/zone2 native shared

Если необходимо перенести зону на другой хост, то процедура лишь немного сложней. Собственно датасет (датасеты) зоны передаются на другой хост командами zfs send/zfs receive. После передачи датасета на новом хосте необходимо создать конфигурацию зоны из перенесенных данных командой zonecfg create -a:

zonecfg:zone1
> create -a /data/zones/zone2

после чего можно просмотреть и изменить конфигурацию командой zonecfg:

root @ pegasus / # zonecfg -z zone2 set zonepath=/data/zones/zone2
root @ pegasus / # zoneadm -z zone2 attach

Кроме zonepath в конфигурации может потребоваться изменить группу параметров net - address и physical, а также можно поменять и другие конфигурационные параметры. Ресурсные ограничения, если они уже присутствуют на новом хосте, могут привести к ругани при конфигурировании перенесенной зоны, однако конфигурация создается и ресурсные лимиты включаются в определение зоны.

Далее, после корректировки конфигурации зоны, выполняется команда zoneadm attach, и после этого можно стартовать перенесенную зону.

Простое перемещение зоны в пределах хоста

На самом деле для перемещения зоны в пределах хоста есть более короткий путь, чем attach/detach. Переместим зону zone2 снова в прежнее местоположение:

root @ pegasus / # zoneadm -z zone2 halt
root @ pegasus / # zoneadm -z zone2 move /data/zone2
root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
9 zone1 running /data/zones/zone1 native shared
- zone2 installed /data/zone2 native shared
root @ pegasus / # zoneadm -z zone2 boot
root @ pegasus / # zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 11.0G 8.61G 36K /data
data/zones 3.68G 8.61G 23K /data/zones
data/zones/zone1 313M 1.69G 313M /data/zones/zone1
data/zones/zone2 3.37G 644M 3.37G /data/zone2

Упс! Поменялась точка монтирования, но не датасет.

Пробуем переместить датасет:

root @ pegasus / # zfs rename data/zones/zone2 data/zone2
cannot unmount '/data/zone2': Device busy

Упс! Низ-зя. Зона работает, датасет занят. Остановим зону и повторим переименование:

root @ pegasus / # zoneadm -z zone2 halt
root @ pegasus / # zfs rename data/zones/zone2 data/zone2

root @ pegasus / # zfs list
NAME USED AVAIL REFER MOUNTPOINT
data 11.0G 8.61G 36K /data
data/zone2 3.37G 644M 3.37G /data/zone2
data/zones 313M 8.61G 23K /data/zones
data/zones/zone1 313M 1.69G 313M /data/zones/zone1
root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
9 zone1 running /data/zones/zone1 native shared
- zone2 installed /data/zone2 native shared
root @ pegasus / # zoneadm -z zone2 boot
root @ pegasus / # zoneadm list -vc
ID NAME STATUS PATH BRAND IP
0 global running / native shared
9 zone1 running /data/zones/zone1 native shared
12 zone2 running /data/zone2 native shared

Вот теперь все правильно. Зона перемещена в другой датасет на том же самом хосте.