Construindo um sistema NAS doméstico barato no Linux

Construindo um sistema NAS doméstico barato no Linux

Eu, como muitos outros usuários do MacBook Pro, enfrentei o problema de memória interna insuficiente. Para ser mais preciso, o rMBP que usei diariamente estava equipado com um SSD com capacidade de apenas 256GB, o que, naturalmente, não foi suficiente por muito tempo.

E quando, além de tudo, comecei a gravar vídeos durante os meus voos, a situação só piorou. O volume de filmagens filmadas após esses voos foi de mais de 50 GB, e meu pobre SSD de 256 GB logo ficou cheio, forçando-me a comprar um drive externo de 1 TB. Porém, depois de um ano, ele não conseguia mais lidar com a quantidade de dados que eu gerava, sem falar que a falta de redundância e o backup o tornavam inadequado para hospedar informações importantes.

Então, a certa altura, decidi construir um NAS grande na esperança de que esse sistema durasse pelo menos alguns anos sem exigir outra atualização.

Escrevi este artigo principalmente como um lembrete de exatamente o que fiz e como fiz, caso precise fazer novamente. Espero que seja útil para você também se decidir fazer o mesmo.

Talvez seja mais fácil comprar?

Então, sabemos o que queremos obter, a questão permanece: como?

Analisei primeiro as soluções comerciais e, em particular, a Synology, que deveria fornecer os melhores sistemas NAS para consumidores do mercado. No entanto, o custo deste serviço revelou-se bastante elevado. O sistema de 4 compartimentos mais barato custa mais de US$ 300 e não inclui discos rígidos. Além disso, o preenchimento interno de tal kit em si não é particularmente impressionante, o que põe em causa o seu real desempenho.

Então pensei: por que não construir eu mesmo um servidor NAS?

Encontrando um servidor adequado

Se você for montar esse servidor, primeiro precisará encontrar o hardware certo. Um servidor usado deve ser bastante adequado para esta construção, já que não precisaremos de muito desempenho para tarefas de armazenamento. Entre as coisas necessárias, devemos destacar uma grande quantidade de RAM, vários conectores SATA e boas placas de rede. Como meu servidor funcionará no local da minha residência permanente, o nível de ruído também é importante.

Comecei minha pesquisa no eBay. Embora eu tenha encontrado muitos Dell PowerEdge R410/R210 usados ​​por menos de US$ 100, tendo experiência trabalhando em uma sala de servidores, eu sabia que essas unidades 1U faziam muito barulho e não eram adequadas para uso doméstico. Como regra, os servidores em torre costumam ser menos barulhentos, mas, infelizmente, havia poucos deles no eBay e todos eram caros ou de baixa potência.

O próximo lugar para procurar foi o Craiglist, onde encontrei alguém vendendo um HP ProLiant N40L usado por apenas US$ 75! Eu estava familiarizado com esses servidores, que geralmente custam cerca de US$ 300 mesmo usados, então enviei um e-mail ao vendedor na esperança de que o anúncio ainda estivesse ativo. Ao saber que assim era, sem pensar duas vezes, fui a San Mateo buscar este servidor, o que à primeira vista me agradou definitivamente. Tinha desgaste mínimo e, exceto por um pouco de poeira, todo o resto estava ótimo.

Construindo um sistema NAS doméstico barato no Linux
Foto do servidor, imediatamente após a compra

Aqui estão as especificações do kit que comprei:

  • CPU: Processador AMD Turion(tm) II Neo N40L de núcleo duplo (64 bits)
  • RAM: 8 GB de RAM não ECC (instalado pelo proprietário anterior)
  • Flash: Unidade USB de 4 GB
  • Conectores SATA: 4 + 1
  • NIC: NIC integrada de 1 Gbps

Escusado será dizer que apesar de já ter vários anos, as especificações deste servidor ainda são superiores à maioria das opções de NAS do mercado, especialmente em termos de RAM. Um pouco mais tarde, até atualizei para ECC de 16 GB com tamanho de buffer aumentado e maior proteção de dados.

Selecionando discos rígidos

Agora temos um excelente sistema de trabalho e só falta selecionar os discos rígidos para ele. Obviamente, por esses US$ 75 eu só comprei o servidor sem o HDD, o que não me surpreendeu.

Depois de fazer uma pequena pesquisa, descobri que os HDDs WD Red são mais adequados para executar sistemas NAS 24 horas por dia, 7 dias por semana. Para adquiri-los, recorri à Amazon, onde adquiri 4 exemplares de 3 TB cada. Basicamente, você pode conectar qualquer HDD de sua preferência, mas certifique-se de que tenham a mesma capacidade e velocidade. Isso o ajudará a evitar possíveis problemas de desempenho do RAID no longo prazo.

Configuração do sistema

Acho que muitos usarão o sistema para suas construções de NAS FreeNAS, e não há nada de errado com isso. Porém, apesar da possibilidade de instalar este sistema no meu servidor, preferi utilizar o CentOS, pois o ZFS no sistema Linux é inicialmente preparado para um ambiente de produção, e em geral estou mais familiarizado com o gerenciamento de um servidor Linux. Além disso, eu não estava interessado na interface sofisticada e nos recursos fornecidos pelo FreeNAS - o array RAIDZ e o compartilhamento AFP foram suficientes para mim.

