jueves, 30 de septiembre de 2010

Introducción al uso de ZFS en Solaris

Desde que hizo su aparición Solaris 10, se presentó con un gran número de avances con respecto a sus versiones anteriores, por ejemplo: el DTrace, la virtualización por medio de contenedores, la sustitución del rc por svc, etc. En esta ocasión vamos a mostrar como trabajar con una de estas nuevas características: el ZFS.

El ZFS es un nuevo tipo de filesystem, combina una serie de tecnologías de almacenamiento en una forma automatizada y simple, solo basta crear un pool de datos y crear en este filesystems, los cuales son montados en forma automática sin necesidad de darlos de alta en la tabla de montaje (/etc/vfstab).

Para este ejercicio, voy a utilizar un equipo con Solaris 10 x86 instalado y un disco duro nuevo sin utilizar.

Recordemos que en la plataforma x86 es necesario inicializar todos los discos duros nuevos:

fdisk /dev/rdsk/c1t1d0p0
No fdisk table exists. The default partition for the disk is:

  a 100% "SOLARIS System" partition

Type "y" to accept the default partition,  otherwise type "n" to edit the
partition table.
y

Ahora vamos a crear una partición nueva que ocupe todo el espacio disponible:

format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
       0. c1t0d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@0,0
       1. c1t1d0 <DEFAULT cyl 2607 alt 2 hd 255 sec 63>
          /pci@0,0/pci15ad,1976@10/sd@1,0
Specify disk (enter its number): 1
selecting c1t1d0
[disk formatted]

FORMAT MENU:
        disk       - select a disk
        type       - select (define) a disk type
        partition  - select (define) a partition table
        current    - describe the current disk
        format     - format and analyze the disk
        fdisk      - run the fdisk program
        repair     - repair a defective sector
        label      - write label to the disk
        analyze    - surface analysis
        defect     - defect list management
        backup     - search for backup labels
        verify     - read and display labels
        save       - save new disk/partition definitions
        inquiry    - show vendor, product and revision
        volname    - set 8-character volume name
        !<cmd>     - execute <cmd>, then return
        quit
format> p

PARTITION MENU:
        0      - change `0' partition
        1      - change `1' partition
        2      - change `2' partition
        3      - change `3' partition
        4      - change `4' partition
        5      - change `5' partition
        6      - change `6' partition
        7      - change `7' partition
        select - select a predefined table
        modify - modify a predefined partition table
        name   - name the current table
        print  - display the current table
        label  - write partition map and label to the disk
        !<cmd> - execute <cmd>, then return
        quit
partition>
p
Current partition table (original):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> 0
Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       0               0         (0/0/0)           0

Enter partition id tag[unassigned]:
Enter partition permission flags[wm]:
Enter new starting cyl[0]: 1
Enter partition size[0b, 0c, 1e, 0.00mb, 0.00gb]: 2606e
partition>
p
Current partition table (unnamed):
Total disk cylinders available: 2607 + 2 (reserved cylinders)

Part      Tag    Flag     Cylinders        Size            Blocks
  0 unassigned    wm       1 - 2606       19.96GB    (2606/0/0) 41865390
  1 unassigned    wm       0               0         (0/0/0)           0
  2     backup    wu       0 - 2606       19.97GB    (2607/0/0) 41881455
  3 unassigned    wm       0               0         (0/0/0)           0
  4 unassigned    wm       0               0         (0/0/0)           0
  5 unassigned    wm       0               0         (0/0/0)           0
  6 unassigned    wm       0               0         (0/0/0)           0
  7 unassigned    wm       0               0         (0/0/0)           0
  8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
  9 unassigned    wm       0               0         (0/0/0)           0

partition> label
Ready to label disk, continue? y

partition>

Ahora que nuestro disco esta listo para trabajar, vamos a crear un pool de datos:

zpool create pool1 c1t1d0s0

Y ya estamos listos para crear filesystems, suponiendo que necesite uno que se monte en la ruta /tomcat, por ejemplo:

zfs create -o mountpoint=/tomcat pool1/tomcat

Con este comando estamos indicando que creé el nuevo filesystem “tomcat” utilizando el pool de datos llamado “pool1”, adicionalmente, le estamos indicando que utilice como punto de montaje la ruta /tomcat, si nosotros no indicamos un punto de montaje, en este caso lo hubiera montado por default en /pool1/tomcat. Ahora, vamos a utilizar el comando df para revisar como están nuestros filesystem:

df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c1t0d0s0      2.9G   464M   2.4G    16%    /
/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                   2.5G   940K   2.5G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/dev/dsk/c1t0d0s4      5.8G   2.9G   2.8G    51%    /usr
/usr/lib/libc/libc_hwcap1.so.1
                       5.8G   2.9G   2.8G    51%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s3      2.9G    73M   2.8G     3%    /var
