domingo, novembro 25, 2007

Para saber o numero serial do HD...

Para saber o número serial de um HD, basta utilizar o comando:

# hdparm -i /dev/hda

Lembrando que para disco SCSI ou SATA os dispositivos são listados como sda.

quinta-feira, novembro 15, 2007

TUTORIAL - REALIZANDO REPAROS EM PARTIÇÕES WINDOWS COM LINUX

Para os recém-chegados ao mundo do sistema de código aberto, o Linux é sistema operacional como o Windows, que navega na internet, possui processadores de texto, planilha de cálculo, toca MP3, etc.

Mas, para os usuários com mais tempo de uso, ele é muito mais do que um simples sistema operacional, pois ele permite ajustar o cerne (kernel) para aprimorar o desempenho do hardware, aproveitando assim o máximo do equipamento.

Entre outros atributos, a flexibilidade de uso do Linux é outro fator que impera na escolha de uso do sistema operacional, e também a possibilidade de ajustar o sistema na unha, configurando ele de acordo com a necessidade de cada usuário.

É claro, que não existe uma única solução para tudo, não é porque o Linux é livre para ser distribuído e utilizado, ele será viável para todos os usuários.

Muitos ainda preferem o Windows pela facilidade de uso, eles não querem saber se é grátis ou não, se o sistema trava, ele simplesmente reinicia e continua a trabalhar com ele.

Eu uso o Linux por opção, não porque o Windows me incomodou todos esses anos com falhas, travamentos, nada disso. Mas, sim, porque eu considero ele um autêntico canivete suíço, tem aplicativos e utilitários de excelente qualidade, que estão em desenvolvimento constante. E posso ter tudo isso sem ter de crackear programas, usar números seriais, e ter o risco de prejudicar meu sistema com vírus, trojans, e outros infortúnios.

Além disso, o Linux faz com que os conceitos sobre informática sejam revistos, e que prova que a tendência tecnológica não será aprisionada em uma única solução.

Agora vamos ao que realmente interessa, nesse tópico eu vou mostrar algumas ferramentas úteis para realizar manutenção partições Windows e também, os utilitários equivalentes, e uma tabela comparativa de suporte a sistema de arquivos.

1 – Ferramentas e Utilitários

Vamos conhecer as ferramentas e utilitários do Linux que são largamente utilizadas para fazer manutenção e backup:

1.1 – Particionadores:

  • cfdisk (interface em modo texto) - > somente monta a tabela de partições
  • diskdruid (interface em modo gráfico)
  • parted (interface em modo texto / linha de comando)
  • QTParted (interface em modo gráfico)
  • GParted (interface em modo gráfico)

1.2 – Reparo de arquivos de sistema e diagnóstico:

  • debugreiserfs -> reporta erros em sistema de arquivos no formato ReiserFS
  • fsck -> reporta, e corrige erros em partições, possui suporte a vários sistema de arquivos, inclusive o FAT32, utilizado pelo Windows
  • badblocks -> verifica o sistema de arquivos ou dispositivo por erros e reporta blocos problemáticos
  • dd_rescue -> o modo de operação dele é semelhante ao dd, mas com a vantagem de recuperar dados
  • mkfs -> é o formatador do Linux, a sua função é criar sistema de arquivos no dispositivo desejado
  • mkbootdisk -> esse utilitário cria um disco de boot compatível com o MS-DOS
  • ntfsprogs -> são utilitários para realizar algumas tarefas em sistema de arquivos NTFS
  • gpart -> este utilitário especial tenta recuperar partições perdidas, deletadas acidentalmente, não importando o tipo de sistema de arquivos

1.3 – Utilitários de backup e compressão:

  • gzip -> é muito utilizado para realizar backup, é estável, rápido e prático, ele permite além de copiar pastas recursivamente, também, comprimir os dados para que fiquem menores
  • zip / unzip -> também é muito útil para realizar backups, a sua taxa de compressão é um pouco superior ao do gzip, mas pode levar mais tempo para comprimir os dados
  • rar / unrar -> esse utilitário já é conhecido pelo seu poder de compressão, mas ele exige um equipamento razoável, principalmente se forem muito os dados a serem comprimidos
  • 7-zip -> este novo compressor de dados opensource é o grande concorrente do formato rar, alcança taxas de compressão muito altas
  • unace -> é utilizado para extrair arquivos em formato .ace
  • arj / unarj -> comprime e extrai dados em formato .arj, é muito prático e leve, eu usei muito para “fatiar” arquivos que não cabiam em um disquete
  • kdar -> permite realizar backups de arquivos, diferenciais ou não, é possível também “fatiar” os arquivos de backup para que sejam gravados CDs posteriormente
  • partimage -> este utilitário permite clonar partições inteiras, com a opção de comprimi-las e salva-las em arquivos de imagem
  • g4l -> tem a mesma finalidade do partimage
  • dd -> este utilitário tem a função de copiar dados bloco a bloco, é possível criar clones de partições inteiras, e também, imagens ISO de CDs, DVDs

2 - Tabela comparativa de sistema de arquivos:

Vamos ver agora, quais são os sistema de arquivos suportados pelo Windows e Linux, para se ter uma boa idéia da diferença entre eles, usaremos uma tabela comparativa:

Sistema de arquivos Windows Linux
FAT32 Sim Sim
FAT16 Sim Sim
FAT12 Sim Sim
NTFS Sim Somente Leitura
EXT2FS Não Sim
EXT3FS Não Sim
ReiserFS Não Sim
DOS Sim Sim*

No caso do NTFS, o Linux pode ter acesso completo, utilizando o driver Captive, que utiliza algumas DLLs do Windows XP para habilitar suporte total a esse sistema de arquivos.

Agora, no caso do MS-DOS, o Linux oferece algumas alternativas e utilitários que facilitam a integração desse sistema operacional, como o FreeDOS, DOSEmu, DOSBox, mtools.

Para ver mais informações sobre esses utilitários e ferramentas no Linux, basta digitar o comando:

man ou info

Vamos dar uma rápida olhada na lista de programas equivalentes entre o Windows e Linux:

Ferramenta Windows Equivalente Linux
ScanDisk / Chkdsk fsck / debugreiserfs / badblocks
FDISK cfdisk / QTParted / GParted / DiskDruid
Norton Ghost / Partition Magic g4l / partimage / R.I.P / dd / dd_rescue / g4u
WinRAR / Winzip / 7-Zip rar - unrar / zip - unzip / p7-zip
Formatador (Format) mkfs / dd / fdformat
Desfragmentador (Defrag) *** (Não é necessário no Linux)
MS-DOS Editor (Edit) Shell / Bash (cat, Vim, tail)

3 - Formatando uma unidade de disco rígido e disco flexível:

Como vimos anteriormente, no MS-DOS temos o FORMAT.COM, e no Linux, temos o cfdisk e mkfs. Vamos exemplificar uma formatação:

Eu tenho uma unidade de disco rígido de 40GB, e quero que a tabela de partição fique assim:

[/dev/hdb - 40GB]

/dev/hdb1 - 20GB (FAT32)
/dev/hdb2 - 20GB (FAT32)

Diferente do sistema da Microsoft, as unidades lógicas não são exibidas através de letras, mas sim, como dispositivos.

Então, neste caso, vamos somente criar a tabela de partição usando o cfdisk. O seu uso é muito intuitivo, apesar de ser em modo texto.

- Digite em modo root, o comando cfdisk
- Crie uma partição primária de 20GB e altere o tipo de partição para mude o tipo para 0C Win95 FAT32 (LBA)
- Agora, crie uma segunda partição primária com 20GB, e mude o tipo para 0C Win95 FAT32 (LBA)

Agora já temos a estrutura da tabela de partição pronta, podemos salvar as alterações, escolhendo a opção Gravar. Feito isso, escolhemos a opção Sair.

Só falta criar o sistema de arquivos, como as partições ainda não podem ser montadas, pelo simples fato de não terem nenhum sistema de arquivos definido, vamos fazer isso agora.

Agora, vamos formatar as partições /dev/hdb1 e /dev/hdb2 como FAT32, usando o comando:

# mkfs.vfat -c -f2 -F 32 /dev/hdb1
# mkfs.vfat -c -f2 -F 32 /dev/hdb2

Após o término desta operação, podemos montar as duas partições normalmente, vamos criar duas pastas na raiz do sistema:

# mkdir /hdb1_vfat
# mkdir /hdb2_vfat

Agora é possível montar as duas partições usando o comando mount:

# mount -t vfat -o iocharset=iso8859-1 -o codepage=850 -o gid=1000 -o uid=1000 /dev/hdb1 /hdb1_vfat
# mount -t vfat -o iocharset=iso8859-1 -o codepage=850 -o gid=1000 -o uid=1000 /dev/hdb2 /hdb2_vfat

Estando as duas partições devidamente montada, ja é possível ler e gravar arquivos em ambas as partições.

No caso da partição /dev/hdb2, as opções -o gid=1000 -o uid=1000 força uma montagem, permitindo que o usuário comum possa ler e gravar dados nela, sem precisar se logar como root ou usar o usar o sudo.

É possível ainda inserir estes mesmos parâmetros no /etc/fstab, para que em toda inicialização, os dispositivos estejam disponíveis para o usuário comum com acesso irrestrito.

