1 pontos por GN⁺ 4 시간 전 | 1 comentários | Compartilhar no WhatsApp
  • Para um NAS básico que não precisa de GUI, basta criar datasets ZFS e compartilhá-los via Samba para montar um armazenamento de rede simples
  • O ambiente de exemplo usa Debian 12 Bookworm, OpenZFS zfs-2.1.1, RAIDZ1, 16 GB de RAM ECC RDIMM e 4 SSDs NVMe de 4 TB; criptografia e estratégia de backup ficam fora do escopo
  • Como o ZFS armazena a configuração de pools e sistemas de arquivos nos discos, mesmo que o sistema operacional seja corrompido, é possível recuperar os dados em outra máquina com zfs import
  • É mais seguro identificar os discos por /dev/disk/by-id ou por aliases em /etc/zfs/vdev_id.conf do que por nomes dependentes da ordem, como /dev/nvme1
  • O compartilhamento de rede em si fica a cargo do Samba, com compartilhamentos separados para documentos comuns e Time Machine do macOS nos datasets docs e backups

Escopo de um NAS mínimo feito por conta própria

  • O objetivo é montar por conta própria um NAS básico, sem produtos NAS completos como Synology, QNAP ou TrueNAS
  • A configuração de exemplo fica limitada ao seguinte escopo
    • Nível de RAID: RAIDZ1, tolera falha de 1 unidade
    • Sistema operacional: Debian 12 Bookworm
    • Criptografia: nenhuma
    • Implementação de ZFS: OpenZFS, zfs-2.1.1
    • CPU: 4 núcleos, pode usar uma CPU de servidor Xeon barata
    • RAM: 16 GB de RAM ECC RDIMM
    • Armazenamento: 4 SSDs NVMe de 4 TB
    • Backup: não abordado; exige uma configuração separada
  • O TrueNAS se aproxima de uma suíte de software completa de nível empresarial; quanto mais simples forem as funções necessárias, maior fica o descompasso entre os recursos oferecidos e os requisitos
  • Ao configurar tudo diretamente, você entende cada elemento do sistema e não precisa depender de mais uma suíte de software

Informações de configuração que o ZFS guarda nos discos

  • O sistema de arquivos ZFS é autocontido, então, se o sistema operacional hospedeiro for danificado mas os discos estiverem intactos, os dados podem ser recuperados
  • Basta conectar os discos a uma nova máquina ou a um novo SO, instalar as ferramentas zfs e executar zfs import para importar o pool existente
  • A configuração e os detalhes do ZFS são armazenados nos próprios discos
    • Por exemplo, se você configurou RAIDZ2 com 6 discos, ao mover esses discos para uma nova máquina com as ferramentas ZFS instaladas e executar apenas zfs import, eles aparecerão como RAIDZ2
  • Mesmo que haja um problema no sistema operacional hospedeiro ou na máquina, se os discos não tiverem sido danificados, os dados permanecem preservados

Identificação de discos e configuração de aliases

  • Em uma máquina Linux, a lista de discos pode ser verificada com lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE
  • No exemplo, são usados 4 drives NVMe Samsung SSD 990 PRO de 4 TB
  • Cada disco possui, em /dev/disk/by-id, um link simbólico que liga seu ID ao nome de dispositivo /dev/nvme...
  • Ao definir aliases em /etc/zfs/vdev_id.conf, é possível mapear IDs longos de disco para nomes curtos
alias nvme0 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme1 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme2 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme3 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
  • Os aliases são aplicados ao executar udevadm trigger ou reiniciar o sistema
  • Você pode verificar se foram aplicados com ls -lh /dev/disk/by-vdev
  • O mapeamento por alias é opcional; ao criar o zpool, também é possível usar diretamente o caminho completo /dev/disk/by-id/...
  • Nomes de dispositivo como /dev/nvme1 e /dev/nvme2 devem ser evitados, pois a ordem não é garantida ao instalar um novo drive
  • /etc/zfs/vdev_id.conf é uma configuração para facilitar a criação do zpool; mesmo que o SO seja danificado e esse arquivo seja perdido, o pool ZFS em si não será afetado

