hdparm: Tire o máximo do seu HD

Neste artigo tentarei explicar os conceitos básicos do hdparm, uma importantíssima ferramenta de configuração que pode deixar o seu HD em ponto de bala, tinindo e pronto pra qualquer tarefa.

[ Hits: 229.616 ]

Por: Davidson Rodrigues Paulo em 19/11/2004 | Blog: http://davidsonpaulo.com/


Configurando o disco



Logo se vê pelos relatório que existem muitos parâmetros que podem ser alterados pelo hdparm, e essas alterações vão interferir diretamente no desempenho do HD, positiva ou negativamente. É preciso então saber interpretar as informações e nunca fazer testes com opções que podem representar perigo para a integridade dos dados contidos no disco.

Como vimos anteriormente, o uso do hdparm é simples, sendo sua sintaxe:

      hdparm <parâmetros> <disco>

Segue agora os principais parâmetros do hdparm, e como utilizá-los e seta-los corretamente.
  • -c<valor> : Esse parâmetro especifica o modo de interrupção de I/O. Os valores que pode assumir são:
    • 1: modo 16 bits
    • 2: modo 32 bits
    • 3: modo 32 bits

    Para saber se seu HD suporta o modo 32 bits, veja na BIOS do seu computador.

  • -d<valor> : Ativa/desativa o uso do DMA. Para ativar, use o valor 1. Para desativar, use 0.

  • -X<valor> : Seleciona o modo de DMA a ser utilizado. Pode variar de sdma0 (pior), passando por mdma e chegando em udma5 (melhor). Vamos desconsiderar o uso dos modos sdma que são muito antigos. Para utilizar os modos mdma, basta utilizar o número do modo somado com 32. Ou seja: use 32 para ativar mdma0 (32 + 0), e 34 para o mdma2 (32 + 2). Para utilizar os modos udma, utilize o número do modo somado com 64. Ou seja: use 65 para ativar o udma1 (64 +1) e 69 para o udma5 (64 + 5). Para saber qual modo é suportado pelo seu HD, basta ver as seguintes linhas:

    DMA modes: mdma0 mdma1 mdma2
    UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5

    Obtidas com o comando "hdparm -i /dev/hdX" (X é a letra da sua unidade de disco). O modo que deve ser utilizado é o último que aparece na lista. Nesse caso, é o modo udma5 (69).

  • -m<valor> : Especifica o valor do parâmetro MultSects. O valor desse parâmetro não pode ser maior que o parâmetro MaxMultSects, que encontramos na linha:

    BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16

    do relatório gerado com o comando "hdparm -i /dev/hdX". Nesse caso, o parâmetro MaxMultSects tem o valor 16, então o valor de MultSects deve ser igual ou menor a esse (de preferência igual).

  • -A<valor> : Ativa/desativa o recurso de leitura adiantada. O valor 1 ativa, enquanto 0 desativa.

  • -a<valor> : Configura a leitura adiantada. O valor especificado é multiplicado por 512 Bytes. Assim, se você usar 8, a leitura adiantada será de 4KB. A recomendação é de que você use o mesmo valor que usar para o parâmetro MultSects.

Veja um exemplo de configuração com esses parâmetros acima:

# hdparm -c1 -d1 -X69 -m16 -A1 -a64 /dev/hda
/dev/hda:
 setting fs readahead to 16
 setting 32-bit IO_support flag to 1
 setting multcount to 16
 setting using_dma to 1 (on)
 setting xfermode to 69 (UltraDMA mode5)
 setting drive read-lookahead to 1 (on)
 multcount    = 16 (on)
 IO_support   =  1 (32-bit)
 using_dma    =  1 (on)
 readahead    = 16 (on)
 done.

Esse comando configurou o HD para utilizar o modo de I/O de 32 bits (-c1), ativou o uso do DMA (-d1), ativou o UltraDMA modo 5 (-X69), definiu o leitura de setores múltiplos para 16 (-m16), ativou a leitura adiantada (-A1) e ajustou a leitura adiantada para 8 KB (-a16). Tome-o por base para configura o seu HD conforme as suas características.

A seguir, vamos ver como fazer o ajuste acústico e ajustar o desligamento do motor para economizar energia.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Instalação
   3. Obtendo e analisando informações
   4. Configurando o disco
   5. O gerenciamento acústico e de energia
   6. Testando o desempenho
   7. Ativando o hdparm na inicialização do sistema
   8. Considerações finais
