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).

Esqueleto de um sistema operacional completo

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:

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).

Linus Torvalds, the Linux creator

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.

Quais as principais diferenças entre Linux, Mac e Windows?

Linux vs Mac vs 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:

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.

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:

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

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:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6c0086b3-7053-49e9-8fc7-31220a31eab2/Untitled.png

O kernel obviamente é deus comparado ao root que roda em ring 3, junto com as aplicações.

Principais comandos

1. ls

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

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

vi abre um editor de texto com uma interface minimalista.

9**. passwd**

passwd é usado pra gerenciar os usuários dentro do sistema.

10**. chown**

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

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**

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:

#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"

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'

Ou mandar isso pra um outro arquivo.

$ cat /home/nutella/hello.c | grep 'hello' && echo 'Ola mundo' || echo 'Tchauzinho' > j.txt
© Yaks Souzalinkedin/in/plankiton
github/plankiton