Estrutura de diretórios no GNU/Linux

Quem está começando agora no mundo GNU/Linux, costuma ficar confuso com a estrutura de diretórios e partições.

Enquanto no Windows temos as unidades A:, C: ou D:, no Linux temos os /dev/sda, /dev/sdb e seus pontos de montagem; lá no Windows, tem a pasta “Meus Documentos” onde os usuários gravam seus arquivos; no Linux, existe o diretório /home/usuario, onde geralmente ‘usuario’ é substituído pelo nome do usuário que está logado no sistema no momento.

A estrutura de diretórios do Linux segue o File Hierarchy Standard [1] – Padrão para Hierarquia de Sistema de Arquivos, ou FHS, que é um orgão que define os principais diretórios e o seu conteúdo em sistema Linux ou do tipo Unix e é um subpadrão do LSB – Linux Standard Base[2].

Uma estrutura de diretórios padrão mantém o sistema organizado, e sempre vamos saber onde estará um arquivo de configuração ou um comando que pode ser utilizado por todos usuários, além de garantir que a estrutura padrão será a mesma para qualquer distribuição.

Falando sobre os principais diretórios, o FHS especifica que um sistema GNU/Linux, deve conter obrigatoriamente 14 diretórios. Alguns diretórios são opcionais e pelo menos um é recomendado. Basicamente, temos algo assim:

Conhecendo os diretórios!

/ – É na raiz que ficam todos os diretórios do GNU/Linux. O diretório raiz é representado pela / (barra). Fazendo uma comparação, lá no Windows, temos o diretório C:, que é também é chamado de raiz. Isso significa que tudo o que for instalado no Windows, estará abaixo de C:.No GNU/Linux, tudo também fica abaixo da raiz, ou melhor, do /.

/bin – O diretório /bin guarda os comandos essenciais para o funcionamento do sistema. Esse é um diretório público; sendo assim, os comandos que estão nele podem ser utilizados por qualquer usuário do sistema. Exemplos de comandos: bash, ls, echo, cp e outros.

/boot – No diretório /boot estão os arquivos estáticos necessários à inicialização do sistemae os arquivos do gerenciador de boot. O Gerenciador de Boot é um programa que carrega um sistema operacional e/ou permite escolher qual será iniciado. Normalmente esse programa é gravado no Setor de Boot da partição ativa ou no Master Boot Record (MBR) do disco rígido.

/dev – No diretório /dev ficam todos os arquivos-dispositivos. O Linux faz a comunicação com os periféricos através de links simbólicos (seria algo como atalhos) que ficam armazenados nesse diretório facilitando assim, o acesso aos mesmos. Aqui, vale lembrar que os arquivos-dispositivos podem ser do tipo devfs ou udev:

* devfs – contém todos arquivos-dispositivos, inclusive para dispositivos que não existem no computador e irá ocupar espaço em disco.
* udev – utilizado a partir do kernel 2.6.12, não ocupa espaço em disco e contém somente os arquivos-dispositivos dos devices presentes na máquina.

/etc – No diretório /etc estão os arquivos de configuração do sistema da máquina local. Nesse diretório vamos encontrar uma miscelânea de dados de configuração, tais como: scripts de inicialização do sistema em seus vários níveis (armazenados nos diretórios /etc/r*c), tabela do filesystem (arquivo /etc/fstab), configuração da inicialização do sistema para cada nível (arquivo /etc/inittab), configuração default para todos os logins (arquivo /etc/profile), e um número considerável de arquivos para configuração de rede e outros aspectos do sistema, incluindo a parte gráfica.

/lib – No diretório /lib estão as biblilotecas compartilhadas e módulos do kernel. As bibliotecas, conhecidas como libs, são como as dlls para o Windows. No caso do Linux, quando um programa é instalado, todas as bibliotecas para o seu funcionamento ficam armazenadas nesse diretório.

/media – Ponto de montagem para mídias removíveis, tais como: cd, dvd, floppy disk, pendrive, câmera digital, etc. Aqui seria mais ou menos o equivalente as letras A: e D: do windows… só que aqui, não se usam as letras, usa-se o nome do dispositivo!

/mnt – Diretório usado como ponto de montagem de sistema de arquivos. Por exemplo, existe um servidor de arquivos na rede que precisa ser acessado por um usuário; o administrador irá disponibilizar esse diretório na máquina do usuário dentro do /mnt. E uma coisa legal, é que isso fica transparente… o Linux vai enxergar o diretório remoto como se fosse um diretório da máquina local!

/opt – Normalmente, é utilizado por programas que foram instalados com o sistema já em funcionamento, e que precisam de uma quantidade de uma espaço maior para sua instalação como é o caso do OpenOffice e o KDE.

/srv – Diretório para dados de serviços fornecidos pelo sistema e, cuja aplicação é de alcance geral, ou seja, os dados não são específicos de um usuário. Por exemplo, /srv/www (servidor web), /srv/ftp (servidor ftp), etc.

/var – O diretório /var contém arquivos de dados variáveis. Por padrão, os programas que geram um arquivo de registro para consulta, mais conhecido como log, ficam armazenados nesse diretório. Além do log, os arquivos que estão aguardando liberação, ficam localizados em /var/spool. Os principais arquivos que se utilizam do diretório /var, são as mensagens de e-mail e os arquivos a serem impressos.

/sbin – O diretório /sbin guarda os comandos utilizados para inicializar, reparar, restaurar e/ou recuperar o sistema. Isso quer dizer que esse diretório também é de comandos essenciais, mas os mesmos são utilizados apenas pelo usuário root. Entre os comandos estão o halt, ifconfig, init, iptables e outros.

/tmp – Utilizado para armazenar arquivos temporários. Por exemplo, guardar pequenas informações que precisam estar em algum lugar até que a operação seja completada, como é o caso de um download. Enquanto não for concluído, o arquivo fica registrado em /tmp, e, assim que é finalizado, é encaminhado para o local correto. Observação: no Debian, esse diretório é limpo a cada boot, então não é uma boa idéia guardar arquivos importantes no /tmp!

/usr – Armazena dados compartilhados, e é montado como somente leitura. É considerado um dos mais importantes de todo o sistema. É nele que todos os programas que não foram instalados durante a instalação inicial (hmmm frase estranha! :P) do Linux são instalados. Um diretório /usr requer a existência dos seguintes sub-diretórios:

* /usr/include: arquivos de cabeçalho utilizados por programas C/C++.
* /usr/lib: bibliotecas.
* /usr/local: uso do administrador de sistemas para instalação local e/ou pós-instalação de software.
* /usr/sbin: binários, não essenciais, do sistema.
* /usr/share: dados independentes de arquitetura (ex.: páginas de manual, documentação, etc).
* /usr/bin: programas de usuários, não essenciais para a inicialização do sistema.

Diretórios Opcionais

Surpreso? Sim… temos dentro da estrutura do GNU/Linux, alguns diretórios que vamos encontrar em praticamente todas as distribuições, porém são opcionais. Isso quer dizer que eles podem não existir dentro da estrutura, ou ainda, podem ser renomeados.

/home – É o diretório “lar doce lar” dos usuários. Todo usuário no GNU/Linux, tem um diretório para chamar de seu. Sempre que um novo usuários é criado no sistema, um diretório como mesmo nome é criado no /home. Assim, o sistema fica organizado, além de evitar que usuários escrevam em diretórios que não sejam o seu.

/root – Diretório pessoal do “poderoso chefão” do sistema. O root é o administrador do sistema, e tem poderes para: configurar interfaces de rede, manipular usuários e grupos, alterar a prioridades de processos, entre outros.

/sys – O diretório /sys, está presente a partir do kernel 2.6. Nesse diretório estão os módulos para equipamentos USB. Como ele é montado automaticamente no sistema, basta conectar o equipamento para ser reconhecido.

Diretório Recomendado

/proc – O /proc é um diretório virtual, mantido pelo kernel onde encontramos a configuração atual do sistema, tais como: modelo da cpu, quantidade de memória, dispositivos já montados, interrupções, etc. Aqui, temos subdiretórios, com o nome que corresponde ao PID (Process ID – Identificação do Processo) de cada processo; dentro deles, vamos encontrar diversos arquivos texto, que representam uma importante função do programa em execução.

Para saber mais…

O que foi colocado aqui é uma breve descrição da estrutura de diretórios do Linux! Achei um link super legal com um resumo do padrão da Estrutura de Diretórios no GNU/Linux[3] que vale a pena conferir!

[1] http://www.pathname.com/fhs/

[2] http://www.freestandards.org/en/LSB

[3] http://www.angusyoung.org/filesystem-hierarchy-standard/

Cultura GNU/Linux

Neste post, eu quero falar um pouco sobre um Sistema Operacional chamado GNU/Linux.

Quando falamos que o GNU/Linux é um Sistema Operacional, todo mundo já quer logo saber o que é.

E muitas vezes, prá facilitar o entendimento do povo, (ai ai ai… até eu já falei isso…) acabamos respondendo: “…é a mesma coisa que o Windows!”.

Mas ser somente “a mesma coisa que o Windows”, não explica o que é um Sistema Operacional; portanto, vamos descobrir o que é um Sistema Operacional…

Segundo o site Net Art, Sistema Operacional ou simplesmente SO, é um programa normalmente fornecido pelo fabricante para o controle e coordenação de todas as operações de um computador.

Isso quer dizer que o SO controla a quantidade de memória disponível, espaço em disco, usuários, processos, periféricos (monitor, teclado, mouse), além dos aplicativos que os usuários solicitam (navegador de Internet, editor de textos, etc).

Agora que já temos uma idéia do que é um SO, que tal saber por que o esse tal de GNU/Linux é tão comentado? 😉

Código Aberto x Código Fechado

Basicamente, o GNU/Linux promove tantas discussões com um fervor que chega às raias da Guerra Santa Virtual, por conta de Código Aberto x Código Fechado.

Todo programa de computador é criado através de códigos de programação. Porém, para que o programa possa ser usado pelo computador, o mesmo precisa ser ‘traduzido’ para uma linguagem que o computador entenda. Essa “tradução”, é conhecida como compilação.

A maioria dos programas são distribuídos já compilados, ou seja, o código antes legível pelo ser humano, torna-se incompreensível.

Um programa de código aberto, no entanto, é distribuído não só em linguagem de máquina, mas também na sua linguagem natural de programação, de forma que um desenvolvedor possa interpretar e aprender com ele ou interpretar e melhorar o código adicionando funcionalidades ou corrigindo erros.

Muitos desses programas são desenvolvidos por grandes comunidades online, de forma que a detecção e correção de falhas acontece muito rapidamente.

Com o Código Fechado, acontece o contrário. Os programas são distribuídos já compilados, e o desenvolvedor não tem acesso ao código na linguagem natural de programação. Assim caso o programa tenha alguma falha, depende do fabricante para corrigí-la e depois distribuir a correção.

E prá entender a importância da liberdade de acesso ao código, nada melhor do que saber que tudo começou justamente por conta de uma falha!

Richard Stalman trabalhava no MIT e desenvolveu um software para uma impressora. Quando faltasse papel na impressora, ou quando o papel enroscasse, o computador avisava o Richard, pois ele sentava longe da impressora.

Acontece que a Xerox era a empresa que fornecia a impressora e um software para administrar a mesma. Só que este software não fazia o que o Richard tinha desenvolvido. O MIT trocou todas as impressoras e com isso o programa do Richard não funcionava mais, pois a impressora já não era a mesma.

Então Richard pediu à Xerox para enviar o código fonte do Driver da Impressora, para que ele pudesse mudar o programa que ele criou e então este funcionar como já funcionava.

E como resposta ouviu um sonoro “Não”. =/

Foi neste momento que Richard percebeu que as empresas poderiam em um futuro próximo dominar todas as tecnologias e os humanos virarem escravos destas tecnologias.

Para evitar que as empresas detivessem os códigos, sem permitir que outros vissem os mesmos, Richard Stallman criou uma licença chamada GPL – General Public License.

Essa licença diz mais ou menos o seguinte: Qualquer software que for distribuído na Internet e tiver sob a licença GPL, deve ser livre e ter as 04 liberdades:

0. A liberdade de executar o programa, para qualquer propósito;
1. A liberdade de estudar como o programa funciona e adaptá-lo para as suas necessidades (liberdade nº 0). O acesso ao código-fonte é um pré-requisito para esta liberdade.
2. A liberdade de redistribuir cópias de modo que você possa ajudar ao seu próximo (liberdade nº 1).
3. A liberdade de aperfeiçoar o programa, e liberar os seus aperfeiçoamentos, de modo que toda a comunidade beneficie deles (liberdade nº 2). O acesso ao código-fonte é um pré-requisito para esta liberdade.

Nesse tempo, Richard começou um projeto de criação de um SO chamado GNU, um acrônimo para “Gnu is Not Unix”.

Infelizmente o projeto do Richard nunca terminava, pois o principal, que era o Kernel, o coração do SO não estava pronto.

Mas… no início dos anos 90, um jovem chamado Linus Torvalds começou a criar um sistema operacional de código aberto a partir do Minix, uma versão simples do Unix, que era utilizada pelo meio acadêmico.

O Minix era caro e possuía muitas limitações técnicas; sendo assim, Linus desenvolveu uma plataforma que, além de mais poderosa e flexível para vencer as limitações do Minix, também pudesse ser alterada livremente por qualquer pessoa interessada em melhorar ou adaptar o sistema operacional.

E ai, aconteceu “O chamado” 🙂

Para ser o sistema operacional preferido pelos servidores, a construção do GNU/Linux não foi o trabalho de apenas uma pessoa.

Linus queria saber se o sistema operacional que construiu, estava pronto para ser usado por outras pessoas ou não, além de querer saber o que as pessoas gostavam ou não no Minix, e pediu que enviassem dicas e sugestões de correções.

Sua mensagem:

“Você sente falta dos dias do Minix/1.1 quando homens eram homens e escreviam seus próprios drivers? Você está sem nenhum projeto legal e está ansioso para mexer num sistema operacional que você possa modificar para atender às suas necessidades?

Você está achando chato quando tudo funciona no minix? Não ficar mais a noite inteira tentando arrumar um programa legal?
Então, esta mensagem pode ser para você…”

Assim começou a construção de um sistema operacional criado de modo colaborativo, pois em agosto de 1991, Linus usou a Internet para distribuir o sistema que ele chamou de Linux; uma brincadeira que une o seu nome com Unix – Linus + Unix = Linux.

Ao distribuir o Linux acompanhado do de seu código fonte, Linus conquistou um grande número de colaboradores no mundo todo; assim o Linux recebeu e ainda recebe colaboração de uma extensa lista de interessados no desenvolvimento de uma plataforma aberta e cujo o código-fonte está a disposição de todos.

Nessa rede, incluem-se programadores independentes, institutos de pesquisa, universidades e muitas entidades privadas.

Concluindo essa pequena reflexão sobre o GNU/Linux, acabamos descobrindo que a criação de todo software depende de uma motivação especial ou deficiência de alguma ferramenta. Ao analisar programas que são baseados em Software Livre, percebemos que os mesmos foram criados por aqueles que não concordavam com um modelo de licenças totalmente fechado e que só beneficiava as grandes companhias.

Isso quer dizer que, ao utilizar uma licença proprietária, geralmente se acaba pagando uma quantia significativa para ter o “direito” de utilizar um determinado software.

Assim, aos poucos, projetos chamados “alternativos” começavam a surgir e nasceu o movimento do Software Livre, onde os programadores ganharam mais liberdade para criar e melhorar aquilo que já existia. O modelo de negócio proprietário começou a perder forças e, atualmente o software livre está presente cada vez mais nos computadores do mundo todo.

O GNU/Linux é um software livre que foi criado a partir das deficiências dos sistemas operacionais existentes na época; e mesmo agora que ganhou a atenção de grandes empresas está em constante melhoria.

Planejando o particionamento do HD

O que é particionar um HD?

Basicamente, particionar um disco é dividi-lo em pedaços. Quando compramos um HD, ele não está pronto para receber dados. Para que isso seja possível, devemos particionar o HD. E o particionamento deve ser feito mesmo que não se queira criar outras partições.
A partição será o local que irá receber o sistema de arquivos, que irá prover uma camada funcional para guardarmos nossos dados.

Tipos de partições

As partições podem ser de 3 tipos: primárias, estendida e lógicas.

Uma partição primária, é aquela que a informação está registrada na MBRMaster Boot Record e contém um sistema de arquivos. A MBR possui limitação de tamanho; assim, somente 4 partições primárias podem ser definidas nela.

No GNU/Linux, essas partições são mapeadas nos arquivos-dispositivos /dev/hda1 até o /dev/hda4.

A partição estendida é uma partição primária especial que pode conter mais partições dentro dela. Só pode existir uma partição estendida e ela deve ser uma das 4 partições primárias.
Essa partição não possui um sistema de arquivos. Ela é utilizada para guardar as partições lógicas.

A partição lógica então, nada mais é do que uma partição que se encontra dentro da partição estendida. Podem existir de uma a 12 partições lógicas dentro da estendida e elas são numerada de 5 a 16. No meu HD, existe o seguinte esquema: 3 partições primárias, a partição estendida e 5 lógicas:

/dev/hda1 – primária
/dev/hda2 – primária
/dev/hda3 – primária
/dev/hda5 – lógica
/dev/hda6 – lógica
/dev/hda7 – lógica
/dev/hda8 – lógica
/dev/hda9 – lógica

Ahn, e ai não aparece o /dev/hda4 pois está sendo utilizado pela partição estendida.

O particionamento depende muito da situação, ou melhor, do tipo de utilização que a máquina terá.

Lembram do post Estrutura de Diretórios no GNU/Linux? Lá comentamos sobre os diretórios… e agora que estamos falando sobre particionamento, vale dizer também que alguns diretórios que serão utilizados pelo sistema, não serão particionados: /bin, /sbin, /root, /dev, /lib, /proc, /media.

Por que particionar?

A utilidade de criar um partição separada para um determinado diretório, são duas:
1) Segurança
2) A partição fica independente do sistema.

Falando sobre hardware e depois comento com mais detalhes sobre isso quando escrever sobre dispositivos de bloco, o HD é o dispositivo /dev/hda.

No Windows, as partições recebem o nome de letras: C:, D, e por ai vai. No Linux, elas são nomeadas com o nome do dispositivo junto com o número da partição.

Por exemplo, hda1; onde o hda é o nome do dispositivo e o número 1 (não é o Big Mac!) indica o número da partição. Ah, e o /dev, é claro, é o diretório onde ficam armazenados os arquivos-dispositivos.

Quando estou instalando o meu GNU/Linux por exemplo e na hora da instalação defino que o /home seja uma partição separada, eu garanto que a partição terá um limite e que ela será independente do sistema.

E o limite será definido no tamanho do pedaço que eu dividi meu HD!

E o mundo pode pensar: “Mas o que isso tem a ver com segurança?”

Vamos falar de uma situação que aconteceu aqui em casa. Instalei o Linux e não separei o /home. Meus usuários (meus irmãos) muito legais comigo, começaram a baixar um monte de mp3 no home deles.

E o home, não tem limite, pois é apenas um diretório! Hummm… e não adianta perguntar “Mas não tem um programa de quotas no GNU/Linux?”

Sim, sim… existem quotas no GNU/Linux… mas elas serão aplicadas na partição! Então, faz todo sentido particionar para definir as quotas corretamente!

Bom, como estava falando… meus usuários começaram a baixar mp3… era aqui, era ali… e teve uma hora que o uso do meu HD chegou a 99%. Eu gravei um arquivo e o HD “foi-se”. 100% de uso.

Depois dessa situação, achei que tinha que colocar ordem na casa. Refiz a máquina e particionei o home. Ou seja, deixei ele independente do sistema. Assim, quando meus usuários começaram a gravar novamente as toneladas de mp3, a única coisa que aconteceu, foi lotar o /home e eles não puderam escrever mais nada nessa partição.

Claro que eles não ficaram felizes, mas não deixei de iniciar o sistema e fazer outras coisas só porque o home estava lotado 😉 !

E também apliquei quota, fiz mudanças… mas isso vai ser assunto para outro post!

Aqui no meu HD, existe o seguinte esquema de particionamento:

/boot – 100 M ==> primária
/ – 10 Gb ==> primária
swap – 256 M ==> primária
OBS.: A swap é uma memória virtual. Os dados são processados somente na memória RAM, pois ser mais rápida. Assim, se um programa está sendo executado na RAM e a mesma começar a encher, o GNU/Linux move automaticamente os dados que não estão sendo usados para a partição Swap e libera a memória RAM para a continuar carregando dados. Quando os dados movidos para a partição swap são solicitados, o GNU/Linux move os mesmos da swap para a RAM. Deixei aqui 256 Mb, pois minha máquina tem 1 Gb de RAM.
/usr – 15 Gb ==> lógica
/var – 5 Gb ==> lógica
/tmp – 2 Gb ==> lógica
/home – 15 Gb ==> lógica
/mnt – 10 Gb ==> lógica (Essa eu separei para os usuários colocarem os mp3’s…)

Essas são as partições do meu ambiente… ao particionar o seu HD, leve em conta qual aplicação a máquina terá 😉 !

Referências:
http://focalinux.cipsga.org.br/guia/inic_interm/ch-disc.html
http://pt.wikipedia.org/wiki/Parti%C3%A7%C3%A3o
http://brunotorres.net/particionamento-disco
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-ig-ppc-multi-pt_br-4/ap-partitions.html