Páginas

domingo, 2 de dezembro de 2012

Balanceamento de carga utilizando KeepAlived

Fala pessoal...

Bom, depois de algum tempo sem escrever, irei escrever sobre balanceamento de carga.

Imagine o seguinte cenário onde você tem muitas requisições para suas aplicações e uma única máquina não dá conta. É ai que entra o balanceamento de carga.

Acredite, seu chefe não irá comprar uma appliance de balanceamento de carga tão fácil, porque isso custa bem caro :) Com certeza ele irá mandar você pesquisar alguma coisa ;)

Uma solução que utilizei por muito tempo é o keepalived.

O que ele faz? É um framework para interação com o Linux Virtual Server (LVS). Efetua checks em nível de rede, transporte e aplicação.
Ele faz todo o gerenciamento, se um check em um servidor falhar, ele retira automaticamente a máquina do LVS.
Outra funcionalidade muito bacana é sua alta disponibilidade utilizando o protocolo VRRP. Caso um balanceador apresente problemas (travar, cair, você precisar executar uma manutenção programada), ele faz todo o processo de migração do VIP para uma outra máquina de keepalive, e passa a atender os clientes de forma transparente.

Vale dar uma olhada no site do projeto: http://www.keepalived.org, no site ele descreve todas as funcionalidades e também tem muitos exemplos bacanas.

Outro site que também vale dar uma olhada é o site do projeto LVS: http://www.linuxvirtualserver.org/. Nesse site é descrito todas as funcionalidades do "ipvs".

Não irei descrever aqui quais os tipos de loadbalancer (NAT, DR), nem como ele funciona.
Nesse how-to iremos utilizar o DR, pois é o que menos onera o sistema e pode ser utilizado na rede interna sem a necessidade de uma nova rede.
Aqui há uma explicação de como funciona: http://www.linuxvirtualserver.org/VS-DRouting.html (em inglês)



Mãos a massa!

Ambiente de testes:

4 máquinas com Debian 6.0.6.
As máquinas tem duas interfaces de rede, a default do virtual box (10.0.2.15), e uma interface onde todos os serviços serão executados (172.16.1.0/24).
Duas são para o keepalived e outras duas eu instalei o apache servindo um arquivo simples de html

Balanceadores

As máquinas que executão os balanceadores podem ter configuração modestas. Já rodei grandes ambientes com 1 GB de ram e 2 processadores. O mínimo de disco.


1 - Instalação do keepalive

aptitude install keepalived

2 - Ativar o roteamento no kernel

Edite o arquivo /etc/sysctl.conf e encontre a linha:

net.ipv4.ip_forward=1 (Descomente-a ou a adicione)

sysctl -p (para ler o arquivo sysctl.conf sem a necessidade de reboot)

3 - Configuração do keepalived

No diretório /etc/keepalived crie um arquivo chamado keepalived.conf com o conteúdo:


 global_defs { # Configurações globais, aqui pode ser definido o e-mail para caso de falha em algum backend.  
   lvs_id LVS_Teste #Identificação do balanceador  
 }  
 vrrp_sync_group LVS_Teste { #Grupo VRRP, aqui é definido um grupo que será comum entre todos os participantes desse balanceador.  
   group {  
    LVS_Teste  
   }  
 }  
 vrrp_instance LVS_Teste{ #Esta seção descreve os parametros VRRP do virtual server  
   state MASTER # Indica que esse servidor terá o estado inicial definido como MASTER  
   interface eth1 # Interface onde o multicast do vrrp vai acontecer, e em qual interface o virtual server vai atender  
   virtual_router_id 500 #Numero unico de identificação do balanceador  
   priority 100  
   advert_int 1  
   authentication { #Mecanismo de autenticação, todas as máquinas do grupo devem ter a mesma senha  
     auth_type PASS  
     auth_pass LvSbAlancer # Senha, deve ser igual em todos os nós de keepalived  
   }  
   virtual_ipaddress {  
     172.16.1.1/24 # Esse é o ip virtual, que em caso de falha, será levado para a outra instancia do keepalived. Todos os clientes serão apontados para esse ip. Este campo suporta vários ips, um por linha com mascara.  
   }  
 }  
 virtual_server 172.16.1.1 80 { #Definição do Virtual Server. Aqui se define o VIP + porta que ele irá ouvir  
      delay_loop 1 # Tempo em segundos entre as verificações de servidores reais.  
      lb_algo rr # Algoritimo de balanceamento, nesse caso é o Round Robin, mas pode ser o WLC, WRR... veja na documentação o que mais te atende.  
      lb_kind DR # Tipo do balanceador, pode ser NAT ou DR (Direct Routing)  
      persistense_timeout 1800  
      protocol TCP # Protocolo de operação  
      real_server 172.16.1.10 80 { #aqui se define os servidores reais os backends  
           weight 1 # Peso desse servidor, quanto maior mais conexõe são enviadas para a máquina  
           HTTP_GET { # Probes, aqui é definido as regras de como se declara um host morto ou não. Pode ser trocado por somente uma conexão simples na porta, mas ai é utilizado o comando TCP_CHECK.  
                url {  
                     path /teste.html # URL de teste  
                     digest dcec999b7ece0cc82e62145eb832731f #Hash obtido através do comando genhash (mostrado abaixo)  
                }  
                connect_timeout 1 #Tempo de timeout para declarar o host morto  
                connect_port 80 #Porta de testes.  
           }  
      }  
      real_server 172.16.1.11 80 { #Mesma coisa que o acima, porém outro servidor.  
           weight 1  
           HTTP_GET {  
                url {  
                     path /teste.html  
                     digest 78617b939168605ad578d3625dc3e75e  
                }       
                 connect_timeout 1  
                 connect_port 80  
           }  
      }  
 }  
