4.3 Lição 1
Certificação: |
Linux Essentials |
---|---|
Versão: |
1.6 |
Tópico: |
4 O sistema operacional Linux |
Objetivo: |
4.3 Onde os dados são armazenados |
Lição: |
1 de 2 |
Introdução
Um sistema operacional considera que tudo são dados. Para o Linux, tudo é considerado como um arquivo: programas, arquivos regulares, diretórios, dispositivos de bloco (como os discos rígidos), dispositivos de caracteres (como os consoles), processos do kernel, sockets, partições, links etc. A estrutura de diretórios do Linux , começando com o root /
, é uma coleção de arquivos que contêm dados. Essa redução de tudo a arquivos é um recurso poderoso do Linux, pois permite refinar praticamente todos os aspectos do sistema.
Nesta lição, discutiremos os diferentes locais em que dados importantes são armazenados, conforme estabelecido pelo Linux Filesystem Hierarchy Standard (FHS). Alguns desses locais são diretórios reais que armazenam dados de maneira permanente em discos, enquanto outros são pseudo-sistemas de arquivos carregados na memória que nos dão acesso aos dados do subsistema do kernel, como processos em execução, uso de memória, configuração de hardware e assim por diante. Os dados armazenados nesses diretórios virtuais são usados por uma série de comandos que nos permitem monitorar e manipular esses dados.
Programas e suas configurações
Sem a menor dúvida, os dados importantes de um sistema Linux são seus programas e os arquivos de configuração correspondentes. Os primeiros são arquivos executáveis que contêm conjuntos de instruções a serem executadas pelo processador do computador, ao passo que os últimos geralmente consistem em documentos de texto que controlam a operação de um programa. Os arquivos executáveis podem ser arquivos binários ou de texto. Os arquivos de texto executáveis são chamados de scripts. Os dados de configuração no Linux também são tradicionalmente armazenados em arquivos de texto, embora existam diversos estilos de representação de dados de configuração.
Onde os arquivos binários são armazenados
Como qualquer outro arquivo, os arquivos executáveis vivem em diretórios vinculados a /
. Mais especificamente, os programas são distribuídos em uma estrutura de três camadas: a primeira camada (/
) inclui os programas que podem ser necessários no modo de usuário único, a segunda camada (/usr
) contém a maioria dos programas multiusuários e a terceira camada (/usr/local
) é usada para armazenar o software que não é fornecido pela distribuição e foi compilado localmente.
Tipicamente, os programas estão nestes locais:
/sbin
-
Contém binários essenciais para a administração do sistema, como
parted
ouip
. /bin
-
Contém binários essenciais para todos os usuários, como
ls
,mv
oumkdir
. /usr/sbin
-
Armazena binários para administração do sistema, como
deluser
ougroupadd
. /usr/bin
-
Inclui a maioria dos arquivos executáveis - como
free
,pstree
,sudo
orman
— que podem ser acessados por todos os usuários. /usr/local/sbin
-
Usado para armazenar programas instalados localmente para a administração do sistema e que não são gerenciados pelo gerenciador de pacotes do sistema.
/usr/local/bin
-
Tem a mesma finalidade de
/usr/local/sbin
, mas para programas comuns de usuário.
Recentemente, algumas distribuições começaram a substituir /bin
e /sbin
por links simbólicos para /usr/bin
e /usr/sbin
.
Note
|
O diretório |
Além desses diretórios, os usuários comuns podem ter seus próprios programas em:
-
/home/$USER/bin
-
/home/$USER/.local/bin
Tip
|
Para descobrir quais diretórios estão disponíveis para executar binários, referencie a variável |
Podemos encontrar o local dos programas com o comando which
:
$ which git /usr/bin/git
Onde os arquivos de configuração são armazenados
O Diretório /etc
Nos primeiros dias do Unix, havia uma pasta para cada tipo de dados, como /bin
para binários e /boot
para o(s) kernel(s). No entanto, /etc
(que significa literalmente et cetera) foi criado como um diretório abrangente para armazenar todos os arquivos que não pertenciam às outras categorias. A maioria deles eram arquivos de configuração. Com o passar do tempo, mais e mais arquivos de configuração foram adicionados, de modo que o /etc
se tornou a pasta principal dos arquivos de configuração dos programas. Como já explicamos, um arquivo de configuração geralmente é um arquivo local de texto puro sem formatação (diferente de um arquivo binário) que controla a operação de um programa.
No /etc
, encontramos diferentes padrões para os nomes dos arquivos de configuração:
-
Arquivos com extensão ad hoc ou sem extensão, como por exemplo
group
-
Banco de dados de grupo do sistema.
hostname
-
Nome do computador na rede.
hosts
-
Lista de endereços IP com sua tradução em nomes de computadores na rede.
passwd
-
Banco de dados do usuário do sistema — composto por sete campos separados por dois pontos, fornecendo informações sobre o usuário.
profile
-
Arquivo de configuração de todo o sistema para o Bash.
shadow
-
Arquivo criptografado para as senhas de usuário.
-
Arquivos de inicialização terminados em
rc
:bash.bashrc
-
Arquivo
.bashrc
de todo o sistema para shells bash interativos. nanorc
-
Exemplo de arquivo de inicialização para o GNU nano (um editor de texto simples que normalmente é fornecido com qualquer distribuição).
-
Arquivos terminados em
.conf
:resolv.conf
-
Arquivo de configuração do resolvedor — que fornece acesso ao DNS (Internet Domain Name System).
sysctl.conf
-
Arquivo de configuração para definir variáveis de sistema para o kernel.
-
Diretórios com sufixo
.d
:Alguns programas com um arquivo de configuração exclusivo (
*.conf
ou outro) trazem um diretório*.d
dedicado que ajuda a criar configurações modulares e mais robustas. Por exemplo, para configurar o logrotate, encontramos o diretóriologrotate.conf
, mas também os diretórioslogrotate.d
.Esse tratamento é útil nos casos em que aplicativos diferentes precisam de configurações para um mesmo serviço específico. Se, por exemplo, um pacote de servidor web contiver uma configuração de logrotate, essa configuração poderá ser posta em um arquivo dedicado no diretório
logrotate.d
. Esse arquivo pode ser atualizado pelo pacote do servidor web sem interferir na configuração restante de logrotate. Da mesma forma, os pacotes podem adicionar tarefas específicas colocando arquivos no diretório/etc/cron.d
em vez de modificar/etc/crontab
.No Debian - e derivados do Debian - essa abordagem foi aplicada à lista de fontes confiáveis lidas pela ferramenta de gerenciamento de pacotes
apt
: além do clássico/etc/apt/sources.list
, agora encontramos o diretório/etc/apt/sources.list.d
:$ ls /etc/apt/sources* /etc/apt/sources.list /etc/apt/sources.list.d:
Arquivos de configuração em HOME
(Dotfiles)
No nível do usuário, os programas armazenam suas configurações e arquivos em arquivos ocultos no diretório inicial do usuário (também representado como ~
). Lembre-se de que os arquivos ocultos começam com um ponto (.
), donde o nome: dotfiles.
Alguns desses dotfiles são scripts Bash que personalizam a sessão de shell do usuário, originados assim que o usuário faz login no sistema:
.bash_history
-
Armazena o histórico da linha de comando.
.bash_logout
-
Inclui comandos a executar quando o usuário sai do shell de login.
.bashrc
-
Script de inicialização do Bash para shells não-login.
.profile
-
Script de inicialização do Bash para shells de login.
Note
|
Consulte a lição “As bases da linha de comando” para aprender mais sobre o Bash e seus arquivos de inicialização. |
Outros arquivos de configuração específicos ao usuário são obtidos na inicialização dos programas respectivos: .gitconfig
, .emacs.d
, .ssh
etc.
O kernel do Linux
Antes que qualquer processo possa ser executado, o kernel deve ser carregado em uma área protegida da memória. Depois disso, o processo com o PID 1
(quase sempre o systemd
hoje em dia) desencadeia a cadeia de processos, ou seja, um processo inicia outro(s) e assim por diante. Uma vez que os processos estão ativos, o kernel do Linux é encarregado de alocar recursos para eles (teclado, mouse, discos, memória, interfaces de rede etc.).
Note
|
Antes do |
Onde os Kernels estão armazenados: /boot
O kernel reside em /boot
, junto com outros arquivos relacionados à inicialização. A maioria desses arquivos inclui os componentes do número da versão do kernel em seu nome (versão do kernel, revisão principal, revisão secundária e número do patch).
O diretório /boot
inclui os seguintes tipos de arquivos, com nomes correspondentes à respectiva versão do kernel:
config-4.9.0-9-amd64
-
Definições de configuração do kernel, como opções e módulos que foram compilados junto com o kernel.
initrd.img-4.9.0-9-amd64
-
Imagem de disco RAM inicial que ajuda no processo de inicialização, carregando um sistema de arquivos root temporário na memória.
System-map-4.9.0-9-amd64
-
O arquivo` System-map` (em certos sistemas,
System.map
) contém localizações de endereços de memória para nomes de símbolos do kernel. Cada vez que um kernel é reconstruído, o conteúdo do arquivo muda, pois as localizações da memória podem ser diferentes. O kernel usa este arquivo para procurar localizações de endereços de memória para um símbolo do kernel determinado, ou vice-versa. vmlinuz-4.9.0-9-amd64
-
O kernel propriamente dito, em um formato compactado de extração automática (vem daí o
z
invmlinuz
;vm
significa memória virtual e começou a ser usado quando o kernel começou a ter suporte a memória virtual). grub
-
Diretório de configuração do gerenciador de inicialização
grub2
.
Tip
|
Por se tratar de um recurso crítico do sistema operacional, mais de um kernel e seus arquivos associados são mantidos em |
O diretório /proc
O diretório /proc
é um dos chamados sistemas de arquivos virtuais ou pseudo-sistemas de arquivos, pois seu conteúdo não é gravado no disco, mas carregado na memória. Ele é preenchido de forma dinâmica sempre que o computador é inicializado e reflete constantemente o estado atual do sistema. O /proc
inclui informações sobre:
-
Processos em execução
-
Configuração do kernel
-
Hardware do sistema
Além de todos os dados referentes aos processos que veremos na próxima lição, esse diretório também armazena arquivos com informações sobre o hardware do sistema e as definições de configuração do kernel. Alguns desses arquivos são:
/proc/cpuinfo
-
Armazena informações sobre a CPU do sistema:
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 158 model name : Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz stepping : 10 cpu MHz : 3696.000 cache size : 12288 KB (...)
/proc/cmdline
-
Armazena as strings passadas para o kernel na inicialização:
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=UUID=5216e1e4-ae0e-441f-b8f5-8061c0034c74 ro quiet
/proc/modules
-
Mostra a lista de módulos carregados no kernel:
$ cat /proc/modules nls_utf8 16384 1 - Live 0xffffffffc0644000 isofs 40960 1 - Live 0xffffffffc0635000 udf 90112 0 - Live 0xffffffffc061e000 crc_itu_t 16384 1 udf, Live 0xffffffffc04be000 fuse 98304 3 - Live 0xffffffffc0605000 vboxsf 45056 0 - Live 0xffffffffc05f9000 (O) joydev 20480 0 - Live 0xffffffffc056e000 vboxguest 327680 5 vboxsf, Live 0xffffffffc05a8000 (O) hid_generic 16384 0 - Live 0xffffffffc0569000 (...)
O diretório /proc/sys
Este diretório inclui as definições de configuração do kernel em arquivos classificados em categorias por subdiretório:
$ ls /proc/sys abi debug dev fs kernel net user vm
A maioria desses arquivos funciona como um interruptor e — portanto — só contém um dentre dois valores possíveis: 0
ou 1
(“ligado” ou “desligado”). Por exemplo:
/proc/sys/net/ipv4/ip_forward
-
O valor que habilita ou desabilita a máquina para atuar como roteador (capaz de encaminhar pacotes):
$ cat /proc/sys/net/ipv4/ip_forward 0
Porém, há algumas exceções:
/proc/sys/kernel/pid_max
-
O PID máximo permitido:
$ cat /proc/sys/kernel/pid_max 32768
Warning
|
Tenha muito cuidado ao alterar as configurações do kernel, pois o valor errado pode causar instabilidade no sistema. |
Dispositivos de hardware
Lembre-se, no Linux “tudo é arquivo”. Ou seja, as informações sobre o hardware do dispositivo, bem como as próprias configurações do kernel, são todas armazenadas em arquivos especiais que residem em diretórios virtuais.
O diretório /dev
O diretório device (dispositivo) /dev
contém arquivos (ou nós) de dispositivos para todos os dispositivos de hardware conectados. Esses arquivos de dispositivo são usados como interface entre os dispositivos e os processos que os utilizam. Cada arquivo de dispositivo se enquadra em uma destas duas categorias:
- Dispositivos de bloco
-
São aqueles em que os dados são lidos e gravados em blocos que podem ser endereçados individualmente. Podemos dar como exemplo os discos rígidos (e suas partições, como
/dev/sda1
), as unidades flash USB, CDs, DVDs etc. - Dispositivos de caracteres
-
são aqueles em que os dados são lidos e gravados sequencialmente, um caractere de cada vez, como é o caso dos teclados, console de texto (
/dev/console
), portas seriais (como/dev/ttyS0
e outras) etc.
Ao listar os arquivos do dispositivo, use ls
com a opção -l
para diferenciar os dois. Podemos — por exemplo — verificar discos rígidos e partições:
# ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 may 25 17:02 /dev/sda brw-rw---- 1 root disk 8, 1 may 25 17:02 /dev/sda1 brw-rw---- 1 root disk 8, 2 may 25 17:02 /dev/sda2 (...)
Ou para terminais seriais (TeleTYpewriter):
# ls -l /dev/tty* crw-rw-rw- 1 root tty 5, 0 may 25 17:26 /dev/tty crw--w---- 1 root tty 4, 0 may 25 17:26 /dev/tty0 crw--w---- 1 root tty 4, 1 may 25 17:26 /dev/tty1 (...)
Observe que o primeiro caractere é b
para dispositivos de bloco e c
para dispositivos de caracteres.
Tip
|
O asterisco ( |
Além disso, /dev
inclui alguns arquivos especiais bastante úteis para diferentes finalidades de programação:
/dev/zero
-
Fornece tantos caracteres nulos quantos solicitados.
/dev/null
-
Também chamado de balde de bits. Descarta todas as informações enviadas para ele.
/dev/urandom
-
Gera números pseudo-aleatórios.
O diretório /sys
O sistema de arquivos sys (sysfs
) é montado em /sys
. Foi introduzido com a chegada do kernel 2.6 e representou um grande progresso em /proc/sys
.
Os processos têm de interagir com os dispositivos em /dev
e, portanto, o kernel precisa de um diretório que contenha informações sobre esses dispositivos de hardware. Esse diretório é o /sys
, e seus dados são organizados em categorias. Por exemplo, para verificar o endereço MAC da sua placa de rede (enp0s3
), aplicaríamos cat
no seguinte arquivo:
$ cat /sys/class/net/enp0s3/address 08:00:27:02:b2:74
Memória e tipos de memória
Basicamente, para um programa começar a rodar, ele precisa ser carregado na memória. De modo geral, quando falamos de memória, nos referimos à Memória de Acesso Randômico (RAM), que — quando comparada aos discos rígidos mecânicos — tem a vantagem de ser muito mais rápida. Pelo lado negativo, ela é volátil (ou seja, quando o computador é desligado, os dados desaparecem).
Não obstante o mencionado acima, quando se trata de memória, podemos diferenciar dois tipos principais em um sistema Linux:
- Memória física
-
Também conhecida como RAM, vem na forma de chips compostos de circuitos integrados contendo milhões de transistores e capacitores. Estes, por sua vez, formam células de memória (o componente básico da memória do computador). Cada uma dessas células tem um código hexadecimal associado — um endereço de memória — que pode ser referenciado quando necessário.
- Swap
-
Também conhecida como memória de troca, é a parte da memória virtual que fica no disco rígido e é usada quando não há mais RAM disponível.
Por outro lado, existe o conceito de memória virtual, que é uma abstração da quantidade total de memória utilizável, incluindo a memória (a RAM, mas também o espaço em disco) tal como é vista pelos aplicativos.
free
analisa/proc/meminfo
e exibe a quantidade de memória livre e usada no sistema de maneira bem clara
$ free total used free shared buff/cache available Mem: 4050960 1474960 1482260 96900 1093740 2246372 Swap: 4192252 0 4192252
Vamos entender melhor as diferentes colunas:
total
-
Quantidade total de memória física e de troca instalada.
used
-
Quantidade de memória física e de troca atualmente em uso.
free
-
Quantidade de memória física e de troca que não está atualmente em uso.
shared
-
Quantidade de memória física usada — principalmente — por
tmpfs
. buff/cache
-
Quantidade de memória física atualmente em uso pelos buffers do kernel, a cache e as slabs.
available
-
Estimativa da memória física disponível para novos processos.
Por padrão, free
mostra valores em kibibytes, mas permite uma variedade de opções para exibir os resultados em diferentes unidades de medida. Algumas dessas opções são:
-b
-
Bytes.
-m
-
Mebibytes.
-g
-
Gibibytes.
-h
-
Formato legível por humanos.
-h
sempre é confortável de ler:
$ free -h total used free shared buff/cache available Mem: 3,9G 1,4G 1,5G 75M 1,0G 2,2G Swap: 4,0G 0B 4,0G
Note
|
Um kibibyte (KiB) é igual a 1.024 bytes, enquanto um kilobyte (KB) é igual a 1000 bytes. O mesmo se aplica, respectivamente, a mebibytes, gibibytes etc. |
Exercícios Guiados
-
Use o comando
which
para descobrir a localização dos seguintes programas e preencha a tabela:Programa comando which
Caminho para o executável (saída) O usuário precisa de privilégios de root
?swapon
kill
cut
usermod
cron
ps
-
Onde se encontram os arquivos a seguir?
Arquivo /etc
~
.bashrc
bash.bashrc
passwd
.profile
resolv.conf
sysctl.conf
-
Explique o significado dos elementos numéricos no arquivo do kernel
vmlinuz-4.15.0-50-generic
encontrado em/boot
:Elemento numérico Significado 4
15
0
50
-
Qual comando você usaria para listar todos os discos rígidos e partições em
/dev
?
Exercícios Exploratórios
-
Os arquivos de dispositivo para discos rígidos são representados com base nos controladores que eles usam — vimos
/dev/sd*
para unidades que usam SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), mas-
Como as antigas unidades IDE (Integrated Drive Electronics) eram representadas?
-
E as unidades NVMe (Non-Volatile Memory Express) modernas?
-
-
Analise o arquivo
/proc/meminfo
. Compare o conteúdo desse arquivo com a saída do comandofree
e identifique qual chave de/proc/meminfo
corresponde aos campos seguintes na saída defree
:saída de free
campo /proc/meminfo
total
free
shared
buff/cache
available
Resumo
Nesta lição, você aprendeu sobre a localização dos programas e seus arquivos de configuração em um sistema Linux. O que é importante lembrar:
-
Basicamente, os programas são encontrados em uma estrutura de diretórios em três níveis:
/
,/usr
e/usr/local
. Cada um desses níveis pode conter diretóriosbin
esbin
. -
Os arquivos de configuração são armazenados em
/etc
e~
. -
Os dotfiles são arquivos ocultos que começam com um ponto (
.
).
Também falamos sobre o kernel do Linux. Conceitos importantes:
-
Para o Linux, tudo é arquivo.
-
O kernel do Linux mora em
/boot
, junto com outros arquivos relacionados à inicialização. -
Para os processos começarem a rodar, o kernel precisa ser carregado primeiro em uma área protegida da memória.
-
O trabalho do kernel é alocar recursos do sistema aos processos.
-
O sistema de arquivos virtual (ou pseudo)
/proc
armazena dados importantes do kernel e do sistema de forma volátil.
Da mesma forma, exploramos os dispositivos de hardware e aprendemos o seguinte:
-
O diretório
/dev
armazena arquivos especiais (também chamados de nós) para todos os dispositivos de hardware conectados: dispositivos de bloco ou dispositivos de caracteres. Os primeiros transferem os dados em blocos; os outros, um caractere de cada vez. -
O diretório
/dev
também contém outros arquivos especiais como/dev/zero
,/dev/null
ou/dev/urandom
. -
O diretório
/sys
armazena informações sobre dispositivos de hardware, organizadas em categorias.
Finalmente, falamos um pouco da memória. Nós aprendemos que:
-
Um programa roda quando é carregado na memória.
-
O que é RAM (Memória de Acesso Randômico).
-
O que é Swap ou troca.
-
Como exibir o uso da memória.
Comandos usados nesta lição:
cat
-
Concatena/imprime o conteúdo do arquivo.
free
-
Exibe a quantidade de memória livre e usada no sistema.
ls
-
Lista o conteúdo do diretório.
which
-
Mostra a localização do programa.
Respostas aos Exercícios Guiados
-
Use o comando
which
para descobrir a localização dos seguintes programas e preencha a tabela:Programa comando which
Caminho para o executável (saída) O usuário precisa de privilégios de root
?swapon
which swapon
/sbin/swapon
Sim
kill
which kill
/bin/kill
Não
cut
which cut
/usr/bin/cut
Não
usermod
which usermod
/usr/sbin/usermod
Sim
cron
which cron
/usr/sbin/cron
Sim
ps
which ps
/bin/ps
Não
-
Onde se encontram os arquivos a seguir?
Arquivo /etc
~
.bashrc
Não
Sim
bash.bashrc
Sim
Não
passwd
Sim
Não
.profile
Não
Sim
resolv.conf
Sim
Não
sysctl.conf
Sim
Não
-
Explique o significado dos elementos numéricos no arquivo do kernel
vmlinuz-4.15.0-50-generic
encontrado em/boot
:Elemento numérico Significado 4
Versão do kernel
15
Revisão importante
0
Revisão secundária
50
Número do patch
-
Qual comando você usaria para listar todos os discos rígidos e partições em
/dev
?ls /dev/sd*
Respostas aos Exercícios Exploratórios
-
Os arquivos de dispositivo para discos rígidos são representados com base nos controladores que eles usam — vimos
/dev/sd*
para unidades que usam SCSI (Small Computer System Interface) e SATA (Serial Advanced Technology Attachment), mas/dev/hd*
-
E as unidades NVMe (Non-Volatile Memory Express) modernas?
/dev/nvme*
-
-
Analise o arquivo
/proc/meminfo
. Compare o conteúdo desse arquivo com a saída do comandofree
e identifique qual chave de/proc/meminfo
corresponde aos campos seguintes na saída defree
:saída de free
campo /proc/meminfo
total
MemTotal
/SwapTotal
free
MemFree
/SwapFree
shared
Shmem
buff/cache
Buffers
,Cached
andSReclaimable
available
MemAvailable