Translate

terça-feira, 2 de outubro de 2012

Basic Unix Commands

http://www.youtube.com/watch?v=Ms5sNYyejEw

Configurando o terminal


terminal pode ser um terminal no sentido estrito do termo, conectado ao computador por uma linha serial, ou então o próprio console da máquina, ou uma aplicação como o xterm emulando um terminal dentro doXwindows,
A configuração do terminal é necessária para executar aplicativos como editores de texto visuais, ou para os comandos de teclado como backspace serem corretamente reconhecidos. Essa configuração envolve aconfiguração do driver do sistema, feita através do comando stty e o informe da aplicação, normalmente feito através da variável TERM. Vejamos exemplos de situações onde uma delas ou ambas são necessárias, e como realizá-la:

  1. Ao pressionar a tecla backspace, ao invés de ser apagado o caracter anterior, surge na tela os caracteres ``^H''. Solução:
    $ stty erase ^H
  2. Ao executar o more ou o vi, algumas linhas permanecem escondidas, ou o scroll comporta-se de forma errática. Solução: cheque quantas linhas (vamos supor: 24) e quantas colunas (vamos supor: 80) o seu terminal/emulador possui e execute
    $ stty rows 24 cols 80
  3. Após o uso de alguma aplicação, os caracteres aparecem trocados ou o eco deixou de funcionar, ou quando pressiono enter o cursor permanece na mesma linha. Tentativa de solução:
    $ stty sane
  4. Ao tentar executar uma aplicação, a mensagem de erro terminal capability cm required, ou Terminal type is not defined, ou Terminal type is not powerful enough, ou outra semelhante foi exibida. Solução: cheque o tipo de terminal que você está usando ou emulando (dificilmente será algo diferente de xterm ou vt100) e atribua para a variável de environment TERM esse valor.


Diretórios Principais do Sistema

No Unix não há o conceito de nomes de drives, como C:, mas todos os paths partem de uma raiz comum, o root directory ``/''. Quando a máquina possui vários discos diferentes (ou ao menos várias partições diferentes de um mesmo disco), cada uma delas em geral corresponderá a uma subárvore do filesystem, como /usr/var ou ainda nomes não standard como /disco2, que são chamados de seus pontos de montagem. O comandomount executado sem parâmetros listará os diferentes dispositivos físicos montados (discos locais e remotos e suas partições) e a subárvore correspondente a cada um deles. A tabela que indica todas essas montagens é o arquivo /etc/fstab. Apesar de algumas pequenas diferenças de plataforma para plataforma, os diretórios principais do sistema são:
/bin
/sbin
/etc
/home
/lib
/proc
/tmp
/usr
Binários básicos, como sh e ls.
Binários básicos de administração do sistema.
Arquivos de configuração do sistema e scripts de boot.
Os diretórios dos usuários residem aqui.
Bibliotecas básicas.
Estado corrente do sistema e dos processos.
Arquivos temporários.
Demais binários e bibliotecas.

O termo básico aplicado acima aos diretórios /bin e /lib quer significar principalmente essenciais para o boot e operação mínima do sistema. A separação desses elementos básicos, em contraposição aos que são deixados no /usr, deve-se a razões práticas, principalmente para facilitar a organização de redes de máquinas compartilhando subárvores de diretório. De fato, é comum que o diretório /usr ao invés de estar replicado em todas as máquina da rede esteja residindo fisicamente num único disco, e sendo compartilhado por todas as máquinas.


Atributos e Nomes de Arquivos

No Unix cada arquivo (inclusive diretórios, que são casos particulares de arquivos), conta com um conjunto de atributos de leitura, escrita e execução, que são setáveis através do comando chmod, e podem ser exibidos pelo comando ls -l:

$ ls -l /bin/cat
-rwxr-xr-x   1 root     root        16584 Dec 16 20:09 /bin/cat
string -rwxr-xr-x representa os atributos do arquivo /bin/cat. O primeiro caracter (-) significa que se trata de um arquivo regular, em contraposição aos diretórios (d), device special files (c) e links simbólicos (l). Os 9 caracteres restantes informam as permissões de leituraescrita e execução desse arquivo relativas ao seu proprietário, ao seu grupo, e a todos os demais. O proprietário e o grupo são informados logo à direita, e no caso são o usuário root e o grupo root.
Note que no Unix não existem os atributos de arquivo oculto ("hidden") e do sistema ("system"), suportados no MS-DOS. Não obstante, arquivos cujo primeiro caractere é ponto (".") normalmente são omitidos pelo ls, a não ser que se utilize a opção -a (de "all"), conforme comentamos no início.
Um atributo importantíssimo existente no Unix é o chamado setuid, através do qual um processo adquire ao ser executado os privilégios do owner do arquivo. Isso é frequentemente utilizado por programas que são disparados por usuários não privilegiados mas que por algum motivo necessitam dos privilégios do superusuário, por exemplo:

  $ ls -l /usr/sbin/pppd
  -rwsr-xr-x  1 root   bin   104876  Apr 27  1998 /usr/sbin/pppd