swap                   2.5G    40K   2.5G     1%    /tmp
swap                   2.5G    24K   2.5G     1%    /var/run
/dev/dsk/c1t0d0s6      2.9G   484M   2.4G    17%    /opt
/dev/dsk/c1t0d0s5      2.9G   3.0M   2.9G     1%    /export/home
pool1                   20G    21K    20G     1%    /pool1
pool1/tomcat            20G    21K    20G     1%    /tomcat

Observen que aparecen 2 nuevos filesystem pool1 y pool1/tomcat, pool1 representa al filesystem “raíz” del pool, sobre el se crean el resto de los ZFS.

Vamos a ver qué ocurre si creo otro filesystem:

zfs create -o mountpoint=/postgresql pool1/postgresql
df -h
Filesystem             size   used  avail capacity  Mounted on
/dev/dsk/c1t0d0s0      2.9G   464M   2.4G    16%    /
/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                   2.5G   940K   2.5G     1%    /etc/svc/volatile
objfs                    0K     0K     0K     0%    /system/object
sharefs                  0K     0K     0K     0%    /etc/dfs/sharetab
/dev/dsk/c1t0d0s4      5.8G   2.9G   2.8G    51%    /usr
/usr/lib/libc/libc_hwcap1.so.1
                       5.8G   2.9G   2.8G    51%    /lib/libc.so.1
fd                       0K     0K     0K     0%    /dev/fd
/dev/dsk/c1t0d0s3      2.9G    73M   2.8G     3%    /var
swap                   2.5G    40K   2.5G     1%    /tmp
swap                   2.5G    24K   2.5G     1%    /var/run
/dev/dsk/c1t0d0s6      2.9G   484M   2.4G    17%    /opt
/dev/dsk/c1t0d0s5      2.9G   3.0M   2.9G     1%    /export/home
pool1                   20G    21K    20G     1%    /pool1
pool1/tomcat            20G    21K    20G     1%    /tomcat
pool1/postgresql        20G    21K    20G     1%    /postgresql

Como podrán notar, todos los ZFS de este pool aparecen con el mismo número de espacio disponible (20Gb), esto es porque todos los ZFS de un mismo pool comparten el espacio disponible en el pool de datos, aunque cada uno de ellos mantiene su información independiente con respectos a los demás ZFS, es decir, los datos entre cada filesystem permanecen separados y conforme van aumentando del tamaño el pool les asigna más espacio.

Con esto se reduce la necesidad de reasignar espacios, lo cuál es un problema clásico en la administración de cualquier servidor: si mantengo la información en un solo filesystem se complica la administración del sistema operativo ya que una actualización implica modificar todo, si separo los filesystem, corro el riesgo de que alguno crezca mas allá de lo estimado y deba reorganizarlos.

Otro aspecto es que no tuve la necesidad de utilizar el mkfs para crear el filesystem, ni tampoco tuve que montarlo con el comando mount, todo esto se realizó de forma automática.

Si reiniciamos el servidor, podremos observar que los zfs se montan automáticamente y no tuvimos que darlos de “alta” en la tabla de montaje.

En siguientes entregas voy a explicar como migrar de un esquema de booteo UFS normal a uno ZFS y como hacer el mirroring.

5 comentarios:

lobotmx dijo...

Que tal Don Alex!!!

Pues aqui cultivandome con la ilustracion que nos proporcionas con tus conocimientos, y tambien para agradecerte el tiempo que te tomas para ir subiendo estos temas en tu blog y compartirlos.

Muchas gracias y seguimos aprendiendo mi estimado Alex.

Saludos!

Unknown dijo...

Hola Ingeniero.

Muchas felicidades. Una preguntota Respecto a respaldo a cinta se puede hacer con ufsdump?. Estaría muy bien una práctica de mirroring para este tipo de fs.

De antemano gracias

Unknown dijo...

Por el contrario, muchas gracias a tí.
Como respuesta a tu pregunta, desgraciadamente el ufsdump no soporta este tipo de filesystems y no hay una herramienta equivalente (un zfsdump, por ejemplo), esto fue una de las cosas que lamentablemente nos quedó a deber el equipo de desarrollo del desaparecido OpenSolaris. Así que solo puedes usar el tradicional tar y el cpio.
Para el mirroring, es realmente muy sencillo, por favor revisa esta liga

Anónimo dijo...

hola buenas tardes me gustaria saber oomo crear un filesystem o si es que se puede crear utilzando espacio de otros filesystems es decir ya no tengo un slide con espacio

Anónimo dijo...

Exelente articulo me ayudo muchisimo! muy muy bien explicado.

Tom Frayle