15 jun

Instalar FreeBSD en Raspberry

Pues parece ser que tenemos una versión estable de FreeBSD para Raspberry, y como no puede ser de otra manera debemos probarla.

En este post lo que os voy a explicar es como intalarla en Raspberry de una forma un poco diferente y como dejar el sistema a punto, (red, actualizaciones, paquetes etc …)

Pues venga al lío que se nos va el día.

Instalación

Tenéis diferentes formas de instalar, la “oficial” seria iros a la pagina de FreeBSD https://wiki.freebsd.org/FreeBSD/arm/Raspberry%20Pi, tenemos diferentes métodos, pero os recomiendo que bajéis al final de la pagina a la sección de Binary snapshots, que creo que es la forma mas sencilla de instalar.

Seleccionamos la imagen de todo el listado, pero ESPERAR, no la bajéis todavía. ¿Cual es el problema que yo me encontré?, pues que una vez instalada esa imagen nos encontramos que necesitamos tener conectada la raspberry a un monitor y con un teclado, ya que viene con ssh activado, pero no permite el login externo, si optais por este metodo tendréis que:

Método 1 (descargar la imagen de la pagina oficial)

  1. Monitor
  2. Teclado compatible

Método 2 (descarga imagen con el login ssh habilitado)

  1. Red

El problema que yo tuve es que no tenia en casa ningún teclado compatible que me permitiera hacer login, asi que no podía habilitar el login de root por ssh y no podía hacer nada, total que cuando conseguí un teclado, cambie esa opción y me cree una imagen, la cual permite login por ssh y tiene DHCP por defecto. (plug and play)

Os recomiendo el método 2.

La podéis bajar de aquí  https://mega.co.nz/#!JJxHwarR!WfhEqUZZVaR0GO-ae9mqj_eCaJJbe4OVVcw-J03Ujfo

Una vez tengamos la imagen debemos volcarla en la SD (la imagen esta pensada para un SD de 8GB), tal que así

dd if=20140621_freebsd_raspberry.dd of=/dev/sdx
Dónde el of será el nombre de nuestro dispositivo SD.
Una vez finalice la colocamos en la Raspberry y arrancamos,  deberemos comprobar la ip que nos haya dada el router.
Hacemos login con el  usuario root y contraseña toor
Instalación hecha.

Configuración base del sistema

Lo primero que tendremos que hacer es cambiar la contraseña de root, crearnos un usuario y (recomiendo) deshabilitar el acceso de root por ssh.

Pues vamos a ello.

Primero creamos el grupo de nuestro usuario

[email protected]:~ # pw groupadd name

Después el usuario

[email protected]:~ # adduser mauso
Username: name
Full name: name
Uid (Leave empty for default):
Login group [name]:
Login group is name. Invite mauso into other groups? []:
Login class [name]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/name]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:

OK? (yes/no): yes
adduser: INFO: Successfully added (name) to the user database.
Add another user? (yes/no): no
Goodbye!
Ahora ya podremos hacer login con nuestro usuario, pero no podremos pasar a root, debemos añadir el usuario al grupo wheel.
pw user mod username -G wheel
Comprobamos que podemos entrar y cambiar al usuario root con
su -
Y (recomendación) desactivamos PermitRootLogin yes en el fichero /etc/ssh/sshd_config
Por ultimo podemos añadir una ip estática al sistema de la siguiente forma.
Iremos a /etc/rc.conf y añadiremos lo siguiente.
vi /etc/rc.conf
hostname="FreeBSD"
ifconfig_ue0="inet 192.168.1.101 netmask 255.255.255.0"
defaultrouter="192.168.1.1"
sshd_enable="YES"

Configurar Ports

Tenemos diferentes formas de instalar paquetes en FreeBSD, pero la que voy a explicar y la que más me gusta es a través de ports, aquí tengo una explicación mas extensa que os recomiendo que visitéis.
Lo primero que deberemos conseguir es la colleccion de Ports.
Los pasos son fáciles
  • Descargar los instantánea comprimida
portsnap fetch
  • Extraer
 portsnap extract
  • Actualizar
portsnap update

Disfrutar :)

Si queréis saber más sobre Ports pasaros por aquí

Con esto ya tendremos el sistema montado y listo para empezar a jugar, por último recordaros que FreeBSD tiene una documentación genial, donde podéis ampliar más información sobre los puntos que aquí explique.

 

Fuentes

23 jul

Instalación de Ports FreeBSD

Bueno esta vez voy a explicar como instalar paquetes en freebsd, después de realizar una instalación básica desde el cd o el usb, la situación en mi caso es la siguiente, queremos tener un sistema únicamente para ver unas gráficas de graphite y claro la cosa más sencilla que se nos ocurrió es preparar un mini pc con freebsd ;).

Bien, pues si hemos hecho la instalación base posiblemente lo primero que tengamos que hacer es dar acceso a root por ssh, si lo se… no es correcto, pero dado la criticidad del asunto, en mi caso voy abrir el acceso para gestionar el pc desde mi sobremesa, tranquilamente. Si hemos creado usuario durante el proceso de instalación, siempre podemos entrar con ese usuario y posteriormente cambiar a root.

Para hacer este paso, muy sencillo cambiaremos lo siguiente,

vi /etc/ssh/sshd_config
PermitRootLogin yes
/etc/rc.d/sshd restart

En nuestro caso vamos a realizar la instalación de los paquetes a través de ports, también lo podemos hacer por packages que vienen siendo los paquetes precompilados, o sea los .deb de debian o los .rpm de redhat, el caso de los port se usa la Colección de Ports que son los ficheros makefile y sus parches adaptados específicamente para poder instalar desde el código fuente. Al instalar un port lo que estaremos haciendo es bajar el código fuente aplicar los parches necesarios, compilar el código e instalará el programa.

Como explican muy bien en la pagina de freebsd, en resumen es esto:

Package (binario)

  • Instalación más rápida (compilar programas grandes puede llevar su tiempo).
  • No hay que comprender el proceso de compilar software.
  • No es necesario instalar compiladores en su sistema.

Ports (fuente)

  • Es posible ajustar las opciones de la instalación. (Los packages se generan normalmente con las opciones estándar. Con los ports puede ajustar diversas opciones, como disponer de módulos adicionales o cambiar la ruta por defecto.)
  • Puede usar sus propios parches si tiende hacerlo.

Como veis, gustos y formas, en mi caso me parece bastante interesante la posibilidad de decidir que partes de un programa quieres tener disponible, es una forma de tener exactamente lo que quieres, si que es cierto que en ciertos casos cuando vamos a instalar suites se puede convierte en algo pesado ir seleccionando las opciones de todos los paquetes, pero como no, siempre hay alguna ayuda…(veremos mas adelante) puesta la introducción vamos al lio.

Preparación de las Colección de  Ports

Lo primero que deberemos hacer es bajarnos la Coleccion de Ports, extraerlos y mirar si disponemos de actualizaciones, todo con estos tres comandos.

portsnap fetch
portsnap extract
portsnap update

Opciones e instalación de Ports

Bueno, ahora vamos a instalar algún port, por ejemplo nano, que es un poco más amigable que vi.

Podemos buscar la ruta del paquete a instalar con whereis o con locate.

whereis nano
nano: /usr/ports/editors/nano

Así que nos vamos a esa ruta y haremos

[email protected]:~ # cd  /usr/ports/editors/nano
[email protected]:/usr/ports/editors/nano # make install clean
[email protected]:~ # rehash

Como hemos visto, se cumple lo que os comente anteriormente (menos mal…) y durante el proceso nos preguntan si queremos tener disponible la documentación de gettext, entro otras opciones que deberemos ir contestando gettext

Por norma general la instalación de ports es así de sencilla.

¿Qué pasa si  queremos instalar xfce?

Como os podéis imaginar nos va a preguntar bastantes opciones a medida que vaya preparando los configures, pues en este caso tenemos dos opciones.

Opción 1

  • make config-recursive antes del make install y el make clean, de esta manera nos solicitara todos las opciones antes de empezar y podremos dejarlo compilando sin preocuparnos de que se pare el proceso.

Opción 2

  • Podemos también ponerlo por defecto, o sea que las opciones por defecto que trae el paquete sean las que utilizara, esto lo haremos añadiendo BATCH=yes al fichero /etc/make.conf, o si lo queremos en un caso puntual, podemos lanzar el make de la siguiente forma make install clean BATCH=yes

Bueno pues vamos hacer un ejemplo, con el paquete vim, como veréis  es posible que nos intentara instalar dependencias del paquete con las X11, en el caso que no tengamos las X o que no queramos tener las dependencias, deberemos hacer lo que explique en su día Evitar dependencias X11 al instalar paquetes FreeBSD

whereis vim
cd /usr/ports/editors/vim/
make config-recursive
make install
make clean
rehash

Como hemos visto nos ha pedido diferentes opciones antes de empezar el proceso, después hemos hecho el make install y el make clean y ya no pregunto nada más, como curiosidad si os fijáis paso algo que explique más arriba (menos mal… nuevamente), lo que hizo en descargar el paquete y fue bajando todos los patch disponible para aplicar hasta la fecha, lo vemos en la imagen.

parch

Y aprovechando esto, os voy a explicar que es la carpeta /usr/ports/distfiles/, cuando vamos a instalar un port, el sistema realizara la comprobación primero en esa ruta, para comprobar que no tenga el paquete ya disponible, también es útil en el caso que tengamos que cumplir alguna dependencia que no este en el repositorio, en eso caso podremos el fichero tgz en esa ruta.

Bueno ahora para mostrar la segunda opción, instalaremos el entorno gráfico xfce, el procedimiento es el mismo, cambiando la opción BATCH=yes, pues al lío.

cd /usr/ports/x11-wm/xfce4
make install clean BATCH=yes
echo "/usr/local/bin/startxfce4" > ~/.xinitrc

Como habréis notado, aquí lo hizo todo a saco sin preguntar nada, cogiendo las opciones por defecto como era de esperar tardo un rato largo…. al menos en mi caso (6-7horas), la última linea es para que en el próximo arranque nos muestre el entorno gráfico

Eliminación de Ports

Bien pues a estas alturas ya sabemos como instalar ports de diferentes maneras en nuestro sistema, igual ahora lo que no interesa es eliminar un port, bien pues lo que vamos hacer es lo siguiente, por ejemplo con el port nano.

cd  /usr/ports/editors/nano
pkg_delete nano

Así de fácil

Actualización de Ports

Igual también nos interesa actualizar algun port, pues lo que haremos es lo siguiente.

Veremos los ports que tienen alguna actualización, con el siguiente comando

pkg_version -v