Embora não seja recomendado o acesso irrestrito a nenhuma partição, esta opção pode ser útil, principalmente se você não quiser ficar digitando a senha doroot o tempo todo pra acessar uma partição na qual você irá trabalhar.

Vamos ver agora, uma formatação em um disco flexível. Praticamente, segue o mesmo esquema de formatação e criação de sistema de arquivos, mas existe formas mais rápidas de se criar um sistema de arquivos num disquete do que em um disco rígido.

Usando o fdformat, podemos formatar um disquete em baixo nível, isto quer dizer que ele não terá nenhum sistema de arquivos depois de terminado a formatação. A sintaxe é:

# fdformat /dev/fd0h1440
# umount /dev/fd0 (se o disquete estiver montado, o mkfs não vai poder criar nenhum sistema de arquivos, para isso, você terá que desmontá-lo primeiro)
# mkfs.vfat -c -F 12 /dev/fd0
# mount /dev/fd0 /mnt/floppy (pode ocorrer de sua distribuição ter o ponto de montagem diferente do que está proposto aqui, o SuSE por exemplo, monta em /media/floppy, neste caso, é só substituir pelo correto).

Pode ser usado também, o dd para formatar um disquete, o procedimento é o mesmo do primeiro passo, é só substituir a primeira de linha de comandos por essa:

# dd if=/dev/zero of=/dev/fd0 bs=1024 count=1440

O resto do comando é o mesmo.

Tem uma forma mais rápida e não é nem preciso desmontar a unidade de disquete, é usando o utilitário FORMAT.COM do DOSEmu. O procedimento é o mesmo do MS-DOS, format a:, format a: /q, etc...

4 - Verificando erros em unidades de disco rígido e flexível:

Agora, vamos ver como podemos diagnosticar erros em sistemas de arquivos. Como já vimos no item 1.2, temos o fsck que tem suporte a vários sistema de arquivos diferentes.

Retomando o exemplo do item 3, temos um HD de 40GB, dividido em duas partições FAT32. Vamos supor que você trouxe um HD de um cliente seu com setores defeituosos, mas precisa clonar a partição inteira. Então, você conecta este mesmo HD num outro canal IDE, no secundário mestre (Secondary Master) por exemplo.

Então a tabela de partições estaria assim:

[/dev/hda - 40GB] - Canal IDE 1 - Primary Master

/dev/hda1 - ReiserFS montado como / (39GB)

/dev/hda2 - Swap (1GB)

[/dev/hdb - 40GB] - Canal IDE 1 - Primary Slave

/dev/hdb1 - FAT32 montado em /hdb1_vfat (20GB)
/dev/hdb2 - FAT32 montado em /hdb2_vfat (20GB)

[/dev/hdc - 10GB] - Canal IDE2 - Secondary Master

/dev/hdc1 - FAT32 ainda não montado (10GB)

[/dev/hdd - CD-ROM] - Canal IDE2 - Secondary Slave

/dev/hdd - Unidade de CD-ROM montado em /mnt/cdrom

É possível ver todas as partições com o comando fdisk -l, mesmo que não estejam montadas. No entanto esse comando deve ser executado em modo root.

Vamos ao que interessa, suponhamos que o HD do seu colega esteja com bad blocks e você precise clonar esta partição e copiá-la para um arquivo de imagem, exemplo, hd_cliente.img.

Então, nesse caso, não é uma boa idéia manipular dados neste disco rígido, principalmente se ele não for seu.

A idéia é utilizar o dd_rescue para copiar os dados bloco a bloco, semelhante ao dd, este utilitário pode reparar blocos ilegíveis.

Vamos aos comandos:

# dd_rescue -A /dev/hdc1 /hdb1_vfat/hd_cliente.img

A opção -A irá preencher todos os blocos ilegíveis com blocos vazios, assim, mantendo o tamanho original dos dados / arquivos. Já sem essa opção, os dados serão copiados sem correção de blocos, ou seja, serão lidos e salvos do jeito que foram encontrados.

Se quiser ver a operação detalhada, adicione a opção -v na linha de comandos.

Após o término dessa operação, ainda é possível tentar isolar esses blocos defeituosos, mas dependendo do caso, é melhor orientar o seu cliente para realizar uma possível troca de componente, para evitar problemas futuros.

Mas se optar por isolar os blocos com o devido consentimento do seu cliente, é bom antes de tudo, avisá-lo dos riscos de se usar um disco rígido com setores defeituosos.

Use o seguinte comando, como root:

# fsck.vfat -artvw /dev/hdc1

A opção -t em especial, irá marcar os bad blocks para que não sejam utilizados novamente pelo sistema operacional.

Agora, use o comando dd para restaurar a imagem do HD que criamos com o dd_rescue:

# dd if=/hdb1_vfat/hd_cliente.img of=/dev/hdc1

Como o disco rígido do seu cliente apresentou bad blocks, é muito provável que você encontre inconsistências na estrutura do sistema de arquivos, mesmo que você tenha isolado o problema. Execute novamente o fsck.

# fsck.vfat -arvwV /dev/hdc1

Isso irá executar uma nova verificação, e reparar possíveis inconsistências no sistema de arquivos.

Agora, se o seu cliente decidir comprar outro disco rígido, por ventura ele escolhe um de capacidade maior, um de 80GB por exemplo. Com toda a certeza vai sobrar 70GB de espaço em disco, usando o exemplo do HD de 10GB, ficará sobrando 70GB de espaço não alocado.

O que fazer neste caso em particular? Use o GParted ou o QTParted, e redimensione a partição FAT32 para o máximo permitido.

Antes disso, é altamente recomendável entrar no Windows, se o sistema operacional permitir, caso não tenha ocorrido erros mais graves a ponto de impedir a inicialização, e desfragmentar a unidade completamente.

Depois disso, use os particionadores citados acima para redimensionar o espaço para o máximo permitido.

Em disco flexíveis também é possível realizar a verficação de erros, é o mesmo esquema, apenas muda-se o dispositivo:

# fsck.vfat -arvwt /dev/fd0

Para recuperar blocos defeituosos, usamos o dd_rescue:

# dd_rescue -A -v /devfd0 /home/usuário/floppy_image.img

E para restaurar a imagem em um outro disquete (é óbvio que você vai trocar o disquete defeituoso por um outro novo).

# dd if=/home/usuário/floppy_image.img of=/dev/fd0

Mas espere... ainda não acabou, você pode ter isolado os bad blocks, mas e se o sistema estiver infectado com vírus, jokewares, malwares?

A seguir, vamos ver como remover vírus de partições Windows, usando anti-vírus em ambiente Linux.

5 - Removendo vírus de partições Linux com anti-vírus em plataforma Linux:

Um dos grandes atrativos sem dúvidas é fato de o sistema operacional Linux começar a ganhar um crescente suporte a soluções anti-vírus, tanto pra servidores de arquivos Samba, e-mails, redes corporativas, e não poderiámos deixar esse item importantíssimo passar em branco.

O Linux em particular, não corre muitos riscos por causa de vírus, mas isso poderá ser um assunto a ser revisto e discutido no futuro. O que mais preocupa os administradores de sistema Linux são justamente os bugs e vulnerabilidades que podem ser exploradas em serviços, aplicativos, e no próprio Kernel.

Mas os sistemas Windows ainda estão vulneráveis, mesmo utilizando um sistema Linux como servidor, se nenhuma solução anti-vírus for instalada nele, inclusive, as pragas iriam se propagar na quase na mesma proporção, se tivesse um servidor Windows rodando, na mesma situação. Utilizando um servidor Linux apenas reduziria problemas com vírus no servidor, mas nas máquinas clientes, não resolveria em nada.

Mas voltando ao foco do item, instalando uma solução anti-vírus, reduziria em muito o risco de infecções, tanto em servidores quanto em máquinas Desktop, pois mesmo que o seu sistema seja Linux, o arquivo que você passar para algum colega, ou cliente poderia estar infectado, e com certeza irá funcionar no sistema operacional Windows deles.

Eu escolhi duas soluções, uma é o BitDefender for Linux 7 Free Edition, que não possui um verificador residente, mas ele detecta mais infecções do que o AVG.

E a outra, que como já citei é o AVG for Linux Worstation, que possui um verificador residente que detecta o virus ao acessar o arquivo, seja através do shell ou interface gráfica, o arquivo infectado é trancado imediatamente, e no shell, além disso é exibido um alerta de infecção.

A escolha do anti-vírus é muito pessoal, varia de pessoa pra pessoa e não vou ficar especulando qual é a melhor solução, isso é perda de tempo, pois ela não existe.

Além do mais, a eficácia do anti-vírus vai depender de como e quanto o usuário ou técnico estiver familiarizado com a solução. Quanto mais ele se informar sobre os comandos do anti-vírus, melhor ele vai configurar a solução para aumentar a proteção.

Agora, vamos aos parâmetros que vou utilizar no AVG, já que no modo de interface gráfica ele só detecta, mas não me permite remover as infecções, vou usar o modo console, que consome poucos recursos e é mais rápido e estável.

Mas antes, vou ter de montar o dispositivo, e definir um ponto de montagem, mas de modo que ele fique acessível para o meu usuário, usando o mesmo esquema do item 3, vou retomar o exemplo do item 4, onde eu terei de verificar os arquivos por possíveis infecções.