Com essa configuração é possivel ter um servidor de keepalived master funcionando.
Nos probes, eu utilizei hashes para verificação das páginas, eu acho isso melhor, pois se por algum motivo mínimo a pagina for alterada, o backend é retirado imediatamente do balanceador.
Isso é gerado através do comando genhash:

genhash -s 172.16.1.11 -p 80 -u /teste.html
MD5SUM = 78617b939168605ad578d3625dc3e75e

Onde: -s 172.16.1.11 = Servidor do apache
-p 80 = Porta 80 do servidor
-u = URL /teste.html (foi um arquivo que criei com um conteúdo pré-definido)

MD5SUM = hash que deverá ser usadno no campo digest do keepalived.

P.S. é importante que o arquivo "teste.html" exista e consiga ser acessado no webserver.


Balanceador Slave

É a mesma coisa, o conf é exatamente igual, com exeção da linha:

state MASTER

Ela deve ser

state SLAVE


Primeiros testes

O primeiro teste, é validar se no /var/log/messages há algum erro do keepalived, se houver erros como:

IPVS: Can't initialize ipvs: Protocol not available

Provavelmente o módulo ip_vs não foi carregado, faça sua inicialização com o comando:

modprobe ip_vs

e execute um restart no keepalived só por segurança.


O segundo teste é executar o comando:

ipvsadm -ln
Sua saída deve ser algo como:

root@SLB:~# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.1:80 rr
  -> 172.16.1.10:80               Route   1      0          0        
  -> 172.16.1.11:80               Route   1      0          0        

Se chegar nesse ponto, já podemos passar para a configuração das máquinas (real_servers)


Configuração dos Servidores Reais


1 - Inserir o seguinte conteúdo no sysctl.conf

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth1.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth1.arp_announce = 2

Depois disso:

sysctl -p

Isso irá garantir que a máquina não irá enviar o seu endereço de arp para o ip do vip. O MAC que irá aparecer é o do balanceador.


2 - Inserir o VIP na interface de loopback

No Debian, isso é feito no arquivo /etc/network/interfaces

auto lo:Vip
iface lo:Vip inet static
address 172.16.1.1 # Lembre-se esse é o VIP que setamos na conf do keepalived
netmask 255.255.255.255

Feito isso, um

ifup lo:Vip

Irá colocar a interface de loopback em up. Com o comando ifconfig é possível identifica-la

lo:Vip    Link encap:Local Loopback 
          inet addr:172.16.1.1  Mask:255.255.255.255
          UP LOOPBACK RUNNING  MTU:16436  Metric:1

Repita o mesmo passo em todas as máquinas de backend.


Testes

Para que o teste seja visível, crie o arquivo na máquina:
Eu fiz o seguinte:

echo "<?php

