Um dedo de prosa sobre Linux
Durante minha experiência na D3 tive a oportunidade de participar do D3 Lab um time de colaboração interno, lá faziamos semanalmente lives sobre algum conteúdo relacionado à tecnologia. Queríamos conversar inicialmente sobre segurânça, e nada melhor do que começar com um assunto que todos tanto na área de segurança, como na área de desenvolvimento, irão ter que lidar mesmo não sendo o sistema principal de desenvolvimento. Lidando com coisas como Docker para fazer o deploy de seu sistema online, e tenho certeza que será em um linux se não estiver utilizando ferramentas exclusivas.
O que é linux?
Aqui as pessoas menos inseridas nesse mundo quase "underground" se confundem muito, primeiramente linux não é um Sistema Operacional, e um tanto mais complicado de se explicar, linux é um Kernel criado por linus Torvalds, e kernel por sua vez é o núcleo central que se comunica com a máquina, e ele pode ser utilizado como base para sistemas operacionais completos com libs e aplicações.
Para nos aprofundar um tanto mais, acho que podemos destrinchar um pouco desses conceitos...
Sistema Operacional
Sistema Operacional é uma soma entre vários componentes com responsabilidades diferentes, basicamente o kernel (que vem de núcleo), as bibliotecas (abstrações para interação com o kernel), as aplicações e o shell (a casca de interação direta com o usuario).
Kernel
É o Nucleo do Sistema Operacional, é o responsável por conversar diretamente com o processador.
Library
São bibliotecas padrões que se comunicam diretamente com o kernel através das SysCalls (chamadas de sistema).
Essas SysCalls são funções pra coisas como:
- Ler - read
- Escrever - write
- Abrir - open
- Fechar - close
- Desligar - shutdown
- Tabela com as syscalls no linux
UserLand
É onde seu chrome, vscode e spotify rodam, além de bibliotecas de alto nível, ou até mesmo o seu Shell, que pode ser um bash ou zsh da vida, ou a sua interface gráfica, esteja ela em Windows, Mac ou em um Linux.
Então o que é linux?
Linux é nada mais que um kernel, ele está lá controlando todas as chamadas a funções de hardware e fazendo essa ponte para as bibliotecas na camada de cima. Ele foi criado pelo maravilhosíssimo Linus Torvalds, em 1991, utilizando a biblioteca padrão criada pelo projeto GNU (PS: O GNU criou o conjunto de bibliotecas junto com o kernel hurd, mas o hurd desde aquela época não evoluiu quase nada e ainda é instável, mas por ter essas bibliotecas no linux, algumas pessoas o chamam de GNU/LINUX, mas que fique claro que são projetos diferentes e independentes).
Uma outra coisa que é bom de relembrar é que o Linux não é um UNIX, mas um clone dele, então costumam dizer que eles estão na mesma família mas são quase irmãos adotivos, isso porque a base do linux foi criada toda do zero pelo Torvalds, mas usando o mesmo padrão POSIX que o UNIX original seguia, por isso tem muita coisa semelhante, mas os binários que rodam em um não rodam em outro.
- Existem diversos filhos biológicos na família, alguns deles são os BSDs, o Solaris, o Minix, o Darwin..
Quais as principais diferenças entre Linux, Mac e Windows?
Basicamente em primeiro lugar, o Kernel, e isso faz total diferença já que quando o kernel muda, necessariamente as bibliotecas que se comunicam com o Kernel mudam também, e consequentemente toda a UserLand sofre com isso..
Mas se fossemos colocar em um nível de distância, o Linux e o Mac (Dois irmãos brigões diga-se de passagem) estão a milhares de anos luz de distancia do primo terraplanista Windows.
"C:" vs. "/"
Fato de o Darwin (kernel do Mac) e o Linux serem "UNIX" eles tem diversas semelhanças notáveis, como a "/" (a raiz do sistema, do ingles "root"), e os dispositivos representados como arquivos em pastas como "/dev" no linux, (não sei onde isso fica no Mac, mas saiba que o funcionamento é semelhante) enquanto no Windows os dispositivos ganham uma letra (como C:) e (pelo menos os de armazenamento) tem uma raiz própria.
Por que "*.EXE" não roda no linux?
Basicamente todo o binário (código executável), de um Windows, os famosos .Exe fazem chamadas para o Kernel do windows (o NT Kernel), e o kernel linux simplesmente não entende. É o mesmo que falar português com uma pessoa que só sabe falar chinês...
E por isso, se tu colocar um interprete no meio isso torna possível, exatamente o que o wine faz.
Por que se usa tanto terminal em linux?
Grande parte dos motivos para usar Linux, são pelas vantagens de ferramentas de desenvolvimento e de deploy em servidores, e a maioria delas não tem interface gráfica, o que não significa que você precise de terminal para coisas comuns...
Então criar arquivos, documentos, navegar na internet e esse tipo de tarefa comum, da pra fazer totalmente em modo gráfico.
Oque são Distribuições Linux?
São sistemas operacionais que usam o Kernel Linux, e eles possuem seus próprios públicos alvos, objetivos e customizações tanto diretamente no Kernel, quanto em suas aplicações e shell.
Geralmente as coisas mais importantes em uma distribuição são os gerenciadores de pacotes, de daemons e as customizações no kernel focadas em algum objetivo.
Mas normalmente elas também tem uma interface gráfica especifica e ferramentas próprias por padrão.
Gerenciadores de pacotes
Basicamente são ferramentas para facilitar a instalação, atualização e desinstalação de aplicações e bibliotecas de um sistema, além de também servirem para empacotar aplicações.
Os mais famosos gerenciadores de pacotes são os usados pelas distribuições com maiores famílias:
- rpm, dnf e yum - Red Hat
- O rpm é o gerenciador de pacote e o dnf e yum, são interfaces para facilitar o uso do rpm além de serem usados também para fazer download automático dos pacotes.
- dpkg, apt e apt-get - Debian
- O mesmo caso do Red Hat, onde o dpkg é o gerenciador de pacotes e o apt e apt-get são as abstrações.
- pacman, AUR - Arch Linux
- Diferente dos anteriores o pacman não precisa de abstrações, e o AUR ta mais pra um repositório da comunidade de usuários, onde qualquer um pode empacotar um sofware pro Arch, geralmente usam-se os AUR Helpers pra baixar deles, um dos melhores é o yay.
Gerenciadores de Daemon
São ferramentas pra gerenciar os serviços que rodam em segundo plano, os famosos demônios que agem sem nossa interferência com privilégios de ROOT.
Coisas como os Servidores Gráficos, serviços de bluetooth, serviços de SSH, drivers de dispositivos e etc.
- Systemd
- Init
- UpStart
E o que significa uma distro ser baseada em outra?
Basicamente você tem duas formas de criar uma distro Linux, tu pode criar "from scratch", onde tu pega o kernel e cria/coloca coisas como gerenciador de pacotes, gerenciador de daemons, e etc. tudo manualmente, e assim tem que criar servidores próprios para os pacotes que sua distro vai usar e além disso tem que compilar um a um todos, empacotar e upar nesse servidor.
Ou tu pode escolher uma distro que já tem todo esse eco-sistema e criar apenas as customizações que você gostaria que ela tivesse.
Principais Distros
As maiores e mais populares distribuições linux:
- Android
- NetHunter
- Red Hat
- Fedora
- Debian
- Ubuntu
- Mint
- Kali Linux
- Ubuntu
- Arch Linux
- Manjaro
- Gentoo
- Funtoo
Usuário ROOT e o poder do kernel
Basicamente o "usuário raiz", é aquele que tem super poderes e tem permissões de nível superior dentro do linux. Ele é o único que pode iniciar daemons (são mais poderosos que os demônios), e coisas como apagar a "/".
Qualquer outro usuário só tem poder dentro de sua pasta pessoal "/home/nutela", por isso é preciso usar "sudo" para rodar comandos com permissões de root
- su: super user - do: faça → faça como super usuário
Rings
E agente chama o root de super, mas ele só é super no nível das aplicações, existe uma coisa que chamamos de ring, que vai do 0 ao 3, o 0 sendo o maior nível de poder sobre o hardware:
O kernel obviamente é deus comparado ao root que roda em ring 3, junto com as aplicações.
Principais comandos
1. ls
O ls
lista os arquivos e pastas.
2. df
Com o comando df
você pode pegar informações sobre os dispositivos de armazenamento do seu computador.
3. top
O comando top
é feito pra gerenciar processos rodando no seu sistema.
4. cd
O cd
é usado para mudar de diretório.
5. mkdir
Com mkdir
você pode criar uma pasta nova.
6. rm
Utilize o comando rm
sempre que você desejar remover um arquivo ou diretório.
7. cat
Com o apoio do cat
o terminal abrirá um arquivo selecionado pelo usuário.
8. vi
O vi
abre um editor de texto com uma interface minimalista.
9**. passwd
**
O passwd
é usado pra gerenciar os usuários dentro do sistema.
10**. chown
**
O chown
é usado pra trocar os arquivos de dono dentro do sistema.
11**. chmod
**
Com o chmod
você pode modificar as permissões de um arquivo ou diretório.
12. cp
Adote o cp
sempre que precisar copiar arquivos entre diretórios.
13. file
O comando file
é usado para pegar informações sobre algum arquivo.
14. grep
Com o grep
você pode pesquisar em arquivos de texto.
15. pwd
O pwd
exibe rapidamente o endereço do diretório que está ativo.
15. cut
O cut
corta um texto e exibe o que você o configura pra exibir.
17**. man
**
O man
é o manual com os modos de uso dos comandos e ferramentas do seu linux.
Filosofia UNIX por trás dos comandos
Essa filosofia é basicamente, faça apenas uma coisa, mas faça ela bem. E é por isso que grande parte dos comandos linux faz exatamente isso, mas pra que agente consiga usar várias coisas agente basicamente acopla um comando em outro utilizando |
, >
, >>
, &&
, ||
e várias outras simbologias, assim criando linhas de comando que conseguem fazer muito mais que seus comandos sozinhos poderiam fazer.
Exemplos:
- /home/nutella/hello.c
#include <stdio.h>
int main() {
puts("Hello World!");
return 0;
}
Eu quero exibir na tela apenas o que esta entre os parenteses do puts
.
$ cat /home/nutella/hello.c | grep 'puts' | cut -d'(' -f2 | cut -d')' -f1
"Hello World"
exibe o texto do arquivo | busca a linha com puts | corta os "(" e exibe a 2 coluna | corta os ")" e exibe a 1 coluna
Eu quero que ele exibar "Ola mundo"
se tiver um hello no arquivo se não ele escreve "tchauzinho"
.
$ cat /home/nutella/hello.c | grep 'hello' && echo 'Ola mundo' || echo 'Tchauzinho'
exibe o texto do arquivo | busca a linha com hello | escreve Ola mundo se o comando anterior funcionar | escreve tchauzinho se o commando não funcionar
Ou mandar isso pra um outro arquivo.
$ cat /home/nutella/hello.c | grep 'hello' && echo 'Ola mundo' || echo 'Tchauzinho' > j.txt
- O
>
limpa o arquivo e escreve a saída nele, e o>>
adiciona a saída no final do arquivo (caso o arquivo não exista ambos criam o arquivo)
github/plankiton