Sem os privilégios de superusuário, um usuário comum não conseguiria configurar a interface ppp e nem alterar a tabela de rotas do sistema, no momento em que se conecta ao provedor Internet. Assim, opppd, ao ser executado, requisitará os privilégios do owner do arquivo, que no caso é o superusuário, e dessa forma ele poderá realizar essas operações.
No Unix via de regra são suportados nomes ``longos'' (até 64 ou às vezes até 256 caracteres), e o ``.'' não é um separador entre o nome do arquivo e sua extensão, mas um caracter como os outros. Não obstante, a noção de ``sufixo'' é utilizada informalmente para facilitar a identificação de alguns formatos de arquivos, por exemplo:
.tar
.zip
.Z
.gz
Archive produzido com tar
Archive comprimido produzido com zip
Arquivo comprimido com compress
Arquivo comprimido com gzip

Archives (o termo não tem correspondente em português) são concatenações de vários arquivos ou de subárvores inteiras num único arquivo. Em Unix, tipicamente são produzidos com tar:

$ tar cvf /tmp/etc.tar /etc
$ tar tvf /tmp/etc.tar /etc
$ cd  /tmp; tar xvf etc.tar
O primeiro comando irá criar o archive /tmp/etc.tar, composto por toda a subárvore /etc. O segundo exibirá o conteúdo desse archive. O terceiro irá extrair todo o seu conteúdo dentro do diretório /tmp, ou seja, recriará aquela mesma subárvore como uma subárvore do diretório /tmp.


Intercambiando Disquetes com o MS-DOS

Via de regra as plataformas Unix-like oferecem ferramentas para lidar com disquetes ``formatados'' no MS-DOS (ou, mais precisamente, disquetes que usam FAT). Um set de ferramentas bastante popular é o mtools, que oferece clones das ferramentas do MS-DOS. Exemplos de uso:
$ mformat a:
$ mcopy a:relat.txt .
$ mdir a:
Versões recentes dessas ferramentas lidam também com o VFAT do Windows 95, que permite nomes de arquivos ``longos''.O intercâmbio de arquivos texto entre Unix e MS-DOS deve ser feito com cuidado. Por herança das antigas impressoras, o fim-de-linha no MS_DOS é codificado através de dois caracteres (CR e LF), enquanto no Unix há apenas um (o LF), além do que o final do arquivo é sinalizado no MS-DOS por um CTRL-Z. O mcopy possui a opção -t para realizar essas conversões quando copia de ou para disquetes.

Comandos Unix Parte II


Shell Scripts

Seqüências de comandos que se necessita repetir com grande frqüência podem ser colocados num arquivo que, ao ser ``executado'', ocasiona o disparo de cada um dos comandos da seqüência, na ordem indicada. Um arquivo desses é um shell script, cujo equivalente no MS-DOS são os arquivos ``.BAT''.
Mesmo que nunca se escreva nenhum, com certa freqüência é necessário analisar shell scripts a fim de elucidar o modo de uso de determinados comandos, ou de realizar diagnósticos. Suponhamos por exemplo que você não se lembre como usar um comando chamado xpatgen, mas esteja com um shell num diretório que contém scripts, que usam entre outros o xpatgen. Basta então buscar ocorrências dele nos scripts:

$ grep xpatgen *
patgen: xpatgen -cal_bl
Com isso sabemos que o script patgen executa o xpatgen, e relembramos o modo de executar esse comando, o que talvez já seja suficiente para a necessidade do momento.
Shell scripts utilizam com freqüência de variáveis de environment e de parâmetros de linha de comando. Assim, se ao analisar um script você se deparar com algo como $HOST, lembre-se de que nesse ponto será substituído o valor da variável HOST, e que $1 significa o primeiro parâmetro da linha de comandos$2 o segundo, e assim por diante.


Variáveis de Environment

Além dos parâmetros de linha de comandos como -l ou outros, pode-se também passar parâmetros a um programa através do uso de variáveis de environment. As mais comuns são:

  • PATH - Lista os diretórios (separados por ``:'') onde os executáveis serão procurados, tipicamente /bin/usr/bin e /usr/X11/bin, entre outros.
  • TERM - Tipo do terminal, por exemplo xterm ou vt100 (veja Configurando o Terminal).
  • DISPLAY - Display default para as aplicações Xwindows.
Para exibir o valor de uma delas pode-se usar echo, antepondo o operador $ ao nome da variável, por exemplo:

$ echo $TERM
Existem dois estilos de atribuição de valores a variáveis de environment, o do Bourne shell, usado pelo shksh e bash:

$ TERM=vt100; export TERM
e o do C shell, usado pelo csh e pelo tcsh:
% setenv TERM vt100


Uso de Metacaracteres

O metacaracter mais utilizado provavelmente é o ``*''. Por exemplo,

$ rm *
irá remover todos os arquivos do diretório corrente. É necessário prestar atenção a dois detalhes quando se usa metacaracteres:

  1. O caracter ``.'' não tem o significado de separador entre nome e sufixo que possui no MS-DOS, por isso ``*.*'' significa todos os arquivos em cujo nome ocorre ao menos um ponto.
  2. A expansão do metacaracter é feita pelo shell, e não pela aplicação, por isso o comando
    $ mv *.txt *.bak
    não irá surtir o efeito esperado de renomear todos os arquivos que terminam com ``.txt'' para ``.bak'' (para essa operação deve-se usar o comando for).
Os shells Unix aceitam também o metacaracter ``?'', que significa qualquer caracter e tambem intervalos, como [0-9] (qualquer dígito decimal), entre outros.

Uso de Expressões Regulares

Aplicativos Unix via de regra aceitam expressões regulares como argumentos de busca. Os usos mais freqüentes delas são bem ilustrados através do aplicativo grep. Nos casos abaixo ele será utilizado para buscar uma dada expressão em todos os arquivos do diretório corrente:

  1. Busca de ocorrências de algum dos anos da década de 80:
    $ grep "198[0-9]" * 
  2. Busca de uma ocorrência da palavra "yellow" seguida de uma ocorrência da palavra "page", separadas por zero ou mais caracteres quaisquer:
    $ grep -i "yellow.*page" * 
  3. Busca de uma das palavras "roget" ou "thesaurus":
    $ grep -i "roget\|thesaurus" * 
A sintaxe das expressões regulares pode variar um pouco, dependendo da plataforma e da ferramenta. Via de regra as diferenças consistem em proteger-se ou não alguns caracteres especiais, e nas extensões que algumas ferramentas introduzem. Note por exemplo, o uso do egrep, em comparação com o uso do grep acima:

$ egrep -i "roget|thesaurus" * 
Via de regra todas as ferramentas Unix que lidam com texto, como o more, o sed, e o vi, entre outros, aceitam expressões regulares como argumento de buscas.


Manipulando processos

Um processo é um programa em execução. Num computador que possui apenas uma cpu, na verdade apenas um processo pode estar sendo executado em cada instante. O que se faz é executar um processo durante uma fração fixa de segundo, congelá-lo e passar a executar um outro, e assim por diante, criando a ilusão de simultaneidade.
Através do comando ps pode-se examinar os processos correntes. Por exemplo:

$ ps
PID TTY STAT  TIME COMMAND
 45 v02 S     0:00 -bash
105 v02 R     0:00 ps
ps em geral omite muitos processos a fim de exibir uma saída limpa. Através das opções a e x (ou e no Solaris), pode-se exibir todos os processos correntes. O número de um processo é usado, por exemplo quando é necessário interromper prematuramente a sua execução, através do comando kill.
A finalidade primária do comando kill não é matar um processo, mas enviar um sinal para ele. O Unix possui diversos sinais predefinidos, como SIGHUP, SIGPIPE, SIGTERM, etc. O atendimento a um sinal entretanto é responsabilidade do processo, ou do programador que fez o programa, e por isso a forma com que cada processo reagirá a cada sinal poderá variar. A fim de se interromper a execução de um processo, deve-se enviar para ele o sinal SIGKILL:

 $ kill -SIGKILL 45
 $ kill -9 45
As duas formas acima em geral são equivalentes (o número associado a cada sinal pode variar com a plataforma).
O caracter ``&'' colocado ao final da linha de comandos instrui o shell para disparar o comando em background, a fim de que se possa continuar usando o shell mesmo antes desse comando encerrar a sua execução.
O comando nice faz com que um processo seja disparado com baixa prioridade.

 $ nice gzip -9 *
O comando nohup faz com que o processo sendo disparado se torne imune ao sinal SIGHUP. Em combinação com o &, ele permite o disparo de programas que permanecerão em execução mesmo após o logout do usuário. Exemplos:

 $ nohup gzip -9 * &
Através do comando at pode-se programar a execução de um comando para um horário determinado. Por exemplo:

 $ at now + 1 minute
 ls
 ctrl-d
O comando ls será dessa forma executado daqui a um minuto. Note que na linha seguinte do comando at o que se escreve é na verdade um shell script, terminado com control-d. Ao invés de digitá-lo, poder-se-ia lê-lo de um arquivo através do redirecionamento da entrada:

 $ at now + 1 minute <meuscript 
A execução periódica de um comando se faz através do cron, que é disparado no boot do sistema e monitora as tabelas de execução periódica de comandos de todos os usuários (a cada usuário corresponde uma tabela). Uma tal tabela é chamada crontab. Através dela pode-se especificar que um comando seja executado a cada hora, ou diariamente, ou semanalmente, etc. A edição, inspeção e remoção da crontab de um usuário é feita através do comando crontab, e opções -e-l e -d. Cada linha da crontab indica um comando e a periodicidade com que ele deve ser executado (minutos, horas, dias do mês, meses e dias da semana). Por exemplo:
 $ crontab -l
 40 07 * * * updatedb
 0 22 5 * * pagamento
 0 6,12,15,18 * * * fetch
 0 0 * * 6 backup
No caso a crontab contém três comandos. O updatedb deverá ser executado todos os dias às 7:40. O comando pagamento deverá ser executado às 22:00 do dia 5 de cada mês, e o backup será executado à zero hora de cada sábado.
Note que a crontab é um arquivo texto simples, e quando se executa o comando crontab com a opção -e, entra-se num editor de textos para editá-la. O editor de textos utilizado normalmente será o vi, ou aquele especificado na variável de environment EDITOR.

Unix: Conceitos e Comandos Básicos


Ligando e Desligando a Máquina

Salvo orientação específica do hardware em uso, ligar uma máquina Unix não costuma envolver maiores detalhes do que o acionamento de um botão liga/desliga no console da máquina e uma eventual intervenção humana logo em seguida, solicitando o boot efetivo do sistema a partir de um menu de opções.O boot costuma gerar uma razoável quantidade de mensagens que aparecem no console da máquina. Normalmente elas referem-se aos diferentes estágios do reconhecimento e inicialização do hardware. É interessante conhecê-las, não obstante, salvo contingências, podem ser ignoradas até que surja o prompt ou a janela de login.
O desligamento é um processo mais delicado. O Unix utiliza parte da memória principal como cache de disco, a fim de acelerar as operações de leitura e gravação de arquivos. Antes de se desligar a máquina, é necessário assegurar que os discos estejam sincronizados com o cache, o que é feito pelo comando sync, que deve ser precedido do encerramento de todos os processos, a fim de que não ocorra uma dessincronização em seguida. Todos esses passos são tomados pelo comando shutdown:

$ shutdown -y -g 1 -i 5   (Solaris)
$ shutdown -h now         (Linux)
Em sistemas baseados em PC, o shutdown por vezes é acionável através do ctrl-alt-del.

Manipulando arquivos e diretórios

shell é o programa que lê e executa os comandos que você passa a digitar logo após logar no sistema, como cd ou ls. Via de regra você estará usando o Bourne shell (sh), ou o C shell (csh), ou aperfeiçoamentos desses, como o Korn shell (ksh) ou o Bourne again shell (bash). Via de regra você poderá descobrir qual deles está usando ao executar um ps ou um finger com o seu username com argumento.
Obsoleta ou não, a interface de linha de comandos possui características ainda não suficientemente reproduzidas nas interfaces gráficas, como a possibilidade de uso remoto com baixa banda, e a programabilidade. No caso do Unix, há ainda a vantagem dela estar melhor estandardizada que as interfaces gráficas. Em boa parte dessas notas estaremos nos referindo à interface de linha de comandos, mas abordaremos também a interface gráfica ao final. Vejamos alguns típicos comandos dos sistemas Unix-like:

  • cat [-r] arquivo1 arquivo2 ... 
    Concatena os vários arquivos, na ordem especificada, copiando o resultado para a saída padrão. Se não houver argumentos, copia a entrada padrão para a saída padrão.
  • cd diretório
    Troca o diretório corrente para o diretório especificado, ou para o diretório home, se não houver argumento.
  • cp [-r] argumento1 argumento2 ... 
    Copia um ou mais arquivos, trocando seu nome ou criando a cópia num outro diretório, conforme a quantidade e o tipo dos argumentos. Se o primeiro argumento for um diretório, faz uma cópia recursiva de toda a subárvore iniciada nele, desde que a opção -r (recursive) tiver sido especificada.
  • chmod nnn argumento1 argumento2 ... 
    Troca os atributos do(s) argumento(s) para nnn (veja atributos de arquivos). Ao invés de nnn, a alteração pode ser especificada por exemplo como a+r ou g-w (ag e o significam allgroup e owner+ significaadicionar e - removerr,wx e s indicam respectivamente atributos de leitura, escrita, execução e setuid).
  • ls [-la] diretório1 diretório2 ... 
    Lista o conteúdo do(s) diretório(s) especificado(s), ou do diretório corrente se não houver argumento. Opções principais:
    -a Inclui arquivos com nome iniciado por ``.'' (tais arquivos normalmente armazenam configurações de aplicativos).
    -l Formato longo (veja atributos de arquivos).
  • ln -s argumento1 argumento2 
    Cria um link simbólico cujo nome é o primeiro argumento, apontando para o segundo argumento. A opção -s não pode ser omitida, ou o link criado será um hard link, ao invés de simbólico.
  • man [-k] nome 
    Invoca a man-page associada ao nome, ou exibe uma lista das man pages associadas ao nome, no caso da opção -k (de key) ter sido especificada.
    As man pages Unix são referências técnicas sumárias por vezes difíceis de compreender. Elas são exibidas através do more ou de algum outro paginador semelhante, por isso os comandos do more indicados mais adiante valem para a leitura de man pages, e são úteis para ajudar a localizar informações dentro de uma man page.
    As man pages são divididas em seções, que tradicionalmente são referidas através de parênteses. Por exemplo, a man page shutdown(2) é a man page do system call chamado shutdown, ao passo que a man pageshutdown(8) é a man page do comando administrativo shutdown. Além dessas, a seção 1 contém manuais de comandos comuns, a 3 contém manuais de serviços de bibliotecas, a 4 descreve device special files, a 5 descreve formatos de arquivos de configuração, a 6 os jogos eventualmente instalados, e a 7 contém tudo o mais que não couber nas anteriores.
  • mkdir diretório1 diretório2 ... 
    Cria os diretório(s) especificado(s).
  • more arquivo 
    Exibe de forma paginada o arquivo especificado, ou a entrada padrão no caso de não haver argumento. Aceita vários comandos, entre eles
    ESPAÇOC-b
    /
    ?
    Avança/recua uma página.
    Busca.
    Exibe relação de comandos.

  • mv argumento1 argumento2
    Renomeia o primeiro argumento, que pode ser um arquivo ou um diretório, para o nome dado como segundo argumento. Se ao tentar executar esse comando a mensagem de erro cannot move across filesystemsfor exibida, é porque a origem e o destino estão em filesystems diferentes. Nesse caso deve-se copiar a origem para o destino usando cp, e depois remover a origem com rm.
  • rm [-r] argumento1 argumento2 ... 
    Remove os arquivo(s) especificado(s). Se um argumento for um diretório, remove toda a subárvore iniciada nele, desde que a opção -r (recursive) tenha sido especificada. Via de regra não há modo em sistemas Unix-like de recuperar (undelete) um arquivo removido.
  • rmdir diretório1 diretório2 ... 
    Remove os diretório(s) especificado(s), desde que estejam vazios.
  • vi arquivo 
    vi é uma ferramenta obsoleta, mas está está presente em virtualmente qualquerr plataforma Unix-like, e constitui por vezes a única alternativa para edição de arquivos, por isso convém conhecê-lo ao menos de forma minimal. No uso quotidiano, entretanto, normalmente preferir-se-á outras ferramentas, como o emacs ou o pico ou outras.
    hjkl
    C-f,C-b
    x,X
    [n]dd
    i,ESC
    a,A
    J
    :
    cursor para esquerda/baixo/cima/direita.
    Página seguinte/anterior.
    Remove caracter atual/anterior.
    Remove n linhas (default 1).
    Entra/sai do modo inserção.
    Insere após caracter atual/final da linha.
    Concatena linha seguinte à atual.
    entra comando, entre eles w (salva), q (sair) e / (busca).

  • wc arquivo1 arquivo2 ... 
    Obtém o total de linhas, palavras e caracteres de cada um dos arquivos estipulados, ou da entrada padrão no caso de não haver argumentos.

Estrutura Unix


Um sistema Unix consiste, basicamente, de duas partes:
  • Núcleo - o núcleo do sistema operacional, a parte que relaciona-se diretamente com o hardware, e que executa num espaço de memória privilegiado. Agenda processos, gerencia a memória, controla o acesso a arquivos e a dispositivos de hardware (estes, por meio dos controladores de dispositivo - drivers - e interrupções). O acesso ao núcleo é feito por chamadas de sistema, que são funções fornecidas pelo núcleo; essas funções são disponibilizadas para as aplicações por bibliotecas de sistema C (libc).
  • Programas de sistema - são aplicações, que executam em espaços de memória não privilegiados, e que fazem a interface entre o usuário e o núcleo. Consistem, principalmente, de:
  • Conjunto de bibliotecas C (libc)
  • Shell - um ambiente que permite que o usuário digite comandos.
  • Programas utilitários diversos - são programas usados para manipular arquivos, controlar processos, etc.
  • Ambiente gráfico (GUI) graphics user interface - eventualmente utiliza-se também um ambiente gráfico para facilitar a interação do usuário com o sistema.
Em um sistema Unix, o espaço de memória utilizado pelo núcleo é denominado espaço do núcleo ou supervisor (em inglêskernel space); a área de memória para os outros programas é denominada espaço do usuário (user space). Essa separação é um mecanismo de proteção que impede que programas comuns interfiram com o sistema operacional.

[editar]Processos

Um processo, na visão mais simples, é uma instância de um programa em execução. Um programa, para ser executado, deve ser carregado em memória; a área de memória utilizada é dividida em três partes: código (text), dados inicializados (data) e pilha (stack).
Por ser um sistema multitarefa, o Unix utiliza uma estrutura chamada tabela de processos, que contém informações sobre cada processo, tais como: identificação do processo (PID), dono, área de memória utilizada, estado (status). Apenas um processo pode ocupar o processador em cada instante - o processo encontra-se no estado "executando" (running). Os outros processos podem estar "prontos" (ready), aguardando na fila de processos, ou então estão "dormindo" (asleep), esperando alguma condição que permita sua execução.
Um processo em execução pode ser retirado do processador por duas razões: (i) necessita acessar algum recurso, fazendo uma chamada de sistema - neste caso, após sua retirada do processador, seu estado será alterado para "dormindo", até que o recurso seja liberado pelo núcleo; (ii) o núcleo pode interromper o processo (preempção) - neste caso, o processo irá para a fila de processos (estado "pronto"), aguardando nova oportunidade para executar - ou porque a fatia de tempo esgotou-se, ou porque o núcleo necessita realizar alguma tarefa.
Existem quatro chamadas de sistema principais associadas a processos: forkexecexit e waitfork é usada para criar um novo processo, que irá executar o mesmo código (programa) do programa chamador (processo-pai); exec irá determinar o código a ser executado pelo processo chamado (processo-filho); exit termina o processo; wait faz a sincronização entre a finalização do processo-filho e o processo-pai.

[editar]Sistema de arquivos

Sistema de arquivos é uma estrutura lógica que possibilita o armazenamento e recuperação de arquivos. No Unix, arquivos são contidos em diretórios (ou pastas), os quais são conectados em uma árvore que começa no diretório raiz (designado por /). Mesmo os arquivos que se encontram em dispositivos de armazenamento diferentes (discos rígidos, disquetes, CDs, DVDs, sistemas de arquivos em rede) precisam ser conectados à árvore para que seu conteúdo possa ser acessado. Cada dispositivo de armazenamento possui a sua própria árvore de diretórios.
O processo de conectar a árvore de diretórios de um dispositivo de armazenamento à árvore de diretórios raiz é chamado de "montar dispositivo de armazenamento" (montagem) e é realizada por meio do comando mount. A montagem associa o dispositivo a um subdiretório.

[editar]Estrutura de diretórios

A árvore de diretórios do Unix é dividida em várias ramificações menores e pode variar de uma versão para outra. Os diretórios mais comuns são os seguintes:
/ — Diretório raiz - este é o diretório principal do sistema. Dentro dele estão todos os diretórios do sistema.
/bin — Contém arquivos, programas do sistema, que são usados com freqüência pelos usuários.
/boot — Contém arquivos necessários para a inicialização do sistema.
/dev — Contém arquivos usados para acessar dispositivos (periféricos) existentes no computador.
/etc — Arquivos de configuração de seu computador local.
/home — Diretórios contendo os arquivos dos usuários.
/lib — Bibliotecas compartilhadas pelos programas do sistema e módulos do núcleo.
/mnt — Diretório de montagem de dispositivos.
/mnt/cdrom — Subdiretório onde são montados os CDs. Após a montagem, o conteúdo do CD se encontrará dentro deste diretório.
/mnt/floppy — Subdiretório onde são montados os disquetes. Após a montagem, o conteúdo do disquete se encontrará dentro deste diretório.
/proc — Sistema de arquivos do núcleo. Este diretório não existe, ele é colocado lá pelo núcleo e usado por diversos programas.
/root — Diretório do usuário root.
/sbin — Diretório de programas usados pelo superusuário (root) para administração e controle do funcionamento do sistema.
/tmp — Diretório para armazenamento de arquivos temporários criados por programas.
/usr — Contém maior parte de seus programas. Normalmente acessível somente como leitura.
/var — Contém maior parte dos arquivos que são gravados com freqüência pelos programas do sistema.

Estrutura Unix


Um sistema Unix consiste, basicamente, de duas partes:
  • Núcleo - o núcleo do sistema operacional, a parte que relaciona-se diretamente com o hardware, e que executa num espaço de memória privilegiado. Agenda processos, gerencia a memória, controla o acesso a arquivos e a dispositivos de hardware (estes, por meio dos controladores de dispositivo - drivers - e interrupções). O acesso ao núcleo é feito por chamadas de sistema, que são funções fornecidas pelo núcleo; essas funções são disponibilizadas para as aplicações por bibliotecas de sistema C (libc).
  • Programas de sistema - são aplicações, que executam em espaços de memória não privilegiados, e que fazem a interface entre o usuário e o núcleo. Consistem, principalmente, de:
  • Conjunto de bibliotecas C (libc)
  • Shell - um ambiente que permite que o usuário digite comandos.
  • Programas utilitários diversos - são programas usados para manipular arquivos, controlar processos, etc.
  • Ambiente gráfico (GUI) graphics user interface - eventualmente utiliza-se também um ambiente gráfico para facilitar a interação do usuário com o sistema.
Em um sistema Unix, o espaço de memória utilizado pelo núcleo é denominado espaço do núcleo ou supervisor (em inglêskernel space); a área de memória para os outros programas é denominada espaço do usuário (user space). Essa separação é um mecanismo de proteção que impede que programas comuns interfiram com o sistema operacional.

[editar]Processos

Um processo, na visão mais simples, é uma instância de um programa em execução. Um programa, para ser executado, deve ser carregado em memória; a área de memória utilizada é dividida em três partes: código (text), dados inicializados (data) e pilha (stack).
Por ser um sistema multitarefa, o Unix utiliza uma estrutura chamada tabela de processos, que contém informações sobre cada processo, tais como: identificação do processo (PID), dono, área de memória utilizada, estado (status). Apenas um processo pode ocupar o processador em cada instante - o processo encontra-se no estado "executando" (running). Os outros processos podem estar "prontos" (ready), aguardando na fila de processos, ou então estão "dormindo" (asleep), esperando alguma condição que permita sua execução.
Um processo em execução pode ser retirado do processador por duas razões: (i) necessita acessar algum recurso, fazendo uma chamada de sistema - neste caso, após sua retirada do processador, seu estado será alterado para "dormindo", até que o recurso seja liberado pelo núcleo; (ii) o núcleo pode interromper o processo (preempção) - neste caso, o processo irá para a fila de processos (estado "pronto"), aguardando nova oportunidade para executar - ou porque a fatia de tempo esgotou-se, ou porque o núcleo necessita realizar alguma tarefa.
Existem quatro chamadas de sistema principais associadas a processos: forkexecexit e waitfork é usada para criar um novo processo, que irá executar o mesmo código (programa) do programa chamador (processo-pai); exec irá determinar o código a ser executado pelo processo chamado (processo-filho); exit termina o processo; wait faz a sincronização entre a finalização do processo-filho e o processo-pai.

[editar]Sistema de arquivos

Sistema de arquivos é uma estrutura lógica que possibilita o armazenamento e recuperação de arquivos. No Unix, arquivos são contidos em diretórios (ou pastas), os quais são conectados em uma árvore que começa no diretório raiz (designado por /). Mesmo os arquivos que se encontram em dispositivos de armazenamento diferentes (discos rígidos, disquetes, CDs, DVDs, sistemas de arquivos em rede) precisam ser conectados à árvore para que seu conteúdo possa ser acessado. Cada dispositivo de armazenamento possui a sua própria árvore de diretórios.
O processo de conectar a árvore de diretórios de um dispositivo de armazenamento à árvore de diretórios raiz é chamado de "montar dispositivo de armazenamento" (montagem) e é realizada por meio do comando mount. A montagem associa o dispositivo a um subdiretório.

[editar]Estrutura de diretórios

A árvore de diretórios do Unix é dividida em várias ramificações menores e pode variar de uma versão para outra. Os diretórios mais comuns são os seguintes:
/ — Diretório raiz - este é o diretório principal do sistema. Dentro dele estão todos os diretórios do sistema.
/bin — Contém arquivos, programas do sistema, que são usados com freqüência pelos usuários.
/boot — Contém arquivos necessários para a inicialização do sistema.
/dev — Contém arquivos usados para acessar dispositivos (periféricos) existentes no computador.
/etc — Arquivos de configuração de seu computador local.
/home — Diretórios contendo os arquivos dos usuários.
/lib — Bibliotecas compartilhadas pelos programas do sistema e módulos do núcleo.
/mnt — Diretório de montagem de dispositivos.
/mnt/cdrom — Subdiretório onde são montados os CDs. Após a montagem, o conteúdo do CD se encontrará dentro deste diretório.
/mnt/floppy — Subdiretório onde são montados os disquetes. Após a montagem, o conteúdo do disquete se encontrará dentro deste diretório.
/proc — Sistema de arquivos do núcleo. Este diretório não existe, ele é colocado lá pelo núcleo e usado por diversos programas.
/root — Diretório do usuário root.
/sbin — Diretório de programas usados pelo superusuário (root) para administração e controle do funcionamento do sistema.
/tmp — Diretório para armazenamento de arquivos temporários criados por programas.
/usr — Contém maior parte de seus programas. Normalmente acessível somente como leitura.
/var — Contém maior parte dos arquivos que são gravados com freqüência pelos programas do sistema.

Kernel Unix


This set of tutorials aims to take you through programming a simple UNIX-clone operating system for the x86 architecture. The tutorial uses C as the language of choice, with liberally mixed in bits of assembler. The aim is to talk you through the design and implementation decisions in making an operating system. The OS we make is monolithic in design (drivers are loaded through kernel-mode modules as opposed to user-mode programs), as this is simpler.
This set of tutorials is very practical in nature. The theory is given in every section, but the majority of the tutorial deals with getting dirty and implementing the abstract ideas and mechanisms discussed everywhere. It is important to note that the kernel implemented is a teaching kernel. I know that the algorithms used are not the most space efficient or optimal. They normally are chosen for their simplicity and ease of understanding.The aim of this is to get you into the correct mindset, and to give you a grounding upon which you can work. The kernel given is extensible, and good algorithms can easily be plugged in.If you have problems with the theory, there are plenty of sites that would be delighted to help you (most questions on OSDev forums are concerned with implementation - "My gets function doesn't work! help!" - A theory question is a breath of fresh air to many ;) ). Links can be found at the bottom of the page.

Unix Tutorial


http://www.youtube.com/watch?v=v4YpWACs6Ts

UNIX Introduction


UNIX is an operating system which was first developed in the 1960s, and has been under constant development ever since. By operating system, we mean the suite of programs which make the computer work. It is a stable, multi-user, multi-tasking system for servers, desktops and laptops.
UNIX systems also have a graphical user interface (GUI) similar to Microsoft Windows which provides an easy to use environment. However, knowledge of UNIX is required for operations which aren't covered by a graphical program, or for when there is no windows interface available, for example, in a telnet session.There are many different versions of UNIX, although they share common similarities. The most popular varieties of UNIX are Sun Solaris, GNU/Linux, and MacOS X.Here in the School, we use Solaris on our servers and workstations, and Fedora Linux on the servers and desktop PCs.
The UNIX operating system is made up of three parts; the kernel, the shell and the programs.
http://www.youtube.com/watch?v=7FjX7r5icV8

Historia do unix

Em 1965 formou-se um grupo de programadores, incluindo Ken Thompson, Dennis Ritchie, Douglas McIlroy e Peter Weiner, num esforço conjunto da AT&T (Laboratórios Bell), da General Electric (GE) e do MIT (Massachussets Institute of Technology) para o desenvolvimento de um sistema operacional chamado Multics.
 
Linha do tempo dos variantes do Unix.
 
 
O Multics deveria ser um sistema de tempo compartilhado para uma grande comunidade de usuários. Entretanto, os recursos computacionais disponíveis à época, particularmente os do computador utilizado, um GE 645, revelaram-se insuficientes para as pretensões do projeto. Em 1969, a Bell retirou-se do projeto. Duas razões principais foram citadas para explicar a sua saída. Primeira: três instituições com objetivos díspares dificilmente alcançariam uma solução satisfatória para cada uma delas (o MIT fazia pesquisa, AT&T monopolizava os serviços de telefonia americanos e a GE queria vender computadores). A segunda razão é que os participantes sofriam da síndrome do segundo projeto e, por isso, queriam incluir no Multics tudo que tinha sido excluído dos sistemas experimentais até então desenvolvidos.
Ainda em 1969, Ken Thompson, usando um ocioso computador PDP-7, começou a reescrever o Multics num conceito menos ambicioso, batizado de Unics, usando linguagem de montagem (assembly). Mais tarde, Brian Kernighan rebatizou o novo sistema de Unix.
Um marco importante foi estabelecido em 1973, quando Dennis Ritchie e Ken Thompson reescreveram o Unix, usando a linguagem C, para um computador PDP-11. A linguagem C havia sido desenvolvida por Ritchie para substituir e superar as limitações da linguagem B, desenvolvida por Thompson. O seu uso é considerado uma das principais razões para a rápida difusão do Unix.
Finalmente, ao longo dos anos 70 e 80 foram sendo desenvolvidas as primeiras distribuições de grande dimensão como os sistemas BSD (na Universidade de Berkeley na Califórnia) e os System III e System V (nos Bell Labs).
Em 1977, a AT&T começou a fornecer o Unix para instituições comerciais. A abertura do mercado comercial para o Unix deve muito a Peter Weiner - cientista de Yale e fundador da Interactive System Corporation. Weiner conseguiu da AT&T, então já desnudada de seu monopólio nas comunicações e liberada para atuação no mercado de software, licença para transportar e comercializar o Unix para o computador Interdata 8/32 para ambiente de automação de escritório. O Unix saía da linha das máquinas PDP, da Digital Equipament Corporation (DEC), demonstrando a relativa facilidade de migração (transporte) para outros computadores, e que, em parte, deveu-se ao uso da linguagem C. O sucesso da Interactive de Weiner com seu produto provou que o Unix era vendável e encorajou outros fabricantes a seguirem o mesmo curso. Iniciava-se a abertura do chamado mercado Unix.
Com a crescente oferta de microcomputadores, outras empresas transportaram o Unix para novas máquinas. Devido à disponibilidade dos fontes do Unix e à sua simplicidade, muitos fabricantes alteraram o sistema, gerando variantes personalizadas a partir do Unix básico licenciado pela AT&T. De 1977 a 1981, a AT&T integrou muitas variantes no primeiro sistema Unix comercial chamado de System III. Em 1983, após acrescentar vários melhoramentos ao System III, a AT&T apresentava o novo Unix comercial, agora chamado de System V. Hoje, o Unix System V é o padrão internacional de fato no mercado Unix, constando das licitações de compra de equipamentos de grandes clientes na América, Europa e Ásia.
Atualmente, Unix (ou *nix) é o nome dado a uma grande família de Sistemas Operativos que partilham muitos dos conceitos dos Sistemas Unix originais, sendo todos eles desenvolvidos em torno de padrões como o POSIX (Portable Operating System Interface) e outros. Alguns dos Sistemas Operativos derivados do Unix são: BSD (FreeBSD, OpenBSD e NetBSD), Solaris (anteriormente conhecido por SunOS), IRIXG, AIX, HP-UX, Tru64, SCO, Linux (nas suas centenas de distribuições), e até o Mac OS X (baseado em um núcleo Mach BSD chamado Darwin). Existem mais de quarenta sistemas operacionais *nix, rodando desde celulares a supercomputadores, de relógios de pulso a sistemas de grande porte.

O que o Unix


Unix é um sistema operativo (ou sistema operacional) portátil (ou portável), multitarefa e multiutilizador (ou multiusuário) originalmente criado por Ken Thompson, Dennis Ritchie, Douglas McIlroy e Peter Weiner, que trabalhavam nos Laboratórios Bell (Bell Labs) da AT&T. A marca UNIX é uma propriedade do The Open Group, um consórcio formado por empresas de informática.