Muy importante deberemos revisar /usr/ports/UPDATING ya que ahi veremos los commit que se realizaron en los port que tienen posibilidad de ser actualizados,  de esta manera decidiremos si la mejora nos es necesaria o no.
Yo por norma general utilizo portupgrade, que me parece muy sencillo y dinámico, vamos a ver algunos ejemplos

cd /usr/ports/ports-mgmt/portupgrade
make install clean

Actualizar todos los ports, con confirmación (opción -i)

portupgrade -ai

Si queremos actualizar únicamente un paquete podemos hacer

portupgrade -R nano

Con la opción -R lo que le estamos diciendo es que antes de actualizar el paquete, actualice todas las dependencias.

Limpieza de los Ports

Por ultimo vamos a limpiar el sistema después de todo lo que hicimos.

Sobretodo si somos de los que instalamos los ports sin realizar el make clean, deberemos lanzar cada x tiempo el siguiente comando, ya que la colección de ports tiende a crecer y crecer y crecer….

portsclean -C

Para limpiar la carpeta distfiles haremos.

portsclean -D

Pues creo que es todo, como veréis es una simple pincelada para sentirnos un poco más cómodos con el entorno,  la verdad es que es un sistema muy dinámico y recomiendo que lo proveéis, por supuesto una de las grandes cosas que tiene freebsd es su maravillosa documentación.

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/

Ale a disfrutarlo!

22 may

Tipos de caches ZFS

Vamos a explicar que tipos de cache tenemos disponible en ZFS y como trabaja cada una de ellas, este post es  un añadido al mejora del rendimiento ZFS,  hechas las presentaciones vamos al lio.

Como sabemos ZFS nos permite hacer miles de cosas que difícilmente las podemos encontrar en los sistemas tradicionales de almacenamiento, e incluso algunas de ellas no están presente entre los grandes como EMC o Hitachi, pero bien estamos viendo que con el paso del tiempo hemos conseguido aumentar el numero de cpu’s, los GB de RAM e incluso los miles de TB de nuestros discos duros, pero aún así seguimos pecando de la velocidad de los discos, así que dada esta situación solo nos queda meter caches intermedias para conseguir darle un poco de brío al tema, en esta situación tenemos lo que popularmente se esta conociendo como Hybrid Storage, que no es más que la unificación de un disco duro + un disco SSD + RAM, la cantidad de cada una de las partes en nuestro sistema dependerá una vez mas de los leuros que tengamos encima de la mesa.

En los tiempos que corren, lo mas normal es que tengamos muchos discos rotativos, poca ram y algún SSD, así que vamos a centrarnos en esta situación para explicar como funcionan y como debemos organizar las caches del sistema ZFS. Dónde tenemos el problema?, pues en el acceso aleatorio a los datos, la búsqueda del sector, más el movimiento de la aguja que nos lleva a tener una latencia importante.

Vamos a ver el esquema de sistemas de cache que tiene ZFS y explicar cada una de ellas.

arcCache ARC -> Muy por encima, ubicado en RAM, es la cache de primer nivel de ZFS, si no le decimos nada ZFS intentara ubicar en ella lo máximo posible, ya que al estar en RAM es la más rápida.(uberblock y punteros  a los arboles de datos, para acceder de la forma mas rápida posible a los mismos).

L2ARC: Cache de segundo nivel de lectura, esto son los discos SSD, zfs ubicará  todos los datos que no pudo ubicar en ARC (debemos recordar que zfs hace un uso intensivo del sistema de prefetch inteligente), esto se puede modificar y decidir que parte queremos enviar al ARC y que parte quedarnos en el L2ARC, esta explicado entre otras variables en el post “Mejorar rendimiento de ZFS“.

ZIL: Más disco SSD, cache de segundo nivel de escritura, ahí meteremos el log, el  zfs intent log que acelerará las escrituras de tipo sincrono.

Disk storage pool: Pues los discos, cuando llegamos aquí ya tenemos que tenerlo todo montadito, que sino empieza a ir todo lento lento….

Entonces como nos quedaría?, pues algo tal que así.

Diagrama1

Cosas a tener en cuenta para entender mejor la arquitectura:

  1. El incremento del rendimiento se notara tras varias horas de funcionamiento con la estructura montada, ya que el sistema L2ARC/ZiL, ira almacenando en cache, los datos que mayor acceso tengan.
  2. El L2ARC, esta pensado para sistemas de write one, read many, o sea mucha lectura poca escritura, y lectura de datos de tipo aleatorio, la lectura de datos secuenciales zfs no hará uso de L2ARC (de cualquier modo el sistema de prefetcht integrado en zfs ya esta suficientemente optimizado para el envío de datos).
  3. ZIL, esto nos ayudara a compensar las escrituras a disco, la verdad es que yo recomiendo activar ambos, ya que obtendremos el mejor rendimiento posible.

Por último, recordad que una vez montado la arquitectura deberías revisar los parámetros, pasaros por el post Mejorar rendimiento de ZFS

Como montar esto?

Fácil

zpool add <pool> cache <disco>

 

zpool add <pool> log <disco>

El primer comando activaremos la cache de L2ARC y con la opción log del segundo comando activaremos la cache ZiL
Ale a disfrutarlo!

06 may

Instalar BaculaWeb en Freebsd

Vamos a explicar como instalar una pequeña web única y exclusivamente para controlar los trabajos del servidor de bacula, esta solución básicamente los que nos ofrece es una web donde veremos como están los backups, cuantos fallaron cuantos fueron bien etc… pero de momento como os comento es a modo informativo….

Pues dicho esto vamos al lio.

