Computação & Tecnologia
Artigos com o marcador Linux
Sistemas operacionais 64 bits: Vale a pena?
28/03/10
Por Alexandre Otto Strube
Hoje o texto será um pouco menos técnico, mas igualmente prático.
Processadores de 64 bits são hoje uma realidade, e não apenas um sonho de futuro. Mesmo os processadores celeron atuais são capazes de executar sistemas operacionais de 64 bits. Os preços não são mais altos do que os de 32 bits, eles simplesmente os sucederam.
Coisa semelhante deverá acontecer com os processadores intel pentium 4, que, por serem mais caros, têm uma rotatividade menor, portanto ainda são encontrados em sua maioria em 32 bits no mercado brasileiro ainda.
No lado da AMD, os athlon já são 64 bits há muito tempo. Os processadores da linha Sempron, que são o antigo athlon XP, ainda são de 32 bits. Existem algumas poucas unidades encontráveis no mercado que permitem endereçamento de memória de 64 bits.
Que os processadores de 64 bits valem a pena, não há a menor dúvida. Eles permitem uma capacidade muito maior de memória, e permitem rodar os softwares do futuro, coisa um pouco mais complicada para os de 32 bits. O caso é: Vale a pena ter um sistema operacional de 64 bits hoje em dia?
A grande questão atualmente é com os controladores de dispositivo, que nós nos referimos como Device Drivers. Vários controladores de dispositivo são disponíves apenas para sistemas operacionais de 32 bits.
O caso é especialmente emblemático no caso do Microsoft Windows. Como ele foi lançado há relativamente pouco tempo, os desenvolvedores não tiveram tempo (ou interesse) em lançar versões de 64 bits dos drivers dos seus produtos (afinal, quase ninguém usa). A falta de drivers para o windows xp 64 é emblemática. Os próprios integradores e lojas vendem máquinas de 64 bits com o windows de 32.
No caso do Linux, a coisa muda um pouco de figura, e, incrivelmente, para melhor.
Por quê?
A explicação é simples: o Linux é software livre. Temos grande parte dos drivers desenvolvidos pela própria comunidade de software livre. Da mesma forma que, em grande parte dos casos, ter um programa rodando nos pc 64 bits é simplesmente uma questão de recompilação, assim acontece com muitos dos drivers. Outros dão algum trabalho, mas nada do outro mundo.
Existem alguns drivers, entretanto, que são problemáticos mesmo no caso do Linux. São eles exatamente os drivers proprietários, que fazem o pesadelo do xp 64.
Portanto, se você quer usar Linux mas tem um winmodem, a chance é de que você não irá conseguir usá-lo, a menos que use o driver da Linuxant ( http://www.linuxant.com/drivers ) – que é específico para modems conexant e é pago.
O caso é ainda mais estranho para as placas de rede sem fio. Muitas delas não têm drivers para Linux, e usa-se uma aplicação chamada ndiswrapper ( http://ndiswrapper.sourceforge.net/ )que pode usar os drivers do windows – mas nesse caso, deve usar os drivers do xp-64, e você está novamente em um beco sem saída, pois a maiora das placas não tem driver nem para o windows.
Conclusão. Vale a pena usar o Linux de 64 bits? Vale. E por que não usar? Por conta de um ou outro hardware específico. Fora isso, sejam bem-vindos ao futuro!
Será que o Linux está ficando muito lento e ‘inchado’?
11/02/10
Linux performance: is Linux becoming just too slow and bloated?
Autor original: Mitch Meyran
Publicado originalmente no: freesoftwaremagazine.com
Tradução: Roberto Bechtlufft
Eis um aspecto do software livre e de código aberto que está voltando a ser discutido: por anos, prevaleceu a ideia de que um software desse tipo precisava ser leve e elegante para ser considerado pronto para o uso. Mas alguns eventos recentes mostraram que, no caso do kernel do Linux, isso de certa forma deixou de ser verdade: o desempenho vem caindo lenta e regularmente.
Como isso é possível?
O kernel “inchado”
O kernel do Linux é monolítico. Isso significa que todos os drivers de hardware rodam no espaço de memória do kernel. Sempre que você inclui um drive, está incluindo algo no kernel. Além disso, por questões de desempenho, vários elementos do espaço de usuário entram no kernel e o tornam ainda mais inchado.
Some a isso o fato de que, historicamente, o Linux tem sido desenvolvido para plataformas x86, estando fortemente vinculado a essa arquitetura, chegando até a usar interrupções de hardware no código (essencialmente misturando assembly de x86 no código C, que é bem mais genérico e portável).
Para completar, como tudo o que está relacionado ao hardware roda no espaço do kernel, o resultado é instável por natureza: um bug em um driver de hardware possibilita à placa de rede travar o sistema. O Linux é literalmente o oposto de um microkernel.
Talvez vocês se lembrem de um quebra-pau ocorrido há muitos anos na internet entre Andy Tanenbaum e Linus Torvalds acerca dos méritos de um microkernel. Não vou fingir ser o que eu não sou (professor com PhD, desenvolvedor de software e escritor), e vou deixar que você descubra por conta própria do que se tratava a discussão: primeiro, na página de Andrew S. Tanenbaum sobre o MINIX e o Linux, depois em uma entrevista concedida à FSM. Para acelerar as coisas, vou resumir aqui o que é um microkernel e suas vantagens.
MINIX: um microkernel
Um microkernel é, por definição, um kernel que NÃO possui drivers de hardware integrados — nenhum! Nem mesmo um agendador de interrupções ou um controlador de memória. Nada além de um sistema de mensagens, com todo o resto que não faça parte do kernel sendo executado em espaço de usuário. Um microkernel é elegante, e talvez nem precise de mais do que uns poucos milhares de linhas de código em C. É estável: se um driver de hardware falhar, o kernel não trava. Com isso, o driver pode travar e ser recarregado em seguida, novinho em folha. Além do mais, esse tipo de design facilita muito as atualizações. Como o kernel em si é muito simples, é relativamente fácil livrá-lo de bugs; quando um driver é atualizado, ele pode ser descarregado para que uma nova versão seja carregada em seu lugar. Ou seja, é o fim das reinicializações.
O MINIX foi criado como uma ferramenta para o aprendizado: por isso, precisa ser o mais independente do hardware quanto possível. Ele é todo feito com código portável (por exemplo, C — nada de assembly).
O MINIX está em sua terceira versão. Ele é capaz de rodar um sistema de janelas e pseudoterminais. Também pode operar como servidor, ou como desktop (mas pouquíssimas ferramentas para desktops foram portadas). Está em conformidade com o POSIX (o que não significa muita coisa).
E por que o MINIX não substitui o Linux?
Primeiro, por questões históricas. O MINIX é, antes de mais nada, uma ferramenta para o aprendizado. Ele é o clone funcional de UNIX mais básico da atualidade, e por isso mesmo precisa se manter bem simples. Novos recursos não devem ser incluídos como patches, mas sim como drivers adicionais, para que não sejam usados até serem necessários. Isso tudo, somado à menor quantidade possível de duplicação de código, significa que o processo de melhoria do MINIX é muito delicado.
Segundo, por questões de desempenho: os microkernels usam um sistema de mensagens para comunicação entre o kernel e os drivers. Esse processo consome ciclos de CPU que a comunicação direta no espaço do kernel não consome. O simples fato do controlador de memória estar separado do kernel já leva a uma perda de desempenho de 20%. Logo, na maioria dos casos, o MINIX será pelo menos 20% mais lento do que o Linux ou o BSD.
Outra questão de desempenho: como o código do Linux inclui código em assembly otimizado para x86, mesmo sem o design do microkernel ele continuaria sendo mais rápido do que o MINIX, que só tem código em C, ao rodar em plataformas x86 (o desempenho dependeria da eficiência do compilador, mas certamente haveria perdas). Mas é bom que entremos em mais detalhes nessa questão.
Nota do editor: o Minix só se tornou livre um bom tempo depois de nascer. Esse foi um dos principais argumentos de Linus no debate com Tanenbaum…
Um estranho kernel monolítico: o Linux
Uma das maiores melhorias implementadas no Linux desde sua criação foi a capacidade de suportar módulos: no princípio, era preciso compilar o kernel inteiro sempre que um componente de hardware era alterado. Outra opção era compilar um kernel enorme, com todos os drivers carregados, e isso resultava em RAM desperdiçada com drivers não utilizados. Com os módulos, é possível dividir o kernel em várias partes, que podem ser carregadas e descarregadas livremente. Ou seja, você pode compilar um kernel pequeno e básico para depois carregar os módulos necessários, em tempo de execução. Dá até para descarregar um módulo, compilar um substituto e carregar a versão atualizada, igualzinho a um micro kernel. Mas um aviso para quem não está prestando atenção: não é aí que o design do micro kernel é teoricamente melhor do que o de um kernel monolítico. Isso ocorre na interface entre o driver e o kernel.
Por exemplo, se você carregar um módulo com um driver gráfico bugado, pode travar o kernel e o computador.
Há vários fatores que aliviam o problema: a interface dos módulos no Linux fica cada vez mais afiada, e vai ficando mais difícil para um bug em um driver travar o kernel inteiro. Fora que, com a natureza de código aberto do kernel, é muito pouco provável que um código qualquer contenha bugs capazes de causar travamentos — e os bugs que existem logo são eliminados. Resumindo, o MINIX é estável porque não permite que bugs o façam travar, e o Linux é estável porque não há muitos bugs capazes de derrubá-lo — e as diferenças no uso dos dois são suficientes para que cada um seja um projeto diferente.
Embora Torvalds (e a comunidade de desenvolvedores do Linux de modo geral) discorde de Tabenbaum no que tange aos microkernels, ele admite que várias de suas afirmações são válidas. É por isso que, com o tempo, mais e mais código é adicionado ao kernel para isolar os subsistemas um do outro. Esse tipo de código traz mais complexidade às funções do kernel, usando ciclos de CPU e reduzindo o desempenho…
Essa é uma das questões.
Como o Linux agora roda em mais de uma plataforma (x86), várias de suas partes tiveram que ser reescritas: ARM, PPC e Itanium são algumas das plataformas nas quais o kernel roda. A maioria replica as mesmas funcionalidades da plataforma x86, mas muitas vezes de forma menos avançada ou refinada — logo, embora o Linux provavelmente seja um dos kernels de melhor desempenho em x86, o mesmo não vale para outras plataformas. Como isso é um problema, a maior parte do trabalho em código específico de x86 agora é feito da forma mais compartimentada possível:
- código que não tenha equivalente funcional em outras plataformas (a um custo razoável de desempenho, ou código como um emulador FPU x87, ou um controlador de memória específico) é mantido dentro do x86, mas precisa ser à prova de hacks;
- código com equivalência funcional em outras plataformas (com um custo razoável de desempenho) é programado em C comum e tirado do x86 para se alojar na seção “kernel”.
Veja que, nesse meio tempo, vários “hacks de velocidade” (válidos tanto para código remanufaturado quanto para código novo) poderiam ser perdidos. Ao mesmo tempo, graças à reutilização do código, a parte “central” do kernel em todas as plataformas (digamos, o agendador, o controlador de memória e o resto dos componentes internos do kernel) talvez esteja se tornando mais elegante em suas funções básicas. Mas código mais elegante não é a mesma coisa que código mais rápido.
Essa é outra questão.
O desempenho também depende de quem vê: por vezes ele pode ser prejudicado por um bug ou uma regressão, por outras pode resultar de uma mudança no equilíbrio. Vamos tomar como exemplo o alocador de memória e o driver do ext4.
Essa é a terceira questão, e merece uma análise mais detalhada.
Recursos e segurança às custas do desempenho
Embora a modularização do código tenha um custo de desempenho genérico que costuma ser irrisório, considerando-se os ganhos de tempo de desenvolvimento e a qualidade geral do código, alguns recursos têm custos de desempenho que não são acompanhados de benefícios que possam ser facilmente mensurados — mas o benefício existe. Vamos tomar como exemplo duas das mais citadas “regressões que não são regressões”.
Tenha em mente que regressões acontecem e que geralmente são corrigidas após algumas versões novas do kernel.
O dilema do alocador de memória
No momento, o kernel do Linux tem três alocadores diferentes: O SLOB, que é histórico e um tanto dedicado, o SLAB, que era o favorito, e o SLUB, que é o mais novo e de modo geral o mais lento.
De acordo com a documentação do kernel, o SLUB foi escrito para substituir o SLAB em sistemas com mais de um núcleo: o SLAB é mais rápido do que o SLUB, sem dúvidas, mas em sistemas com mais de um núcleo ele também consome mais RAM. Em casos muito extremos, o SLAB pode acabar usando mais do que um gigabite de RAM, acabando com seus ganhos de desempenho devido à paginação e à “competição” do barramento de dados. O SLUB resolve esse problema pesando mais na CPU, mas usando menos RAM — nesses casos extremos, o SLUB se sai melhor do que o SLAB. Como ele também não consome tanta CPU assim, e como as máquinas estão ganhando cada vez mais núcleos (um Intel quad-core com Hyper-threading conta como processador de oito núcleos, e desperdiça uns 17 MB de RAM — diga adeus ao cache da sua CPU), acabou se tornando o padrão.
Mas as medições de desempenho de bancos de dados mostram que kernels usando o SLUB têm desempenho pior do que kernels usando o SLAB.
O estresse dos agendadores
A princípio, o Linux foi posto para trabalhar em tarefas típicas de servidores: essas tarefas tinham que ser realizadas o mais rapidamente possível. O Linux também é um kernel multitarefa cooperativo, que dá mais recursos a um processo quando ele os solicita se:
- a prioridade do processo (seu nível de ‘nice’) for mais alta do que a de outros processos que também exigem recursos;
- outros processos em execução tiverem notificado o kernel de que no momento suas operações foram concluídas.
A questão vai além disso, mas é só para você entender o básico.
Geralmente, a carga em servidores inclui um punhado de processos em primeiro plano com prioridades altas, focados em concluir suas tarefas o mais rapidamente possível antes de liberar seus recursos: nesses casos, atrasar uma tarefa para que outra seja concluída é o sistema mais eficiente. Menos erros de cache na CPU, menos movimentos frenéticos dos discos rígidos… esse tipo de agendamento é bom para servidores.
Mas em um desktop, isso significa que, digamos, os movimentos do mouse vão congelar se um processo abusar muito da CPU. E isso não é legal.
Para isso, o agendador CFS foi escrito, e o kernel meio que foi reprojetado. O CFS leva em conta coisas como a quantidade de recursos que já foram solicitados pelo processo. Ele permite a preempção de um processo em mais pontos de execução, e consulta os processos em busca de pontos de execução adicionais em intervalos mais regulares de tempo.
Mas as medições de desempenho de bancos de dados mostram que kernels usando o CFS têm desempenho pior do que kernels antigos.
Fatores atenuantes
Pode parecer que a perda de velocidade do kernel não é algo ruim se em troca temos um sistema mais versátil e seguro. Mas ainda se discutem vários pontos que podem parecer contradizer tudo o que estou dizendo. Vou tratar de alguns desses pontos.
Os drivers de sistemas de arquivos devem ficar no espaço de usuário ou no kernel?
Essa é uma questão bem delicada, e há mais de um motivo para isso: como tudo no Linux é um arquivo, o sistema de arquivos tem que estar bem próximo ao kernel. Afinal, até os processos estão no sistema de arquivos. É só olhar em /proc, ou procurar por dispositivos em /dev! Voltemos ao debate microkernel vs. kernel monolítico. Os custos de desempenho seriam altos se todos os sistemas de arquivos ficassem no espaço de usuário. Então vamos colocar todos os drivers de sistemas de arquivos na memória! Mas há milhares deles, e alguns estão infestados de bugs! Tem certeza de que quer fazer isso?
Vou usar um exemplo bastante controverso, que mostra como é difícil responder a essa pergunta sem um contexto: vamos falar no NTFS, com suporte a espaços de arquivos NT, POSIX e DOS, fluxos de dados alternativos, journaling de metadados, compactação e criptografia em nível de arquivo, desfragmentação integrada e alocação de blocos fora da ordem.
A versão 3 estreou no Windows 2000, e é a versão em uso no momento. Nem todos os seus recursos são usados ou sequer suportados pelos sistemas operacionais da Microsoft, ou seja, pode haver destruição de dados em volumes NTFS perfeitamente válidos e “sadios”. Não diga que eu não avisei.
O suporte a NTFS é uma promessa antiga: primeiro porque não havia nenhuma utilização real para ele até 2003, segundo porque ele é muito complexo e não muito bem documentado. Ainda assim, há suporte ao NTFS no kernel desde 2001, só que para uma versão mais antiga do NTFS (do NT4), que não era compatível com a versão 3.x, causando corrupções tremendas. Em meados de 2004, um driver NTFS reescrito apareceu, permitindo acesso para leitura e até para escrita em partições NTFS. Um driver de terceira geração, surgido em 2006, logo chamou a atenção: o NTFS-3G roda em espaço de usuário e oferece acesso total para leitura e escrita em partições NTFS. O objetivo principal não era o desempenho, e só recentemente essa questão ganhou prioridade, embora já tenham havido muitas melhorias nesse sentido.
O seu desempenho mediano foi citado como razão para que os drivers de sistemas de arquivos sejam mantidos no espaço do kernel. A julgar pelos testes semiformais que eu fiz, isso é uma besteira. O que eu observei foi que:
- O driver NTFS do Windows tem um alocador de blocos desastroso, capaz de dividir um arquivo grande em mais de 3.000 pedaços em uma partição usada, enquanto o NTFS-3G só divide o arquivo em uns trinta pedaços (teste realizado em uma partição de 80 GB com 60% do espaço preenchido).
- O NTFS-3G consome bastante tempo da CPU ao realizar a escrita (a versão mais recente, 20091015, dá uma boa melhorada nesse problema): um monte de arquivos pequenos ou um poucos arquivos grandes agora não fazem muita diferença, mas em sistemas mais modestos (como netbooks) a taxa de transferência é essencialmente limitada pelo clock da CPU;
- O NTFS do Windows, do NTFS-3G e do Linux têm velocidade de leitura e uso de CPU muito semelhantes durante a leitura;
- As taxas de dados variam enormemente no Linux de acordo com a interface usada: SCSI (incluindo IDE e SATA nos kernels mais recentes) ou USB. O mesmo se aplica se você usar o pacote FUSE completo ou a versão reduzida e otimizada oferecida pelo NTFS-3G.
Isso significa que o NTFS-3G não pode ser usado para exemplificar como drivers internos do kernel são melhores do que os que ficam em espaço de usuário: ele não apenas é tão rápido quanto o driver interno do kernel, (ambos compartilham a mesma funcionalidade e boa parte do código, com uso semelhante da CPU) como também há um maior impacto no desempenho vindo dos controladores de barramento! Além disso, levando-se em consideração que a maior parte do tempo gasto em leituras se dá esperando por uma resposta do driver, otimizações pequenas como o acesso direto ao kernel e/ou o uso de código assembly são inúteis, e ponto final. Otimizações na ordem de leitura, na organização e na alocação dos dados são bem mais importantes.
Quanto a deixar os sistemas de arquivos na memória, a questão é outra. Ou seja, não há motivo para que um driver de sistema de arquivos seja portado para o kernel se ele já funciona bem em espaço de usuário, nem há motivos reais para tirar um sistema de arquivos do kernel se ele já estiver completo e tiver sido bem testado. Na verdade, há um projeto em andamento para modularizar a alocação de blocos e os relatórios de erros no kernel para todos os drivers de sistemas de arquivos: Embora esse não seja, stricto sensus, o melhor lugar para isso, é mais prático em termos de “repositório de código”, mas exige também para funcionar bem.
Fora do x86, o Linux é uma droga… ou não?
Essa afirmação não está errada, mas também não está certa: na verdade, o Linux funciona muito bem em PPC, provavelmente devido ao fato de Linus ter uma CPU Apple Mac G5; ou seja, se o Linux-x86 é bom, o Linux-PPC vem em segundo lugar. Além disso, a arquitetura x86-64 recentemente conquistou um lugar só seu no kernel, não sendo mais a filha bastarda da árvore x86. Enquanto isso, Alpha e Itanium vão ficando meio “mofadas” — digo, suas arquiteturas. Há vários sistemas embarcados com suporte a elas… ou não — eles não costumam durar muito.
E chegamos à arquitetura ARM. O fato é que o Linux não roda muito bem na arquitetura ARM. Aqui, temos algumas informações vindas do Debian. O kernel pode não ser fantástico, mas a maior parte da perda de desempenho em ARM vem da biblioteca glibc do GNU — e foi por isso que o Debian decidiu substituir a glibc pela eglibc, que é basicamente uma glibc cheia de patches. De acordo com os autores do fork, os desenvolvedores do GNU não são muito rápidos e demoram muito para integrar patches para a arquitetura ARM, o que levou ao fork. O bom da eglibc é que, embora tenha patches para ARM, ela continua compatível com a glibc — rodando, portanto, em x86 (em ambas), PPC etc.
Parece que não é mais tão difícil assim portar o Linux para plataformas diferentes, e a falha de um port depende de muitas outras coisas além do kernel. Mas é preciso tempo para que as coisas deem certo.
Conclusão
O Linux está inchando e ficando mais lento. Só que não dá para correlacionar diretamente as duas coisas, já que o kernel cresce cada vez que um driver é incluído, mas você não é obrigado a carregar todos os drivers. O fato é que, dado um conjunto semelhante de drivers, o Linux não está de fato ficando maior.
Usando medições atuais, o desempenho do Linux está, sim, caindo regularmente; essas medições são voltadas para tarefas específicas, e essas tarefas são típicas de servidores, portanto é bom ter um pé atrás.
Quando alguma regressão aparece no kernel, ela geralmente é corrigida rapidamente. Regressões “falsas” geralmente são causadas pelo acréscimo de recursos de segurança e/ou estabilidade, e também por uma “mãozinha” das otimizações voltadas para os usuários. O que faltam são ferramentas que “peguem” regressões e tempo para que novos recursos não façam o kernel inchar.
Nesse sentido, projetos como a suíte de testes e tracker da Phoronix, que testa tanto tarefas orientadas à rede quanto ao usuário, e que permite que variações sejam disponibilizadas automaticamente, são ferramentas comuns há tempos no Windows, e seus resultados não têm preço.
Créditos a Mitch Meyran – freesoftwaremagazine.com
Tradução por Roberto Bechtlufft <info at bechtranslations.com.br>
Quebrando a senha do root no linux
10/04/09
Esta é uma dica rápida, para quem precisa quebrar a senha do usuário root em qualquer distribuição linux, utilizando um live-cd.
- Bootar com o live-cd.
- Descobrir em qual área do disco esta instalada a partição / (# cfdisk)
- Criar um diretório – pode chamar de target (# mkdir /target)
- Assumindo que a partição instalada no hd, esteja em hda1, monte a partição no diretório /target (# mount /dev/hda1 /target)
- Acessar o diretório /target (# cd /target)
- Alterar a partição / que está rodando do cd, para a partição raiz instalada no HD montada no /target (# chroot .)
- Alterar a senha do root com o comando passwd (# passwd root)
Explicando o funcionamento:
Inicializaremos a máquina através da distribuição carregada à partir do cd. Nestes live-cd’s, o usuário disponibilizado é o usuário root.
Depois de montar a partição / do HD na pasta criada na ramdrive (/target), e tornar a mesma como partição / para o sistema que está rodando via cd (# chroot . ) , ganhamos acesso total ao sistema, pois estávamos rodando do cd como usuário root, e tornamos a partição raiz do HD, como a partição raiz do CD. Agora rodamos o comando passwd para trocar a senha do usuário root.
Obs.: Atentar para o (.) depois do comando chroot, pois ele indica para alterar a raiz para o diretório atual, e neste caso se faz necessário estar dentro do diretório desejado ( no nosso exemplo, o /target)
10 coisas que você deve fazer antes de conectar seu Linux à Internet
10/04/09
Este texto é uma tradução. O texto original está disponível no site http://www.builderau.com.au/program/linux/soa/10_things_you_should_do_to…?feed=rss
Não coloquei algumas partes do texto nas quais o autor focava muito no Mandriva. Tentei deixar o texto um pouco generalizado, podendo ser usado para qualquer distribuição que você queira.
Finalidade
O Linux, assim como o Windows, é apenas um sistema operacional. Quando falo com colegas que estão usando o Linux pela primeira vez, esta é a primeira coisa que deixo clara. O Linux não é uma varinha de condão que pode ser utilizada para resolver todos os problemas da informática. O Linux tem vários problemas, assim como o Windows. Não há um sistema operacional perfeito ou completamente seguro. Essa máquina vai ser um servidor ou uma estação de trabalho? Pensando nisso, vários problemas são evitados.
Instalação
Diferente do Windows, o Linux não tem uma versão específica para servidores, outra para estações de trabalho, etc. Durante uma instalação típica, a escolha sobre quais softwares serão instalados é sua. Portanto, de acordo com os softwares que você instala, você define o papel da máquina: servidor ou estação de trabalho. Por isso, você deve saber muito bem quais são os pacotes que o instalador da sua distribuição está instalando para você. Por exemplo, algumas distribuições irão instalar e configurar um servidor Samba ou um servidor de email como parte da instalação básica. Dependendo da finalidade do seu computador e do nível de segurança que você quer, esses serviços podem ser desnecessários ou indesejados. Tirando um tempinho para se familiarizar com o instalador da sua distribuição pode evitar muitas dores de cabeça e reinstalações.
Instalar e configurar um firewall
Um firewall provê uma camada a mais de segurança em qualquer rede. Estes softwares permitem que você filtre o tráfego que chega no seu PC, evitando problemas. O software Shorewall (que utiliza o IPTables/Netfilter como backend) simplifica a configuração de um firewall pessoal (um outro pacote bastante interessante é o KMyFirewall, que utiliza o Qt). Instalando e configurando firewalls para sua estação o quanto antes, você pode restringir ou bloquear determinados tipos de tráfego, tanto entrando quanto saindo do seu PC.
Bloquear ou permitir determinados tipos de tráfego da rede é apenas uma camada de segurança, mas como você pode adicionar mais segurança (além das regras do firewall) para um serviço que você realmente precisa que usuários da internet ou intranet utilizem no seu computador? Segurança baseada em hosts é mais uma camada de segurança.
Configurando os arquivos /etc/hosts.deny e /etc/hosts.allow
Na seção anterior, vimos como configurar um firewall para permitir conexões de outros hosts aos serviços que a nossa máquina está provendo utilizando um firewall. Para aumentar a segurança contra tráfego indesejado ou atacantes, podemos limitar os hosts que se conectam a determinados serviços. Os arquivos /etc/hosts.deny e /etc/hosts.allow nos permitem fazer isso.
Quando um computador tenta acessar um serviço como o SSH, por exemplo, os arquivos /etc/hosts.deny e /etc/hosts.allow são processados e o acesso será permitido ou negado de acordo com as regras destes arquivos. Geralmente, se você esta instalando uma estação de trabalho, é útil se colocar a seguinte linha no /etc/hosts.deny:
ALL:ALL
Isso vai negar o acesso de qualquer host a qualquer serviço. Parece muito restritivo à primeira vista, mas depois disso você pode adicionar hosts no arquivo /etc/hosts.allow para permitir o acesso aos serviços. Abaixo você encontra um exemplo que permite a alguns hosts conectar ao SSH:
sshd: 192.168.0.1 #permite o host 192.168.0.1 acessar o SSH
sshd: foo.bar.com #permite o acesso do host foo.bar.com ao SSH
Estes dois arquivos oferecem uma filtragem muito boa baseada em hosts.
Desabilite ou remova serviços não utilizados
Assim como no Windows, no seu Linux podem haver serviços rodando em background que você não tem conhecimento ou que não queria que estivesse lá. Utilizando o comando chkconfig (em distribuições baseadas em Red Hat) ou entrando no diretório /etc/rc.d (no Slackware), você pode verificar quais serviços são inicializados e que você não quer e desabilitá-los. Serviços que não estão rodando não oferecem riscos à segurança e não consomem recursos da máquina.
Aumente a segurança de serviços necessários
Se a sua máquina tem alguns serviços que devem receber conexões da Internet, tenha certeza de que você conhece muito bem todas as opções de configuração destes serviços. Por exemplo, se você precisa utilizar o SSH, tenha certeza de que você verificou todos os detalhes do arquivo /etc/ssh/sshd_config antes de habilitar o serviço. O mínimo que você deve fazer é desabilitar o login do root. Toda máquina Linux tem um usuário root que pode logar via SSH, quando você desabilita este usuário, você inibe ataque de brute force pois o atacante ainda não sabe qual usuário é valido nessa máquina. Se você deixar o login remoto do root habilitado, o atacante só vai precisar descobrir a senha.
Configure as opções de rede do kernel
O prórpio kernel Linux pode oferecer algumas opções de segurança para a rede. Se familiarize com as opções disponíveis no arquivo /etc/sysctl.conf e as configure conforme necessário. As opções deste arquivo controlam, por exemplo, que tipo de informações sobre a rede são logadas nos logs do sistema.
Conecte o PC a um roteador
Um roteador (mesmo que doméstico) é um hardware bem comum hoje em dia. Ele é a primeira camada de segurança para qualquer rede, seja ela doméstica ou corporativa e permite que vários computadores utilizem o mesmo endereço IP para o acesso à Internet. Isso geralmente dificulta a ação de um atacante ou programa malicioso pois ele bloqueia qualquer tráfego que você não permitiu. Roteadores domésticos são apenas versões mais enxutas de roteadores corporativos que empresas utilizam para separar sua rede da Internet.
Atualize
Sempre mantenha o software do seu computador atualizado com os últimos patches de segurança seja qual for o sistema operacional que você está utilizando. A sua distribuição irá sempre lançar patches de segurança regularmente e estes devem sempre ser aplicados. Como no Windows, esta deve ser a sua primeira tarefa do dia
.
Outros softwares
Você também deve instalar outros softwares que aumentem a segurança do seu sistema.
Bastille-Linux (http://www.bastille-linux.org/) é um programa que pode ser usado para aumentar a segurança de certos aspectos do Linux. Ele desenvolve uma política de segurança que é aplicada ao sistema e produz relatórios sobre potenciais problemas de segurança. Além disso, é uma ótima ferramenta para se aprender sobre detalhes da segurança do seu Linux.
O Tripwire (http://sourceforge.net/projects/tripwire) é um software que monitora os binários do seu sistema procurando por modificações não autorizadas. Frequentemente um hacker modifica os binários do seu sistema para dificultar a detecção de uma intrusão. Os programas modificados lhe fornecem informações falsas permitindo que o hacker mantenha o controle sobre seu sistema sem que você perceba.
Instalando programas no Linux
10/04/09
Autor: Pedro Augusto de O. Pereira / http://augusto.pedro.googlepages.com/
Introdução
A instalação de aplicativos no GNU/Linux é um dos pontos que mais causam confusão nos iniciantes por ser um pouco diferente. Para fazer a instalação, nós temos 3 opções: o RPM (para distribuições baseadas na Red Hat como Fedora, Conectiva), a instalação através de código fonte (arquivos .tar.gz, .tar.bz2, etc), sendo que estes independem de distribuição e o apt-get, criado pela Debian.Vou tratar cada uma delas separadamente para que eu possa esclarecer as particularidades de cada uma.
Instalação através de um tarball
Esse é um dos tipos de instalação mais populares. Aqui o desenvolvedor empacota os arquivos fonte do programa e os disponibiliza para download, junto com alguns scripts para facilitar a instalação no computador do usuário.
Como o desenvolvedor lhe envia os códigos-fonte dos arquivos, será necessário compilá- los para que eles funcionem no seu computador. Para conseguir realizar a compilação de qualquer programa no seu sistema, você deve ter os pacotes de desenvolvimento instalados no seu micro (pacotes como a glibc, automake, etc) Falando assim pode parecer que para instalar aplicativos desse jeito é um bicho de sete cabeças, mas não chega nem perto disso =] A compilação é um processo meio padronizado, ou seja, quase sempre você vai precisar digitar os mesmos comandos para instalar qualquer programa. Vou explicar cada um deles abaixo, lembrando que todos eles devem ser executados dentro do diretório criado quando você descompactou o tarball do programa:
./configure
O ./configure na verdade não é um comando, mas sim um shell script. Quando executado, ele verifica se seu sistema possui tudo o que é necessário para que o aplicativo que você está querendo instalar seja executado corretamente, sem nenhum problema. Além disso, ele também gera um arquivo chamado makefile. Este arquivo contém regras sobre a compilação do programa, sem este arquivo, o próximo comando não conseguirá executar pois não terá idéia do que será necessário fazer.
make
O make usa o makefile gerado pelo ./configure para realizar a compilação do programa.O makefile contém instruções para que o make compile tudo o que for necessário.
make install
Enquanto o make só compila o programa, o make install instala realmente o programa criando os diretórios necessários, colocando os binários no lugar certo, etc. Lembrando que o make é o único dos 3 comandos que requer permissões de root para ser executado, já que este escreve em lugares em que só o root tem permissão.
Então, para instalar um programa através de um tarball:
# tar -xzvf programa.tar.gz
# cd dirdoprograma
# ./configure
# make
# su – root
# make install
Geralmente são esses os passos executados para que você instale um programa a partir do código fonte. A única coisa que pode variar é o nome do script (o primeiro “comando” digitado). Na maior parte das vezes é configure, mas o desenvolvedor pode colocar outro nome nele, como setup, por exemplo. Por isso, é muito recomendado que você leia o arquivo Readme para ter instruções exatas de como proceder para instalar o aplicativo.
Depois de instalado, os binários do aplicativo vão estar em /usr/local/bin. Preste atenção a um detalhe muito importante: se seu aplicativo só funcionar em um ambiente específico (o KDE, por exemplo) os binários dele vão para outro diretório: /usr/local/kde/bin.
Portanto, nunca se esqueça de adicionar esses diretórios na variável PATH de todos os usuários do sistema, para que eles também possam executar o programa.
Você deve estar pensando: “Bom instalar é fácil, mas como eu desinstalo um programa?”. Eu respondo: “É mais fácil ainda!”.
Você simplesmente vai ter que voltar ao diretório criado pelo tarball quando este foi descompactado e digitar:
# make uninstall
Bem fácil, né? E você achando que instalar e desinstalar programas através dos fontes era difícil.
RPM
O RPM (Red Hat Package Manager) é um dos modos mais inteligentes e fáceis de se instalar, desinstalar, monitorar o que está instalado, atualizar programas, etc. Ele ajuda muito o usuário iniciante pois é muito intuitivo e fácil de se usar. Vou lhe ensinar aqui como instalar, desinstalar, atualizar e verificar se algum pacote está instalado no seu sistema, se aprofundar no uso do RPM é com você.
Instalando
Os pacotes RPM são arquivos binários pré-compilados para uma certa distribuição. Por isso você sempre vai procurar por pacotes RPM feitos para a sua distribuição. Um ótimo lugar para se encontrar pacotes RPM é no site www.rpmfind.net.
O processo de instalação é bem fácil. Vou usar como exemplo de instalação o SIM, um clone do ICQ para GNU/Linux.
Com o pacote em mãos, vá ao console e digite:
# rpm -ivh sim-0.9.2-1.rh90.i386.rpm
Explicando as opções:
- -i: instalar
- -v: modo verbose. Com esta opção ativada, o rpm irá te falar o que está fazendo.
- -h: mostra o progresso da instalação do pacote com caracteres #.
Opa! Tivemos uma mensagem de erro:
error: Failed dependencies:
libsablot.so.0 is needed by sim-0.9.2-1.rh90
sablotron >= 1.0.1 is needed by sim-0.9.2.-1.rh90
Ó meu Deus! E agora??
Calma! O RPM está nos dizendo que para o SIM ser executado corretamente ele necessita do pacote sablotron com uma versão maior ou igual a 1.0.1. Portanto, simplesmente procuramos esse pacote (nesse caso é uma biblioteca) e o instalamos:
# rpm -ivh sablotron-1.0.1-1.rh90.i386.rpm
Depois de instalado, instalamos o pacote principal sim-0.9.2-1.rh90.i386.rpm:
# rpm -ivh sim-0.9.2-1.rh90.i386.rpm
Agora sim conseguimos instalar o SIM. Para executá- lo digite “sim” em um terminal.
Atualizando
Vamos supor que, depois de um tempo, é lançada uma nova versão do SIM e nós queiramos atualizar o nosso programa. Para isso nós utilizaremos a opção -U, assim:
# rpm -U sim-x.x.x-2.rh90.i386.rpm
Assim ele vai atualizar o SIM automaticamente, sem ter que desinstalar a versão antiga e instalar a nova.
Desinstalando
Para você desinstalar um pacote RPM qualquer, basta usar a opção -e:
# rpm -e sim-x.x.x-2.rh90.i386.rpm
Verificando quais pacotes estão instalados
Para você pesquisar se um certo pacote está instalado ou não, você pode usar a opção -qa. Com essas opções o sistema RPM vai consultar toda a base de dados de pacotes RPM e lhe mostrar todos os pacotes RPM que estão instalados no seu micro. É uma boa idéia usar o grep para consultar um pacote específico:
# rpm -qa | grep pacote
Assim, se o pacote estiver instalado, você verá o nome do pacote como única saída do comando. Caso o RPM não ache um pacote com o nome especificado ele simplesmente irá ficar quieto, não te dirá nada.
Bom, isso é o básico sobre RPM. Cabe a você se aprofundar mais no uso desta excelente ferramenta.
APT-GET com suporte a RPM
Conforme você vai usando o sistema RPM você vai perceber que ele tem um sério problema. Muitas vezes você tem que instalar vários pacotes para conseguir fazer um programa funcionar (esses pacotes extras são chamados dependências), e depois de um tempo isso vai começar a te chatear muito.
Pensando nisso, foi criado o sistema APT-GET.
Este sistema funciona como o RPM, mas um pouco mais melhorado. Com ele você pode instalar, desinstalar e atualizar pacotes no seu sistema.Você deve estar se perguntando:
“Mas qual a grande vantagem dele em cima do RPM?”
A maior vantagem do APT sobre o RPM é que ele resolve problemas de dependências automaticamente. Assim, se você tentar instalar um pacote o APT já vai instalar todas as dependências dele automaticamente.
Para instalar o APT você vai precisar baixar o pacote RPM dele e instalá- lo como foi explicado no tópico anterior. Depois de instalá- lo é hora de começar a usar! Digite “apt-get update” para que o apt atualize os pacotes necessários por ele. Lembre- se que neste passo você tem que estar conectado à Internet.
Depois que ele terminar o passo anterior, você já pode começar a usá- lo para instalar, desinstalar e atualizar seus pacotes.
Para instalar um pacote qualquer digite:
# apt-get install pacote
Com o comando acima ele vai instalar o pacote e qualquer dependência necessária.
Para que o apt cheque quais pacotes estão desatualizados no seu sistema e já os atualize digite:
# apt-get upgrade
Para remover algum pacote junto com suas dependências, use:
# apt-get remove pacote
Todas as fontes de onde o APT vai fazer download estão descritas no arquivo /etc/apt/sources.list. Se você quiser adicionar algum lugar de onde o APT deva fazer download de algum pacote, indique- o nesse arquivo. Uma fonte não precisa necessariamente ser um servidor FTP. Você pode adicionar os CD-ROMs da sua distribuição para poder instalar os pacotes contidos neles pelo APT. Você só vai precisar digitar o comando:
# apt-cdrom add
Se você não especificar onde está o seu drive, o APT vai usar as informações contidas no seu arquivo /etc/fstab.
Bom, sobre o APT é isso. Só te mostrei o básico pois o APT é uma ferramenta com muitos recursos. Para escrever esta parte do tutorial, me baseei no excelente arquivo disponível em http://bazar.conectiva.com.br/~godoy/apt-howto/index.html.
É isso! Aposto que agora você vai conseguir instalar qualquer programa (não importa a forma como ele apareça na sua mão!) no seu GNU/Linux. Espero que este artigo tenha te ajudado a esclarecer qualquer dúvida que você tivesse sobre instalação.