Vamos criar um diretório usando o comando mkdir, onde será montado o dispositivo:

# mkdir /hd_cliente

Agora, vamos montar o dispositivo no ponto de montagem recém-definido:

# mount -t vfat -o iocharset=iso8859-1 -o codepage=850 -o gid=1000 -o uid=1000 /dev/hdc1 /hd_cliente

Agora, sabendo que o dispositivo já pode ser acessado, agora vamos aos comandos do AVG:

avgscan -scan -heur -ext=*.* -arc -clean /hd_cliente/

Configurei o verificador usando detecção heurística, arquivos compactados, testando todas as extensões, e remoção automática de vírus sem pausa, no diretório /hd_cliente.

Neste momento eu iniciei uma verficação no HD do meu cliente, ao término da verficação será reportado quantos vírus foram encontrados e removidos.

6 - Utilitários de backup e restauração de partições:

Após ter feito o isolamento de blocos defeituosos, verificação de erros, backup e restauração de uma partição inteira, chegou a hora de conhecer os utilitários de backup e restauração profissionais, como o sistema Microsoft tem o Partition Magic, Acronis Partition Manager, Norton Ghost, que oferecem muito mais funcionalidade do que os particionadores simples.

O grande lance desses utilitários, é a possibilidade de criar, clonar, e restaurar partições localmente e remotamente, via rede, através de um servidor FTP.
E outro grande trunfo é a possibilidade de compactar os arquivos de imagens, usando compressão gzip e bzip2, que reduzem de 50 até 75% o tamanho original.

Os que eu mais uso é o g4l (Ghost for Linux), mas existem outras soluções como o partimage, o g4l, e o R.I.P.

Existe o gpart que tenta recuperar as partições apagadas acidentalmente, também é uma mão na roda, pois eu consegui recuperar uma partição inteirinha cheias de mp3 e vídeos.

Você pode baixar essas ferramentas em vários formatos, como imagens de disquete, ISO de CDs, ou código fonte.

7 - LiveCD:

Assim como o Kurumin, Kokar, e Kalango, que são LiveCDs, isto é, rodam diretamente do CD, bastando apenas dar o boot pelo CD-ROM. Isso é possível porque todo o seu conteúdo é carregado na memória RAM. Se você gostou do sistema, é possível ainda instalar ele definitivamente no seu disco rígido, assim podendo também, trabalhar em dual boot junto com o Windows.

Mas existem outras distribuições que lançaram o seu LiveCD, mas essas não oferecem opção para instalar o sistema, apenas rodam do CD. Ex: SuSE Linux 9.2 LiveCD, Fedora Core 4 LiveCD, Conectiva 10 LiveCD,

Através deles é possível realizar as mais diversas tarefas de manutenção, inclusive as descritas neste tutorial. Cada uma delas trazem consigo várias ferramentas instaladas, dependendo de cada distribuição, você terá uma maneira diferente de se logar como root.

É aconselhável experimentar vários LiveCDs para ter um melhor suporte, o que você não encontrar em uma distribuição, vai encontrar em outra.

Onde encontrar as ferramentas deste tutorial:

quarta-feira, novembro 14, 2007

Linux - Permissões de Acesso Especiais


O controle de acesso em arquivos e diretórios é a segurança fundamental para qualquer sistema multi-usuário.

Os sistemas de arquivos nativos do Linux implementam controle de acesso utilizando algumas propriedades dos arquivos/diretórios.

Conteúdo:

1 - Lembrando como as permissões básicas funcionam:
2 - Permissões de Acesso Especiais:
3 - SUID ( Set User ID):
3.1 - Exemplo
3.2 - Comandos
4 - SGID ( Set Group ID ):
4.1 - Exemplo
4.2 - Comandos
5 - Sticky ( Sticky bit):
5.1 - Exemplo
5.2 - Comandos

Obs.: Neste e em outros artigos que eu escrevi a formatação do texto possui os seguintes significados:

- O texto em Negrito assume que se trata de um comando que deve ser digitado.
- O texto em Itálico significa que é a saída de um comando ou conteúdo de um arquivo.
- O ">>>" significa que você deve digitar no interpretador do Python.
- O "#" significa que o comando dever ser executado como usuário "root".
- O "$" significa que o comando deve ser executado como usuário sem privilégios.

1 - Lembrando como as permissões básicas funcionam:

No Linux há três modelos de controle de acesso básicos: Read, Write e Execution.

Veja um exemplo de permissão básica na figura abaixo:



O Tipo do Objeto significa:

d => diretório
b => arquivo de bloco
c => arquivo especial de caractere
p => canal
s => socket
- => arquivo normal

Já os outros caracteres significam:

r => significa permissão de leitura (read);
w => significa permissão de gravação (write);
x => significa permissão de execução (execution);
- => significa permissão desabilitada.

Explicando um pouco mais:

Leitura (r):
Em arquivos, permite examinar o conteúdo do arquivo.
Em diretórios permite listar conteúdo do diretório.

Escrita (w):
Em arquivos, permite escrever, remover e alterar o arquivo.
Em diretórios, permite criar e remover arquivos dentro do diretório.

Execução (x):
Em arquivos, permite executar um arquivo como um programa.
Em diretório, permite ler e escrever em arquivos dentro do diretório.

Sendo que os três primeiros rwx primeiros pertencem ao Dono do arquivo, e os outros três rwx pertencem ao Grupo e por fim os últimos três rwx pertencem há outros usuários que não fazem parte do grupo.

2 - Permissões de Acesso Especiais:

Mas somente as três permissões básicas (rwx), não dão toda flexibilidade para controlar acesso aos arquivos e diretórios.
Por isso o Linux tem mais três modelos especiais para controle de acesso, chamados suid (set user id), sgid (set group id) e Sticky (Sticky bit).

Veja um exemplo de permissão especial na figura abaixo:



3 - SUID ( Set User ID):

A propriedade SUID é somente para arquivos executáveis e não tem efeito em diretórios.

Nas permissões básicas, o usuário que executou o programa é dono do processo.
Mas, em arquivo executável com a propriedade SUID aplicada, o programa rodará com o ID do dono do arquivo, não com o ID do usuário que executou o programa.
Normalmente o usuário dono do programa executável é também dono do processo sendo executado.
Ou seja, quando um arquivo/programa executável tem o controle de acesso SUID, ele é executado como se ele estivesse iniciado pelo dono do arquivo/programa.

A permissão de acesso especial SUID pode aparecer somente no campo Dono.

3.1 - Exemplo:

Um exemplo para arquivo executável com a propriedade SUID é o arquivo /usr/bin/passwd.
Ou seja, quando executamos o comando passwd com qualquer usuário normal, o processo é executado com ID do usuário root ( como se o usuário root tivesse executado o comando passwd), pois somente o usuário root tem permissão para alterar o arquivo /etc/passwd.

# ls -lah /usr/bin/passwd
-rwsr-xr-x 1 root root 27K 2006-04-03 10:37 /usr/bin/passwd

3.2 - Comandos:

- Aplicando SUID:

Aplicando a propriedade SUID em um arquivo executável utilizando formato simbólico (s):

# chmod u+s programa.sh
# ls -lah programa.sh
-rwsr-xr-x 1 root roberto 0 2006-09-26 22:57 programa.sh

Aplicando a propriedade SUID em um arquivo executável utilizando formato octal (4):

# chmod 4750 programa.sh
# ls -lah programa.sh
-rwsr-x--- 1 root roberto 0 2006-09-26 22:57 programa.sh

- Retirando SUID:

# chmod u-s programa.sh
# ls -lah programa.sh
-rwxr-x--- 1 root roberto 0 2006-09-26 22:57 programa.sh

- Procurando SUID:

Procurando a propriedade SUID em um arquivo executável utilizando formato simbólico (s):

# find /home/roberto -perm u=s
/home/roberto/programa.sh

Procurando a propriedade SUID em um arquivo executável utilizando formato octal (4):

# find /home/roberto -perm -4000
/home/roberto/programa.sh

4 - SGID ( Set Group ID ):

A propriedade SGID tem a mesma função que o SUID para arquivos executáveis.
Mas, a propriedade SGID tem um efeito especial para os diretórios.

Quando SGID é aplicado em um diretório, os novos arquivos que são criados dentro do diretório assumem o mesmo ID de Grupo do diretório com a propriedade SGID aplicado.

A permissão de acesso especial SGID pode aparecer somente no campo Grupo.

4.1 - Exemplo:

Se no diretório /home/roberto tem o grupo casa e tem o SGID habilitado, então todos os arquivos dentro do diretório /home/roberto serão criados com o grupo casa.
Esta é um importante atributo para um equipe, assumindo que todos os arquivos compartinhados devem ter o mesmo grupo.

4.2 - Comandos:

- Aplicando SGID:

Aplicando a propriedade SGID em um diretório executável utilizando formato simbólico (s):

# chmod g+s /home/equipe
# ls -lah /home/equipe
total 0
drwxr-sr-x 2 roberto equipe 48 2006-09-26 23:21 .

Aplicando a propriedade SGID em um diretório executável utilizando formato octal (2):

