Construyendo un sistema NAS doméstico económico en Linux

Construyendo un sistema NAS doméstico económico en Linux

Yo, como muchos otros usuarios de MacBook Pro, me enfrenté al problema de la memoria interna insuficiente. Para ser más precisos, el rMBP que usaba a diario estaba equipado con un SSD con una capacidad de sólo 256 GB, lo que, naturalmente, no fue suficiente durante mucho tiempo.

Y cuando, además de todo, comencé a grabar vídeos durante mis vuelos, la situación no hizo más que empeorar. El volumen de metraje filmado después de esos vuelos fue de más de 50 GB, y mi pobre SSD de 256 GB se llenó muy pronto, lo que me obligó a comprar una unidad externa de 1 TB. Sin embargo, después de un año, ya no podía manejar la cantidad de datos que estaba generando, sin mencionar que la falta de redundancia y respaldo lo hacía inadecuado para alojar información importante.

Entonces, en un momento decidí construir un NAS grande con la esperanza de que este sistema durara al menos un par de años sin requerir otra actualización.

Escribí este artículo principalmente como un recordatorio de exactamente lo que hice y cómo lo hice en caso de que necesite hacerlo nuevamente. Espero que también te sea útil si decides hacer lo mismo.

¿Quizás sea más fácil comprar?

Entonces, sabemos lo que queremos conseguir, la pregunta sigue siendo: ¿cómo?

Primero miré soluciones comerciales y, en particular, miré Synology, que se suponía que proporcionaría los mejores sistemas NAS para consumidores del mercado. Sin embargo, el coste de este servicio resultó bastante elevado. El sistema de 4 bahías más barato cuesta más de $300 y no incluye discos duros. Además, el relleno interno de un kit de este tipo no es particularmente impresionante, lo que pone en duda su rendimiento real.

Entonces pensé: ¿por qué no construir yo mismo un servidor NAS?

Encontrar un servidor adecuado

Si va a montar un servidor de este tipo, primero debe encontrar el hardware adecuado. Un servidor usado debería ser bastante adecuado para esta construcción, ya que no necesitaremos mucho rendimiento para las tareas de almacenamiento. Entre las cosas necesarias, cabe destacar una gran cantidad de RAM, varios conectores SATA y buenas tarjetas de red. Dado que mi servidor funcionará en mi lugar de residencia permanente, el nivel de ruido también importa.

Comencé mi búsqueda en eBay. Aunque encontré muchos Dell PowerEdge R410/R210 usados ​​allí por menos de $100, teniendo experiencia trabajando en una sala de servidores, sabía que estas unidades 1U hacían demasiado ruido y no eran adecuadas para uso doméstico. Como regla general, los servidores de torre suelen ser menos ruidosos, pero, desafortunadamente, había pocos en eBay y todos eran caros o tenían poca potencia.

El siguiente lugar para buscar fue Craiglist, donde encontré a alguien vendiendo un HP ProLiant N40L usado por sólo $75. Estaba familiarizado con estos servidores, que incluso los usados ​​tienden a costar alrededor de $300, así que envié un correo electrónico al vendedor con la esperanza de que el anuncio todavía estuviera activo. Al enterarme de que así era, sin pensarlo dos veces me dirigí a San Mateo para recoger este servidor, que a primera vista definitivamente me agradó. Tenía un desgaste mínimo y salvo un poco de polvo, todo lo demás estaba genial.

Construyendo un sistema NAS doméstico económico en Linux
Foto del servidor, inmediatamente después de la compra.

Aquí están las especificaciones del kit que compré:

  • CPU: Procesador AMD Turion(tm) II Neo N40L de doble núcleo (64 bits)
  • RAM: 8 GB de RAM sin ECC (instalada por el propietario anterior)
  • Flash: Unidad USB de 4 GB
  • Conectores SATA: 4 + 1
  • NIC: NIC integrada de 1 Gbps

No hace falta decir que, a pesar de tener varios años, las especificaciones de este servidor siguen siendo superiores a la mayoría de opciones NAS del mercado, especialmente en términos de RAM. Un poco más tarde, incluso actualicé a 16 GB ECC con un mayor tamaño de búfer y mayor protección de datos.

Seleccionar discos duros

Ahora tenemos un excelente sistema de trabajo y solo queda seleccionar discos duros para él. Obviamente, por esos $75 solo compré el servidor sin el disco duro, lo cual no me sorprendió.

Después de investigar un poco, descubrí que los discos duros WD Red son los más adecuados para ejecutar sistemas NAS las 24 horas del día, los 7 días de la semana. Para adquirirlos recurrí a Amazon, donde compré 4 copias de 3 TB cada una. Básicamente, puedes conectar cualquier HDD que prefieras, pero asegúrate de que sean de la misma capacidad y velocidad. Esto le ayudará a evitar posibles problemas de rendimiento de RAID a largo plazo.

Configuración del sistema

Creo que muchos usarán el sistema para sus versiones NAS. FreeNAS, y eso no tiene nada de malo. Sin embargo, a pesar de la posibilidad de instalar este sistema en mi servidor, preferí usar CentOS, ya que el sistema ZFS en Linux está inicialmente preparado para un entorno de producción y, en general, estoy más familiarizado con la gestión de un servidor Linux. Además, no estaba interesado en la elegante interfaz y las funciones proporcionadas por FreeNAS: la matriz RAIDZ y el uso compartido de AFP fueron suficientes para mí.

Instalar CentOS en USB es bastante simple: simplemente especifique USB como fuente de arranque y, al iniciarlo, el asistente de instalación lo guiará a través de todas sus etapas.

Construcción RAID

Después de instalar CentOS con éxito, también instalé ZFS en Linux siguiendo los pasos enumerados pasos aquí.

Una vez que se completó este proceso, cargué el módulo ZFS Kernel:

$ sudo modprobe zfs

Y creó la matriz RAIDZ1 usando el comando zpool:

$ sudo zpool create data raidz1 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609145 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609146 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609147 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609148
$ sudo zpool add data log ata-SanDisk_Ultra_II_240GB_174204A06001-part5
$ sudo zpool add data cache ata-SanDisk_Ultra_II_240GB_174204A06001-part6

Tenga en cuenta que aquí estoy usando los ID de los discos duros en lugar de sus nombres para mostrar (sdx) para reducir la posibilidad de que no se puedan montar después del arranque debido a un cambio de letra.

También agregué caché ZIL y L2ARC ejecutándose en un SSD separado, dividiendo ese SSD en dos particiones: 5 GB para ZIL y el resto para L2ARC.

En cuanto a RAIDZ1, puede soportar 1 fallo de disco. Muchos argumentan que esta opción de grupo no debe usarse debido a la probabilidad de que el segundo disco falle durante el proceso de reconstrucción del RAID, lo que puede provocar la pérdida de datos. Ignoré esta recomendación, ya que regularmente hacía copias de seguridad de datos importantes en un dispositivo remoto, y la falla incluso de toda la matriz solo puede afectar la disponibilidad de los datos, pero no su seguridad. Si no tiene la capacidad de realizar copias de seguridad, sería mejor utilizar soluciones como RAIDZ2 o RAID10.

Puede verificar que la creación del grupo se realizó correctamente ejecutando:

$ sudo zpool status

и

$ sudo zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
data                               510G  7.16T   140K  /mnt/data

De forma predeterminada, ZFS monta el grupo recién creado directamente en /, lo cual generalmente es indeseable. Puedes cambiar esto ejecutando:

zfs set mountpoint=/mnt/data data

Desde aquí puede optar por crear uno o más conjuntos de datos para almacenar los datos. Creé dos, uno para la copia de seguridad de Time Machine y otro para el almacenamiento compartido de archivos. Limité el tamaño del conjunto de datos de Time Machine a una cuota de 512 GB para evitar su crecimiento interminable.

Optimización

zfs set compression=on data

Este comando habilita la compatibilidad con la compresión ZFS. La compresión utiliza una potencia mínima de la CPU, pero puede mejorar significativamente el rendimiento de E/S, por lo que siempre se recomienda.

zfs set relatime=on data

Con este comando reducimos el número de actualizaciones a atimepara reducir la generación de IOPS al acceder a archivos.

De forma predeterminada, ZFS en Linux utiliza el 50% de la memoria física para ARC. En mi caso, cuando la cantidad total de archivos es pequeña, se puede aumentar de manera segura al 90%, ya que no se ejecutarán otras aplicaciones en el servidor.

