FACULDADE DE TECNOLOGIA DE GUARATINGUETÁ SISTEMA OPERACIONAL LINUX Álvaro Perez Sanchez, Cleber Lopes Campomori, José Marcos Rocca, Pedro Aurélio Lemes Trabalho apresentado na disciplina “Sistemas Operacionais 2” para o professor José Geraldo, no curso superior de Tecnologia em Informática, 4° semestre noturno. Guaratinguetá – SP 2011 FACULDADE DE TECNOLOGIA DE GUARATINGUETÁ SISTEMA OPERACIONAL LINUX Álvaro Perez Sanchez, Cleber Lopes Campomori, José Marcos Rocca, Pedro Aurélio Lemes Trabalho apresentado na disciplina “Sistemas Operacionais 2” para o professor José Geraldo, no curso superior de Tecnologia em Informática, 4° semestre noturno. Área de concentração: Sistemas Operacionais Guaratinguetá – SP 2011 LISTA DE ILUSTRAÇÕES Figura 1 - Ken Thompson e Dennis Ritchie ................................................................. 10 Figura 2 - Linus Torvalds ............................................................................................. 11 Figura 3 - Mascotes GNU e Linux (Tux) ..................................................................... 12 Figura 4 - Richard Stallman .......................................................................................... 12 Figura 5 - Logotipo do Debian ..................................................................................... 14 Figura 6 - Logotipo Ubuntu .......................................................................................... 15 Figura 7 - Logotipo Damn Small Linux ....................................................................... 15 Figura 8 - Logotipo Endian Firewall ............................................................................ 16 Figura 9 - Logotipo Android......................................................................................... 17 Figura 10 - Esquema de gerenciamento de memória através [...] ................................. 30 SUMÁRIO 1 INTRODUÇÃO: O QUE É LINUX? ................................................................................... 9 2 HISTÓRICO ........................................................................................................................ 10 2.1. Antecessores, Multics e Unix .......................................................................................... 10 3 DISTRIBUIÇÕES LINUX ................................................................................................. 13 3.1. O que são disitribuições .................................................................................................. 13 3.2. Exemplos de distribuições ............................................................................................... 13 3.2.1. Debian ............................................................................................................................ 14 3.2.2. Ubuntu ........................................................................................................................... 14 3.2.4. Endian Firewall ............................................................................................................ 16 3.2.5. Android .......................................................................................................................... 16 4 DETALHES DO SISTEMA OPERACIONAL LINUX .................................................. 18 4.1. Sistema de arquivos ......................................................................................................... 18 4.1.1. Linux EXT2 ................................................................................................................... 18 4.1.2. Linux EXT3 ................................................................................................................... 19 4.1.3. Funcionalidades do Linux EXT3 ................................................................................ 20 4.1.4. Desfragmentação do Linux EXT3 ............................................................................... 21 4.1.5. Recuperação no Linux EXT3 ...................................................................................... 21 4.1.6. Compressão no Linux EXT3 ....................................................................................... 21 4.1.7. Linux EXT4 ................................................................................................................... 22 4.1.8. Sistemas de arquivos ou arquivos grandes ................................................................. 23 4.1.9. Escalabilidade de subdiretórios ................................................................................... 23 4.1.10. Extends ........................................................................................................................ 23 4.1.11. Alocação multiblock ................................................................................................... 24 4.1.12. Atraso na alocação ...................................................................................................... 25 4.1.13. FSCK rápido ............................................................................................................... 25 4.1.14. Journal checksumming .............................................................................................. 26 4.1.15. Recursos relacionados aos inodes.............................................................................. 26 4.1.16. Presistência na pré-alocação ...................................................................................... 27 4.1.17. ReiserFS ....................................................................................................................... 28 4.1.18. Desvantagens do ReiserFS ......................................................................................... 28 4.2. Gerenciamento de memória ............................................................................................ 29 4.3. Gerenciamento de processos ........................................................................................... 32 4.3.1. O conceito de processo ................................................................................................. 32 4.3.2. Os primeiros processos ................................................................................................. 33 4.3.3. Estados ........................................................................................................................... 34 4.3.4. Limite de recursos ........................................................................................................ 35 4.3.5. Preemptivo .................................................................................................................... 36 4.3.6. Política de escalonamento ............................................................................................ 37 4.3.7. Algoritmo de Escalonamento ....................................................................................... 38 5 VANTAGENS E DESVANTAGENS DO LINUX............................................................ 39 5.1 Vantagens .......................................................................................................................... 39 5.2 Desvantagens ..................................................................................................................... 40 6 CONCLUSÕES.................................................................................................................... 41 7 BIBLIOGRAFIA ................................................................................................................. 42 1 INTRODUÇÃO: O QUE É LINUX? Linux é um sistema operacional, responsável pelo funcionamento do computador, que faz a comunicação entre hardware (impressora, monitor, mouse, teclado) e software (aplicativos em geral). O kernel é o coração do Sistema Operacional Linux. Ele é o responsável por garantir que todos os programas terão acesso aos recursos de que necessitam (memória RAM, por exemplo) simultaneamente, fazendo com que haja um compartilhamento concorrente – mas sem oferecer riscos à integridade da máquina. O conjunto de um kernel e demais programas responsáveis pela comunicação com este é o que denominamos sistema operacional. Desenvolvido pelo finlandês Linus Torvalds, o Linux tem seu código fonte disponível sob licença GPL para qualquer pessoa utilizar, estudar, modificar e distribuir de acordo com os termos da licença. O Linux é um sistema operacional derivado do Unix. 2 HISTÓRICO O nome Linux é uma fusão do nome de seu criador, o finlandês Linus Torvalds com Unix, um sistema operacional de grande porte voltado para servidores, no qual o Linux foi baseado. Para entender a história do Linux é preciso um breve resumo sobre a história do Unix. 2.1. Antecessores, Multics e Unix O Unix e sua história estão intrinsicamente ligados a história de um sistema operacional mais antigo, chamado Multics, o Multics foi criado na década de 1960 por um conjunto de empresas entre elas General Eletric (GE), laboratórios Bell (Bell Labs) e American Telephone an Telegraph (AT&T) além do Massachusets Institute of Technology (MIT). A idéia principal do Multics era quanto as características de tempo compartilhado, aonde vários usuários usam os recursos do computador ao mesmo tempo, compartilhando-o. Ken Thompsom, um dos pesquisadores do Multics que trabalhava na Bell, após a saída da referida empresa do projeto Multics, decidiu que desenvolveria um sistema que mantesse as mesmas características do Multics mas que fosse menor do que o anterior, nasceu então o Unix. Algum tempo mais tarde em 1973 um outro pesquisador da Bell, Dennis Ritchie, reescreveu todo o sistema em uma linguagem de alto nível que ele mesmo criou, o C, isto fez com que o Unix passasse a ter maior aceitação fora da Bell. Figura 1 - Ken Thompson e Dennis Ritchie Entre 1977 e 1983 a AT&T passou a alterar o Unix de modo a poder comercializar o mesmo, isto se deu em meados de 1983 com o desenvolvimento da versão System V que até hoje ainda é usado no mercado. Em 1991 Linus Torvalds, então estudante de Ciências da Computação na Universidade de Helsinki na Finlândia, começa a estudar o Minix uma versão livre do Unix, então o mesmo decide criar um sistema que fosse mais poderoso que o Minix, para isso envia uma mensagem através da Usenet (espécie de antecessor da Internet), divulgando sua idéia, aonde já propõe a colaboração no desenvolvimento do sistema, bem como a disponibilização dos códigos fontes, Ainda em 1991 disponibiliza a versão 0.02 do Kernel (núcleo do sistema), e continua trabalhando até finalmente em 1994 oferecer a versão 1.0. Figura 2 - Linus Torvalds O Linux é um Sistema Operacional livre, que reimplementa as especificações POSIX, que já eram usadas em sistemas Unix (System 4) e BSD. Deste modo o Linux é muito similar ao Unix, mas seu fonte é completamente distinto tendo sido escrito de formas completamente diferentes e separadas. Linus Torvalds ao desenvolver o Linux não tinha intenção de ganhar dinheiro a intenção primordial era desenvolver um sistema que atendesse as suas necessidades pessoais, além é claro da pesquisa. Desde o começo o estilo de desenvolvimento foi baseado na ajuda coletiva, aonde vários desenvolvedores são coordenados por Linus, de forma colaborativa melhorando o sistema que ele criou. Milhares de pessoas no mundo ajudaram e ainda ajudam a desenvolver o Linux apenas pelo prazer de se criar um sistema cada vez melhor, isso faz dele a potência que é nos quesitos estabilidade e segurança. O Linux é regido pela licença GPL a referida licença basicamente dita que qualquer um pode usar o programa desde que não o torne fechado. Ou seja, você pode alterar e até comercializar o programa, mas nunca fechar o seu código. A história do Linux ainda se funde a do GNU, o GNU é um projeto que começou em 1984 por Richard Stallman com o objetivo de desenvolver um sistema compatível com Unix (Unix-like). O Linux é apenas um kernel (núcleo do sistema) o GNU é um conjunto de softwares, que foram até mesmo usados por Linus no desenvolvimento do Linux. Deste modo o sistema acabou se fundindo, se tornando uma junção do Kernel (Linux) e demais itens do Sistema (GNU). Deste modo o sistema leva usualmente o nome de seu núcleo, o Linux, mas o termo correto é GNU/Linux. Figura 3 - Mascotes GNU e Linux (Tux) Figura 4 - Richard Stallman 3 DISTRIBUIÇÕES LINUX 3.1. O que são disitribuições Entende-se como sistema operacional, um software que como um todo é capaz de fazer o computador funcionar de forma útil, provendo acesso aos dispositivos de hardware disponíveis, bem como fornecendo programas e aplicações para a interação do usuário nas mais diversas aplicações. As distribuições são a junção de todos esses fatores, núcleo do sistema (kernel Linux), programas (ex: Shell), aplicativos (ex: navegador Firefox). O que difere uma distribuição da outra é a versão utilizada do Kernel, e os programas e aplicativos disponibilizados, bem como o foco da distribuição, existem distribuições voltadas para todos os tipos de atividade, servidores, desktop, roteadores de redes, firewall, mobile e etc. Um fato que deixa claro a diferença que as distribuições podem ter entre si de acordo com o que oferecem se baseia no tamanho em bytes de algumas delas, existem distribuições capazes de “rodar” a partir de um simples disquete de 1.44MB até distribuições que ocupam 3 DVD´s de 4.7GB. 3.2. Exemplos de distribuições Hoje existem centenas de distribuições voltadas para as mais diversas aplicações, como citado existem muitas diferenças e peculiaridades entre as elas. Seguem alguns exemplos, suas funções, peculiaridades e foco principais. 3.2.1. Debian Debian ou Debian GNU/Linux é uma distribuição focada na estabilidade que existe desde 1996, atualmente a versão estável se encontra na 6.0 (codinome Squeeze). O Debian prima por estabilidade, haja visto que há uma cultura de se manter sempre versões antigas e testadas de todos os pacotes e bibliotecas, garantindo alta confiabilidade, a versão estável da distro nunca recebe pacotes antes dos mesmos serem exaustivamente testados, isso faz com que o Debian seja uma distribuição amplamente utilizada em servidores. Outro fator diferencial do Debian é o gerenciador de pacotes APT que permite a instalação, remoção, atualização e configuração de pacotes de instalação de forma simples, fácil, eficaz e segura. Figura 5 - Logotipo do Debian 3.2.2. Ubuntu Esta distribuição existe desde 2004, é uma distribuição baseada no Debian, também utilizando o gerenciador de pacotes APT, tem tido grande destaque no mercado Linux nos últimos três anos, apresentando grandes facilidades na sua instalação e uso para desktops, as versões do Ubuntu são lançadas a cada seis meses sempre no mês quatro e no mês dez. O número das versões obedece a este padrão começando na versão 4.10(ano 2004, mês 10), 5.04(ano 2005, mês 04) e assim sucessivamente. O ubuntu costuma trazer inovações interessantes aos usuários de desktop a cada nova versão, sendo considero o Linux “mais fácil de usar”, devido as suas ferramentas intuitivas e bem construídas graficamente. A última versão é a 11.4 (codinome Natty Narwhal), que traz como grande novidade o uso do novo e polêmico gerenciador de janelas Unity, que promete um Desktop mais produtivo e bonito em comparação aos demais gerenciadores de janela. Figura 6 - Logotipo Ubuntu 3.2.3. Damn Small Linux É uma distribuição baseada no Debian, que faz parte de um tipo denominado “minidistribuições”, basicamente se trata de um Linux live-cd (roda direto do CD, sem necessidade de instalação, sendo possível seu uso até mesmo em computadores sem disco rígido), a pequena distribuição oferece um desktop pronto e completo, contendo suíte de escritório, navegador de internet, cliente de mensagens instantâneas entre outros aplicativos. Devido ao seu tamanho é também muito leve e pode rodar bem no modo denominado “light” em um 486 DX2 de 66 Mhz com 16MB de memória RAM, com uma máquina com 128MB de RAM é capaz de rodar no seu modo “full” com todos os aplicativos e recursos da distribuição plenamente funcionais. A distribuição tem pouco mais de 50MB o que permite sua gravação até mesmo em CD’s do tipo Business Card. Se encontra na versão 4.4.10. Figura 7 - Logotipo Damn Small Linux 3.2.4. Endian Firewall Como o próprio nome sugere o Endian é um firewall baseado em Linux que pode transformar qualquer computador em um poderoso roteador/firewall. Conta com interface Web unificada de acesso e gerenciamento. Dispõe de ferramentas comuns e avançadas para firewall e roteamento, como por exemplo NAT, Proxy, DHCP, VPN, Anti-vírus e Anti-Spam para email e Web, filtro de conteúdo, estatísticas e logs, dentre outras ferramentas. Se encontra atualmente na versão 2.1.2. Figura 8 - Logotipo Endian Firewall 3.2.5. Android Sistema operacional mobile da Google que utiliza o kernel Linux. Não é desenvolvido internamente no kernel e sim numa estrutura externa desenvolvida pela Google. O sistema foi desenvolvido inicialmente pela própria Google que posteriormente passou o desenvolvimento para a Open Handset Alliance, ficando apenas com o gerenciamento do produto e a engenharia de processos. O Android é desenvolvido com bibliotecas que permite ao desenvolvedor programar para ele utilizando Java realizando o controle do aparelho por intermédio dessas bibliotecas. O crescimento do Android foi exponencial no último ano, atingindo algumas marcas altamente expressivas como: duzentos mil aplicativos desenvolvidos e disponibilizados no Google Market (loja de aplicativos do Android), cem milhões de aparelhos Android ativados, quatro bilhões e meio de aplicações instaladas através do Android Market. Com estes números o Android se tornou a plataforma mais utilizada em smarthphones estando em primeiro lugar com 38,5% de todo o mercado. Figura 9 - Logotipo Android 4 DETALHES DO SISTEMA OPERACIONAL LINUX 4.1. Sistema de arquivos Linus Torvalds adaptou o sistema de arquivos do MINIX, de Andrew Tanenbaum, para o Linux. Esse sistema de arquivos estendeu o limite do volume para 2 GiB e o tamanho do nome de arquivo para 255 caracteres. 4.1.1. Linux EXT2 A influência do UNIX pode ser vista, p.ex., na utilização de grupos de blocos, que são análogos aos grupos de cilindros utilizados pelo FFS. O tamanho máximo de um volume Ext2 é de 8 TiB. O Ext2 foi projetado e implementado para corrigir as deficiências do Ext e prover um sistema que respeitasse a semântica UNIX. A influência do UNIX pode ser vista, p.ex., na utilização de grupos de blocos, que são análogos aos grupos de cilindros utilizados pelo FFS. A versão original do FFS originou o que é hoje conhecido como UFS1 (Unix File System 1). O bloco, que consiste num conjunto de setores (cada setor tem 512 bytes), é a menor unidade de alocação para o Ext2. O tamanho pode ser de 1024, 2048 ou 4096 bytes e é definido na formatação. A partição EXT2 é o tipo usado para criar o sistema de arquivos Linux Native usado para armazenar o sistema de arquivos EXT2 (após a formatação) e permitir o armazenamento de dados. 4.1.2. Linux EXT3 A principal diferença entre o Ext2 e o Ext3 é a implementação do journaling, que consiste em um registro (log ou journal) de transações cuja finalidade é recuperar o sistema em caso de desligamento não programado. Há três níveis de journaling disponíveis na implementação do Ext3: Journal: os metadados e os dados (conteúdo) dos arquivos são escritos no journal antes de serem de fato escritos no sistema de arquivos principal. Isso aumenta a confiabilidade do sistema com uma perda de desempenho, devido a necessidade de todos os dados serem escritos no disco duas vezes. Writeback: os metadados são escritos no journal mas não o conteúdo dos arquivos. Essa opção permite um melhor desempenho em relação ao modo journal, porém introduz o risco de escrita fora de ordem onde, por exemplo, arquivos que são apensados durante um crash podem ter adicionados a eles trechos de lixo na próxima montagem. Ordered: é como o writeback, mas força que a escrita do conteúdo dos arquivos seja feita após a marcação de seus metadados como escritos no journal. Esse é considerado um meio-termo aceitável entre confiabilidade e performance, sendo, portanto, o nível padrão. A vantagem de usar ext3 é que melhora a recuperação do sistema de arquivos caso ocorra algum desligamento súbito do computador, por meio da gravação seqüencial dos dados na área de metadados e acesso mhash da sua árvore de diretórios. Embora o seu desempenho (velocidade) seja menos atrativo que o de outros sistemas de arquivos (como ReiserFS e XFS), ele tem a importante vantagem de permitir que seja feita a atualização direta a partir de um sistema com ext2, sem a necessidade de realizar um backup e restaurar posteriormente os dados, bem como o menor consumo de processamento . Enquanto em alguns contextos a falta de funções de sistemas de arquivos "modernos", como alocação dinâmica de inodes e estruturas de dados em árvore, poderia ser considerada uma desvantagem, em termos de "recuperabilidade" isso dá ao ext3 uma significante vantagem sobre sistemas de arquivos que possuem-nas. Os metadados do sistema de arquivos estão todos em locais fixos e bem conhecidos, e há certa redundância inerente à estrutura de dados, que permite que sistemas ext2 e ext3 sejam recuperáveis no caso de uma corrupção de dados significante, em que sistemas de arquivos em árvore não seriam recuperáveis. 4.1.3. Funcionalidades do Linux EXT3 A estrutura da partição ext3 é semelhante à da ext2, pelo que a migração de um formato para o outro é simples. A adição do journaling é feita em um arquivo chamado .journal que fica oculto pelo código ext3 na partição (desta forma ele não poderá ser apagado, o que comprometeria o funcionamento do sistema). A estrutura idêntica da partição ext3 com a ext2 torna mais fácil a manutenção do sistema, já que todas as ferramentas para recuperação ext2 funcionarão sem problemas, sendo mesmo possível montar uma partição ext3 como se fosse ext2. Como o ext3 visa uma grande compatibilidade com o ext2, muitas das estruturas ondisk são similares àquelas da ext2. Por causa disso, o ext3 não possui muitas das funções mais recentes como alocação dinâmica de inodes e tamanhos de blocos variáveis (fragmentos ou caudas). Os sistemas de arquivos ext3 não podem ser checados enquanto são montados para escrita. Um dump do sistema de arquivos feito enquanto ele está sendo montado para leitura e escrita pode resultar em dados corrompidos dentro do arquivo de dump. 4.1.4. Desfragmentação do Linux EXT3 Não há uma ferramenta online de desfragmentação funcional em nível de sistema de arquivos. Um desfragmentador offline da ext2, e2defrag, existe mas requer que um sistema ext3 seja revertido previamente ao ext2. Mas, dependendo das funcionalidades ativadas no sistema de arquivos, o e2defrag pode destruir dados; ele não sabe lidar com muitas das novas funcionalidades do ext3. 4.1.5. Recuperação no Linux EXT3 Diferentemente do ext2, o ext3 zera os ponteiros de blocos nos inodes de arquivos apagados. Ele faz isso para simplificar o acesso de leitura e escrita quando o journal está sendo utilizado após uma montagem "suja". Isso, no entanto, previne efetivamente que os arquivos sejam recuperados. O único recurso do usuário é fazer um "grep" no disco rígido para buscar por dados que sejam sinalizadores de início/fim de arquivo. Isso provê uma remoção de arquivos um pouco mais segura que em sistemas ext2, o que pode ser tanto uma vantagem quanto uma desvantagem. 4.1.6. Compressão no Linux EXT3 Suporte a compressão transparente de dados (disponível como um patch extra-oficial para ext2) não está disponível no ext3. O ext3 tem um tamanho máximo para arquivos e para o sistema de arquivos inteiro. Esses limites dependem do tamanho de bloco do sistema de arquivos; a tabela abaixo resume esses limites: Tabela com tamanho de blocos e tamanho de arquivos O tamanho de bloco de 8 KiB está apenas disponível para arquiteturas (como a alpha) que permitem paginação de 8 KiB. 4.1.7. Linux EXT4 Ext4 é a evolução do sistema de arquivos mais usados no Linux, o Ext3. De muitas maneiras, Ext4 é uma profunda melhoria sobre o Ext3, sendo o Ext3, com muitas melhorias frente o Ext2. No Ext3 foi principalmente a adição de Journaling sobre o Ext2, mas Ext4 teve mudanças importantes na estrutura do sistema de arquivos destinado ao armazenamento de dados. O resultado é um sistema de arquivos com um design aperfeiçoado, melhor performance, confiável e com muitos recursos. Um sistema de arquivos Ext3 existente, pode ser migrado para Ext4 com um procedimento fácil, onde consiste a execução de um casal de comandos em modo “read-only” (descrito na próxima seção). Por meio disto você melhora a performance, limites de armazenamentos e recursos do sistema de arquivos corrente, com ou sem a “reformatação” e/ou reinstalação do SO e softwares “environment”. Se você precisa das vantagens do Ext4 em um sistema em produção, você pode atualizar o sistema de arquivos. O processo é seguro é não há riscos para seus dados (obviamente, fazer backup de dados críticos é recomendado, pois você está atualizando seu sistema de arquivos). O Ext4 vai usar uma nova estrutura de dados somente em novos dados, a estrutura antiga continuará intocada, é será possível para leitura/escrita se for preciso. Desta forma, é claro, assim que uma vez convertido o sistema de arquivos para Ext4, você não vai poder voltar para o Ext3 novamente. 4.1.8. Sistemas de arquivos ou arquivos grandes Atualmente, Ext3 suporta 16TB de tamanho máximo no sistema de arquivos, e 2TB de tamanho máximo de um arquivo. Ext4 adiciona 48-bit endereçados, obtendo assim 1EB de tamanho máximo de sistema de arquivos e 16TB de tamanho máximo de arquivos. 1 EB = 1,048,576 TB (1 EB = 1024 PB, 1 PB = 1024 TB, 1 TB = 1024 GB). 4.1.9. Escalabilidade de subdiretórios Atualmente a possibilidade máxima de número de subdiretórios contendo um único diretório no Ext3 é 32.000. Ext4 quebra esse limite, e possibilita um número ilimitado de subdiretórios. 4.1.10. Extends Os tradicionais sistemas de arquivos derivados do Unix como o Ext3, utilizam um esquema de mapeamento indireto de blocos para manter cada trilho do bloco usado correspondente no dado de um arquivo. Isto é ineficiente para arquivos grandes, especialmente um arquivo grande deletado e/ou operações “truncate”, porque o mapeamento mantém uma entrada para muitos blocos únicos, e grandes arquivos tem muitos blocos. Os sistemas de arquivos modernos usam uma abordagem diferente chamada “extends”. Um extends é basicamente um punhado de blocos físicos continuo. Isto pode ser basicamente definido: “Os dados no próximo bloco n”. Por exemplo, um arquivo de 100MB pode ser alocado em um único extends deste tamanho, em vez de precisar da criação de um mapeamento indireto para 25600 blocos (4KB por bloco). Arquivos grandes são divididos em diversos extends. Extends melhora a performance e também ajuda a reduzir a fragmentação, uma vez que incentiva o continuo “layouts” do disco. 4.1.11. Alocação multiblock Quando o EXT3 precisa de nova escrita de dados no disco, há um alocador de blocos que decide quais blocos livres deverá ser usado para a escrita do dado. Mas o alocador de blocos do Ext3 somente alocar um bloco (4KB) em um momento. Esta forma que o sistema precisa para escrever 100MB de dados mencionado anteriormente em outro ponto, será necessário para chamar o alocador de blocos 25600 vezes (isto simplesmente para 100MB!). Não só isto é ineficiente, como também não permite que o bloco de alocação utilize a política de alocação porque ele não sabe como o total de muitos dados deve ter a alocação iniciada, ele apenas conhece sobre um simples bloco. Ext4 usa “multiblock allocator” (mballoc), no qual, aloca muitos blocos em uma simples chamada, em vez de um simples bloco por chamada, evitando um monte de overhead. Isto melhora a performance, e é especialmente útil com “alocação atrasada” e extends. Este novo recurso não afeta o formato do disco. 4.1.12. Atraso na alocação Atraso na alocação é um recurso de performance (isto não muda o formato do disco) encontrado em poucos sistemas de arquivos modernos, tais como o XFS, ZFS, btrfs ou Reiser 4, que constitui em um atraso na alocação de blocos tanto quando possível, contrário aos tradicionais sistemas de arquivos (tais como o Ext3, Reiser3, etc) fazem: alocando os blocos com a maior brevidade possível. Por exemplo, em um processo de escrita, o código do sistema de arquivos irá atribuir imediatamente os blocos quando os dados forem coletados – mesmo se os dados não estiverem sendo escritos agora para o disco, eles vão ser mantidos em cache durante um tempo. Esta abordagem tem algumas desvantagens.Por exemplo, quando um processo esta escrevendo continuamente em um arquivo, crescente, sucessivamente sendo escritos atribuindo blocos para os dados, mas ele não sabe se o arquivo se manterá crescente. Atrasando a alocação, por outro lado, não afetaria os blocos imediatamente quando o processo de escrita, sim, ela atrasa a alocação dos blocos, enquanto o arquivo é mantido em cache, até que ele esteja realmente indo para escrito no disco. Isto da ao bloco de alocação a capacidade de alocar em situações em que sistemas antigos não poderia. Atraso na alocação trabalha muito bem com as duas características anteriormente mencionadas, extents e alocação multiblock, porque, em muitos casos um trabalho em que o arquivo é gravado para o último disco que será atribuído em blocos extends, cuja alocação é feita com o mballoc. O desempenho é muito melhor, e a fragmentação é muito melhorada em alguns workloads. 4.1.13. FSCK rápido Fsck é uma operação muito lenta, especialmente o primeiro passo: checagem de todos os inodes em um sistema de arquivos. No Ext4, até o fim de cada grupo da tabela de inode estará armazenado uma lista de inodes inutilizados ( com checksum, por segurança), assim o fsck não irá checar estes inodes. O resultado final é que o tempo do fsck melhorou de 2 a 20 vezes, dependendo do número usado de inodes. Deve-se notar que é o fsck, e não o Ext4, que irá montar a lista de inodes inutilizados. Isso significa que você deve executar o fsck para obter a lista de inodes inutilizados construída, e só na próxima execução do fsck será mais rápida. Há também uma característica que ajuda a acelerar o fsck – “flexible block groups” – que também acelera as operações em arquivos. 4.1.14. Journal checksumming O Journal é mais utilizado na parte do disco, construindo os blocos mais propensos a falhas de hardware. A recuperação de um journal corrompido pode levar a uma corrupção massiva. Mas “journal checksumming” tem um bonus: ele permite a conversão e gravação em duas-fases, sendo no Ext3 o journal em única fase, acelerando a operação no sistema de arquivos para mais de 20% em alguns casos – assim a reabilitação e a performance são melhoradas ao mesmo tempo. 4.1.15. Recursos relacionados aos inodes Aumento de inodes: Ext3 suporta a configuração de tamanho de inode ( pelo parâmetro -l do mkfs), mas o tamanho padrão de inode é 128 bytes. Ext4 tem como padrão 256 bytes. Isto é necessário para acomodar algumas características extras (como o timestamp em nano segundos ou versonamento de inodes), e o espaço restante do inode será utilizado para armazenar atributos extends suficientemente pequenos para caber nesse espaço. Isto facilitará o acesso aos atributos com maior agilidade, e melhora no desempenho das aplicações que usem alocação extend por um fator de 37 vezes. A reserva de inode consiste em alocar vários inodes quando um diretório é criado, esperando que eles sejam utilizados no futuro. Melhorando a performance, porque quando novos arquivos forem criados neste diretório, eles serão capazes de utilizar os inodes reservados. Portanto a criação de um arquivo, como também a ação de apagar o mesmo, será mais eficiente. timestamps em nano segundos significa que áreas com “tempo modificado” sejam capazes de usar resoluções em nano segundos em vez de segundo como no Ext3. 4.1.16. Presistência na pré-alocação As aplicações chamam o sistema de arquivos para pré-alocar o espaço, e o sistema de arquivos aloca a quantida necessária de blocos e estrutura de dados, mas não há dados sobre o assunto até que a aplicação realmente precisa para escrever os dados no futuro. Isto é o que faz aplicações P2P quando “pré-aloca” o espaço necessário para uma transferência que irá durar horas ou dias, mas muito mais eficiente quando implementado por um sistema de arquivos do que por uma API genérica. Isto tem varios usos: em primeiro lugar, para evitar aplicações (como aplicativos P2P) faze-lo propriamente e ineficientemente, mediante o preenchimento de um arquivo com zeros. Segundo, para melhoria da fragmentação, uma vez que os blocos serão alocados em um tempo, e continuamente se possível. Terceiro, para assegurar que os pedidos tenham sempre o mesmo espaço solitado para a necessidade, o que é importante para aplicações RT-ish, pois sem a pré-alocação o sistema de arquivos poderá ficar cheio no meio de uma operação importante. Este recurso estará disponível via libc posix_fallocate() interface. 4.1.17. ReiserFS ReiserFS usa árvores balanceadas para tornar o processo de busca de arquivos, informações sobre segurança e outros metadados mais eficientes. Para arquivos muito pequenos, seus dados podem ser armazenados próximos aos metadados, então, ambos podem ser recuperados com um pequeno movimento do mecanismo da "cabeça" de leitura do disco. Essa propriedade vai contribuir para um melhor desempenho caso uma aplicação necessite abrir muitos arquivos pequenos rapidamente. No caso de um desligamento incorreto do sistema, o ReiserFS é capaz de recuperar a consistência do sistema de arquivos em pouco tempo e a possibilidade de perda de pastas ou partições é reduzida. Em compensação, os arquivos que eventualmente estiverem sendo gravados no exato momento em que acabou a energia ficarão com seus dados corrompidos, haverá acesso aos arquivos normalmente, mas o conteúdo estará truncado ou incompleto. 4.1.18. Desvantagens do ReiserFS Uma desvantagem do ReiserFS é o seu consumo de CPU muito elevado. Utiliza no mínimo 7 por cento da CPU, chegando a usar até 99 por cento, quando a actividade de disco é elevada. O futuro do ReiserFS é atualmente dado como incerto, em virtude da prisão em 10 de Outubro de 2006 de Hans Reiser, seu criador, e sua condenação em 28 de Abril de 2008 pelo assassinato de sua mulher no início de Setembro de 2006. Atualmente, devido à paralisação das atividades da Namesys, o projeto ReiserFS está armazenado em kernel.org. 4.2. Gerenciamento de memória Cada processo no Linux possui prioridades com relação à alocação de memória. O Linux também possui uma característica de alocar determinados recursos dos processos que foram executados para garantir que estes retornem de maneira mais eficiente quando estes forem requisitados novamente. Caso a memória física (memória RAM) esteja totalmente carregada, é iniciado um processo de operação com a memória virtual, a memória SWAP. (Silva APUD Lima, 2007). Esse espaço da memória utilizado para armazenar estes recursos é chamado de cache ou ainda prefetch. Se verificarmos os níveis de memória durante a utilização do sistema, veremos que mesmo com poucos programas abertos, a memória vai estar praticamente toda ocupada. Isso ocorre pelo fato de que o Linux está alocando as páginas de memória livre para a alocação desses recursos dos processos que são encerrados. Porém, devido a algoritmos complexos e totalmente eficientes, além da memória SWAP (memória virtual), o sistema pode operar sem lentidões. À medida que mais processos vão sendo executados, e como estes tem preferência de alocação na memória física, o Linux começa a jogar estes recursos alocados para a memória SWAP. Os processos a serem lançados para a memória SWAP geralmente seguem o padrão de latência do processo: os processos não utilizados a mais tempo são lançados para a memória SWAP. Isso libera espaço na memória física, permitindo a alocação de mais processos nessa memória. Essa memória SWAP é uma partição no disco rígido (partição SWAP) dedicada exclusivamente para estes despejos de processos em caso de necessidade de liberação de espaço na memória física. Essa partição é criada automaticamente na instalação das distribuições Linux de maneira geral. Com relação à alocação de páginas, a memória física é dividida através de um algoritmo chamado buddy-heap. Este é responsável pela liberação de páginas de memória física e também pela alocação de intervalos de página de acordo com o necessário. Este algoritmo consegue alocar regiões “parceiras” de memória afim de aumentar a capacidade de armazenar de maneira contínua os processos na memória física. Em caso da necessidade de alocação de processos menores, os quais não necessitam ocupar toda uma região de memória, o algoritmo pode dividir uma região em duas regiões parceiras, utilizando somente o espaço necessário. Dessa maneira, a menor porção de alocação caracteriza-se como uma página de memória. Figura 10 - Esquema de gerenciamento de memória através do algoritmo buddy-heap. Um outro alocador de memória concentra-se no kernel Linux. Este não utiliza necessariamente os mecanismos tradicionais de alocação de memória. Estes caracterizam-se por caches criados pelo próprio kernel, como o cache de buffers, o cache de páginas e o sistema de gerenciamento de memória virtual. A memória virtual no Linux é gerenciada de maneira ligeiramente diferente. As páginas de memória virtual são criadas de acordo com a demanda, gerenciando memória virtual de acordo com os conjuntos de regiões de memória (o que configura o espaço de endereçamento) e conjuntos de páginas (uma visão física de cada espaço de endereçamento, visão descrita nas tabelas de página do hardware). O kernel Linux pode criar espaços de endereçamento virtual em duas situações: na execução de um novo programa através de uma chamada ao sistema exec, no qual o processo recebe um espaço de endereçamento vazio, e quando o processo é criado com chamada ao sistema fork, na qual é feita uma cópia integral dos espaços de endereçamento virtual e os dois processos compartilham as mesmas páginas de memória física. Existe ainda a tática de transição de processos entre a memória física e a memória virtual. Esse processo é conhecido como swapping. Os sistemas baseados em UNIX atuais realizam a troca de páginas de processos, nunca realizando o swapping de processos inteiros. Esse sistema de paginação é dividido em duas seções: o algoritmo de políticas, o qual é responsável por decidir qual página deverá ser transferida para o disco e quando esta página deve ser transferida; e o sistema de paginação, o qual transfere os dados novamente para a memória física quando estes se tornam necessários novamente. O Linux decide qual das páginas deve sofrer swapping através de um algoritmo chamado LFU, ou Least Frequently Used. Nesse algoritmo, as páginas com menor frequência de utilização são selecionadas para a realização da operação de swapping, com intuito de realizar o menor número possível de trocas de páginas. Figura 11 - Funcionamento básico do swapping O kernel ainda reserva parte da memória virtual para seu uso interno. Esse espaço dedicado é dividido em duas partes: uma estática, onde existem as referências das tabelas de páginas; e outra dinâmica, de uso próprio do kernel. 4.3. Gerenciamento de processos 4.3.1. O conceito de processo Em sistemas operacionais é conveniente diferenciar um programa e a sua execução. É comum que um mesmo programa seja executado por vários usuários, ao mesmo tempo. Isto ocorre com um editor de textos, por exemplo. Neste caso, todos os usuários utilizam uma mesma cópia do código do editor de textos, porém cada execução trabalha sobre uma área de variáveis privativa. Cada execução independente do editor de textos constitui um processo. Um processo pode ser definido como "um programa em execução". O conceito de processo é bastante abstrato, mas é essencial no estudo de sistemas operacionais. Um programa é uma seqüência de instruções. É algo passivo dentro do sistema. Um programa não altera o seu próprio estado. Por outro lado, o processo é um elemento ativo. Ele altera o seu estado, à medida que executa um programa. Para cada processo o sistema operacional mantém um registro descritor, que é um pequeno bloco de memória que mantém informações sobre o processo (número único, estado, valores dos registradores da UCP, etc.). Como qualquer outro sistema de compartilhamento de tempo o Linux consegue dar a impressão de execução simultânea dos processos, separando um espaço bastante curto de tempo para cada um deles. Para ter sucesso nesta tarefa ele segue uma serie de regras que não desperdiça tempo de hardware com operações desnecessárias e consegue escolher qual processo deve ser executado naquele exato momento. Quem faz essa escolha no kernel é o escalonador de processos, que em grande parte é responsável pela produtividade e eficiência do sistema. Mais do que um simples mecanismo de divisão de tempo, ele é responsável por uma política de tratamento dos processos que permite os melhores resultados possíveis. 4.3.2. Os primeiros processos Na fase de inicialização do Linux a função ``start_kernel'' é responsável por criar um thread, este é o processo de número zero, o primeiro e o ascendente de todos os outros processos. Depois de inicializar toda a estrutura de dados para este processo, esta mesma função é responsável por chamar a função ``init'' que por sua vez utiliza a chamada de sistema ``execve'' para rodar o executável init, que será o processo número 1, mais conhecido como init. Podemos chamar de Deus e pai de todos os outros processos, é o segundo processo a ser criado e um dos últimos a morrer. Seus filhos, vivem como nós seres humanos, eles nascem, se desenvolvem, tem uma vida mais ou menos produtiva, podem ter inúmeros filhos em poucos segundos e eventualmente morrem. Existem alguns outros processos que também são criados pelo kernel durante a fase de inicialização e destruídos assim que o sistema desliga. Outros são criados sob demanda, assim que surge a necessidade deles são carregados. 4.3.3. Estados Uma das coisas que o escalonador precisa ter ciência é em qual estado está cada processo, na estrutura que armazena os dados de cada processo temos um array de possíveis estados onde apenas uma das opções abaixo estará ativa. TASK_RUNNING Em execução ou aguardando para ser executado. TASK_INTERRUPTIBLE O processo está suspenso até que determinada condição se torne verdadeira. TASK_UNINTERRUPTIBLE Como o estado anterior, exceto pelo fato de que o seu estado não será modificado quando receber um sinal. É importante para os processos que necessitam executar determinada tarefa sem ser interrompido. TASK_STOPPED Execução do processo foi parada. TASK_ZOMBIE O processo está terminado, mas o processo pai ainda não executou uma chamada de sistema para retornar informações sobre o processo morto - ``wait'', as informações não são descartadas pois ainda podem ser utilizadas. 4.3.4. Limite de recursos Por padrão o Linux limita os recursos que cada processo pode ter. Isto é, quanto de recursos do sistema ele pode utilizar. Isso é uma proteção para que caso o usuário faça algo errado, não prejudique a estabilidade do sistema. Esses limites são: RLIMIT_AS O tamanho máximo que um processo pode ter em bytes. O kernel checa esse valor quando um processo utiliza a chamada de sistema ``malloc'' ou similar. RLIMIT_CORE Quando um processo é abortado, o kernel pode gerar um arquivo core contendo as informações desse aborto. Este valor é utilizando para limitar o tamanho desse arquivo. Caso o valor seja zero O, o arquivo não é criado. RLIMIT_CPU O tempo máximo em segundos que um processo pode ser executado. Caso esse limite seja ultrapassado o kernel envia um sinal SIGXCPU para tentar pacificamente finalizar sua execução, se isso não acontecer ele envia um SIGKILL e mata o processo. RLIMIT_DATA O tamanho máximo do heap ou memória de dados em bytes. O kernel checa esse valor antes de expandir o heap de um processo. RLIMIT_FSIZE O tamanho máximo em bytes permitido para um arquivo. Se o processo tentar aumentar o tamanho de um arquivo que ultrapasse esse valor, o kernel envia um SIGXFSZ. RLIMIT_LOCKS O número máximo de arquivos que um processo pode dar lock. Toda fez que o usuário tenta dar lock em um arquivo o kernel checa esse valor. RLIMIT_MEMLOCK O tamanho máximo em bytes de memória que não permite swap. O kernel checa esse valor toda vez são utilizadas as chamadas de sistema ``mlock'' ou ``mlockall''. RLIMIT_NOFILE O número máximo de descritores de arquivos abertos. Toda vez que um descritor for aberto ou duplicado o kernel checa este valor. RLIMIT_NPROC O número máximo de processos que um usuário pode ter. RLIMIT_RSS A quantidade máxima de memória física que um processo pode ter. RLIMIT_STACK O tamanho máximo em bytes da stack. O kernel checa este valor antes de expandi-la. 4.3.5. Preemptivo Os processos do Linux são preemptivos, isso significa que quando um processo entra no estado TASK_RUNNING o kernel vai checar se existe alguma prioridade maior do que o processo corrente. Caso exista, o processo corrente é interrompido e o que tem prioridade maior começa a rodar. Imagine a seguinte situação onde o usuário utiliza apenas dois processos. O editor de textos Emacs para escrever o seu programa e ao mesmo tempo o gcc para compilar a versão mais recente do programa Pogobol Light. Por ser um programa interativo o editor de textos tem uma prioridade maior do que o compilador, mesmo assim ele ainda é suspenso diversas vezes para que o compilador possa rodar também. O usuário digita algumas palavras e imediatamente após cada tecla digitada o kernel suspende a execução do compilador para poder processar o Emacs e assim o texto digitado aparecer na tela, isso acontece tão rápido que torna-se imperceptível, então o Emacs é suspenso novamente para que o gcc possa voltar a executar. Neste caso, quando dizemos que um processo foi suspenso, significa que ele continua com o estado TASK_RUNNING, porém não mais utilizando o CPU. 4.3.6. Política de escalonamento A prioridade de um processo no Linux está em constante alteração, o escalonador se mantém informado sobre o que os processos estão fazendo e assim torna-se possível ajustar a prioridade. Dessa maneira os processos que ficaram proibidos de utilizar o CPU por um longo intervalo de tempo, tem sua prioridade incrementada automaticamente, contrariamente os processos que passaram um longo período dentro do CPU são penalizados tendo sua prioridade decrementada. Quando tocamos no assunto escalonamento é importante notar que os processos são classificados como da Forma E/S e Forma CPU. O primeiro faz uso extenso dos recursos de entrada e saída, isso significa que grande parte do seu tempo é utilizado no aguardo da conclusão das operações de Entrada e Saída, já o segundo são processos que necessitam de um longo tempo dentro do CPU. Uma classificação alternativa define três classes de processos: Processos Interativos Os processos que estão em constante interação com o usuário, sendo assim eles perdem grande parte do tempo esperando uma atividade do usuário, como um clique do mouse ou o aperto de uma tecla. Quando qualquer dessas ações for recebida o sistema precisa responder de forma ágil suspendendo qualquer processo que estiver rodando e colocar o processo interativo no CPU para processar a requisição solicitada pelo usuário, caso contrário ele pode pensar que o sistema não está respondendo. Um bom tempo de resposta é em torno de 50 e 150 ms. Processos em Lote Não necessitam de nenhuma interação do usuário e por isso muitas vezes rodam em background. Como são processos de baixa prioridade, são freqüentemente penalizados pelo escalonador. Programas de processamento em lote comuns são editores de texto, compiladores e programas gráficos. Processos em Tempo Real Esses processos nunca devem ser bloqueados por processos de baixa prioridade, precisam de um tempo de resposta super rápido e com uma variação bastante baixa. Alguns aplicativos que fazem uso do tempo real são som, vídeo, controladores de robôs e equipamentos que envolvem a segurança humana. 4.3.7. Algoritmo de Escalonamento O algoritmo de escalonamento do Linux funciona dividindo o tempo do CPU em fatias. Em uma única fatia cada processo tem um tempo especifico de duração que é computada assim que essa fatia inicia. Geralmente processos diferentes tem tempos de execução diferentes. Quando o tempo de execução de um processo termina ele é retirado do CPU e outro processo que está rodando é colocado no seu lugar. Uma fatia termina quando todos os processos esgotaram seu tempo reservado de execução, assim o escalonador é responsável por calcular o tempo de execução para todos os processos e uma nova fatia inicia. Para o Linux escolher qual processo deve rodar ele precisar escolher qual tem a prioridade maior, existem dois tipos de prioridade: Prioridade Estática Definido pelo usuário para processos que necessitam de tempo real, os valores variam de 1 até 99 que nunca são modificados pelo escalonador. Prioridade Dinâmica Esta é aplicada para os processos convencionais. A prioridade dinâmica dos processos convencionais é sempre inferior aos processos com prioridade estática. Se existir um processo com prioridade estática no estado TASK_RUNNING nenhum processo dinâmico irá rodar até que ele pare de executar. 5 VANTAGENS E DESVANTAGENS DO LINUX 5.1 Vantagens Custos muito baixos ou até nulos Por serem baseadas em software livre, as distribuições Linux podem ser encontradas até gratuitamente. Algumas distribuições, como o Ubuntu, disponibilizam em seus sites oficiais links de download das imagens dos CDs de instalação ou até mesmo disponibilizam um formulário onde você pode solicitar a entrega de mídias de instalação através do correio. Versões mais “elaboradas”, como aquelas dedicadas exclusivamente a servidores, podem apresentar um pequeno custo por causa da licença, mas esse custo ainda é muito menor do que licenças de outros sistemas operacionais, como os sistemas da família Windows. Ainda há o fato de que, por ser software livre, os usuários podem modificar o código-fonte do sistema para atender alguma necessidade específica, recompilar tudo e distribuir normalmente. Maior estabilidade e segurança Os sistemas Linux são mais estáveis, pois conseguem gerenciar de maneira mais eficiente os recursos de hardware. Isso permite que até máquinas mais antigas possam rodar versões mais novas das distribuições. Além disso, são mais seguros, pois o número de pragas virtuais para sistemas Linux ainda é muito reduzido, além de que códigos que modifiquem qualquer parte do sistema sempre são interceptados com a autenticação obrigatória o superusuário (root). Esse recurso inclusive começou a ser incorporado de maneira similar a partir do Windows Vista na família Windows, através do Controle de Conta de Usuário. Comunidade extensa e ativa A comunidade Linux é muito ativa. Manifesta-se através de fóruns, listas de discussão e outros meios através da internet, meios de fácil acesso. Isso garante suporte quando necessário, inclusive em português. Você pode obter auxílio para problemas bem básicos como para problemas mais complexos. 5.2 Desvantagens Incompatibilidade com alguns equipamentos Alguns fabricantes de equipamentos não escrevem drivers para o sistema Linux para seus equipamentos, como é o caso de algumas impressoras da HP. Existem alternativas para estes casos, porém geralmente são tortuosas de serem implementadas e podem desencorajar os usuários a utilizarem as distribuições Linux. Incompatibilidade com alguns formatos de arquivos Alguns formatos de arquivos, principalmente os proprietários da Microsoft, não são executados com toda a fidelidade, como é o caso do formato de vídeo WMV. Existem plugins para executá-los, mas estes não acabam oferecendo a mesma qualidade que se o arquivo estivesse sendo executado no Windows Media Player. O Linux ainda peca na facilidade de uso Mesmo com o esforço de algumas distribuições como o Ubuntu, o Linux não consegue oferecer a mesma facilidade de uso que o Windows. Isso talvez se deva mais a um fator cultural, mas o fato é que se você entregar um computador com Linux pra alguém que trabalha com Windows, este certamente sentirá um pouco de dificuldade, o que não acontece geralmente ao contrário. Muitas coisas ainda são mais fáceis de serem executadas via terminal, porém as pessoas geralmente “temem” aquela tela preta com um monte de comandos em branco. 6 CONCLUSÕES Concluímos que desde o manifesto inicial feito por Linus Torvalds até hoje, o Linux tem evoluído com muita velocidade e profissionalismo, ao contrario do que muitos apostavam por se tratar de um software livre. Suas funcionalidades plug and play, drivers compativeis e aplicativos cresceram de tal forma que pouquíssima coisa é incompatível ou não funciona bem no Linux. Suas diversas distribuições tiveram investimentos pesados oriundos de empresas como Siemens, Sun, Oracle e outras que fomentaram seu desenvolvimento e hoje, é uma plataforma atualizada, otimizada e funcional tanto para desktops quanto para servidores. Linux de fato veio para ficar e sua difusão está cada vez mais forte devido principalmente os órgãos governamentais que optaram por utilizá-lo como forma de fugir do monopólio Microsoft. Com o advento da computação nas núvens, a discussão e o uso do Linux ganha novo folego e talvez, a compatibilidade e independencia necessária para talvez, assumir a primeira posição no mercado 7 BIBLIOGRAFIA Gonçalves, A., Luvizotto, D., Nascimento, H., Santos, L., Martins, L. Sistemas Linux. Universidade Estadual de Londrina, Londrina, 2007. Disponível eletronicamente em <http://www.dca.fee.unicamp.br/~andreric/arquivos/sistemas_linux.pdf>. Acessado em 19 e 20 de maio de 2011; Júnior, J., Alvarez, D. Gerenciamento de memória no Linux. Instituto Tecnológico da Aeronáutica (ITA). São José dos Campos. Disponível em <http://ces33.wikidot.com/gerenciamento-de-memoria:jose-gerardo-e-diego-alvarez>. Acessado em 19 de maio de 2011; UOL Tecnologia. Linux: vantagens e desvantagens do sistema. Disponível em <http://tecnologia.uol.com.br/especiais/ultnot/2005/08/18/ult2888u81.jhtm>. Acesso em 20 de maio de 2011. Brasil Escola. História do Linux. Disponível em < http://www.brasilescola.com/informatica/historia-do-linux.htm>. Acessado em 18 de maio de 2011. Kernel.org. The Linux Kernel Archives. Disponível em < http://www.kernel.org/>. Acessado em 19 de maio de 2011. Wikipédia. Linux. Disponível em <http://en.wikipedia.org/wiki/Linux>. Acessado em 18 de maio de 2011. Endian.com. Endian. Disponível em < http://www.endian.com/us/>. Acessado em 19 de maio de 2011. Damnsmalllinux.org. Damn Small Linux. Disponível em < http://www.damnsmalllinux.org/>. Acessado em 19 de maio de 2011. 4Security. 4Security. Disponível em < http://www.4security.com.br/>. Acessado em 19 de maio de 2011. Kernelnewbies.org. EXT4. Disponível em <http://kernelnewbies.org>. Acessado em 19 de maio de 2011.