FreeBSD 7 – GEOM + ZFS
FreeBSD 7
GEOM + ZFS
Truques com Discos usando o GEOM & O poderoso sistema de arquivos da SUN, o ZFS Serviço Técnico de Informática Faculdade de Ciências e Letras do Campus de Araraquara Universidade Estadual Paulista – Júlio de Mequita Filho FreeBSD 7 – GEOM + ZFS
Hardware VS. Software RAID Um dos maiores requisitos quanto se deve armazenar dados importantes é a utilização de RAID, ou Redundant Array of Independed Disks – Conjunto Redundante de Discos Independentes. O FreeBSD suporta tanto RAID por Hardware como por Software. RAID por Hardware é gerenciado por uma controladora SCSI, e por adaptadores que provêem RAID chamados Controladores RAID. A maioria dos sistemas de RAID via Hardware são muito estáveis, e normalmente a maneira mais eficiente de gerenciar um RAID. O problema com o RAID por Hardware é que diferentes controladoras gravam dados nos discos em formatos diferentes. Se sua controladora apresentar problemas, você não poderá trocá‐la por uma controladora diferente, ela poderá não reconhecer os dados nos discos. Então você sempre terá que ter a sua disposição uma controladora idêntica no caso de uma falha. O RAID por Software é gerenciado pelo Sistema Operacional, o qual decide como deve ser armazenado os dados nos discos. Comparado com o RAID por Hardware, este método apresenta um pequeno aumento na carga do sistema, mas requer equipamentos mais baratos. E você não corre o risco de perder seus dados por não encontrar uma controladora identifica quando houver algum problema. FreeBSD 7 – GEOM + ZFS
GEOM – Modular Disk Transformation Framework GEOM STRIPE – RAID 0 O gstripe(8) é utilizado para fazer RAID 0 entre dois ou mais disco. O RAID 0 conhecido como, Striping, é um método utilizado para combinar alguns discos em um único grande volume. Na grande maioria das vezes isto é feito através de uma controladora, porém o gstripe(8) permite o que o mesmo seja feito via software. A gravação é feita como se todos os discos que formam o array fossem somente um, por exemplo, em uma gravação, os dados serão distribuídos por todos os discos do RAID, se um arquivo de 265k for gravado em um RAID 0 de 4 discos, o dado será dividido em quatro partes de 64k que serão gravadas uma em cada disco. Assim aumentando a velocidade de I/O e o tamanho de uma unidade. Utlizando Para utilizar o gstripe(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_STRIPE FreeBSD 7 – GEOM + ZFS
Outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /boot/loader.conf geom_stripe_load="YES" Ou então, podemos ativar o gstripe(8) temporáriamente carregando o modulo do kernel: # kldload geom_stripe Utilizando o gstripe O primeiro argumento do gstripe(8) diz a ação que ele deve tomar. Vamos ver eles abaixo: •
create Esta opção tem a sintaxe mínima "gstripe create nome dispositivo1 dispositivo2" onde “nome” é o nome do novo dispositivo que será armazenado em /dev/stripe e dispositivosX são os dispositivos de armazenamento que serão utilizados. Este é o modo manual de criar uma configuração, isto é, cada vez que você deseja criar o dispositivo, você terá que executar o gstripe(8). Se o módulo geom_stripe.ko não estiver sido carregado, ele será carregado. Esta opção aceita algumas flags que veremos abaixo: ­s stripesize Especifica o tamanho do bloco em que as informações serão divididas, o número deve ser um múltiplo do maior setor de todos os discos. Vamos ver um exemplo abaixo, para criarmos o diretório /home. Vamos criar o dispositivo, criar o sistema de arquivos e montar. # gstripe create st0 /dev/da0 /dev/da1
NOTA: Os discos ou partições devem ter o mesmo amanho! FreeBSD 7 – GEOM + ZFS
•
label Esta é a maneira automática de criar um dispositivo. A sintaxe é a mesma do create, somente alterando o create para o label. Neste caso, a flag ­s também é aceita. Deste modo, depois que o dispositivo é criado, as informações serão reconhecidas automaticamente pelo sistema, assim é possível adicionar uma entrada no fstab com o dispositivo criado, neste caso o /dev/stripe/st0. # gstripe label st0 /dev/da0 /dev/da1 # bsdlabel ­wB /dev/stripe/st0 # newfs /dev/stripe/st0a # mount /dev/stripe/st0a /home Para adicionar uma entrada para este dispositivo no fstab, para montar em /home, adicione a seguinte linha no /etc/fstab: # echo /dev/stripe/st0a /home ufs rw 2 2 >> /etc/fstab •
stop Desliga um array, esta opção deve ser seguida pelo nome do array a ser desligado, este comando não mexe nos meta dados do array. # gstripe stop st0 •
clear Limpa os meta dados de um dos dispositivos que formam o array. # gstripe clear /dev/da0 •
dump Cria um backup dos meta‐dados do array. # gstripe dump /dev/da0 FreeBSD 7 – GEOM + ZFS
GEOM MIRROR – RAID 1 RAID 1 ou Mirroring (Espelhamento) é uma técnica utilizada para fazer redundância de discos, isto é, manter dois discos iguais, assim se um vier a falhar o outro estará pronto para assumir o seu lugar. Na prática, por exemplo, seria ter dois HDs A e B, iguais, sendo que só utilizaremos o espaço de um, no caso o de A, quando utilizamos o RAID1 tudo o que é gravado no disco A será também gravado no disco B, assim se o A parar o B assume seu lugar, como se nada tivesse acontecido. O gmirror(8) permite fazer espelhamento tanto de um disco inteiro quando de uma partição ou slice. Depois que as unidades forem espelhadas, todos os componentes são detectados e configurados automaticamente, a sincronização de dados também. Para isto os meta‐
dados (informações sobre o espelhamento) sempre serão armazenados em disco. Utilizando Para utilizar o gmirror(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_MIRROR Outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /boot/loader.conf: geom_mirror_load="YES” Ou então, podemos ativar o gmirror(8) temporáriamente carregando o modulo do kernel: # kldload geom_mirror Utilizando o gmirror O primeiro argumento do gmirror(8) diz a ação que ele deve tomar. Vamos ver eles abaixo: FreeBSD 7 – GEOM + ZFS
•
label Cria um espelhamento, e tem a sintaxe "gmirror label [‐hnv] [‐b Algoritimo] [‐s slice] nome dispositivo ...", pode‐se colocar um ou mais dispositivos. A ordem em que os nomes dos dispositivos são especificados é importante, pois, a prioridade dos componentes é baseada nesta ordem. Quando um dispositivo é criado, ele ficará acessível no diretório /dev/mirror/nome. Vamos ver abaixo as flags disponíveis para este comando. ­b algoritmo Especifica o algoritmo de balanceamento, sendo um dos algoritmos abaixo: load Executa operações de leitura do componente com menor carga prefer Executa operações de leitura do componente com maior prioridade. round­robin Utiliza um algoritmo circular para escolher de onde ler. split Divide as requisições entre os discos, este é o padrão. ­n Desativa a auto sincronização de componentes "envelhecidos" ­s tamanho Quando utilizando o algoritmo de balanceamento split, e uma requisição de leitura for maior ou igual ao "Tamanho" especificado aqui, a leitura no disco será dividida em parte do tamanho de "Tamanho" e cada parte será lida de um disco diferente. Vejamos abaixo um exemplo, iremos fazer o espelhamento em dois discos, na instalação do FreeBSD. Iremos utilizar dois discos iguais, localizados em /dev/da0 e /dev/da1, como podemos ver, os dois são SCSI. Iremos instalar o FreeBSD no disco da0. A configuração será feita durante a FreeBSD 7 – GEOM + ZFS
instalação do sistema. Após instalar e configurar o sistema, não reinicie, vá para um terminal que foi aberto com Alt+F4. Quando entramos neste terminal, normalmente executamos o tcsh, mas vamos ao que interessa, vamos criar o mirror com o algoritmo round‐robin e nomeá‐lo como gm0. OBS: O primeiro comando é só um ajuste para possibilitar a criação do mirror, o comando que realmente cria o mirror é o segundo. # sysctl kern.geom.debugflags=16 # gmirror label ­v ­b round­robin gm0 /dev/da0 Para tudo funcionar, devemos habilitar o suporte ao gmirror no kernel, aqui optaremos por carregar o módulo durante a inicialização, mais tarde, se você preferir, pode compilá‐lo estaticamente no kernel. Para isto execute o seguinte comando: # echo geom_mirror_load="YES" > /boot/loader.conf Agora o dispositivo será reconhecido durante a inicialização do sistema automaticamente. Agora vamos ajustar nosso fstab para utilizar o dispositivo. Os nossos discos e partições agora devem se acessados dentro do diretório /dev/mirror/, em nosso caso, /dev/mirrot/gm0[...]. Edite o seu /etc/fstab substituindo o /dev/da0... por /dev/mirror/gm0..., por exemplo: O arquivo antigo: /dev/da0s2b none swap sw 0 0 /dev/da0s3a / ufs rw 1 1 Ficará: /dev/mirror/gs0s2b none swap sw 0 0 /dev/mirror/gs0s3a / ufs rw 1 1 Pronto, agora volte para o sysinstall apertando em Alt+F1, e reinicie o computador. (Calma não terminamos ainda, mas antes de terminarmos devemos ver mais algumas opções.) FreeBSD 7 – GEOM + ZFS
•
insert Esta opção tem a sintax “gmirror insert [‐hiv] [‐p priority] name prov” ... e serve para adicionar mais um disco ao espelhamento. Depois de inserido o novo disco no RAID 1 ele é sincronizado com os outros disco. As possíveis flags são: ­h Grava o de forma fixa o nome do provider nos meta dados ­i Marca o componente inativo após a sincronização ­p priority Especifica a prioridade do novo componente Agora iremos continuar o nosso exemplo, Após reiniciar o computador, durante a inicialização, antes da checagem de disco, as seguintes linhas provavelmente apareceram na sua tela. GEOM_MIRROR: Device gm0 created (id=2125638583). GEOM_MIRROR: Device gm0: provider da0 detected. GEOM_MIRROR: Device gm0: provider da0 activated. GEOM_MIRROR: Device gm0: provider mirror/gm0 launched. GEOM_MIRROR: Device gm0 already configured. Mounting root from ufs:/dev/mirror/gm0s1a Isto nos mostra que o dispositivo foi reconhecido. Se estas mensagens apareceram e o sistema iniciou, vamos continuar nosso exemplo e criarmos efetivamente o nosso RAID 1. Para isto abra um terminal como root e execute o seguinte comando: # gmirror insert gm0 /dev/da1 GEOM_MIRROR: Device gm0: provider da1 detected. GEOM_MIRROR: Device gm0: rebuilding provider da1. FreeBSD 7 – GEOM + ZFS
Agora temos o RAID 1, o comando acima inseriu o dispositivo /dev/da1 no RAID e a partir de agora os dados entre os dois discos serão sincronizados e eles começarão trabalhar em conjunto. Para ver como está a sincronização execute: # gmirror list Este comando trará a saída de status dos discos. •
clear Esta opção tem a sintax “gmirror clear dispositivo” dispositivo, limpa os meta dados do dispositivo, assim todas as informações "sobre" o mirror são apagadas de um disco, por exemplo. # gmirror clear /dev/da0 Irá limpar as informações do mirror do dispositivo /dev/da0. •
configure Esta opção tem a sintax “gmirror configure [‐adhnv] [‐b balance] [‐s slice] name” e tem como configurar ou reconfigurar um dispositivo. Por exemplo, troca o algoritmo de balanceamento. Veremos abaixo algumas das possíveis flags: ­a Liga a auto sincronização dos discos com dados "envelhecidos", por exemplo, se um disco "cair" e voltar ele será sincronizado automaticamente. ­b Altera o algoritmo de balanceamento. ­d Não grava o de forma fixa o nome do provider nos meta dados ­h Grava o de forma fixa o nome do provider nos meta dados FreeBSD 7 – GEOM + ZFS
­n Desliga a auto sincronização dos discos com dados "envelhecidos", por exemplo, se um disco "cair" e voltar ele será sincronizado automaticamente. ­s slice Especifica o tamanho do bloco que as informações serão divididas no algoritmo de balanceamento split. Esta função pode ser utilizada com o nosso exemplo acima. No exemplo o algoritmo utilizado foi o round‐robin, com o configure poderemos altera‐
lo para o split, como no exemplo abaixo: # gmirror configure ­b split gm0 •
rebuild Esta opção tem a sintax “gmirror rebuild [‐v] name prov ...” E serve para recarregar o espelhamento, ele só tem motivo para ser utilizado, se a sincronização de algum dispositivo foi desligada. Vamos ver o exemplo, se o disco /dev/da1 foi desconectado do RAID por algum motivo, e ele voltar depois, o comando rebuild irá fazer a sincronização dos dados, como no exemplo abaixo. # gmirror rebuild gm0 /dev/da1 •
remove Esta opção tem a sintax “gmirror remove [‐v] nome disco ...” e serve para remover um componente do mirror e limpar seus meta dados. Como exemplo, iremos retirar o disco /dev/da1 do nosso RAID: # gmirror remove gm0 da1 FreeBSD 7 – GEOM + ZFS
•
deactivate Esta opção tem a sintaxe “gmirror deactivate [‐v] name prov ...” e serve para desativar um componente, assim, ele não será automaticamente reconhecido quando ligado ao sistema. Como exemplo, vamos desativar o dispositivo /dev/da1 do nosso exemplo: # gmirror deactivate gm0 da1 •
activate Esta opção tem a sintaxe “gmirror activate [‐v] nome disco ...” e serve para ativar um componente que foi desativado anteriormente. Como exemplo, vamos reativar o dispositivo /dev/da1 do nosso exemplo: # gmirror activate gm0 da1 A partir deste momento os dados dos dois discos serão sincronizados. •
forget Esta opção tem a sintaxe “gmirror forget” nome e serve para esquecer os componentes que não estão conectados. Por exemplo, se desconectarmos o da1, poderemos utilizar o forget. Como no exemplo abaixo: # gmirror deactivate gm0 da1 # gmirror forget gm0 # gmirror activar gm0 da1 GEOM_MIRROR: Cannot add disk da1 to gm0 Como podemos ver o dispositivo da1 não pode mais ser ligado ao gm0, para ele ser inserido novamente no RAID, a opção insert deve ser utilizada. FreeBSD 7 – GEOM + ZFS
•
stop Esta opção tem a sintaxe “gmirror stop nome” e serve para parar um dispositivo, por exemplo, antes do dispositivo ser retirado. Esta opção ainda possui a flag ­f que serve para forçar a parada do dispositivo. Como exemplo vamos parar o nosso dispositivo de exemplo, claro que para pará‐lo devemos forçar a saída, para isto utilize a flag –f: # gmirror stop –f gm0 Se você está executando os mesmos exemplos, o seu sistema acabou de reiniciar! •
dump Esta opção tem a sintaxe “gmirror dump disco” e serve para fazer um "dump" dos meta dados do disco. Exemplo: # gmirror dump /dev/dad1 FreeBSD 7 – GEOM + ZFS
GEOM CONCAT – JBOD – O concatenador de discos O gconcat(8) serve para concatenar discos (JBOD – Just a Bunch of Disks), isto é, juntar dois discos relativamente pequenos e formar um grande disco. Isto é muito útil quando se precisa de um grande volume, e isto também entra no nível de RAID 0, só que sem as questões de striping, isto é, os dados não ficarão divididos paralelamente nos dois discos. Esta forma é uma das mais simples de se utilizar o geom(4). Outro beneficio deste método, é que pode se utilizar discos de tamanhos diferentes. Utilizando Para utilizar o gconcat(8), precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_CONCAT Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /boot/loader.conf: geom_concat_load="YES" Ou então, podemos ativar o gconcat(8) temporáriamente carregando o modulo do kernel: # kldload geom_concat Utilizando o gconcat A concatenação de discos pode ser feita de duas maneiras, de forma manual, onde todas as vezes que um disco concatenado for utilizado ele deve ser criado, ou de forma automática, onde todas as configurações do concatenamento ficarão gravadas em meta dados nos discos, assim, toda vês que o disco for conectado ao sistema ele será reconhecido automaticamente. Abaixo veremos como fazer estas duas formas. Após concatenado o dispositivo ficará acessível dentro do diretório /dev/concat/$Nome onde Nome é o $Nome do dispositivo. O primeiro argumento do gconcat(8) diz a ação que ele deve tomar. Vamos ver eles abaixo. FreeBSD 7 – GEOM + ZFS
•
create Esta opção tem a sintaxe “gconcat create [‐v] nome disco disco...”, e esta é a forma manual de se criar um disco concatenado. Como exemplo iremos concatenar dois disco, /dev/da0 com 4 Gb e /dev/da1 com 10 Gb, logo após iremos criar o novo sistema de arquivos e montar sobre o diretório /mnt: # gconcat create gc0 /dev/da0 /dev/da1 # newfs /dev/concat/gc0 # mount /dev/concat/gc0 /mnt •
label Esta opção tem a sintaxe “gconcat label [‐v] nome disco disco...”, e esta é a forma automática de se criar um disco concatenado. Iremos fazer o mesmo exemplo acima, porém iremos criar de forma automática e adicionarmos a entrada no /etc/fstab: # gconcat label gc0 /dev/da0 /dev/da1 # newfs /dev/concat/gc0 # echo /dev/concat/gc0 /mnt ufs rw 2 2 >> /etc/fstab •
stop Esta opção tem a sintaxe “gconcat stop [‐fv] nome” e serve para parar um disco concatenado. A flag ­f serve para forçar a parada, como exemplo, vamos parar o nosso exemplo: # gconcat stop gc0 •
clear Esta opção tem a sintaxe “gconcat clear [‐v] disco” e serve para remover os meta dados de um dos discos, como por exemplo, iremos utilizar‐lo com o disco /dev/da1: # gconcat clear /dev/da1 FreeBSD 7 – GEOM + ZFS
•
dump Esta opção tem a sintaxe “gconcat dump disco” e serve para fazer um "dump" dos metas dados do disco. Exemplo: # gconcat dump /dev/da1 FreeBSD 7 – GEOM + ZFS
GEOM GATE – Exportando e importando dispositivos via rede O GEOM GATE é composto de duas ferramentas: o ggatec(8) e o ggated(8), que fazem possíveis a exportação e importação de dispositivos de armazenamento via rede. O ggated(8) é o servidor, ele ficará no computador que contém o dispositivo real, já o ggatec(8) ficará do lado do cliente e será responsável por criar o dispositivo no cliente. Bom mas qual a vantagem do GEOM GATE sobre o NFS? O NFS não cria um dispositivo na maquina cliente, assim é impossível aplicar as outras regras do GEOM sobre NFS, como exemplo, com o GEOM GATE é possível criar RAID 1 em rede, ou até mesmo utilizar um disco remoto em um pool do ZFS. Para este exemplo ficar "rico" iremos exportar via rede o dispositivo de JBOD que criamos no exemplo anterior, porém ele pode ser feito com qualquer dispositivo. ggated(8) – O servidor de dispositivos O ggated(8) é responsável pelo lado do servidor do GEOM GATE, basicamente ele lê um arquivo de configuração, que por padrão é /etc/gg.exports. Este arquivo tem uma sintaxe simples, são basicamente três colunas, descritas abaixo: EndereçoDoCliente
Acesso
Dispositivo Local
Em endereço do cliente podemos colocar o nome do computador, um endereço de IP ou “endereço de rede/Mascara da rede”, em “Acesso” temos três opções, RW para Leitura e Escrita, RO para Somente Leitura e WO para Somente Escrita, e para o dispositivo é o caminho do dispositivo como /dev/da0s1d. O arquivo pode ter quantas entradas for necessário. Para nosso exemplo, onde exportaremos o dispositivo /dev/concat/gc0 utilizaremos o seguinte arquivo. 10.0.0.0/8
RW
/dev/concat/gc0
Agora é só executarmos o ggated(8) e está pronto, o ggate por padrão utiliza a porta 3080 tcp de todas as suas interfaces. Esta porta deve ser liberada em seu firewall, ou protegida, como desejar. # ggated # echo $? 0 # FreeBSD 7 – GEOM + ZFS
No exemplo acima vimos que o ggated(8) retornou 0, então ele está funcionando corretamente, caso ele retorne 1, um erro ocorreu, e provavelmente seja o arquivo de configuração ou a porta já esteja em uso, provavelmente por outro processo do ggated(8). O ggate(8) possui algumas flags, veremos elas abaixo: ­a endereço Especifica o endereço para escutar as conexões ­n Não utiliza TCP_NODELAY ­p porta A porta que ele irá escutar conexões. ­R rcvbuf Tamanho do buffer de recebimeto. O padrão é 131072 (128kB). ­S sndbuf Tamanho do buffer de envio. O padrão é 131072 (128kB). ­v Executa em primeiro plano, assim exibindo informações de debug na saída padrão Considerações: Os dispositivos exportados não podem ser montados localmente, e a velocidade dos dispositivos importados nos clientes ficará reduzida pela conexão de rede e pelo geom gate utilizar TCP, as conexões não são criptografadas! Nota: é possível manter apenas uma única conexão simultânea com o GEOM GATE. ggatec(8) – O cliente de dispositivos O ggatec(8), como dito anteriormente é o cliente do ggated(8). Ele tem uma sintaxe mais parecida com as outras opções do GEOM. Ele precisa de um servidor ggated(8) para se conectar. Os dispositivos criados pelo ggatec(8) ficarão sobre o diretório /dev/ggate# onde # é o número do dispositivo, iniciando de 0. FreeBSD 7 – GEOM + ZFS
Utilizando Para utilizar o ggatec(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_GATE Outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /boot/loader.conf: geom_gate_load="YES" Ou então, podemos ativar o ggatec(8) temporariamente carregando o modulo do kernel: # kldload geom_gate Utilizando o ggatec O primeiro argumento do ggatec(8) diz a ação que ele deve tomar. Vamos ver eles abaixo: •
create Esta opção tem a sintaxe “ggatec create Servidor Dispositivo”, basicamente ela cria o dispositivo /dev/ggate0 se este for o primeiro dispositivo montado, caso não seja, o valor 0 vai ser incrementado em um. Esta opção possui várias flags, as veremos abaixo: ­n Não utiliza TCP_NODELAY ­v Em modo verbose ­o ro | wo | rw O modo de Montagem, respectivamente, Somente Leitura, Somente Escrita e Leitura e Escrita. ­p porta A porta que o servidor está escutando FreeBSD 7 – GEOM + ZFS
­q queue_size Tamanho da fila de requisições de I/O que podem ser enfileiradas ­R rcvbuf Tamanho do buffer de recebimento. O padrão é o do servidor. ­S sndbuf Tamanho do buffer de envio. O padrão é o do servidor. ­s sectorsize Tamanho do setor, caso não seja especificado o valor padrão de 512k vai ser utiliziado ­t timeout Tempo de Timeout, por padrão 0, que significa timeout infinito ­u unit Especifica o número da Unidade, aquele número do dispositivo /dev/ggateNumero Como exemplo vamos criar o dispositivo do exemplo do ggated(8), e monta‐lo em /mnt: # ggatec create 10.0.13.146 /dev/concat/gc0 # mount /dev/ggate0 /mnt •
rescue Esta opção tem a sintaxe mínima “ggatec rescue ‐u NumeroDoDispositivo Servidor Dispositivo” e serve para recuperar um dispositivo que foi perdido, por exemplo em uma falha na rede. Esta opção aceita as flags ­n, ­v, ­o, ­p, ­R e ­S descritas anteriormente. Como exemplo, suponhamos a rede caiu e o dispositivo anterior foi perdido, para recuperarmos, executaremos o exemplo abaixo. # ggatec rescue ­u 0 10.0.13.146 /dev/raid3/gr0 FreeBSD 7 – GEOM + ZFS
•
destroy Esta opção tem a sintaxe “ggatec destroy ‐u NumeroDaUnidade” e serve para destruir uma unidade. Esta opção conta com a flag ­f que serve para forças a destruição do dispositivo. Por exemplo, vamos destruir o exemplo que construímos, como ele está montado sobre /mnt vamos forçar sua destruição. # ggatec destroy ­u 0 ­f •
list Esta opção tem a sintaxe “ggatec list” e serve para mostrar os dispositivos montados, porem se utilizado a opção ­u mostra somente o dispositivo e a opção –v traz em modo verbose. Como exemplo vamos exibir as informações sobre o dispositivo numero 0. # ggatec list ­v ­u 0 NAME: ggate0
info: 10.0.13.146:3080 /dev/concat/gc0
access: read-write
timeout: 0
queue_count: 0
queue_size: 1024
references: 1
mediasize: 4008393728 (3.7G)
sectorsize: 1024
mode: r0w0e0
FreeBSD 7 – GEOM + ZFS
ZFS – O poderoso sistema de arquivos da SUN Notas sobre o ZFS Devido a maneira como o ZFS foi implementado (também no Solaris) ele requer uma grande quantidade de memória para funcionar adequadamente, e no FreeBSD ele utiliza o espaço de memória do Kernel, o qual normalmente é bem reduzido comparado a memória total do sistema. Então devemos realizar algumas otimizações para que o ZFS funcione adequadamente, e também é altamente recomendável que seja utilizada uma plataforma de 64 bits, apesar do ZFS também funcionar em 32 bits. Por padrão, o espaço de endereçamento de memória reservado para o kernel é de no máximo 300Mb, o que é muito baixo para o ZFS. Se você manter este padrão, eventualmente você receberá um kernel panic com a seguinda mensagem no /var/log/messages: Apr
7 21:09:07 nas savecore: reboot after panic: kmem_malloc(114688): kmem
_map too small: 324825088 total allocated Para aumentar este valor, acrescente as duas linhas baixo em seu /boot/loader.conf (em um sistema com no mínimo 4Gb de RAM): vm.kmem_size="1536M"
vm.kmem_size_max="1536M"
E para melhorar a performance você pode aumentar o valor do “kern.maxvnodes” (/etc/sysctl.conf) se você tiver bastante RAM para isto (ex. 400000 para 2GB). E monitore o valor de vfs.numvnodes durante produção para ver se ele se estabiliza. FreeBSD 7 – GEOM + ZFS
Você pode utilizar o script abaixo em seu periodic para monitor o uso da memória do Kernel: #!/bin/sh -
TEXT=`kldstat | tr a-f A-F | awk 'BEGIN {print "ibase=16"}; NR > 1
{print $4}' | bc | awk '{a+=$1}; END {print a}'`
DATA=`vmstat -m | sed 's/K//' | awk '{a+=$3}; END {print a*1024}'`
TOTAL=`echo $DATA $TEXT | awk '{print $1+$2}'`
echo Summarize of kernel memory utilization:
echo "
TEXT = $TEXT, "`echo $TEXT | awk '{print $1/1048576 " MB"}'`
echo "
DATA = $DATA, "`echo $DATA | awk '{print $1/1048576 " MB"}'`
echo "
TOTAL = $TOTAL, "`echo $TOTAL | awk '{print $1/1048576 " MB"}'`
FreeBSD 7 – GEOM + ZFS
Usando o ZFS Antes de tudo, devemos habilitar o ZFS na inicialização do sistema, para isso, acrescente a linha abaixo em seu /etc/rc.conf: zfs_enable=”YES” Agora quando o FreeBSD for inicializado, esta mensagem será apresentada: This module (opensolaris) contains code covered by the Common Development and Distribution License (CDDL) see http://opensolaris.org/os/licensing/opensolaris_license/ WARNING: ZFS is considered to be an experimental feature in FreeBSD. ZFS filesystem version 6 ZFS storage pool version 6 Apesar do ZFS ser experimental no FreeBSD, ele já foi amplamente testado, e e já é muito utilizado. Agora podemos começar a testar os recursos oferecidos pelo ZFS. Criado um POOL de discos Para criar um pool de discos, um simples comando basta: zpool create datastore [tipo] /dev/da0 /dev/da1 /dev/da2 /dev/da3 datastore será o nome do nosso pool. tipo é o tipo de pool que será criado. Ele é opcional, e os tipos existentes são: nenhum – JBOD – igualmente o que já foi citado anteriormente no GEOM mirror – O mesmo que o GEOM MIRROR ou RAID 1 raidz – Uma implementação melhorada do RAID 5 raidz2 – O mesmo que o raidz, porém este utiliza 2 discos como paridade. spare – Discos de reserva, deixados disponíveis para quando for preciso um novo disco (no caso da falha de algum em uso) FreeBSD 7 – GEOM + ZFS
ZPOOL MIRROR Para criarmos uma redundância do tipo RAID 1 utilizando o ZFS e 4 discos SCSI usamos os comandos: zpool create datastore mirror /dev/da0 /dev/da1 /dev/da2 /dev/da3 ZPOOL RAIDZ Utilizando o RAIDZ ganhamos bastante em performance e em redundância de disco. Com os mesmos 4 discos SCSI, utilizamos os comandos: zpool create datastore raidz /dev/da0 /dev/da1 /dev/da2 /dev/da3 Como o RAIDZ é baseado em RAID 5, a utilização de discos é muito semelhante, devemos ter no mínimo 3 discos, e é recomendável no máximo 9 discos por POOL. Mas o que podemos fazer quando temos mais do que 9 discos, por exemplo 15 discos? Criamos 3 pools de raidz dentro de 1 pool normal (JBOD) Para isso: zpool create datastore raidz /dev/da0 /dev/da1 /dev/da2 /dev/da3 /dev/da4 raidz /dev/da5 /dev/da6 /dev/da7 /dev/da8 /dev/da9 raidz /dev/da10 /dev/da11 /dev/da12 /dev/da13 /dev/da14 FreeBSD 7 – GEOM + ZFS
Podemos visualizar o array da seguinte forma: # zpool status pool: datastore state: ONLINE scrub: none requested config: NAME STATE READ WRITE CKSUM datastore ONLINE 0 0 0 raidz ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 da3 ONLINE 0 0 0 da4 ONLINE 0 0 0 raidz ONLINE 0 0 0 da5 ONLINE 0 0 0 da6 ONLINE 0 0 0 da7 ONLINE 0 0 0 da8 ONLINE 0 0 0 da9 ONLINE 0 0 0 raidz ONLINE 0 0 0 da10 ONLINE 0 0 0 da11 ONLINE 0 0 0 da12 ONLINE 0 0 0 da13 ONLINE 0 0 0 da14 ONLINE 0 0 0 errors: No known data errors
O mesmo pode ser feito quando utilizamos discos de tamanhos diferentes, por exemplo, 4 discos SATA‐2 de 750Gb e 4 discos SATA‐2 de 1TB. Isso porque como no RAID 5, o RAIDZ exige que todos os discos do array sejam do mesmo tamanho. Podemos criar 2 arrays, cada um com os discos iguais, dentro de uma pool. FreeBSD 7 – GEOM + ZFS
Parâmetros do ZPOOL Além do “zpool create ...” outros parâmetros são aceitos, exemplo: •
add Adiciona um novo dispositivo ao pool especificado. Sintaxe “zpool add pool tipo dispositivo”. Exemplo: # zpool add datastore raidz /dev/da15 •
destroy Destrói o pool especificado. Este comando tenta desmontar todos os pontos de montagem dentro deste pool, e também libera os discos. Sintaxe “zpool destroy pool” Exemplo: # zpool destroy datastore •
list Lista os pools e a situação deles, assim como o espaço utilizado. Sintaxe: “zpool list” Exemplo: # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT datastore 2.72T 320G 2.41T 11% ONLINE ­ •
remove Remove o dispositivo especificado. Este comando, somente remove discos com “hot spare” ou que pertencem ao RAIDZ1 ou RAIDZ2. Para remover discos de um MIRROR, utilize: “zpool detach”. Sintaxe: “zpool remove pool dispositivo” Exemplo: # zpool remove datastore /dev/da15 FreeBSD 7 – GEOM + ZFS
•
iostat O parâmetro mais importante para se monitorar a performance do ZFS, este parametro exibe as estatísticas de entrada e saída do pool especificado. Se for especificado um intervalo de tempo, será exibido a estatística até que CTRL+C seja pressionado. Sintaxe: “zpool iostat [­v] [pool] [interval]” Exemplo: # zpool iostat capacity operations bandwidth pool used avail read write read write ­­­­­­­­­­ ­­­­­ ­­­­­ ­­­­­ ­­­­­ ­­­­­ ­­­­­ datastore 320G 2.41T 4 30 412K 532K •
status Exibe informações detalhadas sobre a situação do pool. Se nenhum pool for especificado, é exibido de todos os pools do sistema. Sintaxe: “zpool status [pool]” Um exemplo já foi mostrado anteriormente. •
offline Torna o dispositivo especificado offline. Enquanto um dispositivo estiver offline, nenhuma tentativa de leitura ou gravação será realizada para o mesmo. Sintaxe: “zpool offline [­t] pool dispositivo” A flag –t especifica que o modo offline é temporário, ou seja, até o próximo reboot. Exemplo: # zpool offline datastore /dev/da4 •
online Ative um dispositivo que foi desativado pelo comando offline. Sintaxe: “zpool online pool dispositivo” Exemplo: # zpool online datastore /dev/da4 FreeBSD 7 – GEOM + ZFS
•
clear Limpa as mensagens de erro em um pool. Se nenhum pool for especificado, todas as mensagens de erro serão limpas. Sintaxe: “zpool clear [pool] [dispositivo]” Exemplo: # zpool clear datastore /dev/da8 •
attach Anexa um novo dispositivo a um pool já existente. Sintaxe: “zpool attach pool dispositivo novo_dispositivo” Exemplo: # zpool attach datastore /dev/da4 /dev/da15 •
detach Remove o dispositivo especificado do pool. A operação não será realizada se não houver replica dos dados deste dispositivo. Sintaxe: “zpool detach pool dispositivo” Exemplo: # zpool detach datastore /dev/da15 •
replace Troca um dispositivo por um novo. Este parametro é equivalente a adicionar um novo dispositivo com attach, esperar a sincronização, e em seguinda remover o dispositivo antigo com detach. Sintaxe: “zpool replace [–f] pool dispositivo_antigo dispositivo_novo” Exemplo: # zpool replace datastore /dev/da4 /dev/da15 FreeBSD 7 – GEOM + ZFS
•
scrub Inicia uma normalização dos dados no pool. A normalização examina todos os dados no pool especificado para verificar se os checksums estão corretos. Para dados replicados (mirror ou raidz), o ZFS repara automaticamente qualquer inconsistência encontrada durante a normalização. O comando “zpool status” reporta o progresso da normalização e exibe um resultado da normalização quando esta terminar. Sintaxe: “zpool scrub [­s] pool” A flag –s para a normalização. Exemplo: # zpool scrub datastore •
history Exibe um historico de comandos do pool especificado. Sintaxe: “zpool history [pool]” Exemplo: # zpool history FreeBSD 7 – GEOM + ZFS
O comando ZFS Dentro do ZFS podemos criar novos pontos de montagem, snapshots, clones de snapshots, compartilhar via NFS, e comprimir pontos de montagem. Para isso utilizando o comando “zfs parametro ponto_de_montagem”. Vejamos abaixo alguns parâmetros aceitos pelo ZFS: •
create Cria um novo ponto de montagem dentro do pool. Sintaxe: “zfs create pool/ponto_de_montagem” Exemplo: # zfs create datastore/backups # df Filesystem Size Used Avail Capacity Mounted on datastore 1.8T 0B 1.8T 0% /datastore datastore/backups 1.8T 0B 1.8T 0% /datastore/backups •
set Através deste parâmetro, informamos várias opções para o ZFS. o compression Com o set compression, podemos definir níveis de compressão em um ponto de montagem, utilizando o GZip com 10 niveis de compressão (0 – nenhum, 9 – máximo). Sintaxe: “zfs set compression=gzip pool/ponto_de_montagem” Exemplo: # zfs set compression=gzip­9 datastore/backups o copies Se tivermos dados muito importantes, que desejamos ter várias copias espalhadas pelo pool, podemos definir atravez deste parametro. Sintaxe: “zfs set copies=quantidade pool/ponto_de_montagem” Exemplo: # zfs set copies=3 datastore/backups FreeBSD 7 – GEOM + ZFS
o checksum Com este parâmetro podemos desabilitar a verificação de integridade de dados (que é habilitada por padrão). Sintaxe: “zfs set checksum=off pool/ponto_de_montagem” Exemplo: # zfs set checksum=off datastore/backups o atime Com o atime, podemos desativar a marcação do horário de acesso a arquivos. Em certos cenários isso pode ser desejado. Sintaxe: “zfs set atime=off pool/ponto_de_montagem” Exemplo: # zfs set atime=off datastore/backups o sharenfs Quando queremos compartilhar um ponto de montagem através da rede, podemos usar este parâmetro. Sintaxe: “zfs set sharenfs=on pool/ponto_de_montagem” Ou: “zfs set sharenfs=“opções do nfs” pool/ponto_de_montagem” Exemplo: # zfs set sharenfs=“­maproot=root –alldirs –network 10.0.0.0” datastore/backups Para que o NFS funcione corretamente, o servidor deve estar ativado no /etc/rc.conf. Para isso adicione as linhas baixo: rpcbind_enable="YES" rpc_lockd_enable="YES" rpc_statd_enable="YES" nfs_server_enable="YES" Nota: com o compartilhamento via NFS do ZFS, não é necessário reiniciar o daemon do mountd quando um novo ponto de montagem for compartilhado ou deixar de ser compartilhado. FreeBSD 7 – GEOM + ZFS
Com o comando “mount” é possível ver o estado da exportação NFS do ZFS: # mount datastore/backups on /datastore/backups (zfs, NFS exported, local) Assim como o “showmount –e”: # showmount –e Exports list on localhost: /datastore/backups 10.0.0.0 •
snapshot Criar snapshots é um dos mais importantes recursos do ZFS. Você pode criar um ponto para restauração do ponto de montagem antes de realizar alterações no mesmo. Sintaxe: “zfs snapshot pool/ponto_de_montagem@nome_do_snapshot” Exemplo: # zfs snapshot datastore/backups@20081101 •
rollback Você pode voltar ao estado que estava o ponto de montagem no momento em que o snapshot foi criado utilizando este parâmetro. Sintaxe: “zfs rollback pool/ponto_de_montagem@nome_do_snapshot” Exemplo: # zfs rollback datastore/backups@20081101 •
destroy Apaga um snapshot criado com o comando “zfs snapshot”. Sintaxe: “zfs destroy pool/ponto_de_montagem@nome_do_snapshot” Exemplo: # zfs destroy datastore/backups@20081101 FreeBSD 7 – GEOM + ZFS
•
clone Por definição, um snapshot é somente‐leitura. Não pode ser feito alterações em um snapshot. Mas quando isso é necessário, você pode criar um clone do snapshot, e utilizar este clone como se fosse o verdadeiro ponto de montagem. Sintaxe: “zfs clone pool/ponto_de_montagem@nome_do_snapshot pool/novo_ponto_de_montagem_do_clone” Exemplo: # zfs clone datastore/backups@20081101 datastore/backups_clone Nota: Ao criar um clone de um snapshot, o espaço em disco não é utilizado. Apenas as modificações realizadas dentro do clone serão gravadas no disco. Assim você pode ter 8GB de dados dentro do datastore/backups, e se você modificar 10MB de arquivos dentro do clone (datastore/backups_clone), o espaço em disco utilizado pelo clone será de apenas 10MB. •
promote Um clone de um snapshot criado com o comando “zfs clone ...” sempre terá uma união direta com o snapshot, você não poderá apagar o snapshot enquanto o clone estiver ativo. Porém, você pode “promover” o clone a um ponto de montagem verdadeiro com o parâmetro promote. Será realizada uma cópia dos dados existentes dentro do snapshot com as modificações já feitas no clone, e o clone promovido passará a ocupar o espaço em disco real. Sintaxe: “zfs promote pool/ponto_de_montagem_do_clone” Exemplo: # zfs promote datastore/backups_clone 
Download

FreeBSD - GEOM+ZFS - Faculdade de Filosofia e Ciências