Outros artigos deste autor

Fundamentos do sistema Linux - usuários e grupos

Resolvendo dependências no Slackware com slackpkg

Instalação e utilização do Qemu no Fedora Core

Dual-boot: instalando o Windows depois do Linux

Hyperic HQ: monitore sua rede like a boss

Leitura recomendada

Conexões redundantes à Internet utilizando Linux

Instalação personalizada com Debian

Configuração do sistema, DHCP, compartilhamento e DNS no Debian Squeeze

google-drive-ocamlfuse - Monte seu Google Drive usando o FUSE

Ubuntu 10.04 OpenLDAP NFS QUOTA

  
Comentários
[1] Comentário enviado por cvs em 19/11/2004 - 08:27h

Muito bom seu artigo cara, gostei mesmo já usando o hdparm há algum tempo obtive muitas respostas aqui.. .só faço uma ressalva, a respeito da instalação, normalmente ele já vem instalado por default... é só...parabens.

[2] Comentário enviado por rfranzen em 19/11/2004 - 09:16h

Muito bom artigo, bem explicado. Quando chegar em casa vou testar :)

[]'s !

[3] Comentário enviado por gelemeurer em 19/11/2004 - 09:39h

Ótimo artigo, valeu!!!

Aqui no IDE aumentou consideravelmente o desempenho, já no scsi: "operation not supported on SCSI disks"

Verei melhor isto mas se tiveres alguma dica...

[]s

Gele


[4] Comentário enviado por y2h4ck em 19/11/2004 - 11:45h

Eu usava o hdparm, melhorou bastante o desempenho, mas infelizmente pelo que andei estu dando meu hd Maxtor 20gb nao permite setar o DMA

Mas o artigo ta show cara, parabens!

Abraços

[5] Comentário enviado por m4sk4r4 em 19/11/2004 - 13:49h

Olá Davidson,

Show de bola seu artigo, gostei muito, value,

t+
[]'s

[6] Comentário enviado por lowpis em 19/11/2004 - 14:01h

O meu dá esse erro:
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
Alguém sabe o porquê?

E, pra quem usa o Gentoo, edite as configurações no arquivo /etc/conf.d/hdparm
O arquivo eh bem explicado, mas basicamente, você precisa colocar uma variável com os argumentos. Aqui em casa, usei:
hda_args="-c1 -d1 -X69 -A1 -a64 -m16"

Depois, para colocar o hdparm na inicialização, faça:
$ rc-update add hdparm boot

[7] Comentário enviado por gibabsb em 19/11/2004 - 18:56h

Parabéns pelo artigo muito bom mesmo, tem uma máteria sobre hdparm na revista LInux Magazine do mês passado, vale a pena dar uma olhada.
Tenho apenas uma dúvida, uso o RH9 e não encontrei o arguivo hdparm.conf então como faço para habilita-lo logo na inicialização ou ele já inicializa automático?
Um abraço

[8] Comentário enviado por bighead em 19/11/2004 - 20:30h

Muito bom , mas eu queria que vc desse uma olhada neste erro e me ajudasse a corrigi-lo!

# hdparm -c1 -d1 -X69 -m16 -A1 -a64 /dev/hda

/dev/hda:
setting fs readahead to 64
setting 32-bit IO_support flag to 1
setting multcount to 16
setting using_dma to 1 (on)
setting xfermode to 69 (UltraDMA mode5)
HDIO_DRIVE_CMD(setxfermode) failed: Input/output error
setting drive read-lookahead to 1 (on)
multcount = 16 (on)
IO_support = 1 (32-bit)
using_dma = 1 (on)
readahead = 64 (on)
root@darkstar:~# hdparm -i /dev/hda
ai quando eu digito :
root@darkstar:~# hdparm -i /dev/hda

/dev/hda:

Model=WDC WD100EB-00BHF0, FwRev=15.15M15, SerialNo=WD-WMA6K6151472
Config={ HardSect NotMFM HdSw>15uSec SpinMotCtl Fixed DTR>5Mbs FmtGapReq }
RawCHS=16383/16/63, TrkSize=57600, SectSize=600, ECCbytes=40
BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=19541088
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 *udma2 udma3 udma4 udma5
AdvancedPM=no WriteCache=enabled
Drive conforms to: device does not report version:

* signifies the current active mode

Viu ele não modificou a opção para o modo udma5 , será que tem como consertar este erro.

[9] Comentário enviado por davidsonpaulo em 19/11/2004 - 20:36h

bighead,

HDIO_DRIVE_CMD(setxfermode) failed: Input/output error

Essa mensagem siginifica que houve erro de entrada/saída no instante em que o hdparm tentava setar o seu HD para o modo UDMA5. Isso pode ter diversos motivos, e um deles é o seu HD na verdade não suportar o modo UDMA5, apesar de o hdparm reconhecer que suporta. Tente ativar os modos udma4 (-X68) e udma3 (-X67). Ou então, configure o /etc/hdparm.conf e reinicie o computador para ver se as configurações funcionam corretamente quando aplicadas no momento do boot.

Abraços

[10] Comentário enviado por removido em 20/11/2004 - 01:10h

SCRIPT DE EXECUÇÃO DO HDPARM

O script abaixo está diponível em http://www.guiadohardware.net/kurumin/dicas/005/index.php#01 e é de autoria do Alan Rafael Rodrigo Batista.
Bom proveito!
¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
. Ganho de performance no HD
Por Alan Rafael Rodrigo Batista

Crie um arquivo:

sudo kedit harddisk.sh

Coloque nele o conteúdo abaixo:

#!/bin/sh
echo "mostrando na tela as configurações do disco"
hdparm -c -d -t /dev/hda #corrija aqui caso seu disco não seja o hda
echo
echo "melhorando a leitura e escrita do hda"
hdparm -c 1 -d 1 -t /dev/hda #corrija aqui caso seu disco não seja o hda
echo "feito!"

Agora dê a permissão:

sudo chmod a+x harddisk.sh

E execute no terminal como root:

./harddisk.sh



[11] Comentário enviado por pop_lamen em 20/11/2004 - 01:30h

Muito bom o artigo, bem completo, estudado.
Prabéns, todos os artigos da comunidade deveriam ser como o seu, e não assuntos cobertos só pela metade.
Wainer.Chiari

[12] Comentário enviado por nemphilis em 20/11/2004 - 22:21h

este artigo me chamou a atenção, além da boa linguagem utilizada, sanou todas as duvidas dos topicos abordados. Parabéns bozolinux, eeeeeeeesse menino vai longe!!!

[13] Comentário enviado por bighead em 21/11/2004 - 13:19h

Muito obrigado Davidson.
Será que o hdparm pode resolver um problema num hd que apresenta este erro:artition check:
hda: hda1 hda2 hda3
hdb:hdb: dma_intr: status=0x51 { DriveReady SeekComplete Er
ror }
hdb: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=0, s
ector=0
hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
hdb: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=0, s
ector=0
hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
hdb: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=0, s
ector=0
hdb: dma_intr: status=0x51 { DriveReady SeekComplete Error }
hdb: dma_intr: error=0x10 { SectorIdNotFound }, LBAsect=0, s
ector=0
hda: DMA disabled
hdb: DMA disabled
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
end_request: I/O error, dev 03:40 (hdb), sector 0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=2,
sector=2
end_request: I/O error, dev 03:40 (hdb), sector 2
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=4,
sector=4
end_request: I/O error, dev 03:40 (hdb), sector 4
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
ide0: reset: success
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=6,
sector=6
end_request: I/O error, dev 03:40 (hdb), sector 6
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
hdb: read_intr: status=0x59 { DriveReady SeekComplete DataRe
quest Error }
hdb: read_intr: error=0x10 { SectorIdNotFound }, LBAsect=0,
sector=0
Muito obrigado a vc pela atenção e a todos da comunidade!!!!!!!!!

[14] Comentário enviado por davidsonpaulo em 23/11/2004 - 16:04h

bighead,

Essas mesmas mensagens aparecem num computador velho de um amigo meu, e o problema é a quantidade de 'bad blocks' (setores defeituosos) no HD. O hdparm não vai consertar isso, pois sua função não é corrigir problemas em HDs, mas somente configurá-los com os devidos recursos a fim de melhorar a performance de leitura e escrita.

Abraços