# chmod 2750 /home/equipe
# ls -lah /home/equipe
total 0
drwxr-s--- 2 roberto equipe 48 2006-09-26 23:21 .

- Retirando SGID:

# chmod g-s /home/equipe
# ls -lah /home/equipe
total 0
drwxr-xr-x 2 roberto equipe 48 2006-09-26 23:21 .

- Procurando SGID:

Procurando a propriedade SGID em um diretório executável utilizando formato simbólico (s):

# find /home -perm /g=s
/home/equipe

Procurando a propriedade SUID em um diretório executável utilizando formato octal (2):

# find /home -perm -2000
/home/equipe

5 - Sticky ( Sticky bit):

Em arquivos executáveis, a propriedade Sticky faz com que o sistema mantenha uma imagem do programa em memória depois que o programa finalizar.
Esta capacidade aumenta o desempenho, pois será feito um cache do programa para a memória, e da próxima vez que ele for executado, será carregado mais rápido.

Em diretórios, a propriedade Sticky impede que outros usuários deletem ou renomeam arquivos dos quais não são donos.
Isso normalmente é utilizado para aumentar a segurança, pois o diretório estará em modo append-only ( somente incremente )
Sendo assim, somente o usuário que é Dono do arquivo, poderá deletar ou renomear os arquivos dentro de um diretório com a propriedade Sticky aplicada.

A permissão especial Sticky, pode ser especificada somente no campo outros usuários das permissões de acesso.

5.1 - Exemplo:

No diretório /tmp, todos os usuários devem ter acesso para que seus programas possam criar os arquivos temporários, mas nenhum pode apagar arquivos dos outros.
Então é interessante aplicar a propriedade Sticky no diretório /tmp.

5.2 - Comandos:

- Aplicando Sticky:

Aplicando a propriedade Sticky em um arquivo executável utilizando formato octal (1)

# chmod 1750 programa_pesado.sh
# ls -lah programa_pesado.sh
-rwxr-x--T 1 root root 2,9M 2006-09-26 23:51 programa_pesado.sh

Aplicando a propriedade Sticky em um arquivo executável utilizando formato simbólico (t):

# chmod o+t programa_pesado.sh
# ls -lah programa_pesado.sh
-rwxr-x--T 1 root root 2,9M 2006-09-26 23:51 programa_pesado.sh

Aplicando a propriedade Sticky em um diretório utilizando formato simbólico (t):

# chmod o+t /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwt 8 root root 264 2006-09-26 23:22 .

Aplicando a propriedade Sticky em um diretório utilizando formato octal (1):

# chmod 1777 /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwt 8 root root 264 2006-09-26 23:22 .

- Retirando Sticky:

# chmod o-t /tmp
# ls -lah /tmp
total 5,0K
drwxrwxrwx 8 root root 264 2006-09-26 23:22 .

- Procurando Sticky:

Aplicando a propriedade Sticky em um diretório utilizando simbólico (t):

# find /home/roberto/ -perm /o=t
/home/roberto/programa_pesado.sh

Aplicando a propriedade Sticky em um diretório utilizando formato octal (1):

# find /home/roberto/ -perm -1000
/home/roberto/programa_pesado.sh

Referência:
Guia Foca Linux - Permissões especiais
LPI Linux Certification in a Nutshell
IBM DeveloperWorks - Linux LPI - Tópico 104.
http://robertors.blogspot.com/2006/09/linux-permisses-de-acesso-especiais.html

sexta-feira, novembro 09, 2007

Comandos Básicos Linux

- Man

Comando que nos mostra o manual de um outro comando.
Uso: man [seção] comando
Observe que seção é opcional, mas pode ser:

1à Comandos do usuário
2à Chamadas ao sistema
3à Biblioteca de funções
4à Dispositivos
5à Formatos de arquivos
6à Jogos
7à Informações Gerais
8à Administração do sistema

Exemplo de uso:
man 1 ls
Utilize /palavra para procurar e q para sair.

- Logout
Fecha a shell do usuário. Este comando é utilizado quando se termina sua sessão ou para se trocar de usuário.

- Shutdown -r now
Comando utilizado para reiniciar a máquina. Possui alguns similares:
Reboot
Init 6
Ctrl + Alt + Del
Existe também o shutdown -h now que desliga a máquina. Seus similares:
Halt
Init 0

- Su
Utilizado para se trocar de usuário sem efetuar logout. Muito comum em acessos via rede, já que via rede por default o root não pode se logar.
Usa-se também su -c "comando a executar" para se executar um comando com poderes de root e depois retornar. Obviamente será pedida uma senha.
Uso do su:
su nomeDoUsuarioAseVirar

- Ls
Comando que serve para listar arquivos. Suas opções mais utilizadas são
-la, onde o -l significa para listar as permissões (inclusive) e o -a para listar todos os arquivos (lembrando que para o linux arquivos começados com . são ocultos).
OBS: O Conectiva Linux possui um alias chamado l para o comando ls -la, use-o e caso a sua distribuição não contenha tal alias, crie-o. Veja mais adiante como fazê-lo.

- Cd (deslocamento relativo x absoluto)
Comando para mudar-se de diretório. O deslocamento absoluto se tem quando utilizamos a raiz (/) para indicarmos para onde queremos ir. Por exemplo, imaginemos que estamos no diretório /usr/src/linux e desejamos ir para o diretório /usr/src/teste. Temos duas opções, a seguir:
cd /usr/src/teste à Deslocamento absoluto, observe o uso do / no início do diretório para o qual queremos ir
cd http://ivandroconradi.multiply.com/teste à Deslocamento relativo, perceba que se estivéssemos em um outro diretório (/usr) por exemplo, não iríamos cair onde queremos. Daí a convenção de "relativo".

- Cp
Copia arquivos. Use: cp arquivoASerCopiado novoArquivo
Opções interessantes:
-i à Pede confirmação antes de substituir um arquivo existente
-R à Cópia recursiva. Serve para copiar diretórios e seu conteúdo.

- Mv
Move arquivos. Use-o também para renomear.
Uso: mv arquivo novaLocalizacao/
mv arquivo novoNome
Recomendado:
-i à Confirma antes de substituir um arquivo existente.
OBS: No Conectiva Linux existe um alias tanto para o comando cp como para o mv com a opção -i.

- Alias
Cria um apelido para um comando. Tem precedência sobre o comando, ou seja, pode-se criar um alias do tipo: alias ls="ls -la". Toda vez que digitarmos ls na verdade ele executará ls -la.

- Clear
Limpa a tela. Recomenda-se a criação de um alias chamado c para este comando.

- Mkdir (-p)
Comando para a criação de diretórios. Usa-se o -p caso se queira criar uma
"árvore" de diretórios.

- Rmdir (-p)
Complemento do comando mkdir. Serve para remover um diretório vazio. A opção -p serve para remover uma árvore de diretórios vazia (sem arquivos).

- Rm (-rf)
Comando utilizado para apagar arquivos. Observe que o rm simplesmente não apaga diretórios. Sua opção -r indica para apagar recursivamente, ou seja, ir apagando todos os arquivos em subdiretórios e inclusive os próprios diretórios. A opção -f força apagar, e não emite mensagens de erro caso não exista um arquivo.
Ex: rm -rf arquivoQueNaoExiste
Não acontecerá NADA. Nenhuma mensagem de erro será informada.

- Who (w, who is god, whoami)
O commando who e w listam os usuários que estão logados na máquina. O w tem uma saída um pouco mais complexa, mostrando mais informações.
O comando who is god é uma sátira e retorna o nome de seu usuário.
O comando whoami (pode ser escrito who am i) também retorna o nome de seu usuário e é utilizado para saber com qual usuário você está logado, muito usado quando se utiliza o su e acaba se confundindo quem é você.

- Df
Mostra informações de sistemas de arquivos montados (mesmo CDRom e Disquete).

- Free
Mostra informações de memória (swap inclusive).

- Cat /proc/cpuinfo
Informações muito completas de seu processador.

- Setterm
Este comando serve para modificar configurações do terminal do Linux, tais como cor de fundo e cor da letra.
Ex:
setterm -background green --> Fundo Verde
setterm -foreground yellow --> Letra "amarela". O amarela está entre aspas devido ao fato de que a cor não parece ser amarelo não.
OBS: Este comando mudará a cor a partir do momento em que ele for dado, ou seja, você precisa imprimir algo na tela ou dar um clear para realmente mudar a cor.

- Tput
Utilizaremos este comando para posicionar o cursor na tela, onde quisermos. Ele será muito útil quando estivermos construindo shell scripts.
Ex:
tput cup 5 10 à Posiciona o cursor na linha 5 coluna 10.

- Uptime
Mostra a quanto tempo o sistema está ligado. Os maiores uptimes da internet são com máquinas UNIX.

- Arquivos da Inicialização
Alguns arquivos são executados quando o sistema reinicializa. O que nos será conveniente falar por agora será o arquivo /etc/rc.d/rc.local (todas as distribuições devem tê-lo implementado).
Este arquivo será o último a ser executado quando da inicialização do sistema.
Diversos arquivos são executados no processo de entrada de um usuário no sistema.
São eles:
.bashrc
.profile
.bash_login
Os 3 se localizam no HOME do usuário
E:
/etc/bashrc
/etc/profile
Observe que enquanto os 3 primeiros são exclusivos dos usuários (cada usuário pode ter suas configurações), os últimos 2 são globais a todos os usuários que entrarem no sistema.
Não recomenda-se alterar o arquivo /etc/profile já que este é de configurações e variáveis.

- Variáveis
Variáveis nada mais são do que espaços na memória que armazenam valores. O linux possui variáveis do próprio sistema, que armazenam valores de configurações ou informações da máquina.
Para vê-las utilize o comando set.
Para darmos um valor a uma variável e torna-la global ao sistema, fazemos
export variável=valor.
Para retirarmos uma variável fazemos unset variável.

- Variável PS1
Esta variável guarda os valores para o PROMPT do Linux. Observe que estes valores podem ser variáveis interpretadas pela SHELL, e por default o são, ou seja, se você utilizar uma shell que não a shell BASH, eles podem ficar sem sentido.
A variável PS1 é uma variável normal do sistema, qualquer valor que for dado a ela irá ficar no prompt.
No entanto ela possui alguns valores especiais interessantes, eis alguns:
\h à Host da máquina
\W à Diretório Corrente
\w à Caminha completo do diretório corrente
\u à Nome do usuário
\t à Hora
\\$ à Fica $ se for usuário normal e # se for root
Exemplo:
export PS1="[\h@\w]\\$ "

- Arquivo /etc/motd
Este arquivo é lido pelo sistema quando um usuário loga na máquina e seu conteúdo é enviado para a tela do usuário, como uma mensagem de boas vindas ou algo do tipo. Preste atenção que comandos NÃO serão interpretados.

- Arquivo /etc/issue
Tela vista ANTES do usuário se logar. Seria a própria mensagem antes do login. Observe que o arquivo /etc/issue.net é o mesmo que o issue mas é válido para conexões via rede (telnet). Em algumas distribuições este arquivo é apenas um link para o /etc/issue.

- Ps (aux)
Comando que lista os processos em execução no sistema. Recomenda-se sempre utiliza-lo com as opções AUX, para que liste TODOS os processos ativos no sistema.

- Kill
Serve para matar um processo em execução. Deve-se utilizar um dos sinais existentes para esta tarefa. O sinal padrão é o sinal 15. Após o sinal, deve-se informar o PID (identificador único de processos) do processo que se deseja matar (encerrar).

- Killall
Implementação do linux muito interessante. Permite-se que se mate diversos processos com o mesmo nome de uma única vez. Observe que pode utilizá-lo para matar um único processo pelo nome, desde que se tenha o cuidado de perceber se não existem outros processos com este nome.
Ex: killall httpd
Killall -9 vi

- Sinais (1, 9, 15)
É importante se lembrar destes 3 sinais principais:
1-) SigHUP à Manda a aplicação reiniciar
9-) SigKILL à Manda o kernel tirar a aplicação da lista de processos ativos (mata mesmo!)
15-) SigTERM à Manda um sinal para que a aplicação termine normalmente
Os sinais são utilizados para comunicações INTER-PROCESSOS, ou seja, quando um processo deseja indicar algo para outro processo.
Neste caso, o processo kill (killall é a mesma coisa), envia o sinal que pedirmos para a aplicação.
Existem outros sinais (como SigINT) que são utilizados pelo sistema. Para visualizá-los utilize o comando kill -l.

- Touch
Cria um arquivo texto vazio. Muito interessante na hora de se testar alguma coisa.
Uso: touch nomeDeArquivoaCriar nomeDeArquivoaCriar2 ...
Pode-se criar diversos arquivos de uma única vez.

- Find
Busca arquivos. Muito avançado.
Uso: find DirAProcurar opções
Exemplos de uso:
find / -name Rodrigo.tar à Procura a partir da raiz (no sistema todo) o arquivo chamado Rodrigo.tar
find /home -exec grep "teste" {} \; -exec ls -la {} \: à Procura a partir do diretório /home arquivos com o conteúdo teste (grep teste) e lista este arquivo (ls -la).
find /usr -type l -ok rm -rf {} \; à Procura no diretório /usr links (-type l) e caso encontre, confirma se deve ou não apagar (-ok rm -rf).
Consulte o manual para informações mais interessantes.

- Locate
Busca arquivos, mas utiliza uma base de dados como padrão, o que o torna muito rápido. Cuidado!! Atualize sempre sua base de dados, ou irão aparecer arquivos que já foram removidos em suas buscas.
Outro problema do locate é o fato de que ele busca qualquer ocorrência da palavra a buscar, ou seja, se você fizer locate a, ele irá listar TUDO no sistema que contém a palavra a.
Para atualizar sua base de dados utilize: updatedb
Para buscar utilize: locate oqbuscar

- Top
Método interessante de se vizualizar os processos ativos na máquina.
Use: M --> Ordenar por consumo de memória
P --> Ordenar por consumo de CPU

- Vi (:w :x :q :q! /)
Ótimo editor de textos que recomenda-se e muito saber. As opções vistas foram:
ØModo Comando, Fim de Linha e de Edição
Ø:w à Salva arquivo
Ø:x à Salva e sai
Ø:q à Sai quando você não alterou nada
Ø:q! à Sai sem salvar
Ø/palavra à Procura palavra
Øn à Procura pela próxima ocorrência de palavra

- Background (&)
O linux possui uma opção interessante que é a de mandar processos para o segundo plano, liberando assim o ambiente do usuário.
Pode-se fazer isso através do sinal & após qualquer comando.

- Jobs
Lista os processos que estão em segundo plano, retornando o número do processo de segundo plano, que deverá ser utilizado para traze-lo de volta.

- Fg
Comando que trás de volta um processo do segundo plano.
Uso: fg numeroProcessodeSegundoPlanoRetornadoPeloJobs

- ln (-s)
Este comando cria um link (atalho) entre diretórios e arquivos. Um link simbólico (opção -s) nada mais é do que um arquivo no HD que aponta para a área onde está o arquivo original. Se o original é apagado, o link fica "quebrado". Já um link direto (apenas ln) dá um outro nome para a mesma área do HD. Como um backup contra remoção indevida, no entanto usa-se o mesmo espaço do HD, referenciando-no de duas maneiras diferentes. Crie e compare. Um link direto não pode ser feito entre diretórios.
Uso: ln -s Original Link
ln Original Link

- Chmod (ugo +rwx)
Comando que muda as permissões de um arquivo. Estas podem ser vistas através do comando ls -l.
A esquerda dos arquivos aparecerá uma cadeia de caracteres de difícil compreensão inicial, mas prestem atenção:
PrimeiroCaractere à Indica o tipo de arquivo, pode ser:
- à Arquivo normal (executável ou texto)
d à Diretório
c à Dispositivo orientado a caracteres (modem, portas seriais)
b à Dispositivo orientado a blocos (hd)
s à Socket mapeado em arquivo ("Em Unix tudo é arquivo")
p à FIFO, comunicação inter-processos
l à Link Simbólico
3 próximos Caracteres à Permissões Válidas para o DONO do arquivo, 1ª coluna com nome de usuário.
R à Permissão de leitura. Para diretórios, pode listar seu conteúdo.
W à Permissão de escrita.
X à Permissão de execução. Para diretórios, pode entrar nele.
3 próximos Caracteres à Permissões Válidas para o GRUPO dono de um arquivo, 2ª coluna, do lado da do DONO do arquivo. Observe que o GRUPO dono não necessariamente tem o DONO como membro.
3 próximos Caracteres à Permissões para o restante dos usuários do sistema.
Ex: chmod ugo+rwx -R arquivoOudiretório.
A opção -R manda dar a permissão recursivamente a todos os arquivos e subdiretórios deste diretório em questão.
Esclarecendo a Sintaxe UGO:
U à Refere-se as permissões para o DONO
G à Refere-se as permissões para o GRUPO DONO
O à Refere-se as permissões para o restante dos usuários
A à Refere-se as permissões para TODOS os usuários (mesmo que Ugo junto)
+rwx à Está-se dando todas as permissões
-rwx à Está-se tirando todas as permissões
OBS: Pode utilizar apenas -r ou -w sozinhos, por exemplo.
=rw à Estaria-se igualando as permissões a +RW-X, ou seja, quando se utiliza o sinal de igual, as permissões se IGUALAM as que o sinal indica, sendo retiradas as que não forem mencionadas.

- Umask
Comando que muda a máscara de permissões padrão para a criação de arquivos e diretórios.
Seu uso será explicado mais adiante, apenas em modo OCTAL e não CARACTERE. O modo CARACTERE foi explicado no curso básico, mas não o será nesta apostila.

- Chown (user:group)
Utilizado para mudar o DONO e o GRUPO dono de um arquivo ou diretório.
Uso: chown novodono:novogrupo arquivoOudiretorio
Observe que a opção :novogrupo pode ser omitida ou trocada por .novogrupo.
Também aqui existe a opção -R.

- Chgrp
Utilizado para mudar apenas o grupo dono de um arquivo.
Uso: chgrp novogrupo ArquivoOuDiretório

- Caracteres Especiais (~,[],*,?)
São também conhecidos como METACARACTERES.
Os mais comuns e utilizados são:
* à Simboliza TUDO
? à Simboliza QUALQUER CARACTERE
~ à Simboliza o HOME do usuário Corrente
[AB]* à Qualquer arquivo (*) começado com A ou com B.