Instalar o CentOS em USB é bastante simples - basta especificar USB como fonte de inicialização e, ao iniciar, o assistente de instalação irá guiá-lo por todas as etapas.

Compilação RAID

Depois de instalar o CentOS com sucesso, também instalei o ZFS no Linux seguindo os passos listados passos aqui.

Assim que esse processo foi concluído, carreguei o módulo ZFS Kernel:

$ sudo modprobe zfs

E criei o array RAIDZ1 usando o 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

Observe que aqui estou usando os IDs dos discos rígidos em vez de seus nomes de exibição (sdx) para reduzir a chance de falha na montagem após a inicialização devido a uma mudança de letra.

Também adicionei cache ZIL e L2ARC rodando em um SSD separado, dividindo esse SSD em duas partições: 5 GB para ZIL e o restante para L2ARC.

Quanto ao RAIDZ1, ele pode suportar 1 falha de disco. Muitos argumentam que esta opção de pool não deve ser usada devido à probabilidade de o segundo disco falhar durante o processo de reconstrução do RAID, o que pode levar à perda de dados. Ignorei essa recomendação, pois fazia regularmente cópias de backup de dados importantes em um dispositivo remoto, e a falha de todo o array só pode afetar a disponibilidade dos dados, mas não sua segurança. Se você não tiver a capacidade de fazer backups, seria melhor usar soluções como RAIDZ2 ou RAID10.

Você pode verificar se a criação do pool foi bem-sucedida executando:

$ sudo zpool status

и

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

Por padrão, o ZFS monta o pool recém-criado diretamente no /, o que geralmente é indesejável. Você pode alterar isso executando:

zfs set mountpoint=/mnt/data data

A partir daqui você pode optar por criar um ou mais conjuntos de dados para armazenar os dados. Criei dois, um para backup do Time Machine e outro para armazenamento compartilhado de arquivos. Limitei o tamanho do conjunto de dados do Time Machine a uma cota de 512 GB para evitar seu crescimento infinito.

Otimização

zfs set compression=on data

Este comando ativa o suporte à compactação ZFS. A compactação usa energia mínima da CPU, mas pode melhorar significativamente o rendimento de E/S, por isso é sempre recomendada.

zfs set relatime=on data

Com este comando reduzimos o número de atualizações para atimepara reduzir a geração de IOPS ao acessar arquivos.

Por padrão, o ZFS no Linux usa 50% da memória física para ARC. No meu caso, quando o número total de arquivos é pequeno, isso pode ser aumentado com segurança para 90%, já que nenhum outro aplicativo estará em execução no servidor.

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

Então com a ajuda arco_summary.py Você pode verificar se as alterações entraram em vigor:

$ 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
...

Configurando tarefas recorrentes

eu usei systemd-zpool-scrub configurar temporizadores do systemd para realizar a limpeza uma vez por semana e instantâneo zfs-auto para criar instantâneos automaticamente a cada 15 minutos, 1 hora e 1 dia.

Instalando o Netatalk

Netalk é uma implementação de código aberto do AFP (Protocolo de Arquivo Apple). Seguindo instruções oficiais de instalação do CentOS, recebi literalmente um pacote RPM montado e instalado em apenas alguns minutos.

Configuração

$ 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

Note-se que vol dbnest é uma grande melhoria no meu caso, já que por padrão o Netatalk grava o banco de dados CNID na raiz do sistema de arquivos, o que não era nada desejável, já que meu sistema de arquivos principal roda em USB e é, portanto, relativamente lento. Ligando vol dbnest resulta em salvar o banco de dados na raiz do volume, que neste caso pertence ao pool ZFS e já é uma ordem de grandeza mais produtiva.

Habilitando portas no 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
Se tudo estiver configurado corretamente, sua máquina deverá aparecer no Finder e o Time Machine também deverá funcionar.

Configurações adicionais
Monitoramento INTELIGENTE

Recomenda-se monitorar o status dos seus discos para evitar falhas no disco.

$ sudo yum install smartmontools
$ sudo systemctl start smartd

Daemon para UPS

Monitora a carga do UPS APC e desliga o sistema quando a carga fica criticamente baixa.

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

Atualização de hardware

Uma semana depois de configurar o sistema, comecei a ficar cada vez mais preocupado com a memória não-ECC do servidor. Além disso, no caso do ZFS, memória adicional para buffer será muito útil. Então voltei para a Amazon, onde comprei 2 RAM Kingston DDR3 8GB ECC por US $ 80 cada e substituí a RAM do desktop instalada pelo proprietário anterior. O sistema inicializou pela primeira vez sem problemas e certifiquei-me de que o suporte ECC estava ativado:

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

resultado

Fiquei muito satisfeito com o resultado. Agora posso manter constantemente a conexão LAN de 1 Gbps do servidor ocupada copiando arquivos, e o Time Machine funciona perfeitamente. Então, no geral, estou feliz com a configuração.

O custo total:

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

No total = $ 689

Agora posso dizer que o preço valeu a pena.

Você faz seus próprios servidores NAS?

Construindo um sistema NAS doméstico barato no Linux

Construindo um sistema NAS doméstico barato no Linux

Fonte: habr.com

Adicionar um comentário