[15] Comentário enviado por GrupoFimdeprova em 01/02/2005 - 09:32h

Muito legal o artigo!
Espero que aumente a performance do meu disco

[16] Comentário enviado por impalerdrumer em 27/02/2005 - 19:35h

cara nenhum dos meus dois hds estao setando o udma4(o máximo suportado pela minha placa mãe q é ata66), ele dá o seguinte erro:
/dev/hda:
setting xfermode to 68 (UltraDMA mode4)
HDIO_DRIVE_CMD(setxfermode) failed: Input/output error

vi vc falando pra um cara aqui q estava com a mesma duivida, q esse problema pode ser relacionado ao hd nao suportar o modo q se esta tentando setar, mas tenho certeza de que meus hds suportam, tanto que um deles é um Samsung novinho de 7200rpm, q suporta até ata133 por sinal.....

se puder me ajudar fico muitissimo grato
Álvaro

[17] Comentário enviado por himura_kenshin em 28/04/2006 - 09:00h

root@yakuza:/home/kurosaki# hdparm -d1 /dev/hda

/dev/hda:
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
using_dma = 0 (off)

alguem poderia me ajudar aki?!?! nao consigo ativar o dma

[18] Comentário enviado por mtarcinalli em 14/09/2006 - 11:34h

Pode ser que o módulo do IDE do seu micro não esteja habilitado no kernel, aqui recompilei e resolveu

[19] Comentário enviado por leorm037 em 17/12/2006 - 20:13h

Parabéns, aqui funcionou tudo certinho.

No meu caso uso o slack, acho que o melhor lugar para colocar é no /etc/rc.d/rc.local, porque também não tenho o /etc/hdparm.conf

Abraços,

Leo

[20] Comentário enviado por marcus-rj em 08/02/2007 - 20:28h

Muito bom o artigo!! Ja conheci o hdparm, mas nao de forma tao completa como nesse artigo. Valeu pela rica informação!!

Nota 10!

[21] Comentário enviado por cytron em 23/02/2007 - 15:51h

Encontrei a solução para o SATA, veja bem como estava fácil de achar:

HDA = hdparm

SDA = shparm

O site é http://sg.torque.net/sg/sdparm.html, mas já vou avisando, é coisa para alienígena! Eu não consegui configurar nada, é muito diferente do hdparm.

Se alguém conseguir fazer alguma melhoria avise.

Tem pra smart também: http://smartmontools.sourceforge.net/man/smartctl.8.html

[22] Comentário enviado por removido em 12/07/2007 - 03:54h

Davidson,

Achei seu artigo show! Aumentar o desempenho de um disco é imprescindível, principalmente, quando o assunto se trata de servidores, onde a velocidade do disco é um fator crucial.

Atenciosamente,

Slackmaster ( jlgomessouza@gmail.com )

http://dangercode.blogspot.com

[23] Comentário enviado por juno em 06/08/2007 - 14:44h

Cara,
Parabéns pelo artigo !
Me ajudou bastante.

Abraços,
Juno

[24] Comentário enviado por wagnux em 08/02/2008 - 10:05h

Estou com o mesmo problema apresentado pelos colegas:

Depois de executar esse comando # hdparm -d 1 /dev/hda
/dev/hda:
setting using_dma to 1 (on)
HDIO_SET_DMA failed: Operation not permitted
using_dma = 0 (off)

Alguém teria uma sugestão pra resolver esse problema?

[25] Comentário enviado por removido em 25/06/2008 - 09:57h

3 ano e meio depois e este artigo ainda tá salvando a minha pele... parabéns...

[26] Comentário enviado por marcelohcm em 16/01/2012 - 11:46h

olá
quando digito hdparm -i /dev/sda
ele me dá essa saída

/dev/sda:
HDIO_DRIVE_CMD(identify) failed: Invalid exchange
HDIO_GET_IDENTITY failed: Invalid argument


gostaria de saber se isso é algum problema do hd...

[27] Comentário enviado por davidsonpaulo em 16/01/2012 - 11:54h

marcelohcm, o hdparm só serve para discos IDE, e ao que tudo indica o seu disco é SCSI ou SATA. Nesse caso, você precisará utilizar o comando sdparm. Um grande abraço!

[28] Comentário enviado por removido em 23/01/2014 - 12:41h

Artigo excelente! Parabéns!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts