Reconfigurações do Debian

Existem alguns comandos úteis que permitem reconfigurar alguns componentes do Debian ou até a distro inteira (como no primeiro boot). Segue abaixo uma pequena lista:

  • apt-setup: Permite reconfigurar os repositórios APT, é a mesma interface carregada no primeiro boot;
  • dpkg-reconfigure pacote: Efetua a reconfiguração de um pacote já instalado. Para isso, ele utiliza a mesma interface de configuração que é exibida quando um pacote é instalado (e se for aplicável ao pacote);
  • base-config: Permite efetuar a configuração do sistema base do Debian com opções como Linguagem, Timezone, usuários e senhas, hostname, apt (o mesmo do apt-setup), instalar pacotes (necessita do pacote base-config instalado).

Bem, pra quem já teve problemas no Xwindow e não sabia exatamente o que executar para reconfigura-lo (eu gostava do Xconfigurator do RedHat :) ), pode executar o comando:
# dpkg-reconfigure xserver-xfree86

Desmontando um dispositivo ocupado

Hoje tive um problema ao desmontar um compartilhamento montado via samba, onde o servidor que estava sendo acessado (windows 2003) não possuia mais tal compartilhamento. Ao tentar desmontá-lo utilizando somente o comando umount, recebia uma mensagem informando que o dispositivo estava ocupado (Device is busy).

Ao tentar achar o processo que estava usando este compartilhamento (via fuser), recebia uma mensagem de permissão negada (access denied).
Decidi dar uma olhada na manpage do umount, e descobri que desde a versão 2.4.11 do kernel, existe uma opção (-l) chamada Lazy unmount cujo objetivo é forçar a o processo de desmontagem removendo todas as referências tão logo ele não esteja mais ocupado.

Um exemplo:

# umount -l /media/smb

Executando um comando periodicamente e exibindo seu resultado

As vezes é necessário executarmos um comando a cada n segundos para acompanhar algum processo que esteja rodando ou para analisarmos algum valor como por exemplo o uso de memória.

Para resolver este problema, existe um comando específico para isso, o Watch. Com ele podemos definir o tempo de atualização da exibição com a opção -n, e destacar os valores diferentes entre as exibições com a opção -d. O resultado é exibido em tela cheia no console.

Por exemplo, digamos que precisaremos acompanhar o uso de memória com o comando free a cada 1 segundo destacando as diferenças:

# watch -n 1 -d free -h

Para sair do modo de execução, basta pressionar [Ctrl]+c

Lembrando que caso o objeto de análise seja um arquivo texto como por exemplo um arquivo de Logs, você pode utilizar o comando tail com a opção -f. Com ele toda linha adicionada ao arquivo em análise será prontamente exibida na tela.

Por exemplo, para acompanharmos os logs gerados pelo sistema, podemos usar o comando:

# tail -f /var/log/messages

Uma dica importante, em alguns casos, como nos logs gerados pelo serviço de e-mail ou durante um processo de compilação (quando muitas mensagens são apresentadas na tela) se você quiser “parar” o scroll das mensagens, basta pressionar [Ctrl]+s. Para voltar a exibição normal, pressione a seqüência [Ctrl]+q.

Backup de Banco de Dados (PostgreSQL e/ou MySQL)

Em um post passado, disponibilizei um programa feito em Shell Script que permite efetuar o backup do MySQL. Bem, efetuei algumas atualização que havia prometido, e agora já é possivel receber e-mail após a realização do backup e fazer copias também do PostgreSQL.

Características

  • Arquivos individuais para cada bancos de dados: Permite gerar um arquivo compactado (gzip) para cada BD do seu programa de BD (MySQL ou PostgreSQL) ou,
  • Arquivo único para todos os bancos de dados: Gera um único arquivo contendo o backup de todos os bancos de dados do programa de BD (MySQL ou PostgreSQL);
  • Histórico de backup com limite máximo de versões anteriores: Ideal para casos onde é necessário restaurar o estado de um banco de dados de alguns dias atrás e o administrador não dispõe de nenhum software que gerencia o backup (Data Protector, Veritas, Tivoli, etc);
  • Arquivos com nomes únicos: Caso você utiliza algum software responsável pelo gerenciamento do backup, basta não optar pelo histórico e toda vez que for executado o script os arquivos serão sobrescritos;
  • Exclusão de Databases: Permite definir quais bancos de dados não serão copiados (funciona apenas quando for gerado arquivos individuais para cada banco de dados). Permite uma lista de exclusão por programa de BD (MySQL ou PostgreSQL);
  • Backup por programa ou integrado: Permite que seja efetuado backup apenas do MySQL, apenas do PostgreSQL ou de ambos os programas na mesma execução;

Download:
backupBd.sh (Versão 1.1)

TODO

  • Permitir a exclusão de databases mesmo quando optar-se pela geração de um único arquivo de backup;
  • Recuperação de dados (script para restore de databases);
  • Mais alguma coisa ?

Ah, todas as sugestões e críticas são bem vindas!

História do Unix, Windows e Linguagens de programação

Pois bem… faz algum tempo que não publico nada por aqui e para (re)começar bem vou abordar uma questão de história.

Conversando com minha noiva sobre a história da computação, me lembrei de um site (na verdade um PDF) que possuia uma árvore genealógica do sistema Unics (que depois virou unix) desde sua origem em setembro de 1969. Como da última vez que o acessei este site ainda estávamos no Linux Kernel 2.4.5 (Junho 2001) não sabia se ele ainda existia e se ainda estava sendo atualizado. Pra variar utilizei o google e voialá! achei o bendito.

Fiquei feliz após análisa-lo e constatar que está extremamente atualizado, sendo que a última entrada é do Darwin 8.5 (junto com o MacOS X) de 15/02/2006. Não são todos os sistemas que se encontram neste gráfico, o próprio autor avisa que existem 96 “sabores” (que ele conhece) que não estão relacionados.

Ainda no mesmo site, achei dois outros links para árvores genealógicas do Windows e das linguagens de programação.
No caso das linguagens, são listadas apenas 50, porém existe uma listagem com 2500 linguagens em The Language List.
Segue abaixo os links:

Nos sites, encontram-se um preview do gráfico (para visualização no browser) e arquivos PDF e Postscript para impressão em A4, letter e Plotter dos diagrama. No caso do Unix existe também um índice das diversar versões com seus respectivos anos de “nascimento”.

Outros links interesantes que podem ser encontrados:

Recomendo que quem tem interesse em história da informática, dê uma navegada nesse site. Existem diversos outros links com muito mais informações.

A propósito falando de história, não sei quem havia me perguntado dia desses, qual era a primeira versão de kernel do Linux que “vi” o lançamento… era o 2.0.36 (em novembro de 1998). Nessa época eu usava o Minilinux, uma distro em 4 disquetes baseada em Slackware que era instalada sobre FAT32 e vinha até com X-Window (se alguém quiser, ainda tenho ela aqui :) ). Nesse ano também, foi quando fui para a fenasoft e adquiri da “Conectiva Internet Solutions” meu primeiro CD de instalação de Linux que era o “Conectiva Red Hat Linux versão Marumbi”. Foi a partir dai que me encantei com esse sistema e o utilizo até hoje, principalmente em servidores.

[update 08/05/06]

Achei outro link com um poster em pdf da O’Reilly com 50 linguagens de programação: The history of Programming Language.

[/update 08/05/06]

Dicas para configurar um servidor DNS reverso

Segue aqui algumas dicas para administradores que precisam configurar um DNS reverso utilizando CIDR (ou, IPs fornecidos pela empresa de telefônia para um link empresarial que possui autorização para efetuar reverso):

Exemplo:

No arquivo /etc/named.conf crie a entrada:

zone "32-39.130.215.200.in-addr.arpa" {
type master;
file "130.215.200.revzone";
};

Estas linhas indicam que o servidor DNS em questão será responsável pelos endereços IP 200.215.130.32 ? 200.215.130.39;

Já o arquivo /var/named/130.214.200.revzone ficará semelhante a:

$ORIGIN .
$TTL 3600 ; 1 hour
32-39.130.215.200.in-addr.arpa IN SOA gw.empresa.com.br. root.gw.empresa.com.br. (
051211 ; serial
3600 ; refresh (1 hour)
900 ; retry (15 minutes)
3600000 ; expire (5 weeks 6 days 16 hours)
3600 ; minimum (1 hour)
)
NS gw.empresa.com.br.
$ORIGIN 32-39.130.215.200.in-addr.arpa.
34 PTR gw.empresa.com.br.
35 PTR empresa.com.br.

Também é interessante resaltar que caso você estivesse repassando a autoridade de um CIDR para outro servidor a configuração ficaria semelhante a:


$ORIGIN .
$TTL 3600 ; 1 hour
130.215.200.in-addr.arpa IN SOA gw.empresa.com.br. root.gw.empresa.com.br. (
051211 ; serial
3600 ; refresh (1 hour)
900 ; retry (15 minutes)
3600000 ; expire (5 weeks 6 days 16 hours)
3600 ; minimum (1 hour)
)
NS gw.empresa.com.br.
$ORIGIN 130.215.200.in-addr.arpa.
32/29 NS dns.que.respondera

Referências:
RFC 2317 – Classless IN-ADDR.ARPA delegation

Backup do Banco de dados MySQL

Escrevi um programa em shell script para facilitar o backup do MySQL e decidi disponibiliza-lo para que outros administradores possam utilizar e coloborar com dicas ou sugestões. Sinceramente desta vez não pesquisei para saber se já existia algo pronto, simplesmente decidi fazer um programa que supra minhas necessidades de backup do MySQL (é, um tipo de backup para cada grupo de servidores :) ). Acredito que da forma que foi elaborado, este programa poderá auxiliar a várias pessoas com diferentes necessidades.

Algumas características:

  • Arquivos individuais para cada bancos de dados: Permite gerar um arquivo compactado (gzip) para cada BD do seu MySQL ou,
  • Arquivo único para todos os bancos de dados: Gera um único arquivo contendo o backup de todos os bancos de dados do MySQL;
  • Histórico de backup com limite máximo de versões anteriores: Ideal para casos onde é necessário restaurar o estado de um banco de dados de alguns dias atrás e o administrador não dispõe de nenhum software que gerencia o backup (Data Protector, Veritas, Tivoli, etc);
  • Arquivos com nomes únicos: Caso você utiliza algum software responsável pelo gerenciamento do backup, basta não optar pelo histórico e toda vez que for executado o script os arquivos serão sobrescritos;
  • Exclusão de Databases: Permite definir quais bancos de dados não serão copiados (funciona apenas quando for gerado arquivos individuaus para cada banco de dados;)

Um exemplo de linha do crontab para efetuar o backup ? 1:00 da manhã:
00 1 * * * /root/scripts/backupMysql.sh

DOWNLOAD:
backupMysql.sh (versão 1.0)

TODO:

  • Adicionar função para envio de e-mails;
  • Permitir a exclusão de databases mesmo quando optar-se pela geração de um único arquivo de backup;
  • Adapta-lo de forma a permitir backup do PostgreSQL;
  • Mais alguma coisa ?

Caso você tenha alguma dúvida, sugestão ou crítica, por favor compartilhe-a comigo utilizando ou o formulário de contato (na página de contatos no início desta página) ou utilizando os comentários abaixo.

Logando atividades realizadas no shell

No dicas-l de hoje tem uma dica que publiquei entitulada: Logando atividades realizadas no shell. Explica sobre como armazenar em um arquivo, os comandos executados e suas respectivas saídas.

Bom para quem quer documentar algum processo realizado…

Como listar e matar processos pelo nome (e não pelo PID)

?? comum quando estamos trabalhando em um console linux e precisamos matar algum processo, executar um # ps aux | grep [PROGRAMA], pegar o PID e executar um # kill [PID] (ou kill -9 [PID]). Pois bem, se você ainda não conhece, deixe me falar (escrever) que é possível listar e matar os processos, utilizando para isso o próprio nome do processo. Para isso existem dois comandos encarregados desta tarefa, são eles o pgrep e o pkill.

O pgrep é responsável por pegar os processos em execução e listar seus IDs (PIDs), para isso o critério de seleção deverá ser completamente satisfeito. Por exemplo:

# pgrep httpd
Listará todos os PIDs de processos que tenham o nome httpd

Também é possível passar alguns parâmetros, como o -u que relaciona processos cujo o UID é efetivamente listado.

O pkill, por sua vez, enviará o respectivo sinal para cada processo que for listado (por padrão o SIGTERM) conforme o critério de seleção utilizado. Por exemplo:

# pkill -HUP syslogd
Fará com que o syslogd re-leia o arquivo de configuração.

Para maiores informações, consulte a página de manual destes comandos.

Otimizando a compilação de aplicações no linux com Make em servidores multiprocessados

Se você possui um computador com suporte SMP (Symmetric MultiProcessor) é possível compilar os programas que utilizam o make (a grande maioria, se não todos) utilizando dois ou mais processadores. Para isso digamos que a aplicação em questão possui um arquivo Makefile, edite-o e procure pela linha:
MAKE=make

ao final da linha adicione a opção -jN, onde N é o número de jobs (ou processos de compilação) que serão executados simultaneamente.

?? aconselhável que N seja definido como o número de processadores da máquina +1, ou seja, digamos que você possui uma máquina com 2 processadores Dual Core, então você poderia alterar a linha para:
MAKE=make -j5

Caso o arquivo Makefile não possua a entrada MAKE, então você poderá adicionar a opção -j diretamente ao executar o make:
# ./configure
# make -j5

Se você possui muita memória RAM/Swap, pode testar a opção -j sem nenhum número, desta forma o make não irá limitar o número de atividades simultâneas.

?? possível também calcular a duração das compilações para avaliar qual o melhor valor para a opção -j, para isso utilize o comando time. Por exemplo:
# ./configure
# time make

Efetuei um teste compilando a aplicação RRDTools em um servidor Dual Xeon. A compilação normal durou (real) 1m38s. Já compilando com a opção -j5 a duração foi para 46s ou seja 54% mais rápido.