echo date('l jS \of F Y h:i:s A');
echo "Voce foi atendido pelo servidor: ";
echo exec('hostname'); ?>" > /var/www/data.php


P.S. É necessário ter o php instalado no servidor (sim, isso é redundante, mas...)

Em uma outra máquina com um navegador qualquer, acesse: http://VIP/data.php, no meu caso http://172.16.1.1/data.php



Observe em qual servidor atendeu sua requisição (apache1)






Observe que o nome do servidor foi alterado (apache2), indicando que o balanceador funciona.

Esse balanceador pode ser utilizado em servidores proxy, da mesma forma que o apache, em instancias read only de banco de dados, enfim, em quase tudo. Use com criatividade!

Bom pessoal, espero ter ajudado.
Qualquer dúvida por favor me enviem um e-mail:

quarta-feira, 21 de setembro de 2011

Horário de Verão

Fala pessoal....

O horário de verão está chegando e como sempre muita gente se esquece de como ajustar o relógio de seus servidores.
Na verdade o que precisamos acertar não é o relógio, mas sim o timezone que a máquina está. Nosso timezone para a maior parte do Brasil, é o GMT -3 (Brasilia, SP...), quando entramos no horário de verão, vamos para GMT -2 e simplesmente alterar a hora para menos uma, gera vários problemas com servidor de e-mails (esse é o mais sensível a isso).


Chega de conversa, mas como saber se estou preparado para o horário de verão?


zdump -v America/Sao_Paulo |grep 2011
A saída deve ser algo como:

America/Sao_Paulo  Sun Feb 20 01:59:59 2011 UTC = Sat Feb 19 23:59:59 2011 BRST isdst=1 gmtoff=-7200
America/Sao_Paulo  Sun Feb 20 02:00:00 2011 UTC = Sat Feb 19 23:00:00 2011 BRT isdst=0 gmtoff=-10800
America/Sao_Paulo  Sun Oct 16 02:59:59 2011 UTC = Sat Oct 15 23:59:59 2011 BRT isdst=0 gmtoff=-10800
America/Sao_Paulo  Sun Oct 16 03:00:00 2011 UTC = Sun Oct 16 01:00:00 2011 BRST isdst=1 gmtoff=-7200
Mas meu timezone não está atualizado como faço?

Primeiro, visite o seguinte ftp:  ftp://ftp.iana.org/tz , baixe o ultimo tzdata[ANO][a-z].tar.gz por exemplo tzdata2011i.tar.gz.
Descompacte o arquivo:

tar -xvzf tzdata2011i.tar.gz
Compile o arquivo contendo todos os timezones para a America do Sul

zic southamerica
 Copie o arquivo de timezone do estado de São Paulo (no meu caso, alguns outros estados também utilizam esse mesmo timezone)

cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
Verifique sua data, ela deve estar correta, e com o uso do zdump, já deve ser possível verificar.

Duvidas / Sugestões e-mail para:

sexta-feira, 2 de setembro de 2011

Nagios 3.3.1 - Problemas na hora do make install

Fala pessoal...

Hoje fui fazer um setup de um novo nagios, porém me deparei com o seguinte erro:

        do /usr/bin/install -c -m 664 -o nagios -g nagios $file /usr/share/includes/rss; done
/usr/bin/install: omitting directory `includes/rss/extlib'
/usr/bin/install: omitting directory `includes/rss/htdocs'
/usr/bin/install: omitting directory `includes/rss/scripts'
make[1]: *** [install] Error 1
make[1]: Leaving directory `/usr/local/src/nagios/html'
make: *** [install] Error 2
Após pesquisar no oraculo, encontrei um post no forum do ubuntu...

Para recuperar do erro:

Execute o ./configure (pode ser o que tem aqui no blog)
Após execute:
sed -i 's:for file in includes/rss/\*;:for file in includes/rss/\*.\*;:g' ./html/Makefile
sed -i 's:for file in includes/rss/extlib/\*;:for file in includes/rss/extlib/\*.\*;:g' ./html/Makefile
Depois siga normalmente com o conjunto de makes (pode ser o que tem aqui no blog também)

quarta-feira, 9 de março de 2011

Aumentando o limite de File Descriptors

Fala pessoal...

Recentemente precisei aumentar o número de arquivos abertos (open files) de uma máquina Debian, porém ao editar o arquivo /etc/security/limits.conf, os valores não eram alterados, mesmo depois de reiniciar. Essa dica, funciona nas versões 5 e 6 do Debian.

Para verificar qual é o valor máximo de open files, utiliza-se o comando ulimit -a (todas as informações) ou o comando ulimit -n (somente o valor de open files). A saída do ulimit -a de um sistema padrão é assim:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Essa opção nos mostra qual é o máximo de arquivos abertos simultaneamente.


1024 arquivos simultâneos não é suficiente?
Depende, imagine um servidor web com mais de 1024 acessos simultâneos, para cada conexão efetuada, 1 File Descriptor é alocado, e esse limite é atingido rapidamente, e a máquina começa com muitos sintomas estranhos.....

Beleza, partindo desse ponto, fica fácil, é só ir no /etc/security/limits.conf e adicionar a opção nofile dessa forma:
* soft nofile 16384
* hard nofile 32768
Onde:

* = Todos os usuários
soft = limite padrão
hard = limite máximo
16386/32768 = valores do File Descriptors

E qual o problema?
Quando o o arquivo era alterado, serviços eram iniciados com o valor padrão de File Descriptors (1024)

Solução:

o arquivo /etc/pam.d/common-account é o arquivo responsável pelas configurações de login de todos os serviços.
No final do arquivo insira:

session required pam_limits.so
 Basta um restart na máquina para que essa solução funcione.

Uma coisa que notei foi: o usuário root não entrava nas regras do limit, ficava no padrão, a solução foi adicionar o usuário root no limits.conf como no exemplo abaixo:

root soft nofile 16384
root hard nofile 32768
* soft nofile 16384
* hard nofile 32768

É isso, qualquer coisa enviem um e-mail:

terça-feira, 19 de outubro de 2010

Termômetro USB – TemperNTC

Fala pessoal….

Recentemente comprei um termômetro USB para ver até onde conseguiria chegar com ele.

Comprei esse termômetro no ebay (paguei algo em torno de R$ 15,00) mas é encontrado facilmente nesses sites de compras chineses  fica a dica.

Em um primeiro momento após pesquisar um pouco, encontrei um código na internet, mas ele tinha um problema, era escrito para o termômetro Temper que só tem um sensor de temperatura.

O TemperNTC, tem um “rabicho” (termômetro externo) com um sensor de temperatura extra, assim você consegue fazer duas medições em locais distintos.
Temper




TemperNTC




Partindo dai, iniciei minha pesquisa sobre como fazer-lo funcionar no linux, depois de algumas googladas, achei um módulo do Perl que tem suporte para ambos Temper, porém era necessário transformar a saída do módulo em alguma coisa funcional.

A saída do lsusb dele é:
Bus 003 Device 013: ID 1130:660c Tenx Technology, Inc.

Preparando para utilizar o termômetro

Para o módulo ser instalado corretamente, algumas dependências são necessárias, portanto instale:
aptitude install libusb-dev

Depois instale o CPAN e os módulos necessários
cpan -fi Bundle::CPAN
cpan -fi ExtUtils::MakeMaker
cpan -fi Inline::MakeMaker
cpan -fi Device::USB
cpan -fi Device::USB::PCSensor::HidTEMPer
Esse processo leva alguns minutos, responda todas as perguntas das instalações com as respostas padrão (tecle enter)

Feito isso, já é possível retirar alguns dados do termômetro.

Crie um arquivo com o seguinte conteúdo:
#! /usr/bin/perl

use 5.010;
use strict;
use warnings;
use Carp;
use Device::USB;
use Device::USB::PCSensor::HidTEMPer::Device;
use Device::USB::PCSensor::HidTEMPer::NTC;
use Device::USB::PCSensor::HidTEMPer::TEMPer;
use lib;
use Device::USB::PCSensor::HidTEMPer;

my $pcsensor  = Device::USB::PCSensor::HidTEMPer->new();
my @devices   = $pcsensor->list_devices();

my $interno_grande = $devices[0]->internal()->celsius();
my $externo_grande = $devices[0]->external()->celsius();

my $interno = substr $interno_grande, 0, 5;
my $externo = substr $externo_grande, 0, 5;

printf "Termometro Interno: $interno C\n";
printf "Termometro Externo: $externo C\n";

Salve o arquivo, dê permissão de execução, a saída desse pequeno código é:
# ./termometro
Termometro Interno: 21.12 C
Termometro Externo: 25.02 C
Para quem comprou o Temper, é só utilizar a função internal, as funções external não devem ser utilizadas.

Legal, mas para mim isso ainda não é o suficiente. Gostaria de gerar alguns gráficos disso, é possível? SIM!

Como utilizo o Munin para fazer a geração dos gráficos da minha rede, resolvi escrever um plugin que faz a captura dos dados e coloca-los tudo em um único gráfico.


Preparando o ambiente para executar o script

1 – Instalar o munin e o sudo
aptitude install munin munin-node sudo

Com tudo instalado, já é possível ver localmente os gráficos, se você tem um web server instalado, ele estará disponível em http://seuwebserver/munin


2 – Configurar o sudo

Execute o comando:
visudo

No final do arquivo, adicione a seguinte linha:
nobody  ALL=(root) NOPASSWD:/usr/local/bin/temper_run.pl

3 – Criar os arquivos

Crie o arquivo temper em /usr/share/munin/plugins e insira o seguinte conteúdo:
#!/bin/bash

sudo /usr/local/bin/temper_run.pl $1

Crie o arquivo temper_run.pl em /usr/local/bin com o seguinte conteúdo:
#!/usr/bin/perl

# Script to monitor ambient temperature using the TemperNTC
# Writen by Victor Sartori 10/10 - victor (NoS Pa M) sartori (d o t ) eti [d o t] br
# Version 0.2.1

# Some notes:
# All values in Celsius, if you wanna use it in fahrenheit, change the conversion function to fahrenheit on line 50 and 51

use strict;
use Carp;
use Device::USB;
use Device::USB::PCSensor::HidTEMPer::Device;
use Device::USB::PCSensor::HidTEMPer::NTC;
use Device::USB::PCSensor::HidTEMPer::TEMPer;
use lib;
use Device::USB::PCSensor::HidTEMPer;

if ("$ARGV[0]" eq "autoconf") {
 printf "yes\n";
 exit 0;
}

if ("$ARGV[0]" eq "config") {
 my $LOAD_WARN="28";
 my $LOAD_CRIT="32";

 print "graph_title Temperature\n";
 print "graph_args --base 1000 -l 0\n";
 print "graph_vlabel Temperature\n";
 print "graph_scale no\n";
 print "graph_category system\n";
 print "temperE.label External temperature in Celsius\n";
 print "temperE.warning $LOAD_WARN\n";
 print "temperE.critical $LOAD_CRIT\n";
 print "temperI.label Internal temperature in Celsius\n";
 print "temperI.warning $LOAD_WARN\n";
 print "temperI.critical $LOAD_CRIT\n";
 print "graph_info Temperature.\n";
 print "temper.info Average temperature.\n";
 exit 0;
}

my $pcsensor  = Device::USB::PCSensor::HidTEMPer->new();
my @devices   = $pcsensor->list_devices();

my $internal_big = $devices[0]->internal()->celsius();
my $external_big = $devices[0]->external()->celsius();

# This is a workarround becouse the external value shows so much decimal values.
my $internal = substr $internal_big, 0, 5;
my $external = substr $external_big, 0, 5;

print "temperI.value $internal\n";
print "temperE.value $external\n";

Dê permissão de execução para os dois arquivos, reinicie o munin-node
/etc/init.d/munin-node restart
A saída do gráfico fica assim:



Alguns Problemas:
  • O termômetro ficou com o sensor interno desrregulado, ele marcava sempre 75 ou 110, resolvi colocando em uma máquina windows, instalando o software que vem junto e alterando a parte de calibração para 0, ele voltou a marcar a temperatura normalmente.
  • O plugin não rodava direto no munin-node, descobri que é necessário ter privilégios de root para acessar o dispositivo, por isso existe dois scripts e a configuração do sudo.
  • Estou escrevendo um script para o nagios também, assim que ele estiver pronto faço um novo post aqui.
  • O fonte do script do munin está em inglês, porque irei posta-lo no munin-exchange.
  • Quem for um programador perl e souber como faço isso sem o sudo, fico grato se me explicar, não tenho muita experiencia com perl.
Dúvidas, sugestões, enviem um e-mail para: 

quarta-feira, 13 de outubro de 2010

Instalando o Debian via pendrive

Fala pessoal…..

Esses dias fui fazer um setup em um server e estava sem mídias (mentira, eu quebrei um cd-rw que funcionava, sem querer :p ). Qual a solução mais simples?

Utilizar uma instalação via internet, o NETINST do Debian.

Após uma olhada rápida no site do Debian achei a solução, rápida e simples!
O que você irá precisar?
  • Um pendrive >= a 256 mb
  • Uma máquina linux
  • Imagem iso do Debian netinst

Passo 1

Você irá precisar da imagem de boot do sistema, o debian fornece isso aqui:
Para sistemas i386 (32 bits) ou amd64 (64bits)
Os arquivos tem em média 20 mb


Passo 2

Download da imagem iso do netinst
Sistemas i386 (32 bits) ou amd64 (64bits)
Os arquivos tem 150 mb e 130 mb (valores arredondados)


Passo 3


ATENÇÃO TODOS OS SEUS DADOS DO PENDRIVE SERÃO DELETADOS APÓS ESSES COMANDOS!! ATENÇÃO!!

Descompacte a imagem no pendrive

Para isso, descubra onde o seu pendrive foi detectado, duas formas de se fazer isso:
fdisk -l
dmesg

Eu prefiro usar o fdisk -l, é mais simples de se identificar o dispositivo (localize-o pelo tamanho)

Nesse exemplo, irei usar o dispositivo em /dev/sdc, tenha certeza que é o dispositivo correto, caso contrário vc irá apagar informações de outros dispositivos, e isso não é legal

Execute o comando:
zcat boot.img.gz > /dev/sdc

Feito isso, monte o pendrive e copie o iso do netinst para o pendrive
mount /dev/sdc /mnt
cp netinst.iso /mnt
umount /dev/sdc

Feito isso é só dar boot na máquina e setar a opção de boot para o usb.
Qualquer dúvida/sugestão ou qualquer outra coisa, enviem um e-mail para:

sexta-feira, 17 de setembro de 2010

Samba + Debian 5 + Windows 7 + PDC

Fala pessoal…

Começamos o processo de migração para o Windows 7 aqui na empresa, irei descrever os passos que utilizei para conseguir fazer o samba suportar essa nova versão do Windows.

Meu ambiente:
Servidor atual: Debian 4.0 com samba rodando em PDC, autenticando vários usuários (sim, eu sei, essa versão está muito velha :p)
Servidor Novo: Debian 5.0.5


Fase 1: Levantamento de dados do servidor antigo

Além dos dados, é necessário migrar os usuários e os grupos
Edite o arquivo /etc/passwd e copie todos os usuários que tem ID maior que 1000 (terceira coluna)
Você pode fazer da seguinte forma:
grep 1[0-9][0-9][0-9][0-9] /etc/passwd
Edite o arquivo /etc/shadow e copie todos os usuários que estavam no passwd que vc retirou
Edite o arquivo /etc/group e copie os grupos que vc criou, os demais podem ser ignorados
Copiar o arquivo /etc/samba/smbpasswd (se existir)
É claro que vc vai transportar isso para o novo servidor… nem sei pq disse isso :p

Outra coisa super importante, é obter o SID do domínio que está rodando na máquina antiga, sem ele, ninguem irá conseguir logar no domínio sem que você retire todas as estações do domínio antigo e os re-insira, definitivamente isso não é uma boa opção.
net getlocalsid > localsid
net getdomainsid > domainsid
Dica: Sempre que for instalar um novo PDC, gere esses SID e grave em um arquivo e faça backup, no caso de uma falha, o restore da máquina é rápido.


Fase 2: Instalação do Samba

Para poder autenticar máquinas com o Windows 7, a versão do samba necessária é a 3.3 ou superior. Como no Debian, a versão dos repositórios é a 3.2, iremos instalar a versão do projeto Debian Backports.
Edite o seu /etc/apt/sources.list e insira a seguinte linha:
deb http://backports.debian.org/debian-backports lenny-backports main
depois
aptitude update
 aptitude -t lenny-backports install samba

Feito, samba instalado!


Fase 3: Configuração do Samba

A minha configuração antiga, quando aplicada ao samba 3.4, apresentava alguns erros quando era executado a verificação da configuração utilizando o testparam. Dando uma pesquisada no site do samba, encontrei uma configuração básica, que fucnionou corretamente para mim. Veja:
[global]
 workgroup = DOMÍNIO #aqui você especifica o nome do domínio
 netbios name = MÁQUINA # esse é o nome da máquina
 passdb backend = smbpasswd #formato de armazenamento da senha, pode-se especificar como tdbsam
 printcap name = cups
 add user script = /usr/sbin/useradd -m %u
 delete user script = /usr/sbin/userdel -r %u
 add group script = /usr/sbin/groupadd %g
 delete group script = /usr/sbin/groupdel %g
 add user to group script = /usr/sbin/groupmod -A %u %g
 delete user from group script = /usr/sbin/groupmod -R %u %g
 add machine script = /usr/sbin/addmachine %u #ATENÇÃO NESSA PARTE, abaixo irei explicar do que se trata.
 unix password sync = yes
 passwd program = /usr/bin/passwd %u
 passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword:* %n\n *password\supdated\ssuccessfully* .
logon script = todos.bat
 unix charset = iso-8859-1 # Setei essa opção, pois o meu samba é muito antigo (veio de várias distro antes)
    #e os caracteres estao todos em iso
 display charset = cp850 # mesma coisa, para manter a compatibilidade de acentos.
 log file = /var/log/samba/log.%m
logon path =
 logon drive =
 logon home =
 domain logons = Yes
 os level = 35
 preferred master = Yes
 domain master = Yes
 idmap uid = 15000-20000
 idmap gid = 15000-20000
 printing = cups
 client NTLMv2 auth = Yes
[netlogon]
 comment = Network Logon Service
 path = /home/netlogon
 guest ok = yes
 writable = no
 write list = @domadmin
 browseable = no

Onde pedi atenção, a explicação para aquele script addmachine é a seguinte: O Windows 7, espera nome de máquinas em maiúsculo, então foi necessário essa “gambiarra” para que eu não me deparasse com erros de “Falha na relação de confiança com o domínio” e outros erros estranhos, como esse no log: netlogon_creds_server_check failed

Crie o seguinte arquivo /usr/sbin/addmachine
#!/bin/bash
ID_GRUPO_MAQUINAS=1086
 NOME_MAIUSCULO=$(echo $1|tr [a-z] [A-Z])
 /usr/sbin/useradd -s /bin/false -g $ID_GRUPO_MAQUINAS -d /var/lib/nobody $NOME_MAIUSCULO

Feito isso, dê permissão de execução:
chmod +x /usr/sbin/addmachine

Observação: na váriavel ID_GRUPO_MAQUINAS, deve ser setado o id do grupo que irá armazenar todas as máquinas cadastradas, iremos criar esse grupo mais para frente. 1086, é o meu número id do grupo referente. Você precisa setar o com o SEU ID, veremos isso mais a frente.

Agora é hora de setar o SID do domínio. Se o seu samba é uma instalação nova, ignore esses passos.
/etc/init.d/samba restart
net setlocalsid$(cut -d: -f2 /ARQUIVO/COM/O/LOCALSID) #ou você pode copiar e colar, assim é mais simples e rápido :p)
 net setdomainsid$(cut -d: -f2 /ARQUIVO/COM/O/DOMAINSID)
/etc/init.d/samba restart

Feito! seu samba está com o id do domínio antigo. Máquinas XP já podem fazer o logon sem maiores problemas.


Fase 4: Criação e Mapeamento de grupos
Para o Windows 7 funcionar bem junto com o samba, é necessário um mapeamento dos grupos unix com o samba. Ele espera o um grupo com um RID específico, alguns grupos são mandatórios não precisa ninguém fazendo parte deles.

Segue uma lista dos grupos, em destaque os mandatórios

Well-Known Entity RID Type Essential
Domain Administrator 500 User No
Domain Guest 501 User No
Domain KRBTGT 502 User No
Domain Admins 512 Group Yes
Domain Users 513 Group Yes
Domain Guests 514 Group Yes
Domain Computers 515 Group No
Domain Controllers 516 Group No
Domain Certificate Admins 517 Group No
Domain Schema Admins 518 Group No
Domain Enterprise Admins 519 Group No
Domain Policy Admins 520 Group No
Builtin Admins 544 Alias No
Builtin users 545 Alias No
Builtin Guests 546 Alias No
Builtin Power Users 547 Alias No
Builtin Account Operators 548 Alias No
Builtin System Operators 549 Alias No
Builtin Print Operators 550 Alias No
Builtin Backup Operators 551 Alias No
Builtin Replicator 552 Alias No
Builtin RAS Servers 553 Alias No