- Home do usuário
Diretório que pertence ao usuário, onde ele pode tudo. O comando cd isolado leva o usuário até este diretório. Ao logar no sistema, o usuário cai também em seu home.

- Adicionando um Grupo
Um grupo nada mais é do que a união de diversos usuários com as mesmas
características. Por exemplo, poderíamos ter um grupo estudantes ou alunos.
Para adicionarmos este grupo, devemos utilizar o comando:
groupadd alunos
No arquivo /etc/group será adicionada uma entrada alunos, e será dado um GID (identificador de grupo) a este grupo.

- Adicionando um Usuário
Qualquer pessoa que for utilizar o linux deve necessariamente possuir um usuário válido na máquina. Lembrando que NÃO devemos utilizar o root a menos que necessário, esta tarefa é importantíssima mesmo para usuários caseiros.
Adicionando:
useradd rodrigo -g alunos
Adicionamos o usuário rodrigo no grupo alunos. Observe que a opção -g nomegrupo não se faz necessária, e caso seja omitida, teremos comportamentos diferentes em algumas distribuições:
RedHat e familiares (incluindo Conectiva):
Será criado um grupo com o mesmo nome do usuário e este será adicionado neste grupo
Slackware:
O usuário será adicionado em um grupo chamado users
Isto ocorre devido a não padronização deste ato e ao fato de um usuário NECESSARIAMENTE pertencer a algum grupo

- Senhas SHADOW
O esquema de senhas chamado SHADOW foi criado devido ao fato de o Linux (e os Unix-Like da vida) utilizarem em suas senhas um método de criptografia chamado DES (Data Encryption Standard). Este método é fraco (utiliza chaves de apenas 64 bits) e pode ser facilmente quebrado (Veja o livro Cracking DES para entender melhor sobre este assunto). Como o arquivo /etc/passwd necessita ter permissão de leitura para todos, qualquer usuário facilmente conseguiria obter a senha de ROOT do sistema.
Com isso criaram o SHADOW, onde as senhas criptografadas com o DES ficam no arquivo /etc/shadow que só pode ser visto pelo root.
Sobra então no arquivo /etc/passwd apenas um * ou ! no lugar da senha criptografada do usuário.
Todas as distribuições linux trazem o SHADOW por padrão.

- Arquivo /etc/passwd
Este arquivo contém os usuários cadastrados na máquina e informações sobre eles. Sua sintaxe é:
login:UID:GID:Descrição:Home:Shell
Onde:
·login à Nome do usuário na máquina
·UID à Identificador do usuário. O Linux utiliza este número para dar ou tirar permissões. Pode ser repetido entre usuários.
·GID à Identificador do grupo principal do usuário.
·Descrição à Qualquer coisa, se for omitido, deve-se deixar ::. Geralmente coloca-se nome e cargo do usuário
·Home à Diretório pessoal do usuário. Não necessariamente, mas recomenda-se que ele fique no /home e tenha o mesmo nome do usuário.
Ex: Usuário: Rodrigo
Home: /home/Rodrigo
·Shell à Shell que o usuário irá utilizar para se logar no
sistema. Use /bin/false caso o usuário não deva logar. E /bin/bash caso deva.
OBS:
Deve ter ficado na cabeça do leitor atento o fato de CASO O USUÁRIO NÃO DEVA LOGAR.
Mas quando isto acontece?
Digamos que temos uma aplicação que deve ser executada com as permissões de um usuário. Criamos um para ela, mas este não é um usuário válido, como minha aplicação iria entrar na máquina? Este é um caso.

- Arquivo /etc/group
Similarmente ao /etc/passwd este arquivo possui as configurações dos grupos (o /etc/passwd possui dos usuários)
Sua sintaxe geral é:
:x::,
Os usuários que pertencerem a este grupo estarão listados neste arquivo, a menos que o grupo seja primário do usuário, neste caso apenas estaria referenciado em /etc/passwd no campo gid.
Preste atenção que é neste arquivo que o GID dos grupos está especificado, sendo que o /etc/passwd apenas consulta ele.

- Porque saber editar manualmente usuários e grupos?
Esta é uma pergunta bem simples, já que teremos de editar manualmente em
diversas situações onde desejarmos modificar opções de usuários e desejarmos fazer isto de uma forma rápida e segura.


By Serginho http://tuxnaxibe.guardachuva.org/combaux


terça-feira, novembro 06, 2007

Copiar a imagem de um HD para outro usando o Linux

LEIA COM ATENÇÃO E DARÁ CERTO!

Imagine que voce acabou de instalar um linux, configurou servicos, criou contas de usuarios, instalou e configurou uma ou outra aplicacao adicional baixada da internet. Agora, imagine que do seu lado tem outra maquina igualzinha e voce vai ter que fazer a mesma coisa nela, tudo de novo?

Provavelmente no minimo um suspiro de resignacao voce vai soltar antes de comecar. Agora imagine que voce nao tem so uma, mas cinquenta maquinas ali do lado esperando pelo mesmo tratamento... Dai voce nao vai mais estar suspirando, ira isso sim atras de alguma aplicacao capaz de gerar e copiar imagens de hds, como o Ghost(R) por exemplo. E talvez nem saiba voce que ja possui uma ferramenta que muito provavelmente podera resolver seu problema na linha de comando do linux mesmo. Essa solucao, ou melhor, comando, tem o simples e pequeno nome de dd (igual ao comando para apagar linhas no vi). Se voce visitar a man page do dd, recebera a explicacao de que ele copia e converte um arquivo, da entrada padrao para a saida padrao a nao ser que especificado em contrario. Mais um caso de man page que fala muito pouco em termos praticos, mas vamos esmiucar um pouco... Voce pode especificar outra entrada ou saida atraves das opcoes "if" e "of". Sendo que:

if = especifica o fluxo de entrada do comando
of = especifica o fluxo de saida do comando

Assim e que se voce executar o comando

# dd if=texto.txt of=texto2.txt

Tera algo equivalente a se tivesse executado

# cp texto.txt texto2.txt

O legal disso e que, se voce especificar um dispositivo de blocos como fluxo de entrada, fara uma leitura, bit a bit, desse dispositivo. Relembrando, um dispositivo de bloco pode ser um hd, uma particao de um hd, um cd, um disquete, ou afins... E se voce especificar como fluxo de saida um dispositivo de blocos, estara escrevendo nesse dispositivo os bytes que vierem pela entrada. Para dar um exemplo que vai deixar isso bem claro, vamos copiar um disquete usando o dd:

1. Insira o disquete original no drive, mas nao monte o seu sistema de arquivos
2. Execute o comando: dd if=/dev/fd0 of=disquete.img
3. Troque o disquete no drive por outro nao gravado
4. Execute o comando: dd if=disquete.img of=/dev/fd0

No passo 2, o dd leu o dispositivo de blocos /dev/fd0 (disquete) e jogou, byte a byte, tudo que conseguiu ler num arquivo chamado disquete.img. Esse arquivo sera uma imagem exata do sistema de arquivos contido no disquete, com tabelas de alocacao de arquivos e tudo mais. Quando executou o passo 4, voce jogou esse conteudo num outro disquete, bit a bit. O resultado sera que o segundo disquete sera uma copia perfeita do primeiro. E detalhe, se voce tivesse duas unidades de disquete (muito incomum nas maquinas de hoje, mas.....) poderia ter feito diretamente:

# dd if=/dev/fd0 of=/dev/fd1

Sendo /dev/fd0 a unidade que contem o disquete original. Se duvida que funcione, pode pegar um disquetinho e experimentar a vontade, eu espero :) Muito bem, agora imagine que ao inves de especificar dispositivos relativos a unidades de floppy disk, tivessemos especificado dispositivos como /dev/hda ou /dev/hdb, teria funcionado? SIM, pode ter certeza disso, e e aqui que voltamos ao problema de copiar a imagem deum hd. Retornando ao cenario inicial, voce tem uma maquina na qual acabou de instalar linux, e quer jogar a imagem daquela instalacao para outro hd igual ao da primeira maquina. Voce vai precisar colocar os dois hds em uma maquina de onde voce ja possa dar boot num linux que nao seja o do hd recem instalado, pois nenhum dos sistemas de arquivos no hd a ser lido pode estar montado. Entao o que voce pode fazer e instalar esses hds em /dev/hdc (ide2 master) e /dev/hdd (ide2 slave) numa maquina qualquer que ja tenha um hd com linux bootavel (ou entao use um desses live cd para dar boot) e execute:

# dd if=/dev/hdc of=/dev/hdd

E uma copia exata do hd no ide2 master sera feita no ide2 slave. Aqui cabe um aviso importante sobre linux em geral: se voce instalou o linux com o hd no primario master, e muda-lo para primario slave ou secundario master, o sistema nao vai dar boot. E ,obviamente, uma copia desses sistema tambem nao. Ou seja, quando for instalar esses hds numa maquina, certifique-se de que estao no mesmo ide e com a mesma configuracao (master ou slave) com que aquele linux foi instalado. Agora, a boa noticia e que a principio nao importa o SO que voce tem no hd original. O dd nao faz discriminacao :) Vai copiar bit a bit o que estiver no primeiro hd para o segundo. Legal ne?

Bom, isto aqui ja quebra um galho de quem tem que instalar varias maquinas em serie, e essas maquinas em geral costumam ser iguais entre si. Mas e se forem maquinas diferentes, com hds de capacidades diferente?

HDs DE DIFERENTES TAMANHOS

Primeiro entra uma regra simples e logica, se voce quer colocar um sistema de arquivos dentro de um dispositivo, este tem que ter espaco para tanto. Ou seja, sempre copie do hd menor para o hd maior, nunca o contrario. No mais, voce pode utilizar o procedimento que foi feito ate agora, que a unica consequencia e que sobrara espaco nao particionado ao final do hd de destino. O qual voce sempre pode, posteriormente, particionar e especificar um ponto de montagem para ele. Uma outra situacao e que voce pode desejar querer mover aquele linux para um outro hd com outro esquema de particionamento. Aqui entra de novo aquela caracteristica do linux: se voce especificou que o raiz vai ficar, por exemplo, em /dev/hda3 durante a instalacao no hd original, no novo hd este tambem vai ter que estar em /dev/hda3. Se especificou que o /boot tem que ficar em /dev/hda2, tambem tem que ficar em /dev/hda2 no novo hd. Mas a boa noticia e que nada impede essas particoes de estarem alguns blocos mais a frente ou mais para tras, o que nao pode e haver mais particoes antes das particoes a serem copiadas em relacao ao hd original. Isto posto, nada impede que voce faca algo como:

dd if=/dev/hdc2 of=/dev/hdd2 (admitindo que os hds estao no ide2 master e slave respectivamente)

E repetindo o comando para quantas particoes formarem seu sistema, nao esquecendo a de swap claro. De novo chamando a atencao, note que foi copiado hdd2 para hdd2, ou seja, segunda particao para segunda particao. Mas nao ha impedimento que no primeiro hd a primeira particao tenha 2G enquanto que no novo hd a primeira particao tenha 4G, fazendo com que a particao hdd2 fique bem adiante.

Note que, neste procedimento, voce nao copiou o boot loader para o segundo hd, ou seja, ele nao vai dar boot logo de cara. Voce vai ter que instala-lo manualmente. Se for o lilo, e se voce tiver o arquivo de configuracao do boot loader a ser instalado no novo hd no seu diretorio atual do linux que esta usando para executar a copia, voce pode fazer algo como:

# lilo -C arquivo_de_configuracao -b /dev/hdd

O arquivo de configuracao pode bem ser o /etc/lilo.conf copiado a partir do hd original, que voce montou num ponto qualquer antes de processar a copia, so para pegar esse arquivo, e logo depois desmontou. Nao e meu objetivo entrar em detalhes do comando mount aqui, a nao ser uma pequena dica mais a frente. Se voce nao tem familiaridade com esse comando, recomenda-se um pouco de estudo em cima dele e tambem sobre como o linux trata sistemas de arquivos antes de tentar algo deste material.

Uma ultima dica: eventualmente voce pode ter problemas por consequencia do lilo no linux em que voce executou a copia ser uma versao diferente daquele usado pelo linux que voce esta copiando. Pior, voce pode ter usado para boot um linux que so usa grub (ou seja, voce tentou o comando lilo e recebeu a classica mensagem de "command not found"). Nao se desespere, voce pode montar o hd original num ponto de montagem qualquer, tal como no comando:

# mount -t ext3 /dev/hdc1 /mnt/linuxorigem

Usar co comando chroot para mudar temporariamente a referencia da raiz do seu sistema de arquivos:

# chroot /mnt/linuxorigem

E agora que seu / esta temporariamente mudado para /mnt/linuxorigem, executar o comando:

# /sbin/lilo -b /dev/hdd

Depois e so dar exit para sair da "gaiola" onde se meteu :)
Possivelmente tambem poderia ter funcionado se tivesse feito algo como:

# /mnt/linuxorigem/sbin/lilo -C /mnt/linuxorigem/etc/lilo.conf -b /dev/hdd

Tudo depende de ate que ponto as bibliotecas do linux que usou para dar boot sao diferentes daquelas que o lilo do hd origem espera encontrar para sua execucao. Agora, se quer realmente se garantir contra sustos e nao ter que fazer essas acrobacias, use como boot um linux identico aquele instalado no hd origem, e o primeiro exemplo de uso do lilo nao te dara problemas. Note que esta preocupacao existe apenas para gerar copias bootaveis de hds onde voce copiou particoes em separado. Copiando hds inteiros, como no primeiro exemplo, faz com que passe a nao importar nem o SO ou SOs que estao ali. Voce tambem nao precisara se preocupar se a particao que copiou contem apenas dados, e nao um SO que precisa dar boot. Por fim, e obvio que se a maquina para a qual o hd recem escrito com o dd tiver componentes de hardware diferentes daquela onde o linux do hd original foi instalado, voce tera que reconfigurar video, som, rede, e tantos quantos forem os componentes de hardware que diferem.

FALANDO EM OUTROS SOs, NAO DA PROBLEMA MESMO?

Infelizmente eu nao tenho como ter testado com todos os SOs que existem pelo globo (e ainda bem que hoje temos tantas opcoes, nao? :) ). Mas vamos aos casos que ja testei:

HD so com linux: normal, ja vale tudo o que falei ate aqui sem por nem tirar nada.

HDs iguais, no original tem linux e windows: tambem sem problemas se feito como na primeira sessao deste texto.

HDS diferentes, no original tem linux e windows: atencao especial apenas para a particao windows. Apesar de que isto e uma materia sobre linux, nao me custa dar um conselho: execute o scandisk e o defrag antes de tentar a operacao. Se o windows e recem instalado, voce ate pode pular esses passos, mas eu tive uma experiencia recente com um windows98 ja em uso ha algum tempo, em que ele travava no hd para o qual foi copiado logo apos o boot. Executar aquelas duas aplicacoes antes de fazer a copia resolveu meu problema. A proposito, so testei isso ate hoje com windows da linha 98/Me usando fat. Nunca tentei com sistemas de arquivos ntfs para ver se funciona.

DÁ PARA GUARDAR A IMAGEM NUM ARQUIVO?

Lembra do exemplo da copia do disquete? Igual em tudo, mas voce vai ter que ter espaco para guardar o arquivo criado, que vai ter o mesmo tamanho que a particao/dispositivo que voce copiou. Isso mesmo que parte do sistema de arquivos sendo copiado esteja vazio. Ou seja, se voce esta copiando uma particao de 7G, mas ali dentro a soma dos arquivos guardados tem so 100K, ainda assim o arquivo que voce vai gerar vai ter 7G. O dd nao entende sistemas de arquivos, tudo que ele entende sao fluxos de bytes, assim ele le a particao inteira, ate onde nao tem gravado nada, e guarda. Isto posto, e so executar:

# dd if=/dev/hdb4 of=particao4.img

E sera criado o arquivo particao4.img, que contera uma imagem exata do sistema de arquivos naquela particao. Agora, o dispositivo conectado em /dev/hdb pode ate ser desconectado e, se mais tarde quiser restaurar aquela particao em outro hd, e so fazer:

# dd if=particao4.img of=/dev/hdb4

O mesmo vale para copias de hds inteiros. O problema de disponibilidade de espaco em disco pode ser diminuido com o auxilio do gzip:

# dd if=/dev/hdb | gzip > imagem_do_hd.img.gz

Esse comando gera a imagem do hd, mas que agora estara compactada pelo gzip. Obviamente para utiliza-la voce tera que descompacta-la:

# gzip -d -c imagem_do_hd.img.gz | dd of=/dev/hdb

A flag -c faz o gzip mandar os dados descompactados para a saida padrao ao inves de para um arquivo sem a extensao .gz, como faria normalmente. Nao esqueca que o dd, como dito no inicio do artigo, copia normalmente a partir da entrada padrao. Por isso aqui nao se especificou o parametro if= . O preco que se paga neste ultimo exemplo, claro, e um enorme acrescimo de tempo para a realizacao da compactacao e descompactacao. Uma outra aplicacao interessante a que isto nos leva, embora nao esteja relacionada a copia de hds, e gerar uma imagem iso a partir de um cd ja gravado, para depois ser usada na gravacao de um novo cd. Para fazer isso execute como no exemplo:

# dd if=/dev/cdrom of=slackware_cd1.iso

Depois, e so passar o arquivo gerado como argumento do cdrecord ou do seu programa de gravacao favorito. E uma ultima dica interessante: Sabia que e possivel montar esses arquivos que sao copias de sistemas de arquivos, como se fossem um dispositivo? Digamos que, no caso anterior, voce queira dar uma olhada nos arquivos que o cd continha, mas o cd criou pernas e sumiu e voce so ficou com o arquivo de imagem :) Nao e preciso gravar o cd para depois monta-lo, pode-ser perfeitamente montar o proprio arquivo de imagem como em:

# mount -t iso9660 slackware_cd1.iso /mnt/cdimg -o loop

