Linux Básico Prof. Gutemberg Gonçalves dos Santos Júnior Center of Electrical Engineering and Informatics Federal University of Campina Grande
História do Linux A história começa em 1991 com o estudante universitário finlandês Linus Torvalds (21 anos) Olá a todos que usam o Minix - Estou fazendo um sistema operacional (livre - apenas como um hobby, não será algo grande e profissional como o GNU) para máquinas AT 386 (486). Ele tem sido trabalhado desde abril, e está começando a ficar pronto. Eu gostaria de opiniões sobre coisas que as pessoas gostam/não gostam no Minix, já que o meu SO lembra um pouco ele (mesmo layout físico do sistema de arquivos (por motivos práticos), entre outros). Embedded - UFCG :: 2
História do Linux A história começa em 1991 com o estudante universitário finlandês Linus Torvalds Eu já portei o bash (1.08) e o gcc (1.40) e as coisas parecem funcionar. Isso indica que conseguirei alguma coisa prática dentro de alguns meses, e gostaria de saber quais recursos as pessoas mais gostaria de ter. Todas as sugestões serão bem-vindas, mas não prometo implementá-las :-) Linus (torvalds@kruuna.helsinki.fi) PS. Sim - ele está livre de qualquer código do Minix, e tem sistema de arquivos com multi-threading. Ele NÂO é portável (usa 386, chaveamento de tarefas, etc) e provavelmente nunca suportará qualquer coisa além de discos rígidos AT, pois é tudo o que eu tenho :-(. Embedded - UFCG :: 3
O que é Linux? Linux É um kernel de código aberto que vem sendo desenvolvido ao longo do tempo voluntariamente por desenvolvedores de várias partes do mundo; Kernel É o núcleo do sistema operacional; Faz a intermediação entre o hardware e os programas executados pelo computador; Sistema Operacional Kernel + softwares (drivers, protocolos de comunicação, etc.); Várias distribuições (Ubuntu, Red Hat, Debian, Slackware, CentOS, etc.); GNU GNU is Not Unix. Embedded - UFCG :: 4
Organização do GNU/Linux Espaço de usuário Onde as aplicações do usuário são executadas; Biblioteca GNU C Define as chamadas de sistemas (kernel 3.18 400 chamadas) SO com 2 níveis Espaço do Kernel Interface de chamadas de sistema Implementa funções básicas como read e write; Kernel Código independente da arquitetura; Código dependente da arquitetura. Embedded - UFCG :: 5
Estrutura do Sistema de Arquivos Não é imposta pelo sistema. Pode variar de um sistema para outro, mesmo entre duas instalações do GNU/Linux! / Diretório Root /bin/ /boot/ /dev/ /etc/ /home/ /lib/ Comandos básicos essenciais do sistema Imagens do kernel, initrd e arquivos de configuração Arquivos que representam dispositivos Ex: /dev/sda: primeiro disco rígido SATA do sistema Aquivos de configuração do sistema Diretórios dos usuários Bibliotecas compartilhadas básicas do sistema Embedded - UFCG :: 6
Estrutura do Sistema de Arquivos Não é imposta pelo sistema. Pode variar de um sistema para outro, mesmo entre duas instalações do GNU/Linux! /lost+found /mnt/ /opt/ /proc/ /root/ /sbin/ /sys/ Arquivos corrompidos que o sistema tentou recuperar Sistemas de arquivos montados (/mnt/usbdisk/, /mnt/windows/...) Programas instalados pelo administrador do sistema. (/usr/local/ às vezes usado com esse propósito) Acesso a informações do sistema (/proc/cpuinfo, /proc/version...) Diretório particular do usuário root Comandos acessíveis apenas pelo administrador. Controles do sistema e dispositivos (freqüência da CPU, módulos do kernel, etc.) Embedded - UFCG :: 7
Estrutura do Sistema de Arquivos Não é imposta pelo sistema. Pode variar de um sistema para outro, mesmo entre duas instalações do GNU/Linux! /tmp/ /usr/ /usr/local/ /var/ Arquivos temporários Programas dos usuários (não essenciais ao sistema) (/usr/bin/, /usr/lib/, /usr/sbin...) Programas instalados pelo administrador do sistema. (usado algumas vezes no lugar de /opt/) Dados usados pelo sistema ou programas servidores /var/log/ (logs do sistema e programas) /var/spool/mail (emails recebidos) /var/spool/lpd (trabalhos de impressão)... Embedded - UFCG :: 8
Tudo é um arquivo! Quase tudo no Linux é um arquivo! Arquivos comuns; Diretórios; Arquivos que listam um conjunto de outros arquivos; Links Simbólicos; Arquivos que referenciam o nome de outro arquivo; Dispositivos e periféricos; Lê e grava em dispositivos como se fossem arquivos comuns; Pipes; Usados para concatenar programas; Sockets; Comunicação interprocessos. Prompt [riscv@localhost]$ cd / [riscv@localhost]$ ls [riscv@localhost]$ vi etc Verifique que o diretório também é um arquivo! Para sair do VI digite :q [riscv@localhost]$ ls la Verifique os links simbólicos pelo símbolo -> [riscv@localhost]$ cd ~ [riscv@localhost]$ head c 30 /dev/urandom > arquivo /dev/urandom é um dispositivo que gera números aleatórios [riscv@localhost]$ hexdump arquivo Verifique os 30 bytes aleatórios que foram gerados [riscv@localhost]$ cd /etc [riscv@localhost]$ grep command wgetrc Procurando pela palavra command no arquivo wgetrc [riscv@localhost]$ grep command wgetrc grep line Utilizando um pipe para concatenar 2 grep Embedded - UFCG :: 9
Comando ls Lista os arquivos do diretório atual em ordem alfanumérica, exceto arquivos que iniciam com o caractere.. ls -a (all) Lista todos os arquivos (inclusive os arquivos.*) ls l ls -t ls -S ls -r ls -ltr (long) Listagem longa (tipo, data, tamanho, proprietário, permissões) (time) Lista os arquivos mais recentes primeiro (size) Lista os maiores arquivos primeiro (reverse) Inverte a ordenação (opções podem ser combinadas) Listagem longa, com os arquivos mais recentes no final. Reproduza os comandos acima a partir do diretório /etc/ Embedded - UFCG :: 10
Padrões de Substituição de nomes de arquivos Pode-se substituir uma parte do nome de um arquivo por alguns caracteres especiais: ls *txt O shell primeiro substitui *txt por todos os nomes de arquivos e diretórios que terminam com txt (incluindo.txt), exceto aqueles que iniciam com., e então executa o comando ls. ls -d.* Lista todos os arquivos e diretórios que iniciam com.. cat?.log -d instrui o ls a não exibir o conteúdo dos.* diretórios. Exibe todos os arquivos cujos nomes possuem 1 caractere e terminam com.log. Reproduza os comandos acima a partir do diretório /etc/ Embedded - UFCG :: 11
O comando grep grep <padrão> <arquivos> Pesquisa os arquivos passados como parâmetros e exibe as linhas que possuem o padrão. grep er *.log grep -i er *.log grep -ri er. grep -v info *.log Exibe todas as linhas que contém a string er nos arquivos *.log. Mesma situação, porém não diferencia maiúsculas de minúsculas. Mesma situação, porém faz a pesquisa recursivamente em todos os arquivos no diretório. e nos seus subdiretórios. Exibe todas as linhas dos arquivos *.log exceto aquelas que contêm a string info. Reproduza os comandos acima a partir do diretório /var/log/ Embedded - UFCG :: 12
Redirecionando a saída padrão Todos os comandos que exibem texto no seu terminal o fazem por meio da gravação de informações na sua saída padrão. A saída padrão pode ser gravada em (redirecionada para) um arquivo usando o símbolo > A saída padrão pode ser adicionada ao final de um arquivo existente usando o símbolo >> Prompt [riscv@localhost]$ cd ~ Acessa o diretório home do usuário atual [riscv@localhost]$ echo riscvbr Repete a sentença riscvbr e a grava na saída padrão (terminal) [riscv@localhost]$ echo riscvbr > saida Repete a sentença riscvbr e a grava (redireciona) para o arquivo saida [riscv@localhost]$ cat saida Exibe o conteúdo do arquivo saida [riscv@localhost]$ echo riscvbr2 > saida Repete a sentença riscvbr2 e a grava (redireciona) para o arquivo saída, substituindo o arquivo [riscv@localhost]$ echo riscvbr3 >> saida Repete a sentença riscvbr3 e a grava (redireciona) para o arquivo saída, adicionando-a ao final do arquivo [riscv@localhost]$ cat saida Exibe o conteúdo do arquivo saida Embedded - UFCG :: 13
O comando find find <diretório> <expressão> Pesquisa por arquivos de acordo com a expressão diretórios informados. e find ~ -name Downloads find ~ -name Do* Procura por arquivos no diretório ~ com o nome Downloads Procura por arquivos no diretório ~ com o nome começando por Do. find. -name *.log -exec gedit {} ; Procura todos os arquivos com final.log no diretório /var/log e os exibe, um após o outro, com o gedit; Reproduza os comandos acima a partir do diretório /var/log/ Embedded - UFCG :: 14
Comandos básicos Vamos combinar alguns comandos através de exemplos! Prompt [riscv@localhost]$ cd ~ Vai para a pasta home do usuário atual [riscv@localhost]$ mkdir teste_riscv Cria uma pasta com o nome teste_riscv [riscv@localhost]$ echo seunome > arquivo.txt O comando echo repete a expressão que segue (seunome) O comando > redireciona a saída do comando echo para um arquivo com o nome arquivo.txt [riscv@localhost]$ cat arquivo.txt Imprime o conteúdo de arquivo.txt no terminal [riscv@localhost]$ mv arquivo.txt teste_riscv Move o arquivo.txt para o diretório teste_riscv [riscv@localhost]$ ls -la Lista todos os arquivos do diretório com detalhes Prompt [riscv@localhost]$ ls lar Lista todos os arquivos do diretório com detalhes na ordem reversa [riscv@localhost]$ rm rf teste_riscv Apaga o diretório teste_riscv [riscv@localhost]$ head c 30 /dev/urandom Imprime 30 bytes do dispositivo que gera números aleatórios (entende como caracteres) [riscv@localhost]$ head c 30 /dev/urandom hexdump Passa a informação do comando head para o comando hexdump, imprimindo assim os bytes em hexadecimal [riscv@localhost]$ head c 30 /dev/urandom hexdump > aleatorio Cria um arquivo com o nome aleatorio com as informações do comando anterior Embedded - UFCG :: 15
Programando em Bash O bash possui uma poderosa linguagem de script embutido nele mesmo o shell script; Muito utilizado para facilitar a execução de tarefas no Linux; Por exemplo, o Slackware utiliza shell script para instalar e configurar toda a distribuição Uma das grandes vantagens é que o script não precisa ser compilado! Todo arquivo de script deve ter um cabeçalho indicando o tipo de shell que está sendo utilizado #!/bin/sh #!/bin/bash Embedded - UFCG :: 16
Programando em Bash Vamos criar o nosso primeiro script! Prompt [riscv@localhost]$ cd ~ Vá para a pasta home do usuário atual [riscv@localhost]$ gedit meu_primeiro_script Crie um arquivo com o nome meu_primeiro_script Arquivo aberto no gedit #!/bin/bash Echo Meu primeiro Script! Salve o arquivo e feche o gedit Prompt [riscv@localhost]$ bash meu_primeiro_script Execute o script utilizando o bash e verifique a saída Prompt [riscv@localhost]$./meu_primeiro_script Execute o script novamente Prompt [riscv@localhost]$ chmod +x meu_primeiro_script Torne o seu script executável Embedded - UFCG :: 17
Programando em Bash Variáveis em shell script são caracteres que armazenam dados; O bash reconhece uma variável pelo símbolo $ Definição de uma variável variavel= valor Prompt [riscv@localhost]$ var= Variavel do usuário $user Cria uma variável de ambiente com o nome var [riscv@localhost]$ echo var Exibe o nome var, não o conteúdo da variável var [riscv@localhost]$ echo $var Exibe o conteúdo da variável var [riscv@localhost]$ var2= Meu diretório atual é o `pwd` [riscv@localhost]$ echo $var2 Exibe o conteúdo de var2. Note que o símbolo ` foi utilizado para a execução de um comando dentro de outro O comando pwd exibe o caminho completo do diretório atual Embedded - UFCG :: 18
Programando em Bash Controle de fluxo If [condição] then comando a ser executado else comando a ser executado fi Algumas condições -eq (igual) -ne (diferente) -gt (maior) -lt (menor) -o (ou) #!/bin/bash Echo Meu primeiro Script! var=3 if [ $var -eq 3 ] then echo verdadeiro else echo falso fi Arquivo meu_primeiro_script Prompt [riscv@localhost]$./meu_primeiro_script Embedded - UFCG :: 19
Programando em Bash Se aprofundando mais! Arquivo meu_primeiro_script #!/bin/bash for i in {1..9}; do mkdir dir$i done pastas=`ls d dir*` for i in $pastas; do cd $i echo arquivo do diretório $i > texto_$i cd.. done Desafio! Altere o script ao lado para que a árvore de diretórios agora possua a seguinte organização: ~/scripts dir1 dir2 dir3 dir4 dir5 dir6 dir7 Os arquivos texto_$i devem estar nos respectivos diretórios dir8 dir9 dir10 Embedded - UFCG :: 20
Programando em C no Linux Um primeiro programa em C Arquivo hello_world.c #include <stdio.h> int main() { printf( Hello, World!\n ); return 0; Compilando [riscv@localhost]$ gcc -Wall hello.c -o programa Compila o arquivo hello.c -Wall habilita a maioria dos alertas -o especifica o nome do arquivo de saída [riscv@localhost]$./programa Executa o arquivo programa } Obviamente existem formas bem mais complexas: Utilização de múltiplos arquivos; Utilização de diretórios auxiliares; Otimização, ligação (Linking), etc. Embedded - UFCG :: 21
Programando em C no Linux Um programa em C com vários arquivos #include <stdio.h> #include calcula.h Arquivo main.c int main() { int a = 355; printf( O quadrado de %d é %d!\n, a, calcula(a)); return 0; } #ifndef CALCULA_H_ #define CALCULA_H_ int calcula(int num); #endif Arquivo calcula.h Arquivo calcula.c Compilando [riscv@localhost]$ gcc -c calcula.c o calcula.o Compila o arquivo calcula.c mas não realiza o link [riscv@localhost]$ gcc -c main.c -o main.o Compila o arquivo main.c mas não realiza o link [riscv@localhost]$ gcc calcula.o main.o -o programa Realiza o link e cria um executável com o nome programa [riscv@localhost]$./programa Executa o arquivo programa #include calcula.h int calcula(int num){ return num*num; } Embedded - UFCG :: 22
Programando em C no Linux Coloque o arquivo.h no diretório include; Pesquise e realize a compilação dos arquivos em questão! Embedded - UFCG :: 23
Utilizando Makefile Uma simples forma de organizar o processo de compilação Inserindo variáveis Arquivo Makefile programa2: calcula.c main.c gcc -o programa2 calcula.c main.c -I. Arquivo Makefile CC=gcc CFLAGS=-I. programa2: calcula.c main.c $(CC) -o programa2 calcula.c main.c $(CFLAGS) Compilando - Makefile [riscv@localhost]$ make Realiza a compilação dos arquivos assim como descritos no Makefile [riscv@localhost]$ make Só recompila se houve mudanças nos arquivos calcula.c e/ou main.c Embedded - UFCG :: 24
Utilizando Makefile Uma simples forma de organizar o processo de compilação Inserindo dependências Arquivo Makefile CC=gcc CFLAGS=-I. DEPS=calcula.h %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) programa2: calcula.c main.c $(CC) -o programa2 calcula.c main.c $(CFLAGS) Arquivo Makefile CC=gcc CFLAGS=-I. DEPS=calcula.h OBJ=calcula.c main.c %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) programa2: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) %.o: %.c $(DEPS) Especifica que os arquivos.o dependem dos arquivos.c e dos.h definidos na macro DEPS; -o $@ Especifica que a saída da compilação deve ser no arquivo com nome definido no lado esquerdo de : $^ Especifica o lado direito de : $< Especifica o primeiro item da lista de dependências Embedded - UFCG :: 25
Utilizando Makefile Faça um Makefile mais completo Os arquivos headers (.h) devem estar localizados no diretório include; Que todos os arquivos.c sejam colocados no diretório src; O makefile também esteja localizado no diretório src; Que todos os arquivos.o sejam gerados no diretório obj; Que possua uma regra clean que apague todos os arquivos.o; Embedded - UFCG :: 26
Utilizando Git Embedded - UFCG :: 27
Contact Angelo Perkusich, D.Sc. Professor, CEO angelo.perkusich@embedded.ufcg.edu.br +55 83 8811.9545 Gutemberg Gonçalves, Ph.D. Professor gutemberg@embedded.ufcg.edu.br +55 83 99619.2600 Hyggo Almeida, D.Sc. Professor, CTO hyggo.almeida@embedded.ufcg.edu.br +55 83 8875.1894