Aprovecha tus discos duros viejos con FreeNAS y ZFS para montar una NAS casera

Contenido

Introducción


¡Saludos! Llevo unos días haciendo experimentos con gaseosa con FreeNAS y ZFS y tras leerme muchos wikis, documentacion, manuales y foros, he llegado a la conclusión de que la gente no aprovecha el potencial de ZFS en lo que reaprovechar discos viejos que podamos tener por casa de distintos tamaños se refiere.

Es muy facil crear sistemas raid con discos todos igualitos, pero ese caso no siempre se da (y menos en casa), por lo que voy a explicar las opciones que tenemos para aprovechar esos discos que podamos tener en fundas USB o pc's viejos para montarnos una NAS casera y con redundancia aprovechando nuestros discos duros viejos.

Todas las pruebas que he hecho las he hecho en una máquina virtual, pero sería exactamente igual realizadas en un pc físico, por lo que voy a referirme en este tutorial como si lo hubiese hecho en la vida real para que los que leais esto podais hacerlo paso a paso, comenzamos :)

ADVERTENCIA: Aunque el tutorial se basa en FreeNAS, no se va a utilizar las opciones del panel web para crear el raidz2 debido a que FreeNAS no permite gestionar raids con discos de distinto tamaño a través de su panel web, por lo que todo lo trabajaremos con comandos (en FreeBSD funcionará exactamente igual).

El tutorial no obstante sí hara uso del panel web de FreeNAS para crear un recurso compartido, en FreeBSD habrá que crearlo a mano, hay muchos tutoriales de como compartir carpetas con CIFS en FreeBSD, buscad en google :)

Opcional: Si ya teneis FreeBSD o FreeNAS montado y sólo queréis saber como trabajar con los discos, podéis pasar al paso 5 directamente.

Prerequisitos:

  • Un pincho USB (lo usaremos como disco duro para instalar freenas, por lo que tendreis que "sacrificarlo" para que el sistema funcione)
  • La ISO de FreeNAS (http://www.freenas.org/download-freenas-release.html). En el momento de hacer este tutorial se usa la 9.3 STABLE, pero debería valer con cualquier versión posterior, preferiblemente estable. Dado que el raid lo vamos a crear por comandos, la iso de FreeBSD debería valer también, aunque perderemos los extras que nos da el panel web de FreeNAS.
  • Otro pincho USB donde meter la ISO de FreeNAS o un cd virgen y una grabadora para grabarlo.
  • Un PC cualquiera que podamos reciclar que tenga puertos SATA donde pinchar discos duros
  • Discos duros... ¡¡¡Por supuesto!!! en mi caso voy a usar 3 discos de 80Gb, 1 de 160Gb y otro de 320Gb (5 en total).


Manos a la obra:

1) Preparar el hardware

Lo primero de todo es tener claro como vamos a pinchar nuestros discos y donde. En mi ejemplo voy a usar un pc viejo que tiene 6 puertos SATA y voy a pinchar los 5 discos en él. Tiene que tener al menos 2 puertos usb, o en su defecto, 1 puerto USB y 1 lector de CD/DVD.

2) Descargar y grabar FreeNAS

Descargamos FreeNAS (http://www.freenas.org/download-freenas-release.html), preferiblemente la version STABLE (en mi caso he usado la 9.3) y la grabamos en CD/DVD o bien usamos Rufus para grabarla en un pendrive cualquiera. Ojo si usamos rufus de seleccionar el pendrive correcto y haced un backup de los datos antes de realizar esta operación porque se borran todos los datos del pendrive.

Es muy sencillo, simplemente seleccionamos el pendrive (ojo no equivocarse), seleccionamos la ISO y le damos a Empezar. Grabacion de una iso en pendrive con rufus.png

En cuanto termine ya tendremos nuestro pendrive preparado para arrancar FreeNAS en nuestro PC.

3) Instalar FreeNAS

No es dificil, simplemente pinchamos el pincho USB en el que acabamos de grabar FreeNAS en nuestro PC viejo junto con el segundo pendrive que sera donde realmente instalaremos FreeNAS (en mi caso el segundo pendrive es de 8 gigas), entramos en la BIOS y seleccionamos que arranque desde USB en caso de que usemos el pendrive o DVD en caso de que lo hayamos grabado en CD/DVD (algunas BIOS permiten seleccionar el dispositivo de arranque pulsando una tecla en concreto en el arranque, depende de cada PC) para iniciar el programa de instalación.


Pasos para instalar:

  • Una vez iniciado el arranque de la instalación, pulsamos enter para que cargue, y llegaremos al menu de opciones.

Seleccionamos 1) Install/Upgrade

  • Seleccionamos donde queremos instalarlo, como se ha indicado anteriormente, para no desaprovechar los discos duros lo instalaremos en el segundo pendrive (de 8 gigas en este caso) por lo que hay que buscar de todos los discos cual es el pendrive y seleccionarlo con la tecla espacio para que quede algo así:

Instalacion de freenas en pincho usb.png

  • Pulsamos enter y nos avisará de que se van a borrar todos los datos del pendrive, le damos a Yes.
  • Nos pedirá la password del usuario root, ponedle la que queráis, una que no se os olvide. Para este tutorial voy a usar "eol" (sin comillas)
  • Cuando termine de instalar (dependiendo de como sea el pc puede ser en torno a los 5-10 minutos) pedirá que saquemos el CDROM (que puede ser tanto el DVD de FreeNAS como el USB de instalación de FreeNAS, dependiendo de la opción escogida) y reiniciar, por tanto pulsamos OK y luego 3) Reboot System y ya podemos sacar el DVD/USB y dejarlo reiniciarse.

4) Configuración inicial de FreeNAS

Una vez que haga el primer arranque y nos aparezca el menú principal hay que configurarle la red para poder tener acceso desde nuestros pc's normales. Para ello pulsamos la opcion 1) Configure Network Interfaces Seleccionamos la interfaz de red que queramos (en este caso como es un pc corriente y solo tiene 1 tarjeta de red física, solo hay una opción disponible) y seleccionamos 1 y contestamos a las siguientes preguntas:

Reset network configuration? n
Configure interface for DHCP? n
Configure IPv4? y
Interface name: LAN
IPv4 Address: 192.168.1.10/24 
Configure IPv6? n

NOTA: La IPv4 depende de que ip le querais dar al servidor, eso hay que adecuarlo a la red privada de cada uno, en mi caso como lo instalo en la red de mi empresa voy a poner 128.64.80.101/16.

Si todo ha ido bien, volveremos al menú principal y ya podremos empezar a gestionar la máquina desde fuera.

Para comprobar que podemos acceeder al panel web, hay que acceder a FreeNAS poniendo la IP desde un navegador en otro pc de la misma red, en mi caso http://128.64.80.101/

Nos pedirá usuario y contraseña (root / eol) y estaremos dentro.

Como la idea es que la gestión la podamos hacer en remoto, lo primero que haremos será habilitar el servicio SSH, por lo que pincharemos en la pestaña "Services", luego bajaremos hasta SSH, pinchamos en la llave para abrir las opciones, marcamos la casilla de poder loguear con root, aceptamos e iniciamos el servicio SSH cambiandolo de OFF a ON.

Habilitar SSH FreeNAS.PNG

En cuanto el servicio SSH esté habilitado, ya podremos entrar desde otros equipos de nuestra red de casa sin tener que acudir fisicamente a este PC.

En mi caso lo voy a hacer desde mi máquina windows por lo que necesitare el PuTTY (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html). Descargad putty.exe, los otros no los necesitais.