O segredo esta justamente em passar o parametro -o loop no final do comando mount. Se nao funcionar, verifique se o seu kernel foi compilado com suporte a loopback device. Um jeito de checar isso e testar se e possivel carregar o modulo loop (embora esse tipo de suporte pode ter sido compilado embutido no kernel, mas se assim fosse voce nao teria problemas e nem teria que fazer esse teste). Por fim, para encerrar esse pequeno desvio (e praticamente o artigo), note que voce nao esta limitado a fazer isso so com imagens geradas a partir de cds. Pode ser feito com qualquer imagem desde que voce especifique o sistema de arquivos correto com -t. Obviamente, essas imagens sao montadas sempre como somente leitura. Nao da para modificar o conteudo de um arquivo de imagem usando essa tecnica. Para encerrar, note que as tecnicas apresentadas aqui resolvem situacoes simples, mas havendo a necessidade de algo mais "profissional", realmente e melhor procurar por um aplicativo dedicado a atender esse tipo de necessidade.


By serginho at http://tuxnaxibe.guardachuva.org/iso

Recuperando dados de HDs, CDs e DVDs defeituosos com o dd

O dd é um comando usado para clonar partições inteiras, bloco a bloco. Você pode usá-lo para clonar CDs e DVDs também. Mas o que acontece quando você tenta clonar partições ou CDs com defeito? A cópia é abortada.

Outro dia mesmo recebi de uma cliente um DVD no qual ela havia gravado uma festinha de sua filha de 5 anos. O DVD-RW em que a festa foi gravada estava danificado, e com isso o arquivo todo do filme estava inacessível. É um problema bastante irritante: você tem um filme de 400 MB, e por causa de 1 ou 2 MB com defeito a cópia do arquivo é abortada.

Foi então que descobri o dd_rescue. Ao contrário do dd, ele segue adiante, mesmo encontrando erros durante a cópia, e ainda tenta recuperar dados em setores defeituosos. Com isso, no caso do DVD, eu poderia recuperar boa parte do vídeo, embora perdendo alguns megas - o que, com certeza, seria bem melhor do que perder o arquivo inteiro. Ele funciona assim:

  dd_rescue /dev/hdc ~/Desktop/dvd_da_festa.img

Onde /dev/hdc é o dispositivo do meu DVD player. O comando acima gera uma imagem do DVD-RW danificado, da melhor maneira possível, sem truncar o arquivo. Às vezes, quando o estrago é grande, não há muito o que fazer. Mas muitas vezes, com a imagem em mãos, é possível montá-la com o mount e extrair vários arquivos dela, desta maneira:

  # mount -o loop ~/Desktop/dvd_da_festa.img /mnt/tmp

O único inconveniente é que, ao topar com badblocks, o dd_rescue se esforça ao máximo para recuperar os dados, e embora muitas vezes consiga, ele demora bastante para conseguir. Com isso, a recuperação do DVD levaria dias... Sem falar que se você estiver recuperando dados de um HD que já esteja nas últimas, o esforço para recuperar setores com badblocks pode acabar rendendo o último suspiro do HD. Não seria melhor checar primeiro os blocos não danificados, para garantir alguma coisa? Foi então que descobri algo ainda melhor: o dd_rhelp.

Funcionando como um complemento ao dd_rescue, o dd_rhelp "pula" os setores defeituosos, cuidando primeiro dos setores em perfeito estado. Com isso, se você tem um CD de 600 MB e apenas 10 MB estão danificados, o dd_rhelp vai recuperar 590 MB rapidamente, deixando os 10 MB críticos para o final. Se você vai executar a recuperação completa, saiba que ambos os programas levarão o mesmo tempo. Porém, talvez o dd_rhelp já tenha restaurado o suficiente, e você não sinta a necessidade de restaurar os últimos 10 MB. Se estivesse usando o dd_rescue, a recuperação dos 10 MB defeituosos, que poderiam estar logo no início do disco, poderia levar horas, sem que você tivesse a menor idéia do estado do resto do disco. Veja como é prático usar o dd_rhelp:

  $ dd_rhelp /dev/hdc ~/Desktop/dvd_da_festa.img

Você pode interromper a operação com CTRL+C à vontade para continuar mais tarde. De tempos em tempos, o programa exibe ainda uma representação gráfica do progresso da recuperação, como esta:

  === dd_rhelp INFO - 226 chunks...
- Jump pos : 167826.0 - max file size : 1429088.0
- Biggest hole size : 10464 k - total holes : 1285625.5k
- xferd(succ/err) : 143462.5k(142568.0k/894.5k)
- EOF is found and is at 1429088.0k.
=== BAR === [ 'x' dd_rescued, '*' next jump point, '|' '.' not dd_rescued ]
|||x|...|.......||.......||.......|x|.......|......|x|....|xxx|......|xxx|......|xxx|......|........|....
.....|.......|.......|x|....|xxx|...*....|xx|...|xxxx|......|xxx|.......xx|.....|...|....|....|....|....|
...|....|....|...|....|....|...|....|....|...|....|...|....|....|...|....|....|...|....|.....|x|......|xx
x|...|....|xxx|....||...|....|...|....|......|xx|.......|.|xxx|..|..xxx|..||........|.......|....|...|...
..|....|...|....|....|...|....|...|....|....|...|....|....|...|....|...|....|....|...|....|....|...|....|
....|...|....|...|....|....|...|....|....|...|....|....|...|....|...|....|...|....|...|....|...|....|...|
....|...|....|...|...|....|...|....|...|....|...|....|...|....|...|....|...|...|....|...|....|...|....|..
.|....|...|....|...|....|...|...|....|...||...|...|....|...|....|...|....|...|....|...|....|...|...|....|
...|....|...|....|...|....|...|...|xxxx|....|...|x|......|...|....|...|....|...|....|...|....|...|....|..
.|...||...|...||...|...|....|...|....|...|....|...|....|...|....|...|...|....|...|....|...|....|........|
...|....|...|....|...|....|...|...|....|...|....|...|........||.......||.......|....|...|...|....|....|xx
xxxx|.....|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=== Bar was drawn from 0 to 1429088.0

Depois que o dd_rhelp acabar de trabalhar, ou se você decidir parar no meio e ver no que vai dar, você deve montar a imagem com o comando mount, como já ilustrei acima. Porém, antes de montar a imagem, cheque a consistência do sistema de arquivos para tentar corrigir eventuais falhas:

  # fsck -y ~/Desktop/dvd_da_festa.img

Se estiver recuperando dados de um HD danificado, você pode copiar a imagem resultante para um HD novo sem maiores problemas, usando o dd:

  dd if=~/Desktop/hd_danificado_do_cliente.img of=/dev/hdb1


Por Roberto Bechtlufft,
http://www.linuxparaoresgate.com/index.php

LINUX para o resgate - Powered by txt2tags

segunda-feira, novembro 05, 2007

Precisa ativar o snmp do seu Linux?

Novamente estava precisando ativar o snmp dos meus boxs Linux, pois meu chefe vive fuçando e acabando com o meu serviço, dai resolvi deixar este post para facilitar a minha vida e de quem precisar ativar o snmp no Linux.

A instalação em si é muito simples, o complicado é o snmp.conf.
Para instalar em máquinas que utilizem o apt, admitindo que o seus sources.conf está OK, o comando é:

sudo apt-get install snmp snmpd (Ubuntu)
ou
sudo apt-get install net-snmp net-snmp-utils (Mandriva, Conectiva)

Se você tem alguma dúvida do nome do pacote utiliza este comando para achar o nome correto:
apt-cache search snmp
Este comando serve para procurar qualquer pacote do qual você não lembra o nome.

No Fedora Core 5, que por default utiliza o yum o comandofica assim:

yum search snmp (para procurar o pacote)
yum install net-snmp net-snmp-utils
Obs.: O apt-get tem uma performance muito maior que o yum, não se preocupem com a demora do yum, é assim mesmo.

Após a instalação, é só configurar o snmp.conf, como no exemplo abaixo:


#Definição da community e das rede que poderão acessar estas informações
## sec.name source community
## ======== ====== =========
com2sec local localhost geekguy
com2sec network_1 192.168.0.0/24 geekguy
com2sec network_2 192.168.1.0/24 geekguy
#Quem pode acessar e versão do snmp utilizada
## Access.group.name sec.model sec.name
## ================= ========= ========
group MyROGroup v2c local
group MyROGroup v2c network_1
group MyROGroup v2c network_2
#MIBs Disponíveis
## MIB.view.name incl/excl MIB.subtree mask
## ============== ========= =========== ====
view all-mibs included .1 80
# Define política de segurança
## MIB
## group.name context sec.model sec.level prefix read write notif
## ========== ======= ========= ========= ====== ==== ===== =====
access MyROGroup “” v2c noauth exact all-mibs none none

syslocation onde_esta_o_BOX # Se você quiser
syscontact Luciano Santos - john@doe.com # O seu email, tb se vc quiser

proc httpd 200 1 #verificar o processo, com o limite em 200, por exemplo
disk / 10000 #verificar o HD, com um mínimo de 10MB
load 12 14 14 #carga da CPU

#exec .1.3.6.1.4.1.2021.50 /bin/bash /usr/bin/sensors
#exec .1.3.6.1.4.1.2021.51 ps /bin/ps
#exec .1.3.6.1.4.1.2021.52 top /usr/local/bin/top
#exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq



Eu sugiro definir uma regrinha no iptables para permitir o acesso a porta 161 a somente as redes descritas acima no snmp.conf.