O que é o Geom? O geom(4) é um framework que atua entre o kernel e os discos, e manipula a entrada e saída de dados no disco. Ele está neste nível, pois atua como uma interface de gerenciamento de dados nos discos para o kernel, assim o geom(4) pode fazer modificações no método em que os dados são gravados no disco, de forma transparente para o resto do sistema. Leia na integra o que o geom(4) pode fazer por você.
GeomO contexto de transformações do GEOM abrange desde a geometria de discos, RAID e até proteção de dados com criptografia. Tudo isso de forma transparente para usuários e aplicativos do sistema. Neste artigo abordaremos algumas funções que o GEOM oferece para nós. Como: - Criptografar discos com alguns dos mais poderosos algoritmos de criptografia, como AES, Blowfish e 3DES. Veja geli(8)
- Concatenar discos, isto é, unir discos relativamente pequenos para formar um grande disco. Veja gconcat(8)
- Compartilhamento de dois ou mais discos, distribuindo dados em paralelo, RAID0,com o propósito de alto desempenho. Veja gstrip(8)
- Espelhamento de disco, RAID 1, fazendo redundância de dados em dois ou mais discos. Veja gmirror(8)
- Distribuição com bit de paridade, RAID 3, junção das propriedades do RAID 0 com o RAID 1. veja graid3(8)
- Compartilhamento com segredo, O segredo é compartilhado entre os dispositivos e só pode ser desvendado com todos os dispositivos, se um estiver faltando os discos ficarão inacessíveis. Veja gshsec(8)
- Compartilhamendo de dispositivos via rede com ggatec(8) e ggated(8)
O geom(4) foi desenvolvido utilizando alguns conceitos de orientação a objetos, por isso, alguns termos utilizados são provenientes da OO. Com por exemplo, os Fornecedores (Providers) são os dispositivos criados pelos geom, já os Consumidores (Consumers) são os discos e unidades físicas Geli Criptografando discosO geli(8) é responsável pelo criptografia em discos, ele é muito útil para manter segurança em dados confidenciais; sabe aqueles disquetes de filmes de Hollywood!, eles provavelmente utilizavam geli(8) para fazer a criptografia nos dispositivos para ninguém acessar, brincadeira. Muitas pessoas o utilizam para criptografar os seus diretórios pessoais, assim, somente sabendo a chave secreta ou tendo o arquivo chave poderá acessar seus arquivos, outro lugar bom para se utiliza-lo é nos Pendrives, nos exemplos eu utilizarei o meu Pendrive com exemplo. O sistema OperacionalPara utilizar o geli(8) precisamos adicionar as duas linhas abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. device crypto options GEOM_ELI
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_eli_load="YES" CaracterísticasAlgumas características do geli(8). - Suporte de há vários métodos de criptografia, como AES, Blowfish e 3DES.
- Cria as chaves com uma junção de componentes, como frase secreta, bits do arquivo...
- Criptografia da partição root, no momento da montagem da partição root a frase secreta é pedida.
- É rápida
- A configuração do dispositivo é feita automaticamente.
- Utilização de senhas de uso único
Utilizando o geli(8)O primeiro argumento é a ação a ser tomada. Os argumentos mais utilizados são: initPara iniciar a criptografia em um dispositivo. É nele que você configura as opções como algoritmo de criptografia utilizado, tamanho da chave, após o init várias opções são aceitas, veja elas abaixo: - -a Algoritmo - Algoritmo utilizado para criptografar o dispositivo, as possíveis opções são: AES, Blowfish e 3DES.
- -b - Pergunta a frase secreta no boot, útil na utilização no sistema de arquivos raiz. Uma questão importante, o diretório /boot deve estar em um dispositivo sem criptografia.
- -i Iterações - Número de iterações para usar com PKCS#5v2. Caso nenhum valor seja especificado, o valor padrão é de dois segundos de trabalho de criptografia, se zero for especificado, o PKCS#5v2 não vai ser utilizado.
- -K newkeyfile - Com esta opção pode ser utilizado um arquivo como senha. Neste caso será pedido a senha e o arquivo, para utilizar somente o arquivo utilize também a opção -P, ela serve para não pedir a senha.
- -l keylen - Tamanho da chave utilizada pelo algoritmo de criptografia, os valores padrões são: 128 para AES e Blowfish e 192 para 3DES.
- -s sectorsize - Tamanho do setor criptografado, quanto maior o setor menos trabalho.
Ex: Criando criptografia para o dispositivo /dev/da0s1 # geli init /dev/da0s1 Enter new passphrase: Reenter new passphrase:
Criando criptografia para o dispositivo /dev/da0s1, utilizando blowfish e o arquivo 'bla' como chave e sem frese secreta. # geli init -a Blowfish -P -K bla /dev/da0s1 # AttachO argumento attach serve para "ligar" o dispositivo já criptografado, ele pede a chave secreta para decriptografar a unidade, e após o comando a unidade decriptografada é acessada pelo dispositivo /dev/Dispositivo.edi, por exemplo /dev/da0s1 será acessado pelo /dev/da0s1.eli. Algumas flags são aceitas, veja elas abaixo. - -d Se esta opção for especificada o dispositivo será fechado após a ultima escrita nele, no caso quando ele for desmontado, o dispositivo /dev/da0s1.eli desaparecerá.
- -k Especifica o arquivo de senha que foi utilizado na criação do dispositivo
- -p Não pede a frase secreta
Exemplos Ligar o dispositivo do primeiro exemplo: # geli init /dev/da0s1 Enter passphrase:
Ligar o dispositivo do segundo exemplo para ser destruído após ser desmontado # geli attach -k bla -p -d /dev/da0s1 #
Após a primeira vez que você ligou o dispositivo, formate-o com newfs, como no exemplo abaixo. # newfs /dev/da0s1.eli
Agora você pode montar o dispositivo normalmente, como no exemplo abaixo: # mount /dev/da0s1.eli /mnt detachO Argumento detach serve para “desligar” o acesso ao dispositivo, é como se o computador esquecesse a chave que é utilizada para decriptografar o dispositivo. ele possui somente duas opções: - -f Força a retirada do dispositivo.
- -l Ele não retira o dispositivo enquanto o dispositivo estiver aberto.
Ex: Retirando o dispositivo criado anteriormente. # geli detach /dev/da0s1 # onetimeEste argumento serve para criar dispositivos com chave de uso único, este argumento é utilizado para criptografar dispositivos temporários como Swap. ele aceita os argumento -a, -d,-l e -s que já foram descritos acima. setkeyCria ou ajusta uma chave. O geli(8) utiliza uma chave Mestre que pode ser criptografada com duas chaves secretas, com o parâmetro init, somente a chave 0 é criada. A chave pode ser trocada a qualquer momento, em um dispositivo ou um backup, mas somente se o dispositivo estiver ligado a chave não vai ser pedida. O argumento -i tem o mesmo sentido da seção init. Os outros argumentos utilizáveis são: - -k keyfile A chave secreta antiga
- -K newkeyfile A nova chave secreta
- -n keyno O número da chave, como disse antes um dispositivo pode ter duas chaves, a chave do init é a chave 0, se você quer criar uma nova chave utilize o keyno igual a 1,
- -p Não utiliza a chave antiga
- -P Não utiliza uma nova chave
Ex: Alterando a senha do exemplo anterior, retirando o arquivo de senha e adicionando uma frase secreta. # geli setkey -k bla -p /dev/da0s1 Enter new passphrase: Reenter new passphrase: delkeyO parâmetro delkey destrói (sobrescreve com uma chave randômica) a frase selecionada. O dispositivo não será desligado se as chaves forem destruídas, e pode ser recuperado com o setkey. Algumas flags.
- -a Destrói todas as chaves,
- -f Força destruir todas as chaves.
- -n número da chave a ser destruída.
killEste comando apaga todas as chaves e desliga o dispositivo. Este comando é de mão única, e uma vez feito não pode ser desfeito. Ele possui somente uma flag, a -a que força o kill para todos os dispositivos ligados. backupCria um backup dos meta dados do dispositivo em um arquivo restoreRestaura o backup de um arquivo para um dispositivo clearLimpa o meta dado de um dispositivo dumpCria uma imagem do meta dado de um dispositivo. Veja mais exemplos no man 8 do geli gstripe RAID 0 com GEOMO 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) dá via software o suporte ao RAID 0. 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 disco 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, como na imagem abaixo:
Existem dois modos de se fazer a configuração, de modo manual ou automático; de modo manual os meta dados não são armazenados nos discos, assim os discos precisam ser configurados manualmente todas as vezes que forem utilizados, como o nome diz no modo automático, os meta dados são gravados em disco, e os dispositivos são reconhecidos automaticamente. O sistema OperacionalPara 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
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_stripe_load="YES" Utilizando o gstripeO primeiro argumento do gstripe(8) diz a ação que ele deve tomar. Vamos ver eles abaixo createEsta opção tem a sintaxe mínima "gstripe create name disco disco" onde nome é o nome do novo dispositivo que será armazenado em /dev/stripe/name e discos 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 gs /dev/ad0s1e /dev/ad3s1c # newfs /dev/stripe/gs # mount /dev/stripe/gs /home
NOTA: Os discos ou partições devem ter o mesmo tamanho! labelEsta é 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/gs. gstripe no kernel. # gstripe label gs /dev/ad0s1e /dev/ad3s1c # newfs /dev/stripe/gs # mount /dev/stripe/gs /home
Para adicionar uma entrada para este dispositivo no fstab, para montar em /home, adicione a seguinte linha no /etc/fstab: echo /dev/stripe/gs /home ufs rw 2 2 >> /etc/fstab
stopDesliga um dispositivo, esta opção deve ser seguida pelo nome do dispositivo a desligar, e este comando não mexe nos meta dados do array. # umount /home # gstripe stop gs
clearLimpa os meta dados das partições que formam o array. # gstripe clear /dev/ad0s1e dumpCria um backup dos meta-dados do array. # gstripe clear /dev/ad0s1e Gmirror RAID 1 com GEOMRAID 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. O Sistema OperacionalPara 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
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_mirror_load="YES Utilizando o GmirrorO primeiro argumento do gmirror(8) diz a ação que ele deve tomar. Vamos ver eles abaixo labelCria 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 é 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, baseado em um artigo de Dru Lavigne, iremos fazer o espelhamento em dois discos, na instalação do FreeBSD. O Artigo original pode ser acessado neste Link. Iremos utilizar dois discos iguais, localizados em /dev/ad0 e /dev/ad2, como podemos ver, os dois são mestres, um do ata0 e outro do ata1. Iremos instalar o FreeBSD no disco ad0. A configuração será feita durante a 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 eu entro neste terminal, normalmente eu executo 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/ad0
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 compila-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/ad0.. por /dev/mirror/gm0..., por exemplo: O arquivo antigo: /dev/ad0s2b none swap sw 0 0 /dev/ad0s3a / 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.) insertEsta 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 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 linha provavelmente apareceram na sua tela. GEOM_MIRROR: Device gm0 created (id=2125638583). GEOM_MIRROR: Device gm0: provider ad0 detected. GEOM_MIRROR: Device gm0: provider ad0 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/ad2 GEOM_MIRROR: Device gm0: provider ad2 detected. GEOM_MIRROR: Device gm0: rebuilding provider ad2.
Agora sim, temos o RAID, o comando acima inseriu o dispositivo /dev/ad2 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. clearEsta opção tem a sintax gmirror clear 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/ad0
Irá limpar as informações do mirror do dispositivo /dev/ad0 configureEsta 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
- -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 rebuildEsta 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/ad2 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/ad2 removeEsta 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/ad2 do nosso RAID # gmirror remove gm0 ad2 deactivateEsta 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/ad2 do nosso exemplo: # gmirror deactivate gm0 ad2 activateEsta 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/ad2 do nosso exemplo: # gmirror activate gm0 ad2
A partir deste momento os dados dos dois discos serão sincronizados. forgetEsta 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 ad2 poderemos utilizar o forget. Como no exemplo abaixo: # gmirror deactivate gm0 ad2 # gmirror forget gm0 # gmirror activar gm0 ad2 GEOM_MIRROR: Cannot add disk ad3 to gm0
Como podemos ver o dispositivo ad2 não pode mais ser ligado ao gm0, para ele ser inserido novamente no RAID, a opção insert deve ser utilizada. stopEsta 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 gm0
Se você está executando os mesmos exemplos que eu, o seu sistema acabou de reiniciar! :) dumpEsta opção tem a sintaxe gmirror dump disco e serve para fazer um "dump" das informações do disco. Exemplo: # gmirror dump /dev/ad2 Gconcat(8) O concatenador de discos do GEOMO gconcat(8) serve para concatenar discos, 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). O Sistema OperacionalPara 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 /etc/loader.conf geom_concat_load="YES" Utilizando o GconcatA 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. createEsta 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/ad1 com 4 Gb e /dev/ad3 com 10 Gb, logo após iremos criar o novo sistema de arquivos e montar sobre o diretório /mnt # gconcat create gc0 /dev/ad1 /dev/ad3 # newfs /dev/concat/gc0 # mount /dev/concat/gc0 /mnt
labelEsta 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/ad1 /dev/ad3 # newfs /dev/concat/gc0 # echo /dev/concat/gc0 /mnt ufs rw 2 2 >> /etc/fstab stop e destroyEsta 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 para o nosso exemplo. # gconcat stop gc0 clearEsta opção tem a sintaxe gconcat clear [-v] disco e serve para remover os meta dados de um discos, como por exemplo, iremos utilizar-lo com o disco /dev/ad3 # gconcat clear /dev/ad3
dumpEsta opção tem a sintaxe gconcat dump disco e serve para fazer um "dump" das informações do disco. Exemplo: # gconcat dump /dev/ad3 Gshsec discos dependentes GEOMCom o gshsec(8) é possível fazer com que um disco necessariamente precise do outro para ser montado, isto é feito pelo compartilhamento de um segredo entre os dispositivos, assim os dois discos precisam estar presentes para ter-se acesso as informações. O Sistema OperacionalPara utilizar o gshsec(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_SHSEC
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_shsec_load="YES"
Utilizando o GshsecO primeiro argumento do gshsec(8) diz a ação que ele deve tomar. Vamos ver eles abaixo. labelEsta opção tem a sintaxe gshsec label [-hv] nome disco disco e ela cria um segredo compartilhado entre os discos, o dispositivo ficará acessível dentro do diretório /dev/shsec/nome, e só será acessível se os todos os discos estiverem conectados. Por exemplo iremos ligar um Pendrive e um diretório. # gshsec label -v secret /dev/ad0s1 /dev/da0
Assim o /dev/shsec/secret só será acessível se o pendrive estiver conectado. stopEsta opção tem a sintaxe gshsec stop [-fv] nome, isto para o dispositivo, mas não o é destruído. Por exemplo, iremos parar o dispositivo do exemplo acima. # gshsec stop secret
A flag -f serve para forçar a parada do dispositivo. clearEsta opção tem a sintaxe gshsec clear [-v] disco e serve para remover os meta dados de um discos com, por exemplo, iremos utilizar-lo com o Pendrive. # gconcat clear /dev/da0
Agora não podemos mais acessar o dispositivo /dev/ad0s1 dumpEsta opção tem a sintaxe gshsec dump disco e serve para fazer um "dump" das informações do disco. Exemplo: # gconcat dump /dev/ad0s1 Graid3 Raid3 com GEOMO RAID3 é um sistema de RAID que tenta juntar as características de auto desempenho e segurança de dados, Para este tipo de RAID são necessários (2^n + 1) discos, simplificando, 3, 5, 9, 17.... Neste tipo de RAID um dos discos não servirá para armazenamento de dados, mas sim para armazenamento de um [Bit de Paridade], e nos outros discos os dados são gravados, caso um disco venha a falhar, ele pode ser reconstruído a partir dos dados do outro disco e do bit de paridade, Porém se mais de um disco falhar ao mesmo tempo ou no momento da reconstrução de um disco quebrado, todo o conteúdo pode ser perdido, mesmo assim ele é mais seguro que somente um RAID 0, e o desempenho é aproveitamento de espaço em disco é melhor que o RAID 1, pois o tamanho dos discos será a soma de todos-1 dispositivos e a gravação e leitura de dados será feita em todos-1 discos paralelamente. No Raid 3 os meta dados são gravados no último setor do disco, assim eles serão reconhecidos e recarregados automaticamente na inicialização do sistema e em uma eventual falha. Depois de criado os dispositivos ficarão acessíveis dentro do diretório /dev/raid3/$Nome onde nome é o $Nome do dispositivo criado. O Sistema OperacionalPara utilizar o graid3(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_RAID3
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_raid3_load="YES" Utilizando o Graid3O primeiro argumento do gmirror diz a ação que ele deve tomar. Vamos ver eles abaixo. labelEsta opção tem a sintaxe graid3 label [-hnrvw] nome disco disco disco e serve para criar um dispositivo RAID 3, o último disco será responsável pela gravação dos bits de paridade, uma dica é escolher o melhor disco para isso. A configuração inicial do RAID é feita aqui, então vamos ver as possíveis flags. - -h Grava o de forma fixa o nome do provider nos meta dados
- -n Desliga a auto sincronização dos discos não sincronizados, em estado velho.
- -r Utiliza o componente de paridade para leitura em estilo round-robin, sem esta opção o componente de paridade não é utilizado em um sistema onde os discos estejam operando corretamente, com esta opção as operações de I/O serão cerca de 40% mais rápidas, porém leituras seqüenciais serão mais lentas, Não utilize esta opção se a opção -w estiver em uso.
- -w Com esta opção, todas as leituras serão checadas com o bit de paridade, se um erro for encontrado um erro será retornado o valor da sysctl kern.geom.raid3.stat.parity_mismatch é incrementado. Não utilize esta opção se a flag -r for utilizada também.
Por exemplo vamos criar RAID 3 em três partições, /dev/ad0s1e, /dev/ad2s1e e /dev/ad3s1e, todos as três partições tem 1.9G, será utilizada a flag -w e o disco ad3 será o de paridade. Iremos fazer um novo sistema de arquivos e iremos fazer ele montar sobre o diretório /home # graid3 label gr0 /dev/ad0s1e /dev/ad2s1e /dev/ad3s1e # newfs /dev/raid3/gr0 # echo "/dev/raid3/gr0 /home ufs rw 2 2" >> /etc/fstab clearEsta opção tem a sintaxe graid3 clear [-v] disco e serve para limpar os meta dados de um disco. Como exemplo iremos limpar os meta dados do disco /dev/ad0s1e # graid3 clear /dev/ad0s1e configureEsta opção tem a sintaxe graid3 configure [-adhnrRvwW] nome e serve para re-configurar um dispositivo de RAID3. Esta opção tem várias flags, as veremos abaixo. - -a Liga a auto sincronização de dispositivos em estado antigo.
- -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
- -n Desliga a auto sincronização de dispositivos em estado antigo.
- -r Liga a leitura em round-robin.
- -R Desliga a leitura em round-robin.
- -w Liga a verificação de leitura.
- -W Desliga a verificação de leitura.
Como exemplo, iremos ligar a verificação de leitura do exemplo criado anteriormente. # graid3 configure -w gr0 rebuildEsta opção tem a sintaxe graid3 rebuild [-v] nome disco e serve para sincronizar os discos, e só tem efeito se a auto-sincronização do disco tenha sido desligada. Como exemplo, vamos supor que o disco /dev/ad3s1e esteja em estado antigo e a auto-sincronização tenha sido desligada, para sincronizarmos ele novamente executaremos o seguinte comando. # graid3 rebuild gr0 /dev/ad3s1e
removeEsta opção tem a sintaxe graid3 remove [-v] <-n number> nome e serve para remover um disco do RAID, e limpar os seus meta dados, a cada disco é atribuído um número, e o número do disco pode ser obtido através do comando graid3 list, em nosso caso era o disco /dev/ad3s1e. Como exemplo, iremos tirar o disco número dois do nosso exemplo. #graid3 remove -n 2 gr0 insertEsta opção tem a sintaxe graid3 insert [-hv] <-n $numero> nome disco' e serve para adicionar um disco que foi retirado ou tenha "estragado" anteriormente. Após inserido o novo disco, ele será sincronizado. Este comando tem somente mais uma flag, que será vista abaixo: - -h Grava o de forma fixa o nome do provider nos meta dados.
Um exemplo será adicionar o disco numero dois que foi removido, com o disco /dev/ad3s1e graid3 insert -n 2 gr0 ad3s1e stopEsta opção tem a sintaxe graid3 stop [-fv] nome e serve para parar um dispositivo de RAID, a flag -f serve para forçar a parada de um dispositivo. Por exemplo, vamos parar o nosso exemplo: graid3 stop -f gr0 GEOM Gate, Exportando e importando dispositivos via redeFechando este artigo, vou explicar as 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. Para este exemplo ficar "rico" iremos exportar via rede o dispositivo de RAID 3 que criamos no exemplo anterior, porém ele pode ser feito com qualquer dispositivo. ggated(8) O servidor de dispositivosComo disse antes, 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/ad0s1d. O arquivo pode ter quantas entradas for necessário. Para nosso exemplo, onde exportaremos o dispositivo /dev/raid3/gr0 utilizaremos o seguinte arquivo. 10.0.0.0/8 RW /dev/raid3/gr0
Agora é só executarmos o ggated(8) e está pronto, o ggate por padrão utiliza a porta 3080 tcp de todas as suas interfaces. # ggated # echo $? 0 #
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! ggated(8) O cliente de dispositivosO 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. O Sistema operacionalPara utilizar o gate(8) precisamos adicionar a linha abaixo no arquivo de configuração do kernel. E depois construir o novo kernel. options GEOM_GATE
Uma outra opção é carregar o módulo dinâmico do kernel, para isto adicione a linha abaixo no seu /etc/loader.conf geom_gate_load="YES" Utilizando o ggatecO 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
- -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/raid3/gr0 # mount /dev/ggate0 /mnt rescueEsta 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 caio e o dispositivo anterior foi perdido, para recuperarmos, executaremos o exemplo abaixo. ggatec rescue -u 0 10.0.13.146 /dev/raid3/gr0 destroyEsta 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 listEsta 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 -vtraz 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/raid3/gr0 access: read-write timeout: 0 queue_count: 0 queue_size: 1024 references: 1 mediasize: 4008393728 (3.7G) sectorsize: 1024 mode: r0w0e0
Status, e InformaçõesO geom(8) traz algumas informações sobre os dispositivos que estão ativos no sistema, como por exemplo, o status de sincronização dos discos que estão em RAID1 com o gmirror(8). Estas informações são obtidas utilizando um dos comandos do grupo do geom(8), como gmirror(8) ou geli(8) com as seguintes opções: - help Exibe ajuda
- list [name ...] Mostra os dispositivos ligados ao sistema e exibe algumas informações
- status [-s] [name ...] Exibe o status do dispositivo.
- load [-v] Carrega o módulo do kernel responsável pela classe.
- unload [-v] Descarrega o módulo do kernel.
Considerações FinaisVimos neste artigo um dos maióres poderes do FreeBSD, que é a flexibilidade com que podemos trabalhar os discos, coisa que nem todos Sistemas Operacionais fazem com tanta trasnparência e facilidade. Referências: FreeBSD HandBook: http://www.freebsd.org/doc/en/books/handbook/geom.html Páginas do Man Agradecimentos ao Time WWW. Ao Departamento de Ciência da Computação da Unesc que me dá todo apoio e infra-estrutura. E a “Pawel Jakub Dawidek” o Sr Geom. Daniel Bristot de Oliveira danielbristot_AT_gmail_com |