lunes, 5 de noviembre de 2007

Zonas y Contenedores bajo ZFS



Una de las ventajas de crear zonas y/o contenedores bajo el nuevo sistema de ficheros ZFS, reside que nos podemos apoyar en la creación de sanpshot y clones para mover un contenedor de un sistema real (anfitrión) a otro.

La zona global origen tiene como hostname "opensolaris" y el sistema anfitrión destino se denomina "opensolaris2".

Partimos de una zona de tipo BrandZ acotada en cuanto al consumo de memoria y swap:

# hostname
Opensolaris

# zonecfg -z zonelx info
zonename: zonelx
zonepath: /opt/zones/zonelx
brand: lx
autoboot: false
bootargs: -m verbose
pool:
limitpriv:
scheduling-class:
ip-type: shared
net:
address: 10.73.130.249/24
physical: pcn0
capped-memory:
physical: 256M
[swap: 128M]
[locked: 50M]
rctl:
name: zone.max-swap
value: (priv=privileged,limit=134217728,action=deny)
rctl:
name: zone.max-locked-memory
value: (priv=privileged,limit=52428800,action=deny)

y de los siguientes filesystems ZFS:

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 1,57G 380M 26,5K none
mypool/zonas 1,57G 380M 1,57G /opt/zones/

Lo primero que hacemos es "desenganchar" del sistema anfitrión origen, el contenedor que vamos a mover:

# zoneadm -z zonelx detach

Posteriormente realizamos un snapshot de dicho filesystem sobre el que reside el contenedor denominado zonelx.

# zfs snapshot mypool/zonas@Snap1


# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 1,34G 2,94G 24,5K none
mypool/zonas 1,34G 2,94G 1,34G /opt/zones/
mypool/zonas@Snap1 0 - 1,34G -

Una vez que tenemos la imagen como resultado de la snapshot, realizamos un backup de la misma a un fichero local.

# zfs send mypool/zonas@Snap1 > /opt/zones/zonelx.Backup1 &

Y ese mismo fichero resultado del backup lo llevamos por ssh al anfitrión destino.

# scp /opt/zones/zonelx.Backup1 un38134@10.73.130.247:/export/home/un3813 &


Una vez que estamos en el sistema destino, unicamente creamos el pool ZFS deniminado "mypool" y sobre el realizamos la importación del fichero resultado del backup de la snapshot realizado en el sistema origen.

# hostname

opensolaris2

# df -h

Sistema de archivos tamaño usados aprovechar capacidad Montado en
/dev/dsk/c0d0s0 5,4G 3,8G 1,6G 71% /
/devices 0K 0K 0K 0% /devices
ctfs 0K 0K 0K 0% /system/contract
proc 0K 0K 0K 0% /proc
mnttab 0K 0K 0K 0% /etc/mnttab
swap 811M 856K 810M 1% /etc/svc/volatile
objfs 0K 0K 0K 0% /system/object
/usr/lib/libc/libc_hwcap1.so.1
5,4G 3,8G 1,6G 71% /lib/libc.so.1
fd 0K 0K 0K 0% /dev/fd
swap 810M 40K 810M 1% /tmp
swap 810M 28K 810M 1% /var/run
mypool 1,9G 24K 1,9G 1% /mypool

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 91K 1,94G 24,5K none

# zfs receive mypool/zonas < /export/home/un38134/zonelx.Backup1

# zfs list
NAME USED AVAIL REFER MOUNTPOINT
mypool 1,34G 2,94G 24,5K none
mypool/zonas 1,34G 2,94G 1,34G /opt/zones/
mypool/zonas@Snap1 0 - 1,34G -

Una vez importado el sanpshot ZFS podemos crear el contenedor, asi:

# zonecfg -z zonelx

zonecfg:zfszone2> create -a /opt/zonas/zonelx
zonecfg:zfszone2> exit

Una vez creada la zona, la podemos "enganchar" en el anfitrión destino.

# zoneadm -z zonelx attach

# zoneadm list -iv

ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zonelx installed /opt/zones/zonelx lx shared

Una vez creada, la podemos arrancar y acceder a ella.

# zoneadm -z zonelx boot


# zlogin zonelx
[Conectado a la zona 'zonelx' pts/2]

Welcome to your shiny new Linux zone.

- The root password is 'root'. Please change it immediately.

- To enable networking goodness, see /etc/sysconfig/network.example.

- This message is in /etc/motd. Feel free to change it.

For anything more complicated, see:
http://opensolaris.org/os/community/brandz/

You have mail.
# uname -a
Linux zonelx 2.4.21 BrandZ fake linux i686 i686 i386 GNU/Linux


# ifconfig -a

eth0 Link encap:Ethernet HWaddr 00:0C:29:2D:04:A0
inet addr:10.73.130.249 Bcast:10.73.130.255 Mask:255.255.255.0
UP BROADCAST RUNNING SLAVE MTU:1500 Metric:1

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING SLAVE MTU:8232 Metric:1

Luego de una forma sencilla y con muy poco tiempo de perdia de servivio hemos movido un contenedor (con toda su configuración) de un sistema anfitrión inicial a otro destino.