$ cat /etc/modprobe.d/zfs.conf 
options zfs zfs_arc_max=14378074112

Luego usando arc_summary.py Puedes verificar que los cambios han surtido efecto:

$ python arc_summary.py
...
ARC Size:				100.05%	11.55	GiB
	Target Size: (Adaptive)		100.00%	11.54	GiB
	Min Size (Hard Limit):		0.27%	32.00	MiB
	Max Size (High Water):		369:1	11.54	GiB
...

Configurar tareas recurrentes

solía systemd-zpool-exfoliante configurar los temporizadores systemd para realizar la limpieza una vez por semana y instantánea-automática-zfs para crear automáticamente instantáneas cada 15 minutos, 1 hora y 1 día.

Instalación de Netatalk

netatalk es una implementación de código abierto de AFP (Protocolo de archivo de Apple). Siguiente instrucciones de instalación oficiales para CentOS, literalmente recibí un paquete RPM ensamblado e instalado en solo un par de minutos.

Configuración de configuración

$ cat /etc/netatalk/afp.conf
[datong@Titan ~]$ cat /etc/netatalk/afp.conf 
;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
mimic model = TimeCapsule6,106

; [Homes]
; basedir regex = /home

; [My AFP Volume]
; path = /path/to/volume

; [My Time Machine Volume]
; path = /path/to/backup
; time machine = yes

[Datong's Files]
path = /mnt/data/datong
valid users = datong

[Datong's Time Machine Backups]
path = /mnt/data/datong_time_machine_backups
time machine = yes
valid users = datong

Tenga en cuenta que vol dbnest es una mejora importante en mi caso, ya que de forma predeterminada Netatalk escribe la base de datos CNID en la raíz del sistema de archivos, lo cual no era nada deseable ya que mi sistema de archivos principal se ejecuta en USB y, por lo tanto, es relativamente lento. Encendiendo vol dbnest da como resultado guardar la base de datos en la raíz del volumen, que en este caso pertenece al grupo ZFS y ya es un orden de magnitud más productivo.

Habilitación de puertos en Firewall

$ sudo firewall-cmd --permanent --zone=public --add-service=mdns
$ sudo firewall-cmd --permanent --zone=public --add-port=afpovertcp/tcp

sudo firewall-cmd --permanent --zone=public --add-port=afpovertcp/tcp
Si todo se configuró correctamente, su máquina debería aparecer en el Finder y Time Machine también debería funcionar.

Ajustes adicionales
Monitoreo INTELIGENTE

Se recomienda monitorear el estado de sus discos para evitar fallas en los mismos.

$ sudo yum install smartmontools
$ sudo systemctl start smartd

Demonio para UPS

Supervisa la carga del UPS de APC y apaga el sistema cuando la carga llega a un nivel críticamente bajo.

$ sudo yum install epel-release
$ sudo yum install apcupsd
$ sudo systemctl enable apcupsd

Actualización de hardware

Una semana después de configurar el sistema, comencé a preocuparme cada vez más por la memoria no ECC del servidor. Además, en el caso de ZFS, la memoria adicional para el almacenamiento en búfer será de gran utilidad. Así que volví a Amazon, donde compré 2x Kingston DDR3 8GB ECC RAM por $80 cada uno y reemplacé la RAM de escritorio instalada por el propietario anterior. El sistema arrancó la primera vez sin ningún problema y me aseguré de que el soporte ECC estuviera activado:

$ dmesg | grep ECC
[   10.492367] EDAC amd64: DRAM ECC enabled.

resultado

Quedé muy satisfecho con el resultado. Ahora puedo mantener ocupada constantemente la conexión LAN de 1 Gbps del servidor copiando archivos, y Time Machine funciona perfectamente. Entonces, en general, estoy contento con la configuración.

El costo total:

  1. 1 * HP ProLiant N40L = $75
  2. 2 * 8 GB de RAM ECC = $174
  3. 4 * Disco duro WD Red de 3 TB = $440

En total = $ 689

Ahora puedo decir que el precio valió la pena.

¿Haces tus propios servidores NAS?

Construyendo un sistema NAS doméstico económico en Linux

Construyendo un sistema NAS doméstico económico en Linux

Fuente: habr.com

Añadir un comentario