Criação do zpool e configuração dos datasets

  • O exemplo cria um zpool RAIDZ1 com 4 NVMes, tolerando a falha de 1 drive, como no RAID 5
  • Se for necessária maior tolerância a falhas, RAIDZ2, ou seja, uma configuração similar ao RAID 6, é mais resiliente
  • Para instalar o ZFS, consulte a documentação de instalação do OpenZFS; como exemplo, no RHEL 9 a instalação é feita com dnf install zfs
  • Ao criar o zpool, recomenda-se a opção ashift=12
    • Muitos discos, por compatibilidade, reportam ao SO tamanho de setor de 512 KB
    • Discos de alta capacidade como o Samsung 990 Pro podem ter tamanho de setor de 4 KB ou 8 KB
    • ashift=12 representa tamanho de setor de 4 KB e pode melhorar bastante o desempenho
    • O momento da criação do zpool é a última oportunidade para definir esse valor
zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3
zpool status s16z1
  • zpool é a abstração dos discos, enquanto zfs é o sistema de arquivos
  • Ao executar zpool create, um sistema de arquivos ZFS também é criado junto
  • É possível verificar se ashift: 12 foi configurado com zdb | grep ashift
  • Antes de compartilhar, configure o ponto de montagem e a compressão
zfs set mountpoint=/mnt/s16z1 s16z1
zfs set compression=lz4 s16z1
  • Crie os datasets docs e backups abaixo do dataset raiz
zfs create s16z1/docs
zfs create s16z1/backups
  • docs é usado para documentos, e backups para backups do Time Machine
  • Datasets ZFS oferecem mais recursos do que pastas simples
    • Gerenciamento de propriedades por dataset
    • Criptografia
    • Envio e replicação
    • Snapshots
  • É melhor criar datasets separados por grandes categorias de arquivos
  • Por exemplo, se você quiser fazer backup apenas de docs para um servidor remoto, não precisa enviar todo o dataset raiz s16z1

Criando uma conta de compartilhamento com Samba

  • O método de compartilhamento de arquivos em rede é independente do ZFS; basta que o ZFS esteja montado no sistema hospedeiro
  • Instale o Samba
apt install samba
  • Crie o usuário UNIX exclusivo do Samba john e defina uma senha
useradd -m john
passwd john
  • Use smbpasswd -a john para associar o usuário UNIX john a um usuário Samba
  • O host que se conecta pode acessar o compartilhamento como SYS\john
  • É possível verificar o registro do usuário Samba com pdbedit -L -v john
  • A remoção de um usuário Samba é feita com pdbedit -x -u john

Compartilhamento comum e compartilhamento para Time Machine

  • Edite /etc/samba/smb.conf para configurar os compartilhamentos docs e backups
[docs]
path = /mnt/s16z1/docs
browseable = yes
read only = no
guest ok = no
valid users = john
create mask = 0755

[backups]
path = /mnt/s16z1/backups
read only = no
guest ok = no
inherit acls = yes
spotlight = yes
fruit:aapl = yes
fruit:time machine = yes
vfs objects = catia fruit streams_xattr
valid users = john
  • docs é configurado como um compartilhamento SMB de uso geral
  • backups inclui atributos para o Time Machine do macOS
    • fruit:aapl = yes
    • fruit:time machine = yes
    • vfs objects = catia fruit streams_xattr
  • No macOS, pressione cmd+K no Finder e monte usando o formato smb://10.0.0.6/docs ou smb://10.0.0.6/backups
  • Em sistemas da família Debian, instale smbclient e teste da seguinte forma
apt install smbclient
smbclient -U john //10.0.0.6/docs -c 'ls'
  • Ao montar smb://10.0.0.6/backups, ele aparecerá no macOS como compartilhamento do Time Machine
  • Depois de montar, em Settings > General > Time Machine no macOS, adicione esse compartilhamento para iniciar o backup do Time Machine

Itens excluídos

  • A configuração de criptografia não está incluída neste procedimento
  • A estratégia de backup também não está incluída
  • O recurso de replicação de datasets do ZFS será expandido posteriormente em um artigo separado

