Nesse artigo iremos estar usando comandos ZFS para gerenciar discos de forma a utilizar recursos poderosos disponibilizados por esse excelente sistema de arquivos.
No artigo denominado O que é ZFS? Um sistema de arquivos Opensource ZFS é muito mais que um sistema de arquivos, é um gerenciador de volume e um sistema de armazenamento de dados desenvolvido pela Sun Microsystems em 2001 para o sistema operacional Solaris. Atualmente é usado em uma ampla variedade de plataformas, incluindo servidores, workstations e dispositivos de armazenamento de dados.
A Sun Microsystems foi adquirida pela Oracle Corporation em 2010 e a Oracle licenciou o código-fonte do ZFS para a comunidade de código aberto em 2012. O ZFS agora é desenvolvido e mantido pela OpenZFS Foundation.
ZFS tem diversas funções: Armazenamento baseado em pool, Copy-on-Write, Snapshots, Gerenciador de Volume de Software, RAID de software, replicação e compressão e Integridade de dados contra corrupção silenciosa de dados(ou Data integrity against silent data corruption).
No artigo ZFS: Instalando no Linux vimos como fazer a instalação nas principais distros.
Também vimos em ZFS: É Recomendado Usar Memória ECC com 8GB no Mínimo que é recomendado o uso de Memórias ECC, porém esse tipo de memória seja cara para usuários de desktops. Uma questão abordada foi: Posso Instalar em Sistema de 32-bits ao Invés de 64-bits?
Hoje iremos ver alguns exemplos de comandos usando ZFS em um computador com 4 discos.
Termos ZFS Usado nesse Artigo
- Pool: é um conjunto de discos que são combinados para formar um único espaço de armazenamento
Servidor Usando nos Testes de Comandos ZFS
Usaremos os eguinte servidor para testes em nosso laboratório:
- nome: oraclelinux92
- Endereço IP: 192.168.50.5
- Discos: sdb, sdc, sdd, sde
Exemplos de Comandos ZFS com Somente Um Disco no Pool
Nesse exemplo nosso pool conterá somente 1 disco. Usarei o /dev/sdc
#1 Para criar um pool simples e não redundante usando um único dispositivo de disco:
[root@oraclelinux92 ~]# zpool create meuPool /dev/sdc
Para visualizar o novo pool, execiute df:
[root@oraclelinux92 ~]# df -h .... meuPool 1,8G 128K 1,8G 1% /meuPool
#2 O resultado acima mostra a criação e montagem do pool chamado meuPool, que agora está acessível como um sistema de arquivos.
[root@oraclelinux92 ~]# touch /meuPool/listas.txt [root@oraclelinux92 ~]# touch /meuPool/documentos.txt [root@oraclelinux92 ~]# touch /meuPool/livraria.txt
Veja,
[root@oraclelinux92 ~]# ls /meuPool/ documentos.txt listas.txt livraria.txt
#3 Este pool ainda não está usando nenhum recurso e propriedade avançada do ZFS. Para criar um dataset(conjunto de dados) neste pool com compactação habilitada:
[root@oraclelinux92 ~]# zfs create meuPool/meuDataSet
[root@oraclelinux92 ~]# zfs set compression=gzip meuPool/meuDataSet
Agora meuPool/meuDataSet é um sistema de arquivos ZFS compactado. Tente copiar alguns arquivos grandes
Veja que ele é montado automaticamente:
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ... meuPool 1,8G 128K 1,8G 1% /meuPool meuPool/meuDataSet 1,8G 128K 1,8G 1% /meuPool/meuDataSet
Se quisesse montar, caso não estivesse, execute: zfs mount meuPool/meuDataSet
#4 Se quiser desfazer a compactação proceda
[root@oraclelinux92 ~]# zfs set compression=off meuPool/meuDataSet
#5 Para desmontar um sistema de arquivos, use zfs umount e verifique com df:
[root@oraclelinux92 ~]# zfs unmount meuPool/meuDataSet
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ..... meuPool 1,8G 128K 1,8G 1% /meuPool
#6 Para remontar o sistema de arquivos para torná-lo acessível novamente, use zfs mount e verifique com df:
[root@oraclelinux92 ~]# zfs mount meuPool/meuDataSet
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ... meuPool 1,8G 128K 1,8G 1% /meuPool meuPool/meuDataSet 1,8G 128K 1,8G 1% /meuPool/meuDataSet
Pode também executar apenas o comando mount para exibir as montagens
[root@oraclelinux92 ~]# mount | grep meuPool meuPool on /meuPool type zfs (rw,xattr,noacl) meuPool/meuDataSet on /meuPool/meuDataSet type zfs (rw,xattr,noacl)
usei também “| grep meuPool” para filtrar apenas linhas contendo meuPool
#7 Use DataSet ZFS como qualquer sistema de arquivos após a criação. Defina outros recursos disponíveis por DataSet quando necessário. O exemplo abaixo cria um novo sistema de arquivos chamado dados. Ele assume que o sistema de arquivos contém arquivos importantes e o configura para armazenar duas cópias de cada bloco de dados.
[root@oraclelinux92 ~]# zfs create meuPool/dados [root@oraclelinux92 ~]# zfs set copies=2 meuPool/dados
Usando df podemos ver as montagens
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ...... meuPool 1,8G 128K 1,8G 1% /meuPool meuPool/meuDataSet 1,8G 128K 1,8G 1% /meuPool/meuDataSet meuPool/dados 1,8G 128K 1,8G 1% /meuPool/dados
Observe que todos os sistemas de arquivos no pool têm o mesmo espaço disponível. O uso de df nesses exemplos mostra que os sistemas de arquivos usam o espaço de que precisam e todos extraem esse espaço do mesmo pool. O ZFS elimina conceitos como volumes e partições e permite que vários sistemas de arquivos compartilhem o mesmo pool.
#8 para destruir datasets use zfs destroy nomedataset
[root@oraclelinux92 ~]# zfs destroy meuPool/meuDataSet
[root@oraclelinux92 ~]# zfs destroy meuPool/dados
Vamos destruir o pool para trabalharmos no próximo tópico com outro.
[root@oraclelinux92 ~]# zpool destroy meuPool
Trabalhando com Discos em Raid no ZFS
![usando comandos ZFS para gerenciar discos](https://categoriaoutros.com.br/wp-content/uploads/2023/08/Hds-sata.jpg)
Os discos falham. Uma maneira de evitar a perda de dados por falha no disco é usar o RAID. O ZFS oferece suporte a esse recurso em seu design de pool. Os pools RAID-Z requerem três ou mais discos, mas fornecem mais espaço utilizável do que os pools espelhados.
A Sun recomenda que o número de dispositivos usados em uma configuração RAID-Z esteja entre três e nove. Para ambientes que exigem um único pool com 10 discos ou mais, considere dividi-lo em grupos RAID-Z menores. Se dois discos estiverem disponíveis, o espelhamento ZFS fornece redundância, se necessário.
Também, já temos alguns artigos falando sobre Raid:
Aqui irei usar os discos sdc, sdd e sde
Este exemplo cria um pool RAID-Z, especificando os discos a serem adicionados ao pool:
#1 crie um RAID-Z especificando os discos
[root@oraclelinux92 ~]# zpool create meuPool raidz sdc sdd sde
O exemplo anterior criou o meuPool usando a ferramenta zpool.
#2 Este outro exemplo abaixo cria um novo sistema de arquivos chamado documentos nesse pool:
[root@oraclelinux92 ~]# zfs create meuPool/documentos
#3 Ative a compactação e armazene uma cópia extra de diretórios e arquivos:
[root@oraclelinux92 ~]# zfs set compression=gzip meuPool/documentos
[root@oraclelinux92 ~]# zfs set copies=2 meuPool/documentos
Crie alguns documentos dentro do novo dataset.
#4 podemos criar um snapshot. Um snapshot no ZFS é uma cópia instantânea do estado atual do sistema de arquivos, permitindo a recuperação de dados ou a criação de pontos de verificação.
Coloque um @ para separar o dataset do nome do snapshot
[root@oraclelinux92 ~]# zfs snapshot meuPool/documentos@11-08-2023
O ZFS cria snapshot de um conjunto de dados, não de um único diretório ou arquivo.
#4.1 exclua o conteúdo dentro de /meuPool/documentos e traga eles novamente ao recuperar o snapshot
[root@oraclelinux92 ~]# rm -rf /meuPool/documentos/*
[root@oraclelinux92 ~]# zfs rollback meuPool/documentos@11-08-2023
#5 Para listar todos os instantâneos disponíveis, execute ls no diretório .zfs/snapshot do sistema de arquivos. Por exemplo, para ver o instantâneo obtido:
[root@oraclelinux92 ~]# ls -l /meuPool/.zfs/snapshot/
total 0
drwxrwxrwx 1 root root 0 ago 14 11:37 11-08-2023
Como dica, crie um script para tirar instantâneos regulares dos dados do usuário.
#6 Com o tempo, os instantâneos podem ocupar muito espaço em disco. Remova o instantâneo anterior usando o comando:
[root@oraclelinux92 ~]# zfs destroy meuPool@11-08-2023
#7 podemos definir uma pasta qualquer onde o dataset será montado. O comportamento padrão é que o dataset seja montado em um caminho parecido com o seu nome, por exemplo meuPool/documentos é montado em /meuPool/documentos. Vamos supor que queira montar meuPool/documentos em /meusDocs
[root@oraclelinux92 ~]# zfs set mountpoint=/meusDocs meuPool/documentos
veja o resultado,
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ..... meuPool 3,6G 128K 3,6G 1% /meuPool meuPool/documentos 3,6G 128K 3,6G 1% /meusDocs
Recuperando um Raid-Z
Cada RAID de software possui um método de monitoramento de seu estado(status). Visualize o status dos dispositivos RAID-Z usando: zpool status -x
#1 Se todos os pools estiverem Online e tudo estiver normal, a mensagem será exibida: all pools are healthy
[root@oraclelinux92 ~]# zpool status -x all pools are healthy
#1.1 Se retirarmos o -x do comando acima teremos um resultado mais detalhado
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
Se houver um problema, talvez um disco no estado Offline, o estado do pool ficará assim:
[root@oraclelinux92 ~]# zpool status pool: meuPool state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. config: NAME STATE READ WRITE CKSUM meuPool DEGRADED 0 0 0 raidz1-0 DEGRADED 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde OFFLINE 0 0 0 errors: No known data errors
podemos ver que o disco sde está offline.
Você pode definir manualmente um disco como offline com o comando: zpool offline meuPool sde e para colocar novamente online execute: zpool online meuPool sde
#2 Desligue o servidor e substitua o disco sde. Após ligar novamente o servidor, execute zpool replace meuPool sde
Nesse caso, sde é o novo disco.
[root@oraclelinux92 ~]# zpool replace meuPool sde
Vamos checar novamete usando zpool status -x
[root@oraclelinux92 ~]# zpool status -x all pools are healthy
Neste exemplo, tudo está normal.
Verificação de dados
O ZFS usa checksums para verificar a integridade dos dados armazenados. A criação de sistemas de arquivos os habilita automaticamente.
Checksums são valores numéricos gerados a partir de dados para verificar se houve alguma alteração ou corrupção nos dados durante a transmissão ou armazenamento. Desativar Checksums é possível, mas não recomendado! As somas de verificação ocupam pouco espaço de armazenamento e fornecem integridade de dados. A maioria dos recursos do ZFS não funcionará corretamente com sem checksums. Desativar esses checksums não aumentará o desempenho de forma perceptível.
Verificar os checksums(chamadas scrubbing) garante a integridade do pool de armazenamento com:
[root@oraclelinux92 ~]# zpool scrub meuPool
A duração de um scrub depende da quantidade de dados armazenados. Quantidades maiores de dados levarão proporcionalmente mais tempo para serem verificadas. Como o scrub é intensivo em E/S, o ZFS permite que um único scrub seja executado por vez. Após a conclusão do scrub, visualize o status com zpool status:
[root@oraclelinux92 ~]# zpool status meuPool pool: meuPool ..... scan: scrub repaired 0B in 00:00:00 with 0 errors on Mon Aug 14 12:13:08 2023 config: ....
Exibir a data de conclusão do último scrub ajuda a decidir quando iniciar outra. As limpezas de rotina ajudam a proteger os dados contra corrupção silenciosa e garantem a integridade do pool.
#1 Administrando zpool
A administração do ZFS usa dois utilitários principais:
- zpool
- zfs
O utilitário zpool controla a operação do pool e permite adicionar, remover, substituir e gerenciar discos. Enquanto o utilitário zfs permite criar, destruir e gerenciar datasets(ou conjunto de dados), tanto sistemas de arquivos quanto volumes.
#1.1 Criando e destruindo pools de armazenamento
A criação de um pool de armazenamento ZFS requer decisões permanentes, pois a estrutura do pool não pode ser alterada após a criação. A decisão mais importante é em quais tipos de vdevs agrupar os discos físicos. Consulte a lista de tipos de vdev para obter detalhes sobre as opções possíveis. Depois de criar o pool, a maioria dos tipos de vdev não permite adicionar discos ao vdev. As exceções são mirrors, que permitem adicionar novos discos ao vdev, e stripes, que atualizam para mirrors anexando um novo disco ao vdev. Embora a adição de novos vdevs expanda um pool, o layout do pool não pode ser alterado após a criação do pool. Em vez disso, faça backup dos dados, destrua o pool e recrie-o.
Vamos destruir o pool que criamos acima
[root@oraclelinux92 ~]# zpool destroy meuPool
#1 Crie um pool com dois discos espelhados(mirrored)
[root@oraclelinux92 ~]# zpool create meuPool mirror sdd sde
Poderíamo criar mais de um vdev da seguinte forma: zpool create meuPool mirror sdb sdc mirror sdd sde
Os pools também podem usar partições em vez de discos inteiros. Colocar o ZFS em uma partição separada permite que o mesmo disco tenha outras partições para outras finalidades. Em particular, permite adicionar partições com bootcode(código de inicialização) e sistemas de arquivos necessários para inicializar. Isso permite inicializar a partir de discos que também são membros de um pool. O ZFS não adiciona nenhuma peso de desempenho no FreeBSD ao usar uma partição em vez de um disco inteiro. O uso de partições também permite que o administrador provisione menos os discos, usando menos do que a capacidade total. Se um futuro disco de substituição com o mesmo tamanho nominal do original realmente tiver uma capacidade um pouco menor, a partição menor ainda caberá, usando o disco de substituição.
Vamos destruir mais uma vez o pool que criamos
[root@oraclelinux92 ~]# zpool destroy meuPool
#2 Agora, crie um pool RAID-Z2 usando partições:
[root@oraclelinux92 ~]# zpool create meuPool raidz2 sdb sdc sdd sde
veja
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
[root@oraclelinux92 ~]# zpool list NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT meuPool 7.50G 273K 7.50G - - 0% 0% 1.00x ONLINE -
e
[root@oraclelinux92 ~]# df -h Sist. Arq. Tam. Usado Disp. Uso% Montado em ... meuPool 3,7G 128K 3,7G 1% /meuPool
Vamos criar dois datasets
[root@oraclelinux92 ~]# zfs create meuPool/docs [root@oraclelinux92 ~]# zfs create meuPool/imagens
[root@oraclelinux92 ~]# zfs list NAME USED AVAIL REFER MOUNTPOINT meuPool 238K 3.61G 32.9K /meuPool meuPool/docs 32.9K 3.61G 32.9K /meuPool/docs meuPool/imagens 32.9K 3.61G 32.9K /meuPool/imagens
No documento dentro de https://docs.freebsd.org diz que:
Destrua um pool que não é mais necessário para reutilizar os discos. A destruição de um pool requer primeiro a desmontagem dos sistemas de arquivos desse pool. Se algum conjunto de dados estiver em uso, a operação de desmontagem falhará sem destruir o pool. Force a destruição do pool com -f. Isso pode causar um comportamento indefinido em aplicativos que tinham arquivos abertos nesses conjuntos de dados.
Só que não foi isso que os testes mostraram quando executados no Linux. Foi muito fácil destruir um dataset e todo o pool.
Vamos tentar destruir o dataset meuPool/docs. Veja que conseguimos sem problema realizar e exclusão do dataset:
[root@oraclelinux92 ~]# zfs destroy meuPool/docs
Vamos tentar excluir o pool meuPool. Veja que também conseguimos sem dificuldades
[root@oraclelinux92 ~]# zpool destroy meuPool
#1.2 Adicionando e removendo dispositivos no Pool
Vamos refazer o pool com 3 dispositivos apenas
[root@oraclelinux92 ~]# zpool create meuPool raidz2 sdb sdc sdd
Existem duas maneiras de adicionar discos a um pool:
- anexar um disco a um vdev existente com o comando zpool attach ou
- adicionar vdevs ao pool com zpool add.
Alguns tipos de vdev permitem adicionar discos ao vdev após a criação.
Um pool criado com um único disco carece de redundância. Ele pode detectar corrupção, mas não pode repará-la, porque não há outra cópia dos dados. A propriedade copies pode ser capaz de se recuperar de uma pequena falha, como um setor defeituoso, mas não fornece o mesmo nível de proteção que o espelhamento ou RAID-Z. Começando com um pool que consiste em um único disco vdev, use zpool attach para adicionar um novo disco ao vdev, criando um espelho. Use também zpool attach para adicionar novos discos a um grupo de espelhos, aumentando a redundância e o desempenho de leitura. Ao particionar os discos usados para o pool, replique o layout do primeiro disco no segundo. Use gpart backup e gpart restore para facilitar esse processo.
No exemplo em docs.freebsd é usado um exemplo para atualiar o disco único (stripe) vdev ada0p3 para um espelho anexando ada1p3. Lá, os seguintes comandos são executados:
- zpool status
- zpool attach mypool ada0p3 ada1p3
- gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
- zpool status
Vamos ver eles com seus resultados
# zpool status pool: mypool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 errors: No known data errors
# zpool attach mypool ada0p3 ada1p3 Make sure to wait until resilvering finishes before rebooting. If you boot from pool 'mypool', you may need to update boot code on newly attached disk _ada1p3_. Assuming you use GPT partitioning and _da0_ is your new boot disk you may use the following command: gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1 bootcode written to ada1
# zpool status pool: mypool state: ONLINE status: One or more devices is currently being resilvered. The pool will continue to function, possibly in a degraded state. action: Wait for the resilver to complete. scan: resilver in progress since Fri May 30 08:19:19 2014 527M scanned out of 781M at 47.9M/s, 0h0m to go 527M resilvered, 67.53% done config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 ada1p3 ONLINE 0 0 0 (resilvering) errors: No known data errors
# zpool status pool: mypool state: ONLINE scan: resilvered 781M in 0h0m with 0 errors on Fri May 30 08:15:58 2014 config: NAME STATE READ WRITE CKSUM mypool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 ada1p3 ONLINE 0 0 0 errors: No known data errors
Em meu cenário, irei destruir o meuPool criado anteriormente e criar outro apenas com um disco como vdev
[root@oraclelinux92 ~]# zpool destroy meuPool [root@oraclelinux92 ~]# [root@oraclelinux92 ~]# zpool create meuPool sdb [root@oraclelinux92 ~]# [root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 sdb ONLINE 0 0 0 errors: No known data errors
Irei adicionar(attach) o disco sdc
Veja que tive que mencionar o dispositivo sdb já existente e logo em seguinte o sdc que seria o novo
[root@oraclelinux92 ~]# zpool attach meuPool sdb sdc
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: resilvered 178K in 00:00:01 with 0 errors on Tue Aug 15 10:31:10 2023 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors
O comando abaixo é útil se você inicializa o sistema operacional por essa partição
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0
Quando adicionar discos ao vdev existente não é uma opção, como no RAID-Z, um método alternativo é adicionar outro vdev ao pool. A adição de vdevs fornece maior desempenho ao distribuir as gravações nos vdevs. Cada vdev fornece sua própria redundância. A mistura de tipos vdev como mirror(espelho) e RAID-Z é possível, mas desencorajado. Adicionar um vdev não redundante a um pool contendo mirror ou vdevs RAID-Z arrisca os dados em todo o pool. A distribuição de gravações significa que uma falha do disco não redundante resultará na perda de uma fração de cada bloco gravado no pool.
ZFS distribui(stripe) os dados em cada um dos vdevs. Por exemplo, com dois vdevs espelhados(mirrored), isso é efetivamente um RAID 10 que distribui as gravações em dois conjuntos de espelhos. O ZFS aloca espaço para que cada vdev atinja 100% de capacidade ao mesmo tempo. Ter vdevs com diferentes quantidades de espaço livre diminuirá o desempenho, pois mais gravações de dados vão para o vdev menos cheio.
Ao conectar novos dispositivos a um pool de inicialização, lembre-se de atualizar o código de inicialização(bootcode). Essa é aquele último comando que mostrei logo acima e que disse que só seria necessário se o sistema operacional inicia em uma partição com ZFS.
Vamos adicionar um segundo disco. Antes vejamos o status
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: resilvered 178K in 00:00:01 with 0 errors on Tue Aug 15 10:31:10 2023 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors
Agora, como meuPool está como espelhado(mirror) faço a seguinte forma a adição para adicionar o grupo espelho sdd e sde
[root@oraclelinux92 ~]# zpool add meuPool mirror sdd sde
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: resilvered 178K in 00:00:01 with 0 errors on Tue Aug 15 10:31:10 2023 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
No cenário do passo a passo em docs.freebsd foi executado zpool add mypool mirror ada2p3 ada3p3 e em seguida os comandos abaixo para definir bootcode:
- gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada2
- gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
em nosso ambiente de testes o bootcode não é necessário.
A remoção de vdevs de um pool é impossível e a remoção de discos de um espelho é exclusiva se houver redundância restante suficiente. Se um único disco permanecer em um grupo de espelhos, esse grupo deixará de ser um espelho e se tornará um stripe, arriscando todo o pool se o disco restante falhar.
Removerei um disco de um grupo de espelhos com:
[root@oraclelinux92 ~]# zpool detach meuPool sdb
Veja,
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: resilvered 178K in 00:00:01 with 0 errors on Tue Aug 15 10:31:10 2023 remove: Removal of vdev 3 copied 15K in 0h0m, completed on Tue Aug 15 12:19:52 2023 120 memory used for removed device mappings config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 sdc ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
Para anexar novamente o sdb junto com o sdc você deverá executar o comando abaixo mas prestando atenção em colocar o dispositivo que já existe(sdc) e logo após ele o novo(sdb) que será anexado.
[root@oraclelinux92 ~]# zpool attach meuPool sdc sdb
#1.3 Verificando o Status do Pool e Limpando Erros
1.3.1 Verificando o Status do Pool
O estado(status) do pool é importante. Se uma unidade ficar off-line ou o ZFS detectar um erro de leitura, gravação ou dechecksum(soma de verificação), a contagem de erros correspondente aumentará. O status mostra a configuração e o estado de cada dispositivo no pool e o estado de todo o pool. Ações a serem executadas e detalhes sobre o último scrub também são mostrados.
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: resilvered 419K in 00:00:01 with 0 errors on Tue Aug 15 12:21:51 2023 remove: Removal of vdev 3 copied 15K in 0h0m, completed on Tue Aug 15 12:19:52 2023 120 memory used for removed device mappings config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdc ONLINE 0 0 0 sdb ONLINE 0 0 0 mirror-1 ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 errors: No known data errors
1.3.2 Limpando Erros
Ao detectar um erro, o ZFS aumenta as contagens de erro de leitura, gravação ou checksum(soma de verificação). Limpa a mensagem de erro e redefine as contagens com o comando zpool clear mypool. Limpar o estado de erro pode ser importante para scripts automatizados que alertam o administrador quando o pool encontra um erro. Sem limpar os erros antigos, os scripts podem não relatar mais erros.
[root@oraclelinux92 ~]# zpool clear meuPool
1.4 Substituindo um Disco em funcionamento
Pode ser desejável substituir um disco por um disco diferente. Ao substituir um disco em funcionamento, o processo mantém o disco antigo online durante a substituição. O pool nunca entra em um estado degradado, reduzindo o risco de perda de dados. Executar zpool replace copia os dados do disco antigo para o novo. Após a conclusão da operação, o ZFS desconecta o disco antigo do arquivo vdev. Se o novo disco for maior que o antigo, pode ser possível aumentar o zpool usando o novo espaço.
Para substituir um dispositivo faça zpool replace meuPool disco-a-ser-substituído disco-novo
Por exemplo, se quisesse substituir o sde pelo sdf
[root@oraclelinux92 ~]# zpool replace meuPool sde sdf
1.5 Trabalhando com Falhas em Disco
Quando um disco em um pool falha, o vdev ao qual o disco pertence entra no estado degradado. Os dados ainda estão disponíveis, mas com desempenho reduzido porque o ZFS calcula os dados ausentes da redundância disponível. Para restaurar o vdev para um estado totalmente funcional, substitua o dispositivo físico com falha. O ZFS é então instruído a iniciar a operação de resilver. O ZFS recalcula os dados no dispositivo com falha a partir da redundância disponível e os grava no dispositivo de substituição. Após a conclusão, o vdev retorna ao status online.
Se o vdev não tiver nenhuma redundância ou se os dispositivos tiverem falhado e não houver redundância suficiente para compensar, o pool entrará no estado de falha. A menos que dispositivos suficientes possam se reconectar, o pool se torna inoperante, exigindo uma restauração de dados dos backups.
Ao substituir um disco com falha, o nome do disco com falha muda para o GUID do novo disco. Um novo parâmetro de nome para zpool replace não é necessário se o dispositivo de substituição tiver o mesmo nome de dispositivo.
Para testes, acabei destruindo o pool criado anteiormente e criei um novo contendo 2 discos espelhados,
[root@oraclelinux92 ~]# zpool destroy meuPool
[root@oraclelinux92 ~]# zpool create meuPool mirror sdb sdc
Vejamos o status
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 errors: No known data errors
Irei remover o disco sdc e veremos que o status ficará como degradado porque há redundância. Como estou usando o VirtualBox, coloquei o disco como hot-plug e desconectei pelo VirtualBox. Se você executar comandos como zpool detach meuPool sdb não dará certo. Veja: VirtualBox: O que é Hot-Plug nas Configurações de Disco?
Veja novamente o Status
[root@oraclelinux92 ~]# zpool status pool: meuPool state: DEGRADED status: One or more devices has been removed by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using zpool online' or replace the device with 'zpool replace'. scan: resilvered 345K in 00:00:01 with 0 errors on Wed Aug 16 13:40:55 2023 config: NAME STATE READ WRITE CKSUM meuPool DEGRADED 0 0 0 mirror-0 DEGRADED 0 0 0 sdc REMOVED 0 0 0 sdb ONLINE 0 0 0 errors: No known data errors
Agora, vamos subsituir sdc que foi removido por sdd
[root@oraclelinux92 ~]# zpool replace meuPool sdc sdd
Se você executar zpool status verá que estará sdd no lugar de sdc
1.6 Aplicando Scrub no Pool
Scrub vem de esfregar ou limpar e pool, como já sabemos, vem de piscina. Rotineiramente é sempre bom fazer uma limpeza através da opção scrub do zpool. Pelo menos uma vez por mês é bom fazer aplicar um scrub. A operação de limpeza com scrub é intensiva e reduzirá o desempenho durante a execução. Evite períodos de alta demanda ao agendar a depuração ou use vfs.zfs.scrub_delay para ajustar a prioridade relativa da depuração para evitar que reduza a velocidade de outras cargas de trabalho.
1.6.1 Realizando Scrub
Execute zpool scrub meuPool para realizar a limpeza
[root@oraclelinux92 ~]# zpool scrub meuPool
Podemos ver no status do zpool o progresso ou quando foi realizado o último scrub.
[root@oraclelinux92 ~]# zpool status pool: meuPool state: ONLINE scan: scrub repaired 0B in 00:00:01 with 0 errors on Thu Aug 17 12:12:38 2023 config: NAME STATE READ WRITE CKSUM meuPool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 sdb ONLINE 0 0 0 sdd ONLINE 0 0 0 errors: No known data errors
1.6.2 Parando o scrub
Para cancelar uma operação de limpeza, se necessário, execute zpool scrub -s meuPool.
[root@oraclelinux92 ~]# zpool scrub -s meuPool
1.7 Self-Healing ou autorrecuperação
Os checksums armazenadas com blocos de dados permitem que o sistema de arquivos se autorrecupere. Este recurso irá reparar automaticamente os dados cujo checksum não coincida com o registrado em outro dispositivo que faz parte do pool de armazenamento. Por exemplo, uma configuração espelhada com dois discos em que uma unidade está começando a funcionar mal e não pode mais armazenar os dados adequadamente. Isso é pior quando os dados não foram acessados por um longo período, como no armazenamento de arquivos de longo prazo. Os sistemas de arquivos tradicionais precisam executar comandos que verificam e reparam os dados como fsck(8). Esses comandos levam tempo e, em casos graves, um administrador precisa decidir qual operação de reparo executar. Quando o ZFS detecta um bloco de dados com um checksum incompatível, ele tenta ler os dados do disco espelhado. Se esse disco puder fornecer os dados corretos, o ZFS os fornecerá ao aplicativo e corrigirá os dados no disco com o checksum incorreto. Isso acontece sem qualquer interação de um administrador do sistema durante a operação normal do pool.
Um pool que consiste em um único dispositivo não tem recursos de autocorreção. Um pool que consiste em um único dispositivo não tem recursos de autocorreção. ZFS não requer fsck(8) ou programa de verificação de consistência do sistema de arquivos semelhante para detectar e corrigir isso e mantém o pool disponível enquanto há um problema.
Conclusão do meu post “usando comandos ZFS para gerenciar discos”
Nesse post denominado “usando comandos ZFS para gerenciar discos” vimos os principais comandos ZFS para termos uma gerência e boa administração dessa parte de infra que todo admin uma vez ou outra necessitará manusear.
Fontes: docs.freebsd
Veja também:
- Vendo Informações do Sistema pelo CMD ou PowerShell
- Calcule Online Capacidade do RAID que Planeja Criar
- Windows: Redundância de Discos no Windows Usando “Espaços de Armazenamento”
- Windows: Redundância de Discos Usando o “Gerenciador de Discos”
- O que É AHCI e NVMe em Informática?
- DRBD: Introdução ao DRBD(Sistema de armazenamento replicado distribuído) – Artigo 001
- Tipos de Raids em Discos: Linear, RAID 0, RAID 1, RAID 5, RAID 4, RAID 5, RAID 6 e RAID 10
Comment on “Usando Comandos ZFS para Gerenciar Discos”