Embedded Linux Development Course - Workstation (pt. 4)
Ambiente de Trabalho
Como mencionado no Capítulo de Configuração Inicial, ao se desenvolver sistemas Linux embarcados, é fortemente recomendado o uso de uma plataforma de desenvolvimento (host) também com Linux.

Isto, pois, a grande maioria das ferramentas que existem na comunidade open-source foram projetas para rodar em Linux. Quando existe algum porte ou versão para Windows/macOS, normalmente esse porte foi feito por algum determinado grupo de desenvolvedores e você fica sem suporte dos desenvolvedores oficiais, não recebe atualizações, correções de bugs e etc.
Além disso, lembre-se que o kernel que roda na sua aplicação é também o que roda na sua máquina, então quando você passa por problemas durante o desenvolvimento, possivelmente a solução é válida para ambos os sistemas. De forma geral, usando Linux você aprende Linux.
Por estes motivos, durante esse treinamento vamos utilizar a distribuição Ubuntu 16.04 LTS. Porém, ao se desenvolver, fora do curso, deve-se escolher a distribuição que mais agrada e torna o trabalho mais produtivo.
Uma vez usando Linux você já terá grande parte do suporte que precisa, contudo é recomendado utilizar uma distribução que seja estável o suficiente e não trabalho com as ultimas versões de pacotes disponíveis, por exemplo Debian, Slack, Redhat e etc. Visando um ambiente corporativo, o legal é fechar um sistema operacional LTS, que terá suprote por pelo menos cinco anos da comunidade e partir para o desenvolvimento dos sistemas.
Sistema Multi-Usuários
Uma das primeiras características que notamos ao começar a trabalhar com sistemas Linux, é o fato deste ser um sistema operacional multi-usuários. Isto significa que existem diferenciações entre os usuários que operam a máquina. Distinguindo o contexto de acesso a determinadas regiões ou diretórios e também certas operações dentro do sistema.
Em especial, existe o usuário root este é o usuário “administrador” do sistema, possuindo acesso privilegiado sobre o sistema. Esse acesso privilegiado, consede ao usuário root o poder de executar operações que necessitem de permissão elevada, tais como: criar um sistema de arquivos, montar uma partição, adicionar e remover um software, configurar rede, operar arquivos em diretórios com privilégio e etc.
Por padrão, o Ubuntu não permite que usuário root faça login no sistema, essa opção é bloqueada mas pode ser alterada, contudo não é uma atitude recomendada. No entanto, em suas configurações padrão, o Ubuntu usa uma política de que o primeiro usuário criado no sistema (normalmente aquele logo depois da instalação), recebe a permissão de executar as operações privilegiadas do root, através do comando sudo
.
Para exemplificar a utilização do comando sudo
vamos realizar a seguinte demonstração. Ao tentar montar uma partição, através do comando mount
.
mount /dev/sda2 /mnt/disk_test
Recebemos a seguinte mensagem, negando a permissão do nosso usuário:
mount: only root can do that
Ou seja, para realizar esta operação, é necessário utilizar um usuário com permissão de root, portanto devemos utilizar o comando sudo
, demonstrando que realmente queremos utilizar este comando com privilégios.
sudo mount /dev/sda2 /mnt/disk_test
No Ubuntu 16.04, a senha de root é definida durante a instalação do sistemas. Por padrão, algumas distribuições utilizam como senha a palavra root ou mesmo toor. Este tópico será abordado em outro momento do treinamento.
[LAB] Conhecendo o Terminal
Nesta atividade iremos estudar alguns comandos e conceitos básicos da linha de comandos do Linux, necessários para um melhor aproveitamento e entendimento do treinamento.
Linha de Comando Básico
Nesta atividade iremos estudar os comandos básicos da linha de comandos do Linux.
O shell
O shell é uma interface de linha de comandos entre o usuário e o sistema operacional. No Ubuntu, ele pode ser acessado pressionando a tecla Super
e digitando “Terminal” ou pelas teclas de atalho CTRL+ALT+T
.
Sua aparência inicial é uma tela preta com um cursor piscando para a entrada de comandos. Dentro desta janela, você pode abrir outras abas e trabalhar nelas simultaneamente, acessando o menu “File-> Open Tab” ou pelas teclas de atalho CTRL+SHIFT+T
.
Estude e decore as teclas de atalho! Trabalhando com o shell, você será muito mais produtivo!
Diretórios e arquivos
Windows e Linux são sistemas operacionais com conceitos totalmente diferentes. Enquanto que no Windows temos diversas árvores de diretório, cada uma associada à um dispositivo (C:**, **D: e etc), no Linux temos apenas uma árvore de diretórios “/
”, chamada de diretório root ou diretório principal. Perceba que inclusive a orientação da barra é diferente.
Outra diferença importante é que o Linux é “case sensitive”, ou seja, diferencia maiúsculas de minúsculas. Portanto, “Texto.txt
” é diferente de “texto.txt
”.
Alguns comandos básicos para manipulação de arquivos:
Comando | Descrição |
---|---|
cd | Mudar de diretório |
mkdir | Criar diretório |
rmdir | Remover diretório vazio |
rm | Remover arquivo |
rm -R | Remove diretórios e subdiretórios recursivamente |
ls | Listar arquivos e diretórios |
cp | Copiar arquivo |
mv | Mover/renomear arquivo |
cat | Listar conteúdo do arquivo |
No Linux, enquanto que o diretório “/
” representa o diretório principal (raiz), um ponto “.
” representa o diretório atual, e dois pontos “..
” representam o diretório anterior. Exemplos:
Listando o diretório principal:
ls /
Listando o diretório atual:
ls .
Listando o diretório anterior:
ls ..
Exercício 1: Entre na pasta de arquivos temporários “/tmp
”. Crie um diretório “testedir
” e entre nele. Faça uma cópia do arquivo “/etc/resolv.conf
” para este diretório. Liste o diretório e o conteúdo deste arquivo. Renomeie este arquivo para “resolv.txt
”. Liste novamente o conteúdo do arquivo. Apague o arquivo, volte ao diretório “/tmp
” e apague o diretório “testedir
”.
Você pode usar as teclas de seta para cima e para baixo para navegar entre os comandos já digitados. O comandos “history” também exibe os últimos comandos executados. A tecla
TAB
ajuda a preencher de forma inteligente enquanto você esta digitando um comando.
Variáveis de ambiente
Todo shell do Linux possui um ambiente de execução com algumas variáveis configuradas. Você pode imprimir estas variáveis com o comando printenv
.
Um variável importante é o PATH
, que possui todos os caminhos por onde o shell irá procurar um binário para execução. Aqui é o mesmo conceito usado em máquinas Windows para variáveis de ambiente.
Você pode usar o comando echo
para imprimir uma variável ambiente:
echo $PATH
/home/gbs/bin:/home/gbs/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Os valores são separados por dois pontos “:
”. Neste exemplo, quando você tentar executar uma aplicação na linha de comandos, o shell irá procurar esta aplicação nos diretórios /usr/sbin
, /usr/bin
, /bin
e /sbin
.
Se sua aplicação não estiver em um dos diretórios do PATH
, você pode executá-la digitando o caminho completo:
/home/user/bin/app
Ou então entrar no diretório da aplicação e executar usando “./
” conforme abaixo:
cd /home/user/bin/
./app
Para alterar ou criar uma nova variável de ambiente, você precisa usar o comando export
:
export VAR=value
E para remover você pode usar o comando unset
, conforme abaixo:
unset VAR
Exercício 2: Crie, imprima e remova uma variável de ambiente.
Editor de Texto
Existem dezenas de editores de texto disponíveis no Linux. Um dos mais usados é o vi, ou sua versão mais avançada, o vim.
Apesar de altamente produtivo, o vi possui uma curva de aprendizado relativamente grande, o que pode assustar um pouco quem esta começando a aprender Linux. Uma outra solução menos agressiva é o nano, que também possui diversas funcionalidade e permite a edição de arquivos dentro do terminal. Por fim, uma escolha gráfica pode ser o gedit.
Shell Script
Shell script tem o mesmo conceito de arquivos .bat
no Windows. Possui uma linguagem de programação própria, e permite automatizar diversas tarefas que de outra forma seriam repetitivas.
Um shell script normalmente tem na primeira linha o nome do programa interpretador, seguido pelos comandos a serem executados. Exemplo:
#!/bin/bash
mkdir -p /tmp/testedir
cp /etc/resolv.conf /tmp/testedir/
Um shell script precisa de permissão para execução. Portanto, após criar um shell script, você precisa dar esta permissão com o comando abaixo:
chmod u+x script.sh
Exercício 4: Crie um shell script dentro do diretório /tmp
para printar uma mensagem no terminal. Execute-o e depois remova-o.
Dispositivos
No Linux, boa parte dos dispositivos do sistema são representados através de arquivos, incluindo o hardware, cujo acesso é abstraído através de arquivos de dispositivo.
Ou seja, se uma aplicação quer enviar um byte pela porta serial, ela deve escrever este byte no arquivo correspondente à porta serial.
Os arquivos de dispositivo no Linux ficam no diretório “/dev
”, que tem a seguinte correspondência com relação aos dispositivos no Windows:
Tipo | Windows | Linux |
---|---|---|
Porta Serial | COM1 | /dev/ttyS0 |
Porta Paralela | LPT1 | /dev/lp0 |
HD | C: | /dev/sda1 |
CDROM | D: | /dev/sr0 |
Ponto de montagem
Dispositivos de armazenamento, para serem utilizados, devem ser montados em um diretório do sistema operacional. Este diretório é chamado de ponto de montagem.
Por exemplo, ao inserir o pendrive em uma porta USB, será criado um arquivo de dispositivo (Ex: /dev/sdc1
). Este dispositivo deve ser montado com o comando mount
em um diretório do sistema para que se possa acessar os arquivos do pendrive:
sudo mount /dev/sdc1 /mnt/pendrive
No exemplo acima, o pendrive estará acessível através do diretório /mnt/pendrive
. Perceba a necessidade do comao entrar no diretório da ao entrar no diretório dao entrar no diretório da ao entrar no diretório dando sudo
antes do mount
, já que o mount
requer permissões de root para execução.
Após o uso, o pendrive deve ser desmontado com o comando:
sudo umount /dev/sdc1
CUIDADO! Se você não desmontar, corre o risco de perder as alterações realizadas no pendrive!
O nome atribuído ao seu dispositivo é normalmente dinâmico. Existem algumas técnicas e ferramentas disponíveis que podem nos ajudar a descobrir o nome do arquivo associado ao dispositivo.
Uma delas é usando a ferramenta fdisk
, conforme abaixo:
sudo fdisk -l
Disk /dev/sda: 447,1 GiB, 480103981056 bytes, 937703088 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 0E18D5E1-5210-47B3-A1FB-73F4C8699FEF
Device Start End Sectors Size Type
/dev/sda1 2048 1050623 1048576 512M EFI System
/dev/sda2 1050624 935700479 934649856 445,7G Linux filesystem
/dev/sda3 935700480 937701375 2000896 977M Linux swap
Disk /dev/sdb: 7,5 GiB, 8086618112 bytes, 15794176 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe0e0a313
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 15794175 15792128 7,5G c W95 FAT32 (LBA)
Você pode também listar o arquivo /proc/partitions
:
cat /proc/partitions
major minor #blocks name
8 0 468851544 sda
8 1 524288 sda1
8 2 467324928 sda2
8 3 1000448 sda3
8 16 7897088 sdb
8 17 7896064 sdb1
Outra forma é usando olhando as mensagens do kernel com o comando dmesg. Para isso, conecte o dispositivo, execute o comando dmesg
e olhe as últimas linhas da saída do comando.
Estas foram atividades básicas para conhecer o shell e o ambiente Linux. É extremamente aconselhável um estudo mais completo usando o Guia Foca Linux ou outro livro qualquer que explique bem o funcionamento de sistemas operacionais baseados em Linux.
- Guia Foca Linux – documento “GuiaFocaLinux.pdf” disponível em “docs/guides/”.
- Canivete suíço do Shell – documento “canivete-shell.pdf” disponível em “docs/guides/”.
- Guia de referência do vi – documento “vi.pdf” disponível em “docs/guides/”.
- Guia de referência do Shell – documento “shell.pdf” disponível em “docs/guides/”.
[LAB] Configurando o Ambiente de Trabalho
Configuração Inicial
Devido ao limitado tempo de aula em função da quantidade de conteúdo a ser visto, seria inapropriado realizar o download das diversas ferramentas, códigos fontes, documentos, dentre outros, necessários para a realização das atividade práticas deste treinamento, Assim, todo o material julgado necessário para a realização das atividades foi previamente baixado e compilado em um único tarball.
O objetivo desta atividade é extrair o conteúdo desse tarball, analisá-lo e familiarizar-se com o ambiente de trabalho que será utilizado ao longo de todo o treinamento.
Configurando o ambiente de trabalho
Faça download e extraia o arquivo dsle20.tar.xz
:
cd
wget http://brandaogbs.github.io/linux/dsle20.tar.xz
tar xvf dsle20.tar.xz
O comando cd
é utilizado para a navegação entre os diretórios do Linux, executando-o sem argumentos vamos para a pasta home
do usuário que estamos logados. O comando wget
é utilizado para fazer o download de um diretório web, neste caso o repositório com o tarball do curso. Por fim, o comando tar
é utilizado para a manipulação de arquivos tarball enquanto o primeiro argumento xvf
é referente a operação de extração-verbose-arquivo, ao passo que o segundo argumento diz respeito ao arquivo tarball.
Quando houver dúvida/curiosidade sobre os comandos utilizados é possível utilizar o comando man
no terminal do Linux, este retorna o descritivo do comando desejado. Por exemplo: man cd
, man wget
e man tar
. Esta função será utilizada com frequência durante o curso.
Ao finaliza o procedimento de extração, todo o centeúdo do tarball estará disponível na recém criada pasta dsle20
, dentro do diretório home
do usuário logado (~/dsle20). Este diretório possui a seguinte estrutura.
+dsle20
|
+---+dl
|
+---+docs
| |
| +---+guides
| |
| +---+hardware
| |
| +---+training
|
+---+exs
O diretório dl
contém todos os componentes que foram baixados. Durante a realização dos exercícios, os comandos comuns de download (wget
) e clonagem de repositório (git clone
) serão substituídos pelo processo de extrair esses componentes. Cada atividade conterá as informações necessárias para realização de tal procedimento.
O diretório docs
contém uma documentação de apoio para consulta durante o treinamento. Neste diretório, estão contidos pdfs relacionados ao hardware da RaspberryPi, tabelas de comandos do shell, vi, guia introdutório do Ubuntu e kernel Linux, por exemplo.
O diretório training
contém a Agenda, Slides e Atividades de Laboratório (este documento).
O diretório exs
será dedicado a realização dos exercícios. A fim de manter uma estrutura organizada, cada exercício será realizado dentro de seu próprio diretório .