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.