1 comentários

 
GN⁺ 4 시간 전
Opiniões do Hacker News
  • Em termos de preço, agora não é uma boa época para montar um NAS, mas estou montando um nas últimas duas semanas. Estou usando um gabinete Jonsbo N6, que tem backplane SATA de 8 portas e baias para drives, então, ao contrário dos modelos Jonsbo anteriores, é bem decente
    No fim, decidi extrair e usar 4 WD Elements Desktop de 14 TB, e dentro havia drives WD140EDGZ preenchidos com hélio. São cerca de um terço mais baratos que 4 WD Red Plus de 12 TB, e o desempenho também parece semelhante. A garantia é claramente uma desvantagem, mas, se der defeito durante os 2 anos de garantia, acho que talvez dê para colocá-los de volta no gabinete externo
    Coloquei um SSD M.2 usado de 256 GB como drive de boot, e sofri bastante para fazer LUKS, chaves TPM e ZFS na raiz funcionarem juntos sem impedir o boot caso um drive falhe. Aprendi muito sobre systemd-boot, e ele parece muito mais sensato que o grub
    Também senti que há muitos mitos e cultos de carga em torno do ZFS. Por exemplo, o texto menciona RAM ECC, mas dizer que ela é obrigatória porque o ZFS corrompe o pool durante o scrub é quase um mito, e este ano ela está especialmente cara. O ZFS também não precisa de tanta RAM, e o L2ARC tampouco usa muita RAM
    Ainda estou pensando se ativo dnodesize=auto, mas há histórias de terror relacionadas: https://github.com/openzfs/zfs/issues/11353. E é difícil encontrar um provedor de armazenamento em nuvem que ofereça suporte a zfs send por um preço razoável; a Rsync.net recentemente aumentou o pedido mínimo para 10 TiB, grande demais para o meu uso: https://www.rsync.net/products/zfsintro.html

    • Dizer que “em termos de preço, não é uma boa época” é pouco. Agora os preços são terríveis para montar um NAS
      Se houvesse uma opção mágica, eu quase escolheria um mundo sem IA nenhuma, mas com armazenamento a um décimo dos preços de antes da IA
    • Estou rodando um pool ZFS RAIDZ2 de 8 drives e me pergunto se a recomendação de espaço livre do ZFS é culto de carga ou algo real
      Já estou abrindo mão de 2 drives por redundância e, de fato, recentemente dois SSDs que pareciam ser do mesmo lote morreram em sequência, o que ajudou. Mas, se eu seguir também o conselho de deixar livre pelo menos o equivalente a mais um drive por desempenho e estabilidade, com os preços atuais isso dói bastante
    • Fico curioso se pelo menos uma parte do “grande script que faz debootstrap de um NAS baseado em Debian” está disponível publicamente
      Depois de ver https://words.filippo.io/frood/ e https://0pointer.net/blog/fitting-everything-together.html, estou dando uma olhada em configurar um servidor doméstico/NAS com mkosi/systemd. É interessante ver como diferentes configurações resolvem esse problema
    • Fico curioso se a combinação de LUKS e chaves TPM funciona bem na prática. Se o servidor reiniciar, dá para desbloquear o sistema de arquivos raiz com o TPM? O /boot fica criptografado e também protegido contra adulteração? Resiste a ataques evil maid?
      Sei que é uma toca de coelho, mas, se você resolveu tudo isso, é realmente interessante
    • 4 SSDs Samsung SSD 990 PRO 4TB NVMe custam 1.100 dólares cada. Dá vertigem
      https://www.samsung.com/us/memory-storage/nvme-ssd/990-pro-p...
  • Coisas que foram úteis no NAS: ao instalar o avahi-daemon, o Samba passa a anunciar SMB/CIFS automaticamente via DNS-SD para clientes macOS e Linux
    Para descoberta automática no Explorer de clientes Windows 10 ou superior com SMB 1.0 desativado, basta instalar o wsdd2
    Nomes de host Linux normalmente ficam em minúsculas, mas, por padrão, o Samba publica no NetBIOS e no Avahi um nome começando com maiúscula. Se isso incomodar, defina host-name=something em [server] em /etc/avahi/avahi-daemon.conf e coloque mdns name = mdns em [global] em /etc/samba/smb.conf
    Se houver clientes macOS, é bom ativar vfs_fruit na configuração do Samba: https://www.samba.org/samba/docs/current/man-html/vfs_fruit..... Há motivos de compatibilidade, mas principalmente dá para configurar fruit:model e mostrar um ícone divertido na barra lateral do Finder
    Para impedir a criação de .DS_Store, é possível bloqueá-la: https://ryanoberto.github.io/blog/2015/04/01/disabling-the-c.... Acho que também daria para salvar as configurações do Finder em atributos estendidos com fruit:resource = xattr, mas não testei pessoalmente
    A Apple disse há muito tempo que substituiria AFP por SMB, e o suporte ao cliente AFP também deve ser removido no macOS 27, mas o suporte do cliente SMB do macOS ainda é bem ruim. Até lá, pretendo continuar rodando Netatalk junto com Samba; o Netatalk também se registra no Avahi e, significativamente, o macOS prefere AFP a SMB, então o cliente se conecta automaticamente ao daemon certo

    • No Samba, é bom adicionar o diretório home de cada usuário como um item separado. A configuração padrão do diretório homes desperta algum tipo de compulsão
  • Acho apropriado linkar um post do meu blog sobre a criação de um NAS desse tipo, mas com um conjunto de tecnologias bem diferente: dm-integrity, mdadm, XFS. Como desenvolvedor C/C++, acompanhando de perto o desenvolvimento do OpenZFS, o foco em recursos enormes e os problemas contínuos causados pelo SPL/cache de páginas separado me deixavam preocupado em termos de estabilidade.
    Aceitei o sofrimento inicial em troca de abrir mão da conveniência desse canivete suíço que é o ZFS, mas hoje estou muito satisfeito com a escolha.
    https://world-playground-deceit.net/blog/2025/06/nas-setup-l...

  • Cheguei à mesma conclusão ao montar meu NAS. Nix para o sistema, zfs para o RAID, e docker compose para os serviços que eu queria rodar foram suficientes.
    https://www.splitbrain.org/blog/2025-08/03-diy_nas_on_nixos

    • Eu também uso NixOS no NAS. Para gerenciamento de contêineres, vale dar uma olhada em quadlets com Nix, ou seja, contêineres Docker gerenciados pelo systemd.
    • De forma parecida, uso NixOS como NAS, e ele foi crescendo a ponto de agora eu estar tentando compartilhá-lo com outras pessoas também. Mas eu uso BTRFS sobre MDADM.
      Cansei daquele rack barulhento e gastador de energia dentro do armário, então ele acabou virando um servidor doméstico all-in-one e também roteador.
      https://HomeFree.host
  • O motivo de eu ainda pagar pela Synology é que, quando um disco falha, basta puxar a bandeja, trocar o disco, colocar de volta e clicar em alguns widgets. Sei que ele vai fazer o rebuild corretamente.
    Quando um disco falha, ele apita e acende um LED perto do disco problemático, então também sei o que fazer.
    Criar um NAS como o descrito no texto é fácil, mas no longo prazo a chance de perda de dados fica muito maior.
    E considero incompleto um guia desses que não aborda “como substituir com segurança o disco 3 quando ele falhar”. Mesmo que não explique como saber que o disco falhou, esse procedimento deveria estar lá.

    • Fiquei curioso se “snooty” é um erro de autocorreção de Synology ou se é outro produto.
    • Na verdade, é exatamente assim que o ZFS funciona. O guia realmente não está completo, mas reconstruir o array é só substituir o disco e executar um comando do ZFS.
    • O ZFS lida com falhas de disco de forma mais robusta do que qualquer outra coisa. Há um motivo para a Synology usar mdadm por baixo do BTRFS, em vez do recurso de RAID embutido do BTRFS, e o mdadm opera no nível do dispositivo.
      Por isso, ao trocar um drive, o mdadm precisa recriar o drive inteiro, enquanto o ZFS recria apenas os dados que estão realmente em uso.
      zpool replace my_pool disk3 newdisk
    • No ZFS, esse procedimento fica completamente trivial, exceto pela parte dos “bipes e LEDs”.
  • Deve haver motivos para as pessoas levarem ZFS e os componentes que normalmente chamam de “NAS” tão longe, mas eu tenho me virado bem rodando uma configuração rígida de NFSv3 em um HDD grande único com ext4 em uma máquina Linux.
    De qualquer forma, é meu sistema principal, que fica sempre ligado enquanto estou acordado, e com o consumo e overhead de uma única máquina consigo servir arquivos para outros dispositivos.
    Tento manter a configuração de rede basicamente restritiva, então também não me preocupo muito com os argumentos de segurança sobre rodar isso na máquina principal. Talvez eu esteja cometendo um pecado grave, mas será que NFSv3 puro e Samba apenas para compatibilidade realmente não bastam?

    • Primeiro, eu me perguntaria se há backup desse HDD grande único. Essa é a maior preocupação. Um dia esse HDD inevitavelmente vai falhar, e o importante é qual é o plano para quando isso acontecer.
      O principal motivo para as pessoas escolherem ZFS e um “NAS” é checksums e proteção de integridade dos dados, além de não quererem deixar a máquina principal sempre acordada.
      Recursos como snapshots também são úteis, reduzindo a preocupação de perder dados por apagar ou sobrescrever arquivos por engano.
      Não vejo problema em usar como NAS a máquina principal que fica ligada 24 horas. Não é preciso comprar algo à força só por comprar, mas eu me preocuparia com confiabilidade e proteção contra bit rot. Isso acontece de verdade, e eu mesmo já vi graças ao ZFS.
    • Nessa configuração, o maior problema é a estrutura de armazenamento em um único drive. Se um disco falhar, não há tolerância, e se o hardware começar a corromper dados silenciosamente, todos os dados ficam em risco. Isso supondo que os backups também sejam baseados nos dados desse único disco rígido.
      Se quiser manter uma configuração simples, vale considerar manter uma lista de hashes dos arquivos e verificá-la periodicamente.
      Também é bom usar um programa de backup com suporte a snapshots; o Restic é uma boa opção.
      Outra possibilidade é comprar mais um disco rígido do mesmo tamanho do atual e gerenciar a integridade dos arquivos com SnapRAID, ou montar um espelho de 2 discos com btrfs.
    • Quando várias máquinas começam a ler e escrever ao mesmo tempo, você encontra os limites. Ainda assim, o certo é construir o que você precisa agora, sem otimizar demais.
  • O Cockpit foi muito útil para administrar NAS e VPS. Mesmo que, graças aos LLMs, a configuração em si não seja um grande problema, é conveniente ter um dashboard com toggles e logs organizados, além de poder executar comandos de shell pelo celular sem SSH.
    No NAS, dá para ver facilmente os resultados de tarefas cron de backup/manutenção, gerenciar Samba e monitorar o uso de disco. Especialmente fazer o Samba funcionar direito no iPhone é uma dor de cabeça enorme.

    • Se você executa comandos de shell pelo celular sem SSH, fiquei curioso sobre como é feita a autenticação no Cockpit. Algo como colocar autenticação HTTP básica na frente?
      Para autenticação em servidores, em vez de descer para algo que não seja chave pública/privada, eu acabo fazendo o SSH funcionar pelo celular. Sou meio paranoico com essa parte.
  • Quando montei meu próprio NAS no passado, também usei este artigo como material de estudo: https://xyny.art/blog/2026-building-nas/
    Montar um NAS do zero é realmente divertido. O fato de não haver um “material completo” que cubra todo o assunto sem deixar nada de fora é um pequeno obstáculo, mas ao mesmo tempo faz parte da diversão.
    O objetivo do meu texto também é mais adicionar à internet mais um “guia” enviesado de configuração de NAS. Tenho cuidado em chamá-lo de guia, mas, se eu tivesse que fazer a mesma coisa de novo, certamente começaria lendo o meu próprio texto.

  • Conceitualmente, roda a mesma coisa, mas usa FreeBSD em vez de Debian. Não é tanto uma questão de ser melhor ou pior; os trade-offs são diferentes e, no fim, funciona igualmente bem

  • Ao refazer o NAS, decidi usar NFS sobre ZFS. Mas meu objetivo é um pouco diferente do do autor. Usei uma CPU/placa-mãe de baixo consumo e montei dois sistemas separados com failover, configurados em alta disponibilidade
    Na prática, também escrevi um software customizado para lidar com o failover e a replicação de dados. Nos testes, durante o failover, as escritas do cliente pararam só por alguns segundos. Fico curioso para saber se haveria interesse caso eu escrevesse um post sobre isso