O grupo “Domain Computers” não está marcado como mandatório, porém iremos cria-lo para armazenar todos os computadores que serão cadastrados no domínio.

Criando os grupos necessários:

Vamos adotar o prefixo “dom” nos grupos relacionados a administração do domínio.
groupadd domadmins
groupadd domusers
groupadd domguests
groupadd domcomputers

Com os grupos criados, vamos associa-los ao samba:
net groupmap add ntgroup="Domain Admins" unixgroup=domadmins rid=512 type=d
net groupmap add ntgroup="Domain Users" unixgroup=domusers rid=513 type=d
net groupmap add ntgroup="Domain Guests" unixgroup=domusers rid=514 type=d
net groupmap add ntgroup="Domain Computeres" unixgroup=domusers rid=515 type=d

O type=d, significa que o grupo está sendo associado a um domínio, existe também a opção de adicionar a um grupo local.

Você pode e deve fazer isso para todos os seus grupos, quando a aba de permissão foi selecionada no windows, os nomes de grupos que forem mapeados por aqui aparecerão de forma correta lá.

Para que todas as configurações fiquem corretas, e os usuário quando criados sejam adicionados automaticamente aos respectivos grupos, faça o seguinte: edite o arquivo adduser.conf

No final do arquivo, você encontrará as opções EXTRA_GROUPS E ADD_EXTRA_GROUPS, descomente e insira os seguinte:
EXTRA_GROUPS="domusers"
ADD_EXTRA_GROUPS=1

Isso fará com que todo usuário adicionado, seja adicionado no grupo domusers.
Outra coisa necessária a se fazer, é editar o script addmachine, que está em /usr/sbin. No script, existe uma váriavel chamada ID_GRUPO_MAQUINAS, essa váriavel é mandatória! Para obter o id do grupo domcomputers, use o comando:
getent group domcomputers|cut -d: -f3

Insira o valor retornado na váriavel.

Feito!, seu samba está pronto para receber máquinas Windows 7!


Fase 5: Adicionando usuários no sistema


Primeiramente, o usuário root, tem permissão para criar o usuário de computador em seu servidor, porém ele não está adicionado em seu sistema (info para quem está começando do zero) para isso é necessário adiciona-lo ao samba. Rode o seguinte comando:
 smbpasswd -a root

Digite sua senha

Para alterar a senha do root ou de qualquer outro usuário, use o comando:
 smbpasswd root

Fase 6: Adicionando máquinas Windows 7 no domínio

É necessário primeiramente, adicionar algumas chaves no registro. Clique aqui e baixe a alteração do registro.

Se quiser fazer as alterações na mão:
 HKey Local Machine\System\CurrentControlSet\Services\LanmanWorkstation\Parameters

Adicionar os valores:
DWORD  DomainCompatibilityMode = 1
DWORD  DNSNameResolutionRequired = 0
REINICIE O COMPUTADOR! FAZER LOGOFF NÃO RESOLVE! É NECESSÁRIO O REINICIO TOTAL DO SISTEMA!!!

Com as chaves do registro definidas, é necessário nas configurações de IP da máquina que o servidor de WINS seja setado para o SEU SERVIDOR SAMBA

Configure o seu servidor de DHCP para fornecer esse endereço para os seus clientes.

1º como disse, verifique as configurações do wins



2º Vá até as propriedades do sistema (atalho no teclado, tecla do windows + pause) ou clicar com o botão direito no Meu computador e ir em propriedades



3º Clique em “Change Settings” (não sei como isso está escrito em português)



4º Selecione Domain, e insira o nome do domínio definido na opção Workgroup do samba



Será solicitado uma senha, insira a senha de root que você cadastrou e aguarde. Uma tela de erro como essa irá aparecer:



Pressione ok, e reinicie. Quando entrar, selecione a opção de “Switch User” e loge-se com um usuário do domínio.

Não irei colocar imagens aqui de como inserir máquinas windows xp, faça uma busca rápida no google que irá encontrar muita coisa a respeito.
Dúvidas, sugestões correções, por favor entre em contato por e-mail