Primero de todo deberemos instalar los paquetes que nos hacen falta.

Como lo vamos hacer en FreeBSD una cosa muy importante es controlar los paquetes dependientes de las X11, para evitar que nos instale “basura” si no tenemos un entorno gráfico, para evitar eso lo explico aquí

Haremos.

cd /usr/ports/
cd databases/postgresql91-server
make install clean
cd ..
cd sysutils/bacula-client
www/apache22
make install clean
cd ..
cd lang/php5
make install clean
cd ..
cd www/php5-session
make install clean
cd ..
cd devel/php5-gettext
make install clean
cd ..
cd graphics/php5-gd
make install clean
cd ..
cd sysutils/bacula-client
make install clean
cd ..
cd www/apache22
make install clean
cd ..
cd lang/php5
make install clean
cd ..
cd www/php5-session
make install clean
cd ..
cd devel/php5-gettext
make install clean
cd ..
cd graphics/php5-gd
make install clean
cd ..
cd databases/php5-mysql
make install clean
cd ..
cd databases/php5-pdo_mysql
make install clean

Es posible que durante la instalación de los paquetes tengamos un problema de dependencias con el paquete libpng-1.5.13.tar.xz, pero no os preocupéis el papi Miguel piensa en vosotros y aquí lo tenéis libpng-1.5.13, por supuesto esta en doc porque wordpress no me deja subir tar.xz, pero es un tar.xz.

Pues con esto instalado comprobamos que esta el apache arrancado y lo ponemos en el arranque automático

vi  /root/rc.confapache22_enable="YES"

Ahora solo nos queda configurar el codigo, nos lo bajamos de http://bacula-web.org/tl_files/downloads/

cd  /usr/local/www/apache22/data/wget http://bacula-web.org/tl_files/downloads/bacula-web-latest-version-number.tar.gztar -xzf bacula-web-version_number.tar.gz -C /usr/local/www/apache22/data/chown -Rv /usr/local/www/apache22/data/baculachmod -v ug+w /usr/local/www/apache22/data/bacula/application/view/cache

Bueno como veréis los pasos son triviales, lo único que debemos tener en cuenta es darle permisos de escritura al directorio cache.

Ahora vamos a configurar el chirringo este para que se comunique con bacula-dir

Utilizaremos los ficheros de ejemplo para configurarlo.

cp  /usr/local/www/apache22/data/bacula/application/config/config.php.sample /usr/local/www/apache22/data/bacula/application/config/config.php

 

$config['language'] = 'es_ES';// MySQL bacula catalog

Como vemos es bastante sencillo, cambiamos el idioma por defecto y configuramos la base de datos donde tengamos corriendo Bacula.

Una vez hecho esto ya deberíamos tener la web funcionando, iremos a la dirección siguiente

http://IPserver/bacula/test.php

Y deberíamos ver algo así.

testY si vamos a index.php, veremos las tareas y demás información que ya os dejo que la vayáis descubriendo vosotros mismos :).

Dashboard

Ale a disfrutarlo!!!

03 may

Evitar dependencias X11 al instalar paquetes FreeBSD

Una de las cosas super chulas que tenemos por defecto en FreeBSD, es que nos podemos encontrar que queremos instalar un paquete, por ejemplo vim, pero observamos que durante la instalación el sistema también quiere instalar dependencias de X11, y nosotros no tenemos instalado en nuestro sistema las X11, que debemos hacer?

Muy fácil.

sudo vim /etc/make.conf

WITHOUT_X11=yes

Y volvemos a la felicidad, así de sencillo.

18 abr

Mejorar el rendimiento de ZFS

El un post anterior explicamos como montar un zpool, con raidz con deduplicacion  más compresión, suele pasar que, por norma general instalamos el tinglado de ZFS por defecto, y normalmente al inicio funciona perfectamente y muy muy rápido, pero de repente un día nos damos cuanta que el rendimiento bajo sustancialmente. Entonces se nos empieza a caer el mito, el cielo se pone negro y todo se vuelve borroso.

Bueno, pues lo que voy a intentar es dar un poco de luz a ese panorama, explicando ciertos valores que son recomendables tocar en nuestro FreeBSD, para que gestione mejor todo el tinglado.

Vamos al lio.

Primero de todo, nos vamos a centrar en valores del sistema (Boot Loader Parameters), y van configurados en (/boot/loader.conf), nos debemos fijar como tenemos el sistema ahora, por si acaso debemos volver atrás, para eso utilizaremos.

sysctl -a

O podemos ver el valor establecido de aquella variable que queremos cambiar con

sysctl vfs.zfs.arc_meta_used

Primero de todo lo que vamos hacer es un comprobación muy sencilla, vamos a mirar como esta utilizando nuestro sistema la tabla ARC (La tabla ARC es el lugar en memoria, donde el sistema guarda los metadata y la cache de datos).

Debemos tener en cuenta que la memoria mínima que le asignemos al ARC será la que mantenga, todo lo demás desde mínimo al máximo, puede ser solicitado por cualquier otro proceso del sistema, la memoria de ARC no dispone de una prioridad alta, así que si algun proceso solicita memoria es más que probable que ARC ceda la que tiene utilizándose.

Esto nos sirve en el caso que dispongamos de otra aplicación que utilice un tamaño de memoria RAM mínimo para arrancar, podemos asegurarnos que el tamaño mínimo asignado a ARC dejara memoria suficiente para el resto de servicios

Memoria utilizada

sysctl vfs.zfs.arc_meta_used
vfs.zfs.arc_meta_used: 3839717456

Limite de la memoria permitida

sysctl vfs.zfs.arc_meta_limit
vfs.zfs.arc_meta_limit: 3887218688

Como podemos ver estamos al limite…, cosa que debemos cambiar.

Podemos hacer 2 cosas, o modificar el tamaño que utilizara la parte metadata de ARC añadiendo la variables vfs.zfs.arc_meta_limit o hacerlo de forma general, ya que en la tabla de ARC, guardaremos tanto los metadata como la cache de datos y que freebsd se lo gestione como buenamente quiera, pensemos que si modificamos por ejemplo el ARC_max a 4Gb y el arc_meta_limit a > 4GB,  es más que seguro que estemos forzando a que el sistema pase la cache de datos a disco, se puede aumentar el arc_meta, si tenemos activada la cache secundaria en disco SSD, que lo explicare como hacerlo en otro momento.

Bueno pues vamos a reservar un mínimo para todo el tinglado que expliqué del ARC.

Recomiendan utilizar esta regla para asignar un tamaño mínimo al ARC
4GB -> 512MB
8GB -> 1GB
etc

vfs.zfs.arc_min="8096M"

Contando que la máquina solo se dedique almacenar datos podemos aplicar las siguiente “reglas”, que por supuesto no son 100% fiables, debemos aplicar y ver como se comporta el sistema.

Ram x 0.5 – 512 MB

vfs.zfs.arc_max="3584M"

Ram x 2

vm.kmem_size_max="16G"

Ram x 1.5

vm.kmem_size="12G"

Una vez realizado esto debemos asegurarnos que los cambios que hemos hecho se comportan correctamente con el espacio libre del kernel, lo podemos hacer con el siguiente script.

#!/bin/sh

TEXT=`kldstat | awk 'BEGIN {print "16i 0";} NR>1 {print toupper($4) "+"} END {print "p"}' | dc`
DATA=`vmstat -m | sed -Ee '1s/.*/0/;s/.* ([0-9]+)K.*/1+/;$s/$/1024*p/' | dc`
TOTAL=$((DATA + TEXT))

echo TEXT=$TEXT, `echo $TEXT | awk '{print $1/1048576 " MB"}'`
echo DATA=$DATA, `echo $DATA | awk '{print $1/1048576 " MB"}'`
echo TOTAL=$TOTAL, `echo $TOTAL | awk '{print $1/1048576 " MB"}'`

Sumamos el espacio de utilización del kernel, más el utilizado por VDEV cache size, debemos controlar sobretodo vm.kmem_size ya que si nos pasamos con el valor, podemos tener un kernel panic al inicio del sistema, también debemos tener en consideración que vfs.zfs.arc_max, debe ser inferior a vm.kmem_size (ya que no solo ZFS utiliza la memoria), también debemos tener en cuenta, que si ponemos un valor muy alto en vm.kmem_size independientemente de vfs.zfs.arc_max, puede ser que el sistema no nos arranque, no hay problema, podemos cambiar en el gestor de arranque del sistema y asignar con (set vm.kmem_size = “512M”).

Si hemos cambiado los valores vfs.zfs.arc_max y vm.kmem_size el valor de kmem_size_max no se toma en consideración, pero se requiere ponerlo.

Seguimos con más opciones.

vfs.zfs.prefetch_disable="1"

Activar o desactivar esta opción, nos permite hacer que el sistema sea menos restrictivo a la hora de realizar las lecturas, de tal manera que la velocidad de lectura tiende a subir activandolo, este valor hace la función de precargar el siguiente bloque que el sistema predice que pueda ser leído, por supuesto en RAM , desactivarlo solo es recomendable para sistemas que tengan poca RAM.

Venga a por otro más

vfs.zfs.txg.timeout="5"

Este valor es el que controla el ZFS txg timeout, por defecto es 30 segundos, debemos cambiarlo si nos encontramos con cortes en la transferencia, ya que puede ser debido a esto,  normalmente el comportamiento por ejemplo en una linea de 1GB puede ser que  la tasa de trasferencia es oscilante,  o sea que por ejemplo se envían 100MB se para y de golpe envía 200MB etc etc, pensemos también que en el caso que tengamos activado la compresión, puede ser normal que baje la tasa de transferencia a disco mientras el sistema esta comprimiendo los datos, en ese caso lo que aumentara es la CPU

Ahora vamos a subir el numero de vnodes.

Los vnodes es un objeto dentro de la memoria del kernel que habla con la interfaz del sistema de ficheros( abre, lee, escribe, cierra,etc..), los vnodes pueden representar ficheros, directorios, colas….

De tal manera que en el caso que lleguemos al tope de vnodes que el sistema puede gestionar, pues nos encontraremos con la bajada de rendimiento del mismo. Con esto comprobamos su valor

sysctl vfs.numvnodes

Si nos quedamos sin “espacios” en la tabla nos saldrá en el messange.

La norma de freebsd es que 1 gb por cada 4Gb de RAM

vfs.zfs.write_limit_override=1073741824

Parámetros del sistema de ficheros

Ahora vamos a dejar el sistema base a un lado y nos centramos en opciones de ZFS.

Venga al lio!

Si los datos que tenemos en el raidz, no tiene una criticidad alta, podemos plantearnos quitar la opción de checksum, ya que la paridad del RaidZ yo nos proporciona una protección básica, de esta manera libramos carga del sistema de ficheros, pero como digo siempre y cuando los datos que tengamos no son críticos, sino en ningún caso debemos desactivar esta opción

Este cambio se realiza a nivel de pool de zfs, y debemos activarlo y desactivarlo en aquellos que nos interesen, de la siguiente manera.

sudo zfs set checksum=off myzpool

Podemos también desactivar a nivel de pool la opción atime, con esto evitamos que el kernel tenga que realizar updates de tiempo por cada acceso de lectura fichero, esto es necesario si o si, en el caso que los datos que tenemos en el zpool seas accesibles por diferentes servicios a la vez, como contra partida los snapshot ocuparan más.

Haremos

sudo zfs set atime=off myzpool

Ahora vamos a tocar lo que guardara ZFS en la cache, normalmente tendremos 1 cache, que es donde guardara por un lado los metadata de la tabla ARC y por otro cache de datos, si lo que queremos es ahorrar RAM, lo que podemos hacer es decirle a ZFS que solo guarde metadata en la cache. La buena practica seria activar 2 cache, en la primera cache, que va a RAM, le diremos que solo guarde la información metadata, y en la segunda cache que seria un disco rápido (SSD por ejemplo),  le diremos que guarde cache de datos.

Tenemos 3 opciones para “jugar” con la cache, all, metadata o none.

Mas adelante explicare como añadir un disco SSD, para utilizarlo de cache. Con el panorama actual lo dejaremos en all, pero para cambiarla seria.

zfs set primarycache=metadata myzpool

Como comento lo recomendable seria utilizar dos tiempos de cache, en el caso que dispongamos de un disco SSD para la segunda cache lo que haremos es decirle que la segunda cache que va a nuestro disco SSD. Tal que así

zfs set secondarycache=all myzpool

De esta manera lo que conseguimos es que se guarde en memoria la base de datos de metadata, y en el disco SSD se guarde la cache de datos más la metadata, la metadata solo se escribira en el caso que la cache de primer nivel se agote, cosa que no nos interesa, debemos evitar que llegue al disco, ya que en eso momento hemos muerto…. Game Over y a otra cosa mariposa.

Ahora toca la variable recordsize, el cambiar el valor de esta variable, se aplicara desde ese momento para los datos nuevos que añadamos.

Con esta variable le diremos la asignación de tamaño de bloque del pool, debemos tener cuidado con esto ya que la asignación de un tamaño grande, no es contraproducente a nivel de escritura, ya que si tenemos por ejemplo 128 k de bloque y escribimos bloques de 64k, realmente en el rendimiento no tendremos aumento de latencia, el problema nos lo podemos encontrar si la media de bloques escritos en nuestro sistemas es por ejemplo de 64k y tenemos el bloque de 128, por cada envía que hagamos enviaremos 128k, de los cuales 64k son datos vacíos que tiene que gestionar el sistema, a parte si  disponemos por ejemplo de una red de 100MB/s, si tenemos un tamaño de bloque ocupado de 128k, podremos enviar 700 veces por segundo.

Bueno aqui cada cual, yo personalmente lo tengo en 64k, el comando para modificarlo es

sudo zfs set recordsize=16k myzpool

Por ultimo podemos probar si existe alguna actualizacion de ZFS

sudo zfs upgrade my_poolsudo
sudo zpool upgrade my_pool

Con esto reiniciamos y comprobamos el rendimiento, podemos utilizar estos 3 sistemas para comprobar el rendimiento.

zfs-mon

atop -l  2

zpool iostat -v 2

Ale a disfrutarlo!!

11 mar

Resetear base de datos y ficheros de bacula

Tenemos un entrono con Bacula configurado, y nos ponemos en el supuesto que queremos resetear la base de datos con los ficheros, para empezar de nuevo.

Primero de todo vamos hacer una copia de sguridad de la base de datos, por si se nos va la mano más de la cuenta.

/usr/bin/mysqldump bacula > bacula_antes_purge.sql

Ahora pararemos bacula.
En freebsd

/usr/local/etc/rc.d/bacula-dir onestop
/usr/local/etc/rc.d/bacula-sd onestop

En debian

service bacula-director stop
service bacula-sd       stop

Después eliminamos la base de datos y la volvemos a crear

mysql -u root -p
drop database bacula;
create database bacula;
quit

Ahora solo nos queda recrear las tablas, para ello vamos a utilizar el script que nos da bacula y lo ejecutamos tal que

Dependiendo de nuestro SO, estará en un lugar u otro.

~/make_mysql_tables

Una vez finalizado, podemos si queremos eliminar los fichero de copias de seguridad y empezar de nuevo o arrancar el servicio y alinear los ficheros de copia de seguridad con el catálogo.

Primero,

service bacula-director start
service bacula-sd       start
o
service bacula-director start
service bacula-sd       start

Ahora ya tenemos el director, con la nueva base de datos, en el caso que tengamos ficheros de copia de seguridad, podemos volver a cargarlos en el catalogo tal que:

/usr/local/sbin/bscan -V nombredelVOl -v -s -m -c /usr/local/etc/bacula-sd.conf /storage/bacula/

Podemos hacer un script que nos vaya cargando los ficheros de forma sencilla, como os imaginéis en el caso de tener muchos datos, pues darle al play y echaros a dormir.

Ale a disfrutarlo

07 mar

Comandos útiles para zpool

Vamos a poner una lista de comandos útiles para “gestionar” nuestro zpool montado en freebsd, aquí podemos ver como montarlo.

Control de zpool

Eliminar un pool y liberar los discos.

zpool destroy pool

Añadir un disco al pool o añador un disco en spare a un pool existente

zpool add pool disco
zpool add pool spare disco

Comporbar el checksumde todo el pool en busca de errores

zpool scrub pool

Parar un disco y ponerlo otra vez en marcha

zpool offline pool disco
zpool online pool disco

Cambiar un disco por otro

zpool remplace pool discoviejo disconuevo

Información sobre zpool

zpool list
zpool status

Comprobar los accesos

zpool iostat -v 2

Comprobar si un volumen tiene compresión y el ratio

zfs get compression pool
backups  compression  gzip-9    local
zfs get compressratio pool
backups  compressratio  3.89x  -

Comprobar la deduplicacion y el ratio

zfs list pool
NAME      SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
backups  2.33T   123G  2.21T     5%  1.45x  ONLINE

Podemos hace una simulación de lo que podíamos ganar en el caso de activar la deduplicacion en un pool, con el comando

zdb -S pool

Podemos ir comprobando lo que hemos ganado con la deduplicacion y compresion con el comando siguiente.

zdb -D pool
zdb -DD pool

Que nos devolverá información básica o detallada del pool.

Ejemplo basico

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core
dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

Managemen zpool

Establecer una cuota a un pool

zfs set quota=tamaño pool

Almacenar varias copias de cada archivo. Esto establece un nivel de redundancia a mayores sobre lo que ya ofrece el ZPoll. El espacio que ocupa el archivo se multiplica

zfs set copies=3 pool

Crear un snapshot

zfs snapshot [email protected]
zfs list -t snapshot
 zfs list -t snapshot -o name,creation

Volver a un snapshot y eliminarlo

zfs rollback /@
zfs destroy /@

Con esto podemos ir tanteando el mundo de zfs… para más información http://www.freebsd.org/doc/en/books/handbook/index.html

07 mar

Crear Raid-Z más zfs con deduplicación y compresión

Vamos a dar los pasos para crear en FreeBSD dos raidz, crearemos también dos zpools y en uno de ellos vamos a montar la compresión y la deduplicacion que nos ofrece ZFS, a más voy a poner unos comandos que suelen ser útiles para controlar el tema.

El escenario es el siguiente, tenemos 8 discos duros, 4 de 2 TB y 4 de 600GB, la idea es crear dos raidz.

Primero de todo, lo que vamos a mirar es la lista de discos duros que tenemos en nuestro FreeBSD, lo haremos con el comando

egrep '^ad[0-9]|^da[0-9]' /var/run/dmesg.boot

Como os fijareis, estoy en una plataforma virtual, como consejo es diré que tengáis en cuenta los canales del conector de SCSI en VMware, yo soy partidario de separa los discos del sistema en el canal 0 y los de backup (en este caso) en el canal 1, esto también nos da la facilidad que en el caso que sean discos de backup, podamos decidir que esos discos no se realicen snapshot, o por ejemplo si tenemos que hace backup de esa máquina virtual, en mi caso con veeam backup, podremos decirle que no haga backup de los discos que estén conectados en el canal 1.

Un trozo de mi lista es:

da7: Command Queueing enabled
da7: 614400MB (1258291200 512 byte sectors: 255H 63S/T 78325C)
da8 at mpt1 bus 0 scbus3 target 6 lun 0
da8: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device
da8: 320.000MB/s transfers (160.000MHz, offset 127, 16bit)
da8: Command Queueing enabled
da8: 2097151MB (4294967294 512 byte sectors: 255H 63S/T 267349C)
da9 at mpt1 bus 0 scbus3 target 8 lun 0
da9: <VMware Virtual disk 1.0> Fixed Direct Access SCSI-2 device
da9: 320.000MB/s transfers (160.000MHz, offset 127, 16bit)
da9: Command Queueing enabled
da9: 614400MB (1258291200 512 byte sectors: 255H 63S/T 78325C)

Bien, pues vamos a crear primero los dos RAIDZ.

zpool create storage raidz da2 da3 da6 da8

Donde storage es el nombre del “pool” y da2..da8, los discos que queremos añadir a ese Raid.

Por defecto al colocar raidz nos generara algo parecido al RAID5 tradicional, pero disponemos de otro tipos de RAID, dentro del RAIDZ.

Tipos de RAID-Z

Raid 0

zpool create nombredelpoll discos

Raidz-2

Creación de un zpool raidz-2 con 4 discos, doble paridad y un disco de spare,

&lt;pre&gt;zpool create nombre del pool  raidz2 discos spare disco_en_spare

Ahora vamos crear el segundo raidz

zpool create backups raidz da4 da5 da7 da9

Podemos ver que el Raid se creo correctamente con

zpool list
backups  2.33T   104G  2.23T     4%  1.43x  ONLINE  -
storage  7.94T  1.58T  6.36T    19%  1.00x  ONLINE  -

Para ver el punto de montaje, lo podemos hacer con un df -h

Como vamos a colocar copias de seguridad en este pool backups activaremos la compresión y la deduplicacion

Podemos hace una simulación de lo que podíamos ganar en el caso de activar la deduplicacion en un pool, con el comando

zdb -S pool

&lt;pre&gt;
zfs set dedup=on backups/
zfs set compression=gzip-9 backups/

Podemos elegir el nivel de compresión.

Cuando empecemos a trabajar con el, podemos ir comprobando lo que hemos ganado con la deduplicacion y compresion con el comando siguiente.

zdb -D pool

zdb -DD pool

Que nos devolverá información básica o detallada del pool.

Ejemplo basico

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core

dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

Ejemplo detallado

DDT-sha256-zap-duplicate: 2682724 entries, size 356 on disk, 166 in core
DDT-sha256-zap-unique: 14651367 entries, size 335 on disk, 150 in core

DDT histogram (aggregated over all DDTs):

bucket              allocated                       referenced
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
1    14.0M   1.73T    471G    473G    14.0M   1.73T    471G    473G
2    1.23M    135G   42.6G   42.8G    3.08M    345G    106G    106G
4     513K   47.3G   18.8G   18.9G    2.43M    234G   91.8G   92.2G
8     311K   33.5G   10.4G   10.5G    3.25M    362G    110G    111G
16     118K   11.1G   4.30G   4.31G    2.61M    252G   95.7G   96.1G
32     396K   47.5G   11.1G   11.1G    14.1M   1.67T    405G    407G
64    11.9K    389M    373M    375M    1014K   32.9G   31.4G   31.5G
128    3.56K    142M    131M    132M     607K   23.5G   21.9G   21.9G
256    4.24K   75.7M   44.6M   45.8M    1.30M   23.7G   14.0G   14.3G
512      106   3.40M   3.34M   3.36M    67.6K   2.16G   2.12G   2.13G
1K       16    366K    350K    353K    21.9K    440M    418M    422M
2K       16   88.5K   67.5K   71.1K    42.5K    237M    178M    188M
4K        8   77.5K   39.5K   41.1K    43.2K    423M    218M    227M
8K        2     48K     48K   48.6K    23.5K    565M    565M    573M
16K        3   77.5K   77.5K   78.5K    53.8K   1.36G   1.36G   1.38G
32K        1   71.5K   71.5K   71.8K    36.9K   2.58G   2.58G   2.59G
Total    16.5M   2.00T    559G    561G    42.6M   4.65T   1.32T   1.33T

dedup = 2.42, compress = 3.52, copies = 1.00, dedup * compress / copies = 8.48

En este caso no vamos a separa la cache de cada pool y los logs, pero es posible tener una cache por cada grupo discos, una cache que es interesante que este en unos discos más rápidos, si vemos que nos hace falta podemos mirar el rendimiento de nuestro sistema de RAID con la aplicación que queramos, sabiendo que contra más compresión pues mas recursos.
Una herramienta que esta bastante bien es Bonnie++

Con esto ya tendremos montado nuestro sistema Raid-Z y algunas características de zfs

06 mar

Bonnie++

El otro día me encontré con esta herramienta, que permite hacer un stress de los discos duros, tenemos diferentes herramientas del estilo, pero esta me pareció que cumplía bien lo que estaba buscando.

Bonnie++ esta disponible para Linux y Freebsd entre otros..

Para instalar en CentOS por ejemplo haríamos.

 yum install bonnie++
 

En freeBSD a través de ports, lo encontramos en

cd /usr/ports/benchmarks/bonnie++/
make
make install
make clean
rehash

Bueno básicamente bonnie++ nos proporciona 3 tipos de pruebas escrituras secuenciales, lecturas secuenciales y búsquedas aleatorias.
Podemos ver las opciones con

man bonnie++

Normalmente suelo utilizar esta linea que me parece bastante completa.

bonnie++ -d directorio -s 20g -n 1 -m localname -f -b -u user

Donde:

  • -d -> es el directorio de las pruebas
  • -s -> es el tamaño del fichero, nos recomiendan que sea como mínimo el   doble de la memoria RAM, de esta manera evitamos poder utilizar mucho la cache del sistema.
  • -n -> numero de ficheros que creara en múltiplos de 1024.
  • -m -> Nombre de la maquina, a modo informativo
  • -f -> Establece el control para las pruebas per-char IO tests
  • -b -> No escribir buffer
  • -u -> UID o usuario que utilizará

El resultado nos dará algo tal que:

Using uid:0, gid:0.
Writing intelligently...done
Rewriting...done
Reading intelligently...done
start 'em...done...done...done...done...done...
Create files in sequential order...done.
Stat files in sequential order...done.
Delete files in sequential order...done.
Create files in random order...done.
Stat files in random order...done.
Delete files in random order...done.
Version  1.96       ------Sequential Output------      --Sequential Input- --Random-
Concurrency   1     -Per Chr- --Block-- -Rewrite-      -Per Chr- --Block-- --Seeks--
Machine        Size K/sec %CP K/sec %CP K/sec %CP      K/sec %CP K/sec %CP  /sec %CP
localname       32G  592276  77 198308  28             438462  25  2212 120
Latency              250ms   68195us                   533ms   14425us

Version  1.96      ------Sequential Create------        --------Random Create--------
localname           -Create-- --Read--- -Delete--        -Create-- --Read--- -Delete--
files                /sec %CP  /sec %CP  /sec %CP         /sec %CP  /sec %CP  /sec %CP
2                    776   6 +++++ +++  1419   7         1009   7 +++++ +++  1315   7
Latency               371ms     361us    1703us            2187us      48us    1456us

Sobre los resultados, tener en cuenta que en la primera linea, cuanto mas grandes sean los números mejor, al contrario que en la segunda linea, contra mas pequeños sea los números mejor

También puede ser interesante utilizar un atop o alguna herramienta de motorización, para comprobar el sistema durante el proceso