INTRODUÇÃO
ZFS é um sistema de arquivos livre, desenvolvido pela Sun Microsystems (atualmente Oracle) para seu sistema operacional Solaris. O significado original era Zettabyte File System, porém agora é um pseudo-acrônimo.
As características do ZFS incluem grande capacidade de armazenamento, integração de conceitos de sistema de arquivos e administração de volumes (LLVM), RAID via software, nova estrutura de dados no disco, sistema de arquivos de rápido acesso, administração de espaços de armazenamento eficiente, compressão dos dados eficiente (LZMA ou GZIP), segurança e proteção contra corrupção dos dados, checagem contínua da integridade dos dados com reparação automática, instantâneos (snapshots), implementação nativa NFSv4 ACLs.
Tudo isso de forma fácil e com a mesma ferramenta de administração do sistema de arquivos.
CARACTERÍSTICAS DO ZFS
1. Integridade dos dados
Uma das principais características que distingue ZFS dos demais sistemas de arquivos é seu foco na integridade dos dados.
Todos os ponteiros com blocos de um sistema de arquivos contém um checksum (fletcher4 ou SHA-256) sobre o bloco apontado, que é checado ao se ler o bloco. Se houver divergência com o checksum, o sistema de arquivos consegue corrigir os dados automaticamente se houver outra cópia disponível (Mirror, RAID-Z, journal/ZIL ou então redundância no mesmo volume). Tudo isso de forma automática e online, sem necessitar desmontar o volume como nos sistemas que utilizam-se da ferramente fsck (etx3, etx4 etc.).
Isso torna o sistema de arquivos extremamente eficiente contra a bad blocks e dados corrompidos.
2. Capacidade de armazenamento
ZFS é um sistema de arquivos de 128 bits, ou seja, suporta 1,84 × 10^19 vezes a capacidade de um sistema de arquivos de 64 bits como o BTRFS. Os limites de ZFS estão desenhados para ser tão grandes que não se encontram nunca na pratica. Sobre a capacidade do sistema, Jeff Bonwick, o arquiteto chefe da Sun para ZFS, disse: “Criar um sistema de arquivos de 128 bits excederia os limites quânticos de armazenamento da terra.”
Alguns limites teóricos do ZFS:
- 2^48 – número de entradas em um diretório individual
- 2^64 bytes – tamanho máximo de um arquivo
- 2^64 bytes – tamanho máximo de qualquer atributo
- 2^78 bytes – tamanho máximo de um pool
- 2^56 – número de atributos de um arquivo
- 2^64 – número de dispositivos em qualquer pool
- 2^64 – número de pools em um sistema
- 2^64 – número de sistemas de arquivos em um pool
- 2^128 bytes (340,282,366,920,938,463,463,374,607,431,768,211,456 bytes) – capacidade máxima de armazenamento
Como exemplo das capacidades expressadas por estes números, se um indivíduo criasse 1000 arquivos por segundo, levaria 8925,51 anos para alcançar o limite imposto pelo número de arquivos (2^48) em um diretório.
3. Modelo transacional (Copy-on-write)
ZFS utiliza um modelo transacional copy-on-write. Todos os ponteiros com blocos de um sistema de arquivos contém um checksum (fletcher ou SHA-256) sobre o bloco apontado, que se comprova ao ler o bloco. Os blocos que contém dados ativos não se sobrescrevem nunca; em seu lugar, se reserva um novo bloco, e os dados modificados se escrevem nele, então qualquer bloco de metadados que o referencie é, de modo similar, recuperado e escrito. Para reduzir a sobrecarga deste processo, se agregam varias atualizações em grupos de transações, e se utiliza um log de eventos quando se necessitam escrituras síncronas.
4. Snapshots
Como ZFS não sobrescreve dados, tomar um instantâneo (snapshot) simplesmente significa não liberar os blocos utilizados por versões antigas de dados. A vantagem é que os instantâneos se tomam rapidamente e também são eficientes desde o ponto de vista do espaço, pois compartilham os dados sem modificar com o sistema de arquivos.
Podem ser criados instantâneos modificáveis (chamados clones), o que resulta em dois sistemas de arquivos independentes que se criam compartilhando um conjunto comum de blocos. A medida que se realizam trocas os blocos do sistema de arquivos divergem, porém os blocos comuns se manterão independentemente de quantos clones existam.
É possível voltar o sistema de arquivos a um snapshot anterior após alguma mudança indesejada, o que funciona parecido com pontos de restauração do sistema no Windows.
4. Dynamic striping
A medida que se anexem dispositivos de armazenamento ao pool, a largura das bandas se expande de forma automática para inclui-los, de maneira que se utilizam todos os discos no pool para balancear a carga de escritas entre todos os dispositivos.
5. Tamanhos de bloco variável
ZFS utiliza blocos de tamanho variável até 128K. O código disponível atualmente permite ao administrador ajustar o tamanho máximo de blocos utilizados, pois certas cargas não rendem bem com blocos grandes. Também está contemplado um ajuste automático para adequar-se as características da carga de trabalho.
Se ativar-se a compressão se utilizam de tamanhos de bloco variáveis, um bloco pode comprimir para que resulte em um bloco de tamanho menor, então utiliza o bloco pequeno no disco, de maneira que não utilize menos capacidade, senão pode aumentar o throughput de entrada/saída (com isso aumentar a sobrecarga da CPU).
6. Espaços de armazenamento (storage pools)
A diferença dos sistemas de arquivos tradicionais que residem sobre um só dispositivo subjacente e portanto requerem um gestor de volumes separado quando se precisa um sistema de arquivos maior que o dispositivo, ZFS se apoia em espaços de armazenamento virtuais (virtual storage pools).
Os espaços se constroem a partir de um ou mais dispositivos virtuais (vdevs), de que cada um é o raw device, um mirror (RAID 1) de um ou mais dispositivos, ou um grupo RAID-Z de dois ou mais dispositivos. A capacidade de armazenamento de todos os vdevs está disponível para todos os sistemas de arquivos do pool.
Para limitar a quantidade de espaço que um sistema de arquivos pode ocupar, se podem aplicar cotas de disco, e garantir que haverá espaço disponível para determinado sistema de arquivos. Pode-se fixar uma reserva de disco.
7. Criação de sistemas de arquivos de rápido acesso
A criação de um novo sistema de arquivos no interior de um espaço de armazenamento ZFS e extremamente rápida e fácil, muito mais parecida em tempo e esforço a criar um novo diretório em sistema de arquivos tradicional que ao tempo e esforço necessário para criar um novo sistema de arquivos em qualquer outro S.O. tradicional.
Estes sistemas de arquivos podem ter cotas reservadas e outras capacidades de administração úteis. Entre os usos possíveis se encontra a criação de um sistema de arquivos separado, não só um diretório, para cada usuário do sistema.
8. Capacidades adicionais:
- Prioridade I/O explícita com deadline scheduling.
- Ordenação e agregação de I/O globalmente ótima.
- Múltipla e independente prefetch streams com tamanho automático e detecção de passos.
- Operações de Diretório de tempo constante e Paralelo.
- Striping dinâmico de discos entre devices.
- Tamanho múltiplo de blocos de disco escolhidos dinamicamente de acordo com os dados e carga de armazenamento.
- Escalonamento explícito de prioridade de operações de E/S.
- Ordenação de operações de E/S em disco agregada e global.
- Streams múltiplos de independentes de pré-aquisição de dados com detecção automática de demanda.
- Snapshots lógicos instantâneos e limitados, segundo padrão de McKusick, implementado no UFS2 do FreeBSD pela primeira vez.
- Operações de diretório em tempo constante e paralelas.
- COW (Copy-On-Write), técnica criada no FreeBSD que aumenta performance e segurança nas operações de escrita de dados entre áreas física ou logicamente distintas.
- Capacidade de gerenciar RAID via software e LLVM pelo próprio sistema de arquivos.
Introdução adaptada de:
INSTALAÇÃO
Quem utiliza Solaris ou BSD muito provavelmente sabe das inúmeras vantagens que este sistema de arquivos pode proporcionar.
ZFS é software livre, porém licenciado sob a CDDL (Common Development and Distribution License), o que o torna incompatível com a GPL sob a qual é licenciado o kernel Linux.
Desta forma, seria ilegal DISTRIBUIR o código do ZFS dentro do kernel Linux, mas não UTILIZAR o ZFS como outro software qualquer em separado rodando em sua máquina.
Desta forma, foi criada a iniciativa zfsonlinux que produziu suporte compatível ao kernel Linux, e que é considerado estável desde 2013.
Dentre as principais distribuições Linux, Ubuntu, Gentoo e Arch Linux tem ótimo suporte ao ZFS, permitindo a instalação à partir de seus próprios repositórios. O Slackware também tem documentação disponível para utilizar ZFS de diversas formas.
Para quem precisa apenas de acessar um sistema de arquivos, existe também o ZFS-FUSE, que se utiliza do FUSE (Filesystem in Userspace), porém para utilizar o sistema de forma completa com todas suas vantagens é necessário habilitar o suporte no kernel, que é a finalidade deste artigo.
INSTALANDO O ZFS
Para utilizar o ZFS no Linux você deve instalar dois pacotes: SPL e ZFS.
O SPL (Solaris Porting Layer) é um módulo para o kernel Linux entender a API do kernel Solaris. Essa camada de emulação torna possível executar código Solaris no kernel Linux com mínima modificação. O ZFS é o módulo do sistema de arquivos.
O ZFS em sua versão 0.6.4 é compatível com o kernel Linux desde a versão 2.6.32 até a 3.19.
Também é necessário ter instalado em seu sistema os kernel sources e headers na mesma versão. São recomendados sistemas com processadores x86_64 e com memória RAM suficiente (>2 GB) para ótima performance.
Também é necessário ter os pacotes de desenvolvimento básicos instalados, o que de forma geral, em uma distribuição Debian-like, seria instalado com algo do tipo:
$ sudo apt-get install build-essential gawk alien fakeroot linux-headers-$(uname -r)
$ sudo apt-get install zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi wget
Se você utiliza uma distribuição como Slackware em sua instalação full, tudo que você precisar já está instalado, porém neste caso provavelmente você já deve saber o que fazer.
Nós vamos fazer uma compilação básica dos pacotes porém também há pacotes já disponíveis em diversas distribuições e seus respectivos gerenciadores de pacotes:
- Arch Linux – https://wiki.archlinux.org/index.php/ZFS
- Debian – http://zfsonlinux.org/debian.html
- Fedora – http://zfsonlinux.org/fedora.html
- Funtoo – http://www.funtoo.org/ZFS_Fun
- Gentoo – http://wiki.gentoo.org/wiki/ZFS
- RHEL / CentOS / SL – http://zfsonlinux.org/epel.html
- Ubuntu – https://launchpad.net/~zfs-native/+archive/stable
- Slackware – http://slackbuilds.org/repository/14.1/system/zfs-on-linux/
Dito isso, mão à obra:
$ cd ~
$ wget -c http://archive.zfsonlinux.org/downloads/zfsonlinux/spl/spl-0.6.4.tar.gz
$ wget -c http://archive.zfsonlinux.org/downloads/zfsonlinux/zfs/zfs-0.6.4.tar.gz
$ tar -xzvf spl-0.6.4.tar.gz
$ tar -xzvf zfs-0.6.4.tar.gz
$ cd spl-0.6.4
$ ./configure
$ make
# make install
$ cd ../zfs-0.6.4
$ ./configure
$ make
# make install
That’s it! Agora você já pode reiniciar o computador e começar a usar ZFS da mesma forma como faria no Solaris ou FreeBSD.
Você terá os executáveis:
- /usr/local/sbin/zpool
- /usr/local/sbin/zfs
Com os quais fará o gerenciamento do ZFS.
Primeiro carregue o módulo:
# modprobe zfs
E veja se a instalação está funcionando, com a seguinte saída:
# zpool status
no pools available
Se aparecer algo diferente disso sua instalação não ocorreu corretamente.
TUTORIAL BÁSICO
A seguir estão alguns exemplos comandos básicos de gerenciamento do sistema ZFS, que é feito utilizando as ferramentas zpool e zfs.
Maiores informações podem ser encontradas na documentação.
Para criar um simples pool sem redundância em /dev/sda1 e montar em /example:
# mkdir -p /example
# zpool create example /dev/sda1
Criando um dataset neste pool com compressão lzma ativada:
# zfs create example/compressed
# zfs set compression=lz4 example/compressed
Desmontar o dataset:
# zfs umount example/compressed
Remontar:
# zfs mount example/compressed
Criar redundância de 2 cópias neste mesmo dataset:
# zfs set copies=2 example/compressed
Destruir tudo o que fizemos:
# zfs destroy example/compressed
# zpool destroy example
Criar um pool com nome storage que serve como RAID-Z via software com 3 discos:
# zpool create storage raidz /dev/sda1 /dev/sda2 /dev/sda3
Ou então um mirror (RAID-1) via software com 2 discos:
# zpool create storage mirror /dev/sda1 /dev/sda2
Criar um snapshot do sistema de arquivos para que usemos como ponto de restauração:
# zfs snapshot storage@15-04-08
Reverter para este snapshot:
# zfs rollback storage@15-04-08
Verificar o status do pool storage:
# zpool status storage
pool: storage state: ONLINE scrub: scrub completed with 0 errors on Sat Jan 26 19:57:37 2015 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 /dev/sda1 ONLINE 0 0 0 /dev/sda2 ONLINE 0 0 0 /dev/sda3 ONLINE 0 0 0 errors: No known data errors
Realizar verificação dos dados no pool storage:
# zpool scrub storage
Exportar e importar o pool:
# zpool export storage
# zpool import storage
Para uma lista mais completa das funcionalidades, recomendo o Handbook do FreeBSD sobre o assunto, no qual me baseio para escrever este artigo:
TESTE DO CONCEITO / COMPARAÇÃO ENTRE ZFS E BTRFS
Neste tópico vou utilizar uma máquina física com Slackware 14.1 e com ZFS já instalado. Vou substituir a partição home que está em ext4 e colocar em um pool em ZFS com compressão ativada e montada automaticamente no boot. É apenas um teste das funcionalidades. Não me responsabilizo por eventuais perdas de dados. Sempre faça backup.
Inicialmente tenho um disco com duas partições em MBR:
- /dev/sda1 on / type ext4 (rw)
- /dev/sda2 on /home type ext4 (rw)
Mãos à obra:
# modprobe spl
# modprobe zfs
# cd /
# umount /dev/sda2
Se não desmontar sua /home porque algum programa estiver bloqueando, você pode usar o comando lsof para descobrir qual processo é o culpado. Lembro que não poderia estar usando o modo gráfico.
Agora a parte que interessa:
# dd if=/dev/zero of=/dev/sda2 bs=1024 count=10
# zpool create -o ashift=12 -m legacy myhome /dev/sda2
# zfs create -o compression=lz4 myhome/home
# zfs set mountpoint=/home myhome/home
Substitua no seu /etc/fstab a linha de /home por:
Monte sua home:
# zfs mount -a
E coloque para carregar o módulo zfs e spl no boot:
# echo “/sbin/modprobe spl” >> /etc/rc.d/rc.modules
# echo “/sbin/modprobe zfs” >> /etc/rc.d/rc.modules
Importar o pool na hora do boot:
# echo “/usr/local/sbin/zpool import myhome” >> /etc/rc.d/rc.M
E seu Slackware já deve estar funcionando neste momento com o diretório home em ZFS.
COMPARAÇÃO ENTRE ZFS E BTRFS
O fato principal que devemos considerar quando comparamos Btrfs com ZFS é que o ZFS já é um sistema maduro, com uso em produção desde 2005 em outras plataformas com sucesso. Já Btrfs apesar de estar em estado avançado de desenvolvimento (estável desde 2014), ainda apresenta algumas preocupações quando comparado ao ZFS.
ZFS é diversas ordens de magnitude mais testado do que Btrfs atualmente.
Eu acredito que o ZFS nunca se tornará o sistema dominante em Linux, principalmente devido à incompatibilidade das licenças CDDL e GPL. Este lugar um dia há de ser ocupado pelo Btrfs.
CONSIDERAÇÕES FINAIS
Toda vez que você for instalar um novo kernel, você deverá reinstalar os pacotes SPL e ZFS.
Como o suporte ao ZFS não é parte do kernel, se você quiser fazer a sua partição root no ZFS vai dar um pouco de trabalho. Primeiramente necessitaria de uma partição /boot em um sistema conhecido pelo kernel (ex.: ext4). Daí, teria que criar um initrd personalizado com o módulo do ZFS para que o kernel possa abrir sua partição root e dar o boot. Para os mais interessados esse processo é descrito aqui:
Se você quiser que todo o disco fique em ZFS, também é possível compilar um kernel customizado injetando o código do ZFS no kernel, assim o seu kernel teria suporte nativo ao ZFS. Lembrando que você pode fazer isso, mas não pode criar uma DISTRIBUIÇÃO com isso, porque a licença GPL é conflitante com a CDDL. Para os usuários mais familiarizados com compilação do kernel, esse processo é descrito aqui:
ZFS no Linux é estável?
A resposta curta é sim. Porém depende do que você considera como estável. Se estável significa que o sistema não trava, não perde os dados, substitui com vantagens outros sistemas de arquivos, que tem desenvolvimento ativo e correção de falhas no código, que é compatível com as outras implementações, então a resposta é sim. Já se você considerar estável como sinônimo de “exaustivamente testado”, então acho que ainda não chegamos lá. De qualquer forma, ZFS está em uso em produção no Solaris e BSD com resultados positivos na última década.
Referências: