Linux Embarcado - Nota de Aula 1 (Linux Básico)

INÍCIO - Introdução ao Sistema UNIX

Esta disciplina usará o bash, que é padrão em distribuições Linux;

Comandos em Unix

Documentação em Linux

Referência básica: Capítulo 4 da Apostila Linux Básico

Existem duas classes de documentação em Linux.

A primeira classe contém documentação referente a esclarecimentos gerais e de instalação dos diversos programas existentes em uma distribuição Linux. Esta documentação está, geralmente, no diretório /usr/doc. Geralmente são mais úteis aos administradores.

A outra classe, a mais importante, contém as páginas de manuais on-line do UNIX. Esta documentação é acessível através do comando man e contém a descrição e forma de uso dos diversos programas existentes em uma distribuição Unix/Linux.

O manual on-line se organiza em 9 seções (numeradas de 1 a 9). Cada seção agrupa manuais referentes a um assunto específico. As seções são:

  1. Programas executáveis e comandos shell
  2. Chamadas de Sistema - System calls - funções para programação, disponibilizadas pelo kernel.
  3. Bibliotecas do Sistema - Library calls - funções diversas para programação.
  4. Arquivos Especiais - geralmente encontrados no diretório /dev.
  5. Formatos de arquivos e convenções (e.g. /etc/passwd)
  6. Jogos
  7. Macros e convenções gerais (e.g. man(7), groff(7)).
  8. Comandos para Administração do Sistema - geralmente utilizados apenas pelo Administrador do Sistema root
  9. Rotinas do Kernel [Não é padrão]

Eventualmente, pode existir uma seção adicional de novas páginas, denominada Seção n.

Os principais comandos para acesso às páginas de manuais on-line são:

Arquivos e Árvores de Diretórios

Referência básica: Capítulos 3 e 8 da Apostila Linux Básico

Comandos Básicos

Manipulação de Arquivos e diretórios

Usuários e Segurança em Arquivos

Usuários em um sistema UNIX possuem uma identificação numérica única denominada UID (User IDentification) e um nome simbólico único conhecido como Login ou Username.

Também são definidos em um sistema UNIX os chamados grupos. Cada grupo representa um conjunto de usuários que por alguma razão possuem uma função ou atividades em comum (por exemplo, usuários que são alunos de graduação, usuários que são os professores, etc.).

Cada grupo em um sistema UNIX possui também uma identificação numérica única denominada GID (Group IDentification) e um nome simbólico único conhecido como Group name ou simplesmente Grupo.

Estes conceitos são importantes para entender como um sistema UNIX controla a forma com que arquivos podem ser acessados e o que se pode se fazer com eles uma vez acessados. Você pode, por exemplo, desejar que o conteúdo de um determinado arquivo possa ser alterado apenas por você que o criou. Por outro lado você pode fazer com que um outro arquivo tenha seu conteúdo lido por qualquer usuário no sistema.

O comando id(1) pode ser usado para se determinar a identificação completa de um usuário: seu UID e GID.

Permissões de acesso

Quando um arquivo qualquer é criado em UNIX, ele é dito ter um Proprietário e um Grupo. O Proprietário do arquivo corresponde ao Login do usuário que criou o arquivo. O Grupo do arquivo corresponde ao Grupo ao qual pertence o usuário que o criou. Por exemplo, se o usuário ci066, registrado como sendo do grupo especial cria um arquivo, dizemos que este pertence ao Proprietário ci066 e ao Grupo especial.

O acesso a arquivos UNIX é definido através de 3 conjuntos de permissões: um conjunto para Proprietário do arquivo, um conjunto para Grupo do arquivo e um conjunto para Outros usuários.

Cada conjunto pode assumir as permissões de Leitura (representada pela letra r), Escrita (representada pela letra w) e Execução ou Navegação (representada pela letra x).

Em se tratando de um arquivo regular, a permissão de Leitura significa que se pode ler o conteúdo do arquivo, a permissão de Escrita significa que se pode alterar (editar) o conteúdo do arquivo, e a permissão de Execução significa que este arquivo contém um programa ou um script shell, podendo ser executado como um comando.

Em se tratando de um diretório, a permissão de Leitura significa que se pode ler o conteúdo do diretório (por exemplo com ls(1)), a permissão de Escrita significa que se pode criar ou remover arquivos do diretório, e a permissão de Execução significa que este diretório é navegável, isto é, pode-se navegar para ele ou através dele com comandos como cd, pushd, popd ou find(1).

NOTA

Em UNIX, TUDO É CONSIDERADO UM ARQUIVO. Existem assim diferentes tipos de arquivos: regulares, diretórios, links simbólicos, arquivos associados a recursos de hardware (tais como disco, interface de rede, teclado e terminal, etc.). Assim, a permissão de Escrita em um diretório significa alterar o arquivo que representa um diretório, o que significa efetivamente criar e remover arquivos.

As permissões de acesso podem ser definidas a qualquer hora por chmod(1) e podem ser visualizadas através de command(1)ls) usando-se a opção -l. Seja, por exemplo:

   ci066@dupond $ ls -l teste.c
   -rw-r--r-- 1 ci066 especial  2331 Mai 30 11:36 teste.c
   ci066@dupond $ ls -l a.out
   -rw-r-x--- 1 ci066 especial  2331 Mai 30 11:36 a.out
   ci066@dupond $ ls -ld LabNum2
   drwxr-xr-- 1 ci066 especial  2331 Mai 30 11:36 LabNum2
  

No exemplo acima, o arquivo teste.c possui permissão de Leitura e Escrita para o Proprietário do arquivo (usuário ci066), apenas permissão de Leitura para usuários do Grupo do arquivo (grupo especial), e apenas permissão de Leitura para Outros usuários.

Ainda no exemplo acima, o arquivo a.out possui permissão de Leitura e Execução para Proprietário e Grupo, Escrita apenas para Proprietário, e NENHUMA permissão para Outros usuários. Assim, a.out pode ser executado como um comando apenas pelo usuário ci066 e por usuários do grupo especial.

Finalmente, todos os usuários tem permissão para listar o conteúdo do diretório LabNum2. Por outro lado, apenas o usuário ci066 e os usuários do grupo especial tem permissão para navegar para ou através deste diretório. Somente o usuário ci066 tem permissão para criar arquivos dentro do diretório.

Permissões de acesso: Notação octal

As permissões de acesso de um arquivo podem ser representadas de uma forma mais compacta, usando uma notação de 3 DÍGITOS OCTAIS. Esta forma compacta de representar as permissões é referenciada em UNIX como FILE MODE (modo do arquivo ou simplesmente MODO).

Em um MODO, cada dígito corresponde a um grupo de permissões: O primeiro dígito corresponde às permissões do Proprietário, o segundo dígito corresponde às permissões para o Grupo e o terceiro dígito corresponde às permissões para Outros Usuários.

Cada dígito octal do modo é definido pela soma dos valores octais abaixo:

   4 = permissão de Leitura
   2 = permissão de Escrita
   1 = permissão de Execução/Navegação

Assim, a permissão -r-xr--wx pode ser representada pelo Modo 543:

   5 ( = 4 + 1) representa permissão  de Leitura e Execução para Proprietário;
   4 representa unicamente a permissão de Leitura para Grupo;
   3 ( =  2 + 1) representa permissão de Escrita  e Execução para Outros.

Alterando as permissões de um arquivo: chmod(1)

Para alterar as permissões com chmod(1) pode ser usado um Modo (notação octal) ou notação simbólica ([augo][+-=][rwx]) para especificar a mudança de permissões:

   chmod 754 teste.c  (equiv. a chmod u=rwx,g=rx,o=r teste.c)
   chmod 664 teste.c  (equiv. a chmod ug=rw,o=r teste.c)
   chmod u+r,go+r,go-wx teste.c

Encontrando arquivos: find(1)

Comando find: opções, execução de um comando em cada arquivo encontrado, etc.;

SINTAXE: find rota_de_diretório critério_de_procura ação

Procura em um conjunto de arquivos e/ou diretórios (rota_de_diretório) por arquivos que tenham características definidas por um critério de procura, e executa uma ação para cada arquivo encontrado.

Exemplo 1:

  ci066@dupond:~$ find ~ci066 -name jan83 -print
  /home/esp/ci066/LabNum4/docs/jan83

Neste exemplo:

rota_de_diretório: ~ci066

critério de procura: -name jan83

ação: -print

Exemplo 2:

  ci066@dupond:~$ find ~ci066 -perm -033 -atime -2 -exec chmod go-rwx {} $\backslash$;
  ci066@dupond:~$  

Neste exemplo:

rota_de_diretório: ~ci066

critério de procura: -perm -033 -atime -2 (arquivos acessados nos últimos 2 dias E que tenham permissão de Escrita E Execução para Grupo e Outros)

ação: -exec chmod go-rwx {} $\backslash$; muda a permissão dos arquivos que correspondem ao critério de procura.

Observe o uso de {} para representar em find(1) os arquivos selecionados pelo critério de procura.

Exemplo 3:

  ci066@dupond:~$ find ~ci066 $\backslash$( -name '*-8' -o -name '*~' -o -name 'jan[0-9]*' $\backslash$) -exec rm {} $\backslash$;
  /home/esp/ci066/LabNum4/docs/jan83

Neste exemplo:

rota_de_diretório: ~ci066

critério de procura: . Este critério indica que os nomes dos arquivos que devem ser encontrados devem terminar com -8 OU ~ OU começar com jan seguido de um dígito de 0 a 9.

Observe também o uso de -o para representar a operação lógica OU entre os critérios. A ausência do conectivo -o implica em uma operação E, também representada pelo uso de -a.

Observe o uso de parênteses para agrupar todo o conjunto de critérios. Deve-se observar também que os parênteses são precedidos de $\backslash$, para evitar que o shell interprete os parênteses de forma especial. Finalmente, é mandatória o uso de um espaço em branco entre os parênteses e o conjunto de critérios que eles agrupam.

ação: -rm {} $\backslash$; remove cada arquivo selecionado pelos critérios de procura.

Observe o uso de {} para representar em find(1) os arquivos selecionados pelo critério de procura, e de $\backslash$; para indicar o final da opção -exec.

Compactação de arquivos. Arquivamento e Backup

Família Compactador Descompactador Visualizador Sufixos
gzip(1) gzip gunzip zcat .gz
bzip2(1) bzip2 bunzip2 bzcat .bz2
zip(1) zip unzip - .zip
Compactador Sufixo
gzip(1) .tar.gz, .tgz, .taz
bzip2(1) .tar.bz2, .tbz

Exercícios

  1. Utilize o manual online para conhecer os comandos date(1), echo(1), chmod(1), touch(1), rm(1), ls(1), cp(1), mv(1), mkdir(1), rmdir(1), less(1), who(1), id(1), whoami(1), finger(1) e cat(1). Este exercício é não somente um exercício de paciência mas principalmente de persistência. Lendo manuais on-line torna possível a familiarização gradativa com os comandos UNIX.

  2. Resolva os exercícios da Apostila Linux Básica, Capitulo 3, SEcção 3.8

  3. Crie o diretório ~/exerc_01/arquivos usando mkdir(1) APENAS uma vez.

  4. Copie para o diretório criado no exercício anterior os arquivos passwd, group, issue, que estão no diretório etc na raiz do sistema. Resolva este exercício com APENAS UMA ÚNICA linha de comando

  5. Suponha que você tem em um diretório /home/Empresa os subdiretórios memorandos, contratos, vendas e clientes. Cada um destes subdiretórios possui centenas e centenas de arquivos e subdiretórios que foram criados por você. Agora, você quer proteger o diretório /home/Empresa e seu subdiretórios e arquivos, de forma que os arquivos possam ser lidos por você e por usuários de seu grupo UNIX, mas apenas você possa alterá-los. Além disso, outros usuários não devem ter qualquer permissão de acesso a estes arquivos. Como não bastasse, somente você deve ter permissão para listar os conteúdos do diretórios. Indique qual a seqüência de comandos que deve ser executada para garantir os objetivos acima.

  6. Crie o arquivo mocorongo dentro do diretório ~/exercicios_01. Em seguida, indique como usar chmod(1) para definir as permissões abaixo:
  7. Você se encontra em uma situação difícil. Você criou um diretório ~/Trab_Prog_01 e nele você criou 4 (quatro) arquivos, cada um contendo um programa em linguagem Pascal, para serem entregues ao professor da disciplina CI055. Como você é um aluno consciente e correto (e não quer dar moleza para neguinho vagal), você executou os comandos UNIX abaixo com o objetivo de bloquear, para quaisquer usuários exceto você mesmo, o acesso de leitura e escrita aos arquivos:
      cd
      chmod -R 600 Trab_Prog_01 
    
    Mas, depois de executados estes comandos, NEM MESMO VOCÊ consegue agora acessar seus próprios arquivos. O que você fez errado? Como corrigir o problema, mantendo o seu objetivo inicial?

  8. Considerando ainda o exercício anterior, qual seria o efeito dos comandos abaixo?
      cd
      chmod -R 600 .
    

  9. Você deseja retirar todos os arquivos com sufixo *.bak, *%, *~ e os arquivos de nome core existentes em sua área. No entanto, o que você quer de fato é movê-los para um diretório ~/.trash para posteriormente apagá-los com algum outro comando.

  10. Com o problema definido no exercício anterior, você agora deve comprimir (através de bzip2(1)) todos os arquivos do diretório ~/.trash cujo tamanho seja maior que 2M bytes.

  11. Como complementação final aos dois exercícios anteriores, você deseja remover de ~/.trash os arquivos que tenham sido copiados para lá há 3 dias ou mais.

  12. Resolver os exercícios da prática 1

  13. Resolver os exercícios da prática 2