Archive for the ‘Linux’ Category
GlusterFS – Um sistema de arquivos para alta disponibilidade
Depois de um longo tempo sem publicar nada no blog, estou de volta com um assunto interessante: GlusterFS.
Neste artigo irei mostrar como instalar e configurar o GlusterFS para criar um sistema de armazenamento de alta disponibilidade utilizando 2 servidores. Ambos os servidores serão client e server e cada servidor será espelho do outro onde os arquivos serão replicados automaticamente entre eles, ou seja, uma espécie de raid 1 via rede.
GlusterFS é um sistema de arquivos distribuído, capaz de escalar vários petabytes. Ele trabalha sob infiniband RDMA ou tcp/ip. Os desenvolvedores recomendam os sistemas de arquivos Ext3 e Ext4. Outros sistemas de arquivos, como ZFS, ReiserFS, btrfs, JFS, também funcionam, mas não foram amplamente testados. XFS tem vários problemas de desempenho devido a sua implementação atributos estendidos, se você optar por usar XFS seu desempenho utilizando Gluster será reduzido em pelo menos 60%.
Para seu funcionamento, você não precisa de nada em especial, pode utilizar seu hardware já existente, como por exemplo servidores com discos Sata/Sata-II ou ISCSI/SaS.
Os dados dos servidores a serem utilizados neste artigo são:
Servidor 01: 192.168.0.10 Servidor 02: 192.168.0.11 diretório a ser compartilhado: /var/www
É interessante você adicionar as seguintes entradas no /etc/hosts de cada servidor:
192.168.0.10 servidor01 192.168.0.11 servidor02
Como em artigos anteriores, este aqui também é baseado em debian. Os pacotes que iremos utilizar são glusterfs-client e glusterfs-server e a instalação segue o mesmo procedimento:
apt-get install glusterfs-client glusterfs-server
Depois de instalar os pacotes, entre no diretório /etc/glusterfs, nele você verá os seguintes arquivos:
glusterfs.vol glusterfsd.vol
O primeiro arquivo é responsável pela configuração do client e o segundo do server. Como os servidores serão client e server ao mesmo tempo, a configuração destes arquivos precisa ser idêntica em ambas as máquinas.
Renomeie os arquivos e adicione .default ao final de cada um deles:
cd /etc/glusterfs mv glusterfs.vol glusterfs.vol.default mv glusterfsd.vol glusterfsd.vol.default
Crie o arquivo /etc/glusterfs/glusterfs.vol com o seguinte conteúdo:
# /etc/glusterfs client configuration file # volume client01 type protocol/client option transport-type tcp/client option remote-host servidor01 option remote-subvolume brick end-volume volume client02 type protocol/client option transport-type tcp/client option remote-host servidor02 option remote-subvolume brick end-volume volume replicate type cluster/replicate subvolumes client01 client02 end-volume volume writeback type performance/write-behind option aggregate-size 1MB subvolumes replicate end-volume volume cache type performance/io-cache option page-size 512MB subvolumes writeback end-volume
Crie o arquivo /etc/glusterfs/glusterfsd.vol com o seguinte conteúdo:
# /etc/glusterfs server configuration file # volume posix type storage/posix option directory /var/www end-volume volume locks type features/locks subvolumes posix end-volume volume brick type performance/io-threads option thread-count 8 subvolumes locks end-volume volume server type protocol/server option transport-type tcp option auth.addr.brick.allow 192.168.0.10,192.168.0.11 subvolumes brick end-volume
Para entender melhor as opções usadas nas configurações, sugiro dar uma lida na página de translators.
Com os arquivos configurados, inicie o daemon com o seguinte comando:
/etc/init.d/glusterfs-server start
Adicione a seguinte entrada no /etc/fstab de ambos os servidores:
/etc/glusterfs/glusterfs.vol /var/lib/glusterfs glusterfs defaults 0 0
Crie o diretório /var/glusterfs e monte o diretório:
mkdir /var/glusterfs mount -a
Agora com tudo pronto em ambos os servidores, vamos realizar os seguintes testes:
- No servidor 01: Salve alguns arquivos no /var/glusterfs. - Conecte no servidor 02 e veja se os arquivos estão lá. - Execute um reboot no servidor 01. - Veja se tudo está ok no servidor 02. - Salve alguns arquivos no servidor 02. - Quando o servidor 01 voltar, verifique no /var/glusterfs se os arquivos que você salvou quando ele estava fora foram replicados. - Repita o procedimento mudando a ordem do servidores.
Você deve estar se perguntando porque estou me baseando no diretório /var/glusterfs e não no /var/www, isto porque para a replicação funcionar, os dados precisam ser gravados no /var/glusterfs.
E isto é tudo. Estando todos os testes ok, você agora tem um raid 1 vai rede :).
Adicionando suporte a HP Smart Array B110i no Redhat 5.4
Há alguns dias atrás me deparei com um problema. Estava mexendo em uma blade HP e fiz o raid 1 via hardware, até ae tudo bem. Depois gravei o iso do Red Hat 5.4 e fui fazer a instalação. Quando a instalação começou, vi que os discos eram reconhecidos individualmente, ou seja, o SO reconheceu os 2 discos e não o volume que criei. Há princípio achei que era problema na controlada, pois todos os servidores que já mexi, quando a controladora não é reconhecida, os discos também não são.
Depois de muito apanhar, descobri que o problema era driver.
Com o problema em mãos, fui atrás de uma solução. Pesquisei no site da HP e vi que ela disponibiliza o driver em em formato .rpm. Só que o rpm neste momento não me ajuda pois preciso que a controladora seja reconhecida no boot e não depois da instalação. Eles até disponibilizam o disquete de boot com o driver, mas para RedHat 5.3, como o kernel do 5.4 é mais novo o driver não funciona.
Por este motivo resolvi criar este artigo. Os passos que irei mostrar servem para qualquer driver, e funcionam tanto em Red Hat quanto para CentOS, ajuste-o conforme sua necessidade.
Os itens que iremos utilizar são:
rhel-server-5.4-x86_64-dvd.iso hpahcisr-1.2.1-9.rhel5.x86_64.rpm
Primeiramente vamos montar o iso e copiar os arquivos para customizá-lo. Os comandos abaixo são responsáveis por criar os diretórios que iremos utilizar para montar o iso e copiar os arquivos:
mkdir -p /mnt/{driver,original,customizado} mount -o loop /root/rhel-server-5.4-x86_64-dvd.iso /mnt/original/ cp -av /mnt/original/* /mnt/original/.discinfo /mnt/original/.treeinfo /mnt/customizado/
Dando continuidade, vamos descompactar o hpahcisr-1.2.1-9.rhel5.x86_64.rpm para pegar o driver e incluir no initrd:
cd /mnt/driver/ rpm2cpio /root/hpahcisr-1.2.1-9.rhel5.x86_64.rpm | cpio -idmv
Dentro do diretório /mnt/driver ele vai criar o opt/hp/storage_drivers/hpahcisr-1.2.1_2009_09_17.tar.gz, precisamos descompactar este arquivo e separar os módulos que iremos utilizar:
tar xzf ./opt/hp/storage_drivers/hpahcisr-1.2.1_2009_09_17.tar.gz cp -a hpahcisr-1.2.1_2009_09_17/lib/modules/2.6.18-164.el5/kernel/drivers/scsi/hpahcisr/hpahcisr.ko /mnt/driver/
Com o driver separado, vamos descompactar o initrd:
cd /mnt/customizado/isolinux/ mkdir initrd cd initrd gzip -dc ../initrd.img | cpio -ivd
Descompactando os modules:
cd modules gzip -dc modules.cgz | cpio -idumv
Agora precisamos copiar o driver para dentro do diretório que foi criado com o comando acima e adicionar o mesmo nos arquivos para serem lidos no boot:
cp -a /mnt/driver/hpahcisr.ko 2.6.18-164.el5/x86_64/ modinfo -F alias 2.6.18-164.el5/x86_64/hpahcisr.ko | sed -e 's/^/alias /' -e 's/$/ hpahcisr/' >> modules.alias sed -i '/^hptiop/ihpahcisr\n\tscsi\n\t\"Update HP HPAHCISR driver\"' module-info sed -i '/^hptiop/ihpahcisr: scsi_mod' modules.dep
Depois de adicionar o driver e incluir o mesmo nos arquivos necessário, precisamos compactar os modules:
rm -f modules.cgz find 2.6.18-164.el5 | cpio -o -H crc | gzip -9 > modules.cgz rm -rf 2.6.18-164.el5 cd ..
Com este passo finalizado, vamos recriar o initrd:
find . | cpio -o -H newc | gzip -9 > ../initrd.img cd .. rm -rf initrd
O initrd está pronto, ou seja, agora quando você gravar o .iso, a controladora será reconhecida no boot, só que se você instalar o SO e não instalar o driver vai dar problema pois no initrd do kernel que vem no iso não tem o driver, então adicione o hpahcisr-1.2.1-9.rhel5.x86_64.rpm a arvore de pacotes e recriar os .xml utilizados para a instalação dos pacotes:
cp -a /root/hpahcisr-1.2.1-9.rhel5.x86_64.rpm /mnt/customizado/Server/ cd /mnt/customizado/Server/ createrepo -u "media://`head -1 ../.discinfo`" -g repodata/comps-rhel5-server-core.xml .
No passo final, vamos recriar o .iso:
cd /mnt/customized64/ mkisofs -V "Custom Red Hat 5.4" -r -R -J -T -v -no-emul-boot \ -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin \ -c isolinux/boot.cat -o /root/RedHatLinux54-customized.iso .
Grave o .iso em um dvd e instale seu servidor, na hora do boot, digite:
linux text
Quando finalizar a instalação, vai apagar um botão para dar boot, NÃO FAÇA ISSO AINDA, aperte:
alt + f2
Vai abrir um terminal, digite:
cd /mnt/sysimage/ chroot . mount /dev/scd0 /media/ rpm -ivh /media/Server/hpahcisr-1.2.1-9.rhel5.x86_64.rpm umount /media/ exit
Aperte alt +f1 e agora pressione o OK que quando o servidor voltar do boot, seu sistema vai estar instalado com o driver da controladora. A última coisa a ser feita é excluir o kernel das atualizações do sistema pois se você atualizar, irá perder o suporte da controladora e irá ferrar todo o seu sistema pois vai quebrar o raid, então digite:
echo "" >> /etc/yum.conf echo "# Exclui o kernel da atualizacao, necessario para o modulo da hp." >> /etc/yum.conf echo "# Nao tente copiar o modulo para uma versao mais nova do kernel," >> /etc/yum.conf echo "# que alem de nao funcionar, vai foder o lvm." >> /etc/yum.conf echo "exclude=kernel*" >> /etc/yum.conf
Agora você sabe como customizar um dvd de Red Hat e CentOS, caso queira remover pacotes e/ou atualizá-los, basta remover os arquivos .rpm do diretório Server e depois rodar o comando createrpo como mostrado anteriormente.
Configurando um servidor de openvpn parte 2
Dando continuidade a parte 1 do artigo, vamos configurar o lado do cliente.
Chaves e certificados para a filial
server:~/easy-rsa# ./build-key filial1 Generating a 2048 bit RSA private key ......................+++ ..........+++ writing new private key to 'filial1.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [BR]: State or Province Name (full name) [SP]: Locality Name (eg, city) [Sao Paulo]:"Sao Paulo" Organization Name (eg, company) [Personal OpenVPN Client]: Organizational Unit Name (eg, section) []: POC Common Name (eg, your name or your server's hostname) []:filial1 Email Address [but3k4@gmail.com]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /root/easy-rsa/openssl.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName : PRINTABLE:'BR' stateOrProvinceName : PRINTABLE:'SP' localityName : T61STRING:'"Sao Paulo"' organizationName : PRINTABLE:'Personal OpenVPN Client' organizationalUnitName: PRINTABLE:'POC' commonName : PRINTABLE:'filial1' emailAddress : IA5STRING:'but3k4@gmail.com' Certificate is to be certified until Aug 9 14:59:05 2018 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated server:~/easy-rsa#
Com os certificados criados, vamos copiá-los para o /etc/openvpn:
server:~/easy-rsa# mkdir /etc/openvpn/{certs,ccd,keys} server:~/easy-rsa# cp keys/*.crt /etc/openvpn/certs/ server:~/easy-rsa# cp keys/*.key keys/dh2048.pem /etc/openvpn/keys/
Criando o arquivo de rotas
O arquivo /etc/openvpn/ccd/filial1 é responsável por definir rotas individuais para os clientes, ou seja, sem ele, o servidor nao vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.
server:~/easy-rsa# echo "iroute 192.168.1.0 255.255.255.0" > /etc/openvpn/ccd/filial1
Ajustando as permissões de arquivos / diretórios
server:~/easy-rsa# cd /etc/openvpn/ server:/etc/openvpn# chown -R nobody:nogroup keys certs ccd server:/etc/openvpn# chmod 0400 keys/* certs/* ccd/*
Criando o diretorio de log
Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos
server:/etc/openvpn# mkdir /var/log/openvpn
Startando o openvpn do lado matriz
server:/etc/openvpn# /etc/init.d/openvpn start Starting virtual private network daemon: openvpn(OK). server:/etc/openvpn#
Com o lado do servidor ok, vamos criar os arquivos para a filial:
server:/etc/openvpn# mkdir -p filial1/{certs,keys} server:/etc/openvpn# cp certs/{ca.crt,filial1.crt} filial1/certs/ server:/etc/openvpn# cp keys/{filial1.key,shared.key} filial1/keys/
Criando o arquivo /etc/openvpn/filial1/openvpn.conf:
# /etc/openvpn/openvpn.conf filial configuration file # diretorio onde esta os arquivos de configuracao / certificados cd /etc/openvpn # Especifica que este certificado eh de um cliente client # Define o ip do servidor para o cliente conectar remote 189.47.25.20 # porta usada para os clientes conectarem no servidor port 1194 # protocolo usado na conexao proto udp # device usado pelo openvpn dev tun # Diz que o certificado foi assinado pelo servidor ns-cert-type server # Habilita conexoes tls # Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn tls-client # arquivo de chave compartilhada usado pelo tls-server # O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls tls-auth keys/shared.key 1 # Certificado de autoridade # Tem que ser o mesmo em todos os hosts # que conectarem a sua vpn ca certs/ca.crt # Certificado e chave privada do servidor # Cada maquina tem que ter seu certificado e chave cert certs/filial1.crt key keys/filial1.key # Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz # esta no ar, usado para manter a conexao ativa ping-timer-rem keepalive 10 120 # Tipo de criptografia usada cipher DES-EDE3-CBC # habilita compressão no link VPN comp-lzo # Ativa a opcao de se conectar, caso o cliente nao esteja na internet, ou # o mesmo tenha perdido a conexao. resolv-retry infinite # Nao especifica uma porta local para o cliente ouvir. nobind # usuário e grupo sob o qual o openvpn ira rodar user nobody group nogroup # Permite um restart sem fechar a conexão e re-ler as chaves persist-key persist-tun # Log de status das conexoes status /var/log/openvpn/openvpn-status.log # define um arquivo de log, pois o default é o /var/log/syslog log /var/log/openvpn/openvpn.log log-append /var/log/openvpn/openvpn.log # Nivel de log # 0 silencioso, exceto para erros fatais # 4 razoavel para uso geral # 5 e 6 podem ajudar a debugar problemas de conexoes # 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba verb 3 # desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia # acima de 20, ele dropa. mute 20
Compactando os arquivos para a filial:
server:/etc/openvpn# tar -czpf filial1.tar.gz filial1
Envie o arquivo filial1.tar.gz para o /tmp/ da filial.
Agora do lado da filial, é necessário instalar o openvpn e descompactar os arquivos:
filial1:~# apt-get install -y openvpn
Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”. Agora descompacte o arquivo filial1.tar.gz que está no /tmp/:
filial1:~# cd /tmp/ filial1:~# tar xzf filial1.tar.gz filial1:~# mv filial1/* /etc/openvpn/ filial1:~# rm -rf /tmp/filial1*
Criando o diretorio /var/log/openvpn:
filial1:/etc/openvpn# mkdir /var/log/openvpn
Startando o openvpn do lado filial:
filial1:/etc/openvpn# /etc/init.d/openvpn start Starting virtual private network daemon: openvpn(OK). filial1:/etc/openvpn#
Pronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 udp de sua interface externa e tudo na interface da vpn que é tun0.
Caso necessite configurar um notebook para acessar o servidor, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial para notebook ou qualquer outro nome.
Abraços.