Abrimos Putty, escribimos la IP de nuestro FreeNAS (en mi caso 128.64.80.101) y le damos a Open, si todo ha ido bien pedira usuario y password (root / eol) y estaremos dentro para ejecutar nuestros comandos.

5) Trabajo con los discos

Y por fin empezamos con el tema interesante, es muy posible que los que esteis leyendo esto y ya sepais como hacer una instalación de FreeNAS solo querais leer a partir de aquí, pues os comento como montarlo todo.

Lo primero de todo es saber que discos tenemos para trabajar, así que usaremos el panel web por última vez para comprobarlo dado que es más sencillo, para ello pulsamos en "Storage" y luego "View Disks" y en mi caso me lista lo siguiente:

Freenas view disk list.PNG

Ahí puedo comprobar cuales son mis 3 discos de 80 gb ("da1", "da2" y "da3"), mi disco de 160 ("da4") y mi disco de 320 ("da5"). Apuntaros quien es quien para no haceros lio, porque usaremos "daX" para trabajar con ellos.

¿Qué vamos a hacer con ellos? ¿Cómo los mezclamos en un raid? ¿De qué tipo? ¿que variantes hay? Dependiendo de lo que se busque existen varias respuestas.

Existen varios escenarios posibles con esta configuración de discos, así que primero voy a explicar lo que quiero hacer con ellos y después explicare otros posibles escenarios en los que se podrían usar discos de estos tamaños para que se entienda que otras posibilidades existen.

En mi escenario de discos (3x80GB, 1x160GB y 1x320GB) quiero crear un sistema de raid con redundancia, que me permita que falle el disco físico que falle, no pierda mis datos y además intentando aprovechar el máximo espacio físico posible (dejo a otro lado temas como el rendimiento y demás, se trata de reciclar discos que tengamos por casa para almacenar datos de casa, no un sistema empresarial u óptimo).

Premisas antes de calcular el raid

Para ello hay que calcular exactamente como repartimos los discos y los combinamos en raid para conseguir este objetivo partiendo de estas premisas que hay que comprender perfectamente antes de ponernos a trabajar:

  • Como trabajamos con discos de distintos tamaños y los sistemas RAID exigen que sean iguales, particionaremos los discos en cachitos del mismo tamaño en todos los discos para usar esos volúmenes como si fuesen discos completos para integrarlos en el RAID.
  • Con Raidz (lo que sería raid 5 si hablásemos de hardware) solo se puede perder un disco sin perder la información, lo que implica que si se me estropea un disco pequeño de 80 gb, al ser el tamaño de volumen de 80 gb, no pierdo mis datos, pero si se estropea uno de 160 (2x80) o el de 320 (4x80) pierdo 2 y 4 volúmenes respectivamente, por lo que raidz no me salvaría en caso de que se estropease alguno de los discos grandes
  • Con Raidz2 (equivalente a raid 6) se pueden perder 2 discos sin perder información, podrían estropearse cualquiera de mis 3 discos de 80 o el de 160 gb (2x80 es decir 2 "discos"), pero si se estropea el de 320 pierdo toda mi información
  • Con Raidz3 (no existe equivalente raid standard) se pueden perder 3 discos, por lo que puedo perder 3 de 80, o 1 de 80 + 1 de 160, pero sigo sin poder perder el de 320 (4 "discos")

Opciones y toma de decisión

En nuestro caso práctico comprobamos que elijamos el tipo de raidzX que elijamos, si se estropea nuestro disco de 320gb perdemos todos nuestros datos, pero hay formas de evitarlo:


  • Dejar sin usar el espacio sobrante, de tal manera que el disco de 320gb no se aproveche entero y se desperdicie espacio. Por ejemplo si configuramos el disco como parte de un raidz2 (que permite fallo de hasta 2 discos) en vez de dividirlo en 4 cachitos de 80gb, lo dividiriamos en 2 de 80 y dejariamos 160 gigas libres sin usar, de tal manera que si falla el disco de 320gb solo perdemos 2 "discos", pero desperdiciamos espacio real.
  • Usar el espacio sobrante como una particion suelta fuera del raid, mismo caso que el anterior, pero ya que tenemos 160gb que no podemos meter en el raid por problemas de redundancia, no significa que no podamos usarlo como una particion sencilla para almacenar otro tipo de datos que no nos importe perder (como por ejemplo películas).
  • Usar el espacio sobrante de 160gb como 2 volúmenes de hot spare. Esto significa que si se rompen hasta 2 discos fisicos de 80 gb o se rompe el disco fisico de 160 gb (2x80) los dos volumenes de 80 gb "sobrantes" del disco de 320 gb entran en acción y sustituyen automáticamente hasta 2 discos perdidos. <- esta es la opción que vamos a usar
  • Hacer 2 mirrors (espejos) entre las particiones de 80 gb del disco de 320 gb e integrar los mirrors como volumenes del raidz2. Permite que si existe algun problema con alguno de las 2 particiones de datos del disco de 320gb, no se pierdan los datos, pero solo afectaría al disco de 320gb y no aumenta la seguridad de nuestro raidz2 al completo.
  • Se podría usar tambien raidz3, pero en nuestro caso añadimos mayor carga de escritura a nuestros disco al tener que escribir más datos para poder perder hasta 3 discos y sin embargo no ganamos seguridad ni redundancia puesto que ganamos el perder un disco adicional pero perdemos 1 disco de hot spare (por lo que nos quedamos igual en ese sentido) y sin embargo exige más operaciones de escritura y cálculos que afectaran al rendimiento.


¿Entonces cómo quedaría al final?

Una imagen vale más que mil palabras:

Diseño raidz2 discos distintos.png

Siendo cada cuadrito una partición de 80 gb de cada disco.


Decidido, basta de teoría, a currar

Ya sabemos como se llaman los discos con los que queremos trabajar (daX), cual es cual, que tipo de raid queremos hacer y como lo configuraremos, así que volvemos al putty y empezamos con los comandos.

  • Si los discos ya tienen particiones, primero habría que eliminarlas (ojo con equivocarse, no borreis lo que no debeis), lo mas rápido es eliminar la tabla de particiones:
gpart destroy -f da1
gpart destroy -f da2
gpart destroy -f da3
gpart destroy -f da4
gpart destroy -f da5
  • Una vez limpios, les crearemos una tabla de particiones en GPT:
gpart create -s gpt da1
gpart create -s gpt da2
gpart create -s gpt da3
gpart create -s gpt da4
gpart create -s gpt da5
  • Después hay que crear las particiones como tal:
gpart add -s 80G -t freebsd-zfs da1
gpart add -s 80G -t freebsd-zfs da2
gpart add -s 80G -t freebsd-zfs da3

gpart add -s 80G -t freebsd-zfs da4
gpart add -s 80G -t freebsd-zfs da4

gpart add -s 80G -t freebsd-zfs da5
gpart add -s 80G -t freebsd-zfs da5
gpart add -s 80G -t freebsd-zfs da5
gpart add -s 80G -t freebsd-zfs da5

Es decir, 1 particion de 80G para da1, otra para da2 y otra para da3 (los 3 de 80 GB), 2 para da4 (160 GB) y 4 para da5 (320 GB)

NOTA: Si os da el error "gpart: autofill: No space left on device" es porque no son exactamente 80 gigas de tamaño lo que proporciona el disco y habrá que atinar con lo más parecido que podamos. Con 79G funcionará sin problemas pero como quiero rascar todo el espacio que pueda, lo especifico en megas. en mi caso el comando que ejecutaría sería: gpart add -s 81919M -t freebsd-zfs daX

RESULTADO: Si escribimos el comando "gpart show" (sin comillas) veremos como hemos aprovechado todo el espacio que hemos podido de cada disco, esto es lo que resulta:

=>       34  167772093  da1  GPT  (80G)
         34  167770112    1  freebsd-zfs  (80G)
  167770146       1981       - free -  (990k)

=>       34  167772093  da2  GPT  (80G)
         34  167770112    1  freebsd-zfs  (80G)
  167770146       1981       - free -  (990k)

=>       34  167772093  da3  GPT  (80G)
         34  167770112    1  freebsd-zfs  (80G)
  167770146       1981       - free -  (990k)

=>       34  335544253  da4  GPT  (160G)
         34  167770112    1  freebsd-zfs  (80G)
  167770146  167770112    2  freebsd-zfs  (80G)
  335540258       4029       - free -  (2M)

=>       34  671088573  da5  GPT  (320G)
         34  167770112    1  freebsd-zfs  (80G)
  167770146  167770112    2  freebsd-zfs  (80G)
  335540258  167770112    3  freebsd-zfs  (80G)
  503310370  167770112    4  freebsd-zfs  (80G)
  671080482       8125       - free -  (4M)

Si os fijais, las particiones van numeradas debajo de cada daX, por ejemplo, en da5 tenemos las particiones 1,2,3 y 4. La nomenclatura para cada una entonces sería la siguiente: da5p1, da5p2, da5p3 y da5p4.


  • Ahora que ya tenemos nuestras particiones, es hora de crear un pool (agrupacion de discos) al que llamaremos "midisco" y quienes son sus miembros:
zpool create midisco raidz2 da1p1 da2p1 da3p1 da4p1 da4p2 da5p1 da5p2

Y podemos ver como ha quedado si hacemos el siguiente comando:

[root@freenas] ~# zpool status
  pool: midisco
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        midisco     ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            da1p1   ONLINE       0     0     0
            da2p1   ONLINE       0     0     0
            da3p1   ONLINE       0     0     0
            da4p1   ONLINE       0     0     0
            da4p2   ONLINE       0     0     0
            da5p1   ONLINE       0     0     0
            da5p2   ONLINE       0     0     0

errors: No known data errors

Ahora solo nos faltan los hot spares, nuestros discos comodin (que ya hemos quedado que eran da5p3 y da5p4, las dos ultimas particiones de 80gb del disco de 320gb), y se hace de esta manera:

zpool add -f midisco spare da5p3 da5p4

NOTA: Es necesario añadir el switch -f para forzarlo, porque reconoce que el disco fisico ya forma parte de un pool, como estamos trabajando con volumenes creados a mano se queja, pero forzándolo funciona sin problemas. Si estuviesemos trabajando con discos físicos iguales y un disco formase parte de un pool anterior, habria que destruir el pool primero del disco para poder meterlo en otro pool.

Y volvemos a comprobar como queda nuestro pool "midisco":

[root@freenas] ~# zpool status
  pool: midisco
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        midisco     ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            da1p1   ONLINE       0     0     0
            da2p1   ONLINE       0     0     0
            da3p1   ONLINE       0     0     0
            da4p1   ONLINE       0     0     0
            da4p2   ONLINE       0     0     0
            da5p1   ONLINE       0     0     0
            da5p2   ONLINE       0     0     0
        spares
          da5p3     AVAIL
          da5p4     AVAIL

errors: No known data errors

Aquí ya podemos ver como tenemos nuestros discos funcionando y 2 hot spares por si alguno falla, de esta manera falle el disco físico que falle no perderemos nuestros datos :)

Podemos entonces comprobar como queda nuestro nuevo almacenamiento:

[root@freenas] ~# df -h
Filesystem                   Size    Used   Avail Capacity  Mounted on
freenas-boot/ROOT/default     19G    931M     18G     5%    /
devfs                        1.0k    1.0k      0B   100%    /dev
tmpfs                         32M    5.3M     26M    17%    /etc
tmpfs                        4.0M    8.0k      4M     0%    /mnt
tmpfs                        332M     32M    300M    10%    /var
freenas-boot/grub             18G    7.8M     18G     0%    /boot/grub
midisco                      383G     34k    383G     0%    /midisco

Vemos el ultimo "midisco" que tiene 383 gigas disponibles y esta alojado en la ruta /midisco.


Esto significa que de 9 volumenes de 80 gb que hemos creado, quitamos 2 que son los de "repuesto" (hot spares) y de los 7 volumenes de 80 gb (lo que serían 560 gb) nos queda un espacio neto usable de 383 gb, lo que significa que hemos perdido un 30% aproximadamente de espacio para poder ganar la redundancia que queríamos, pero todo tiene un precio :) NOTA: Cuantos más discos añadimos, menos % de espacio usable se pierde.

6) Gestión mediante interfaz web y últimos servicios

No hay nada más cómodo que la interfaz web de FreeNAS para gestionar nuestros raids, asi que hay que importar nuestro raid para que freenas pueda gestionarlo. Esto es necesario dado que al haberlo creado a mano por comandos (porque como he explicado antes, la interfaz web de freenas no nos permite hacer lo que hemos hecho hasta ahora) no lo detecta automáticamente en el panel de gestión web.

Es sencillo:

  • Primero hay que marcar nuestro pool "midisco" como exportable para que se pueda importar en el panel con el siguiente comando:
[root@freenas] ~# zpool export midisco
  • Después nos vamos a la interfaz web (recuerdo que es http://128.64.80.101/ en mi caso, aplicad al vuestro) y pulsamos en la pestaña "Storage", "Import Volume" y debería detectar nuestro ZFS pool, continuamos el proceso (le cuesta un par de minutillos segun el equipo, tened paciencia) y debería aparecernos nuestro volumen ya en la interfaz así:

Raidz2 importado en freenas.PNG NOTA: Aparecen 556 GB disponibles porque el pool "midisco" consta de 9 volumenes de 80 gb, pero recordad que 2 de ellos (160 gb) son spare, asi que no cuentan como espacio disponible para usarse, de ahí que el espacio real sea de 382,9 GB (556 - 160 = 396 GB, y de ahí hay que descontar lo que ocupan los datos de paridad de raidz2)


Y ya podemos hacer un uso del panel web como si lo hubiesemos creado via web. Lo que queramos hacer aquí ya es cosa de cada uno, pero lo más lógico sería compartir nuestros discos por CIFS (carpeta compartida de windows) para que podamos acceder desde nuestros equipos a poner y quitar ficheros, así es como se hace:

Nos vamos a la pestaña "Sharing" -> "Windows (CIFS)" -> "Add Windows (CIFS) share" -> y seleccionamos las siguientes opciones: Freenas add windows share.PNG Nos preguntará si queremos habilitar el servicio CIFS, le decimos que sí y esperamos unos segundos a que se active.

Sólo nos falta dar permisos a todo el mundo para que podamos leer y escribir en midisco, y se hace de la siguiente manera:

Nos vamos a la pestaña "Storage" -> pinchamos en "midisco" (el segundo, el de menos capacidad) -> pinchamos en "change permissions"

Freenas zpool change permissions 1.PNG

Y marcamos todos los permisos para todos los usuarios de esta manera: Freenas zpool change permissions 2.PNG

Y ya podemos probar si todo funciona. Desde nuestro equipo windows le damos a inicio y escribimos: \\128.64.80.101 NOTA: Cada uno que use la ip de su casa :)

y debería aparecer midisco, ¡Listo para usarse!

Y eso es todo, espero que os haya gustado y si tenéis comentarios escribidme un mensaje privado y lo comentamos :)


Consejo: Para comodidad, conectad la carpeta compartida midisco como si fuese una unidad de red para verla como un disco duro más de esta manera (usad la letra que mas os guste):

Conectar unidad de red.PNG


¡Un saludete!