Prévia do material em texto
Conteudista: Prof. Me. Antonio Eduardo Marques da Silva Revisão Textual: Prof.ª Dra. Selma Aparecida Cesarin Objetivo da Unidade: Como identificar onde os dados do sistema operacional Linux são armazenados, programas, kernel, monitoramento de memórias, processos e configuração de Rede básica. 📄 Material Teórico 📄 Material Complementar 📄 Referências Armazenamento, Processo e Rede Armazenamento dos Dados No Linux, o sistema operacional trata tudo como dados. Todos os elementos, como programas, arquivos regulares, diretórios, dispositivos de bloco (como discos rígidos), dispositivos de caracteres (como consoles), processos do kernel, soquetes, partições, links e muito mais, são considerados arquivos. O Linux possui uma estrutura de diretórios que tem como raiz o diretório /, contendo uma coleção de arquivos de dados. Essa abordagem de reduzir tudo a arquivos é uma das principais vantagens do Linux, pois possibilita aprimorar praticamente todos os aspectos do sistema. Página 1 de 3 📄 Material Teórico Figura 1 – Armazenamento de Dados Fonte: Freepik #ParaTodosVerem: imagem que mostra servidores posicionados ao centro e, no entorno, vários outros dispositivos de armazenamento como discos e ssds, todos em azul claro. Fim da descrição. Nesta Unidade, abordaremos os diversos locais em que informações essenciais são armazenadas, conforme definido pelo Padrão de Hierarquia do Sistema de Arquivos do Linux (Linux Filesystem Hierarchy Standard – FHS). Alguns desses locais consistem em diretórios físicos que armazenam dados permanentemente no disco, enquanto outros são pseudossistemas de arquivos carregados na memória, que nos concedem acesso aos dados do subsistema do kernel, como processos em execução, uso de memória, configuração de hardware, entre outros. Os dados armazenados nesses diretórios virtuais são utilizados por uma variedade de comandos que nos permitem monitorar e manipular essas informações de forma eficiente. Programas e suas Configurações Indiscutivelmente, os dados essenciais do sistema Linux consistem em seus programas e os respectivos arquivos de configuração. Os programas são arquivos executáveis que contêm conjuntos de instruções interpretadas pelo processador do computador, enquanto os arquivos de configuração são geralmente documentos de texto que controlam o funcionamento desses programas. Os arquivos executáveis podem ser binários ou de texto, sendo que os últimos são conhecidos como scripts. Além disso, os dados de configuração no Linux são tradicionalmente armazenados em arquivos de texto, embora haja diversos estilos de representação para esses dados de configuração. Essa flexibilidade permite uma configuração mais versátil e adaptável ao ambiente em que o sistema está sendo utilizado. Onde os Arquivos Binários são Armazenados Assim como qualquer outro arquivo, os executáveis no sistema Linux são armazenados em diretórios dentro da hierarquia do sistema. Esses diretórios estão vinculados ao diretório raiz (/). A distribuição dos programas, em geral, segue uma estrutura de três níveis: O primeiro nível (/) contém programas essenciais que podem ser necessários no modo de usuário único, que é um modo de execução especial, utilizado para realizar tarefas de manutenção e recuperação do sistema; O segundo nível (/usr) abriga a maioria dos programas destinados a serem utilizados em modo multiusuário, ou seja, quando vários usuários estão interagindo com o sistema simultaneamente; O terceiro nível (/usr/local) é destinado a armazenar software que não faz parte da distribuição do sistema operacional e foi compilado localmente. Isso, geralmente, inclui software específico do usuário ou aplicativos personalizados. Essa organização em três níveis permite uma separação clara dos programas essenciais do sistema, programas multiusuário e software de terceiros, tornando a administração e a manutenção do sistema mais eficientes e organizadas. Tipicamente, os programas estão nestes locais: Nesse caso, podemos, então, encontrar o local dos programas com o comando which: (/sbin) Contém binários essenciais para a administração do sistema, como parted ou ip; (/bin) Contém binários essenciais para todos os usuários, como ls, mv ou mkdir; (/usr/sbin) Armazena binários para administração do sistema, como deluser ou groupadd; (/usr/bin) Inclui a maioria dos arquivos executáveis, como free, pstree, sudo or man 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. Além desses diretórios descritos, os usuários comuns do sistema podem ter seus próprios programas em: (/home/$USER/bin) e (/home/$USER/.local/bin.) $ which git Nos primórdios do Unix, cada tipo de dado costumava ter sua própria pasta dedicada, como /bin para arquivos binários e /boot para o kernel. Contudo, surgiu o diretório /etc (literalmente "etc") como uma solução abrangente para armazenar todos os arquivos que não se enquadram em categorias específicas. A maioria desses arquivos são arquivos de configuração. Com o passar do tempo, à medida que mais e mais arquivos de configuração foram sendo criados, o diretório /etc se tornou o local principal para armazenar os arquivos de configuração dos programas. Como já explicado anteriormente, esses arquivos de configuração, geralmente, são simples arquivos de texto local (em oposição a arquivos binários), que controlam o funcionamento de um determinado programa. No diretório /etc, podemos encontrar diferentes padrões para identificar os nomes dos arquivos de configuração, tais como: /usr/bin/git (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; (bash.bashrc) Arquivo .bashrc de todo o sistema para shells bash interativos; Diretórios com Sufixo .d Em alguns programas, além do arquivo de configuração principal (como logrotate.conf), é comum encontrar um diretório específico com o sufixo ".d" (como logrotate.d). A finalidade desse diretório é possibilitar a implementação de configurações modulares e mais robustas. Um exemplo disso é o programa logrotate, que tem o arquivo de configuração principal logrotate.conf, mas também inclui o diretório logrotate.d. Nesse diretório, é possível adicionar arquivos de configuração adicionais, cada um com suas próprias configurações específicas. Essa abordagem modular facilita a organização das configurações e permite adicionar ou modificar configurações sem a necessidade de alterar o arquivo de configuração principal, tornando o sistema mais flexível e fácil de gerenciar. Cada arquivo dentro do diretório *.d complementa e amplia as opções do arquivo de configuração principal, permitindo personalizações mais granulares sem afetar as configurações globais do programa. Essa abordagem é especialmente útil quando diferentes aplicativos precisam de configurações para um serviço específico. Por exemplo, se um pacote de servidor web incluir uma configuração para o logrotate, essa configuração pode ser colocada em um arquivo dedicado dentro do diretório logrotate.d. Dessa forma, o pacote do servidor web pode atualizar esse arquivo sem afetar o restante da configuração do logrotate. Da mesma forma, os pacotes instalados no sistema podem adicionar tarefas específicas ao incluir arquivos no diretório /etc/cron.d,em vez de modificar diretamente o arquivo /etc/crontab. Essa abordagem modular possibilita que cada aplicativo gerencie suas próprias configurações e agendamentos de tarefas de forma independente, o que facilita a manutenção do sistema e evita conflitos entre as configurações. Um exemplo dessa abordagem modular pode ser observado no sistema Debian e em suas distribuições derivadas. Além do arquivo tradicional /etc/apt/sources.list, essas distribuições (nanorc) Exemplo de arquivo de inicialização para o GNU nano (um editor de texto simples que normalmente é fornecido com qualquer distribuição); (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. adotam o diretório /etc/apt/sources.list.d. Nesse diretório, é possível adicionar arquivos que representam listas de fontes confiáveis para o utilitário de gerenciamento de pacotes "apt". Cada arquivo contém uma lista de repositórios adicionais, permitindo que diferentes aplicativos ou componentes adicionem suas próprias fontes de pacotes sem alterar o arquivo sources.list original. Essa abordagem modular torna mais fácil e seguro adicionar, remover ou atualizar as fontes de pacotes do sistema: Arquivos de configuração em Home (Dotfiles) Quando um usuário está interagindo com um sistema, os programas costumam armazenar suas configurações e arquivos em arquivos ocultos no diretório inicial do usuário, que é representado pelo caractere "~". É essencial notar que esses arquivos ocultos têm seus nomes iniciados com um ponto (.), e por isso são chamados de "dotfiles". Dentro desses dotfiles, alguns deles são scripts Bash que personalizam a sessão do shell do usuário. Esses scripts são executados automaticamente assim que o usuário faz o login no sistema, configurando o ambiente do shell conforme as preferências do usuário. Essa personalização pode incluir definições de variáveis de ambiente, aliás, funções, e outros ajustes que tornam a experiência de uso do terminal mais adequada às necessidades do usuário. Essa capacidade de personalização por meio dos dotfiles é uma característica poderosa e flexível do sistema, permitindo que os usuários ajustem o ambiente do shell de acordo com suas preferências e fluxos de trabalho, sendo executados assim que o usuário faz login no sistema: $ ls /etc/apt/sources* /etc/apt/sources.list /etc/apt/sources.list.d: (.bash_history) Armazena todo histórico da linha de comando; (.bash_logout) Inclui comandos a executar quando o usuário sai do shell de login do Linux; O Kernel do Linux Antes que qualquer execução de processos possa acontecer, o kernel do sistema operacional Linux precisa ser carregado em uma região protegida da memória. Após esse carregamento, o processo com o PID 1 (geralmente o systemd, atualmente) inicia a cadeia de processos, em que um processo inicia outro(s) e assim por diante. Esse processo de inicialização é fundamental para que o sistema operacional e todos os seus componentes essenciais estejam prontos para uso. Uma vez que os processos estão em execução, o kernel do Linux assume a responsabilidade de alocar recursos para eles, como teclado, mouse, discos, memória, interfaces de Rede e muito mais. O kernel age como um intermediário entre o hardware do sistema e os processos em execução, garantindo que cada processo tenha acesso adequado aos recursos necessários para funcionar corretamente. Essa gerência eficiente dos recursos é essencial para o bom desempenho e a estabilidade do sistema, permitindo que os processos realizem suas tarefas de forma coordenada e segura. Figura 2 – Kernel do Linux (.bashrc) Script de inicialização do Bash para shells não login; (.profile) Script de inicialização do Bash para shells de login. #ParaTodosVerem: imagem que mostra duas caixas com os nomes kernel e software em preto respectivamente. Apresenta uma relação de confiança entre esses dois itens, por meio de setas. Fim da descrição. Onde os Kernels estão Armazenados: /boot O kernel do sistema operacional é armazenado na pasta /boot, juntamente com outros arquivos relacionados à inicialização do sistema. A maioria desses arquivos tem componentes do número da versão do kernel em seus nomes, incluindo a versão do kernel, a revisão principal, a revisão secundária e o número do patch. Dentro do diretório /boot, podemos encontrar os seguintes tipos de arquivos, cujos nomes refletem sua respectiva versão do kernel: O diretório /proc é um exemplo de sistema de arquivos virtual ou pseudossistema de arquivos, o que significa que seu conteúdo não é armazenado fisicamente em disco, mas sim carregado na (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 for reconstruído, o conteúdo do arquivo muda, pois as localizações da memória podem ser diferentes. O kernel usa esse 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 in vmlinuz; vm significa memória virtual e começou a ser usado quando o kernel começou a ter suporte para a memória virtual); (grub) Diretório de configuração do gerenciador de inicialização grub2. memória. Esse diretório é preenchido dinamicamente sempre que o computador é inicializado e reflete o estado atual do sistema em tempo real. O /proc contém informações valiosas sobre: O uso do diretório /proc é uma maneira poderosa de acessar informações em tempo real sobre o estado do sistema e seus componentes, sendo uma ferramenta valiosa para diagnóstico, monitoramento e ajustes de configurações do Linux. Na próxima lição, abordaremos os dados relacionados aos processos armazenados no diretório /proc. No entanto, é importante destacar que o /proc também é responsável por armazenar arquivos com informações cruciais sobre o hardware do sistema e configurações do kernel. Esses arquivos são fundamentais para compreender o funcionamento interno do sistema e realizar ajustes específicos quando necessário. Alguns exemplos desses arquivos incluem: Processos em execução: fornece detalhes sobre os processos em execução no sistema, como PID (identificador de processo), consumo de recursos, informações de memória e muito mais; Configurações do kernel: permite visualizar e ajustar várias configurações e parâmetros do kernel do sistema; Informações sobre o hardware: fornece detalhes sobre o hardware do sistema, incluindo CPU, memória, dispositivos conectados, partições, interfaces de Rede e muito mais; Informações do sistema: fornece informações gerais sobre o sistema, como a versão do kernel, tempo de atividade e carga do sistema, entre outros. (/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 450560 - 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: 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): Porém, há algumas exceções: (/proc/sys/kernel/pid_max) O PID máximo permitido: $ ls /proc/sys abi debug dev fs kernel net user vm $ cat /proc/sys/net/ipv4/ip_forward 0 Dispositivos de Hardware É crucial ter em mente que, no Linux, a filosofia de que "tudo é arquivo" é aplicada. Isso implica que as informações relacionadas ao hardware do dispositivo, bem como as configurações do kernel são armazenadas em arquivos especiais presentes em diretórios virtuais. Portanto, esses dados são tratados e acessados da mesma maneira que se estivessem em arquivos convencionais. Essa abordagem uniforme facilita a manipulação e o acesso a informações do sistema, tornando o Linux um sistema operacional flexível e poderoso. O Diretório /dev O diretório de dispositivos (/dev) contém arquivos, também chamados de nós, que representam todos os dispositivos de hardware conectados ao sistema. Esses arquivos de dispositivo desempenham o papel de interface entre os dispositivos e os processos que desejam utilizá-los. Essa abstração permite que os processos do sistema operacional acessem e interajam com os $ cat /proc/sys/kernel/pid_max 32768 Saiba Mais Tenha muito cuidado ao alterar as configurações do kernel, pois o valor errado pode causar instabilidade no sistema. dispositivos de hardware de maneira padronizada, tornando a comunicação e o controle dos dispositivos mais eficientes e simplificados. Os arquivos no diretório /dev são essenciais para permitir que o sistema operacional e os aplicativos interajam com o hardware do computador de forma uniforme e consistente. Dispositivos de Bloco Na categoria de dispositivos de bloco, estão incluídos aqueles em que os dados são lidos e gravados em blocos individuais com endereçamento. Exemplos comuns desses dispositivos são discos rígidos (e suas partições, como /dev/sda1), unidades flash USB, CDs, DVDs e outros dispositivos similares. Esses dispositivos são fundamentais para armazenar e recuperar grandes volumes de dados de maneira eficiente, tornando-os essenciais para o funcionamento do sistema operacional e das aplicações que utilizam armazenamento em massa. Dispositivos de Caracteres Essa categoria inclui dispositivos nos quais os dados são lidos e gravados de forma sequencial, um caractere de cada vez. Exemplos desses dispositivos são teclados, o console de texto (/dev/console) e portas seriais (como /dev/ttyS0 e outras), entre outros. Para distinguir esses dispositivos, ao listar os arquivos do diretório de dispositivos, você pode usar o comando "ls" com a opção "-l". Isso permitirá identificar a diferença entre os dois tipos de dispositivos. Por exemplo, você pode verificar discos rígidos e suas partições da seguinte maneira: # ls -l /dev/sd* brw-rw---- 1 root disk 8, 0 may 25 17:02 /dev/das 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: # 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 (...) Saiba Mais O asterisco (*) é um caractere especial utilizado para realizar globbing, que representa zero ou mais caracteres. Por essa razão, ele foi empregado nos comandos "ls -l /dev/sd" e "ls -l /dev/tty*" mencionados anteriormente. Se você estiver interessado em aprofundar o conhecimento sobre esses caracteres especiais e como utilizá-los, recomendo consultar a lição dedicada ao globbing, em que encontrará informações detalhadas sobre o assunto. Lá, você terá a oportunidade de aprender mais sobre essa técnica e a sua aplicação para efetuar buscas e manipulações de arquivos de forma mais avançada no ambiente Linux. O Diretório /sys O sistema de arquivos sys (sysfs) é montado em /sys. Introduzido com o kernel 2.6, o sysfs representa um avanço significativo em relação ao /proc/sys. O objetivo principal do sysfs é permitir que os processos interajam com os dispositivos em /dev de forma mais organizada e estruturada. O diretório /sys contém informações detalhadas sobre os dispositivos de hardware presentes no sistema, e esses dados são organizados em categorias específicas. Por exemplo, se você deseja verificar o endereço MAC da sua placa de rede (por exemplo, enp0s3), pode usar o comando "cat" no seguinte arquivo, dentro do diretório /sys: Dessa forma, o sysfs oferece uma maneira mais conveniente e clara de acessar informações sobre os dispositivos de hardware, facilitando a interação e a configuração do sistema. Além disso, o /dev inclui alguns arquivos especiais muito úteis para diferentes finalidades de programação, como podemos ver a seguir: (/dev/zero) Fornece tantos caracteres nulos quantos solicitados; (/dev/null) Descarta todas as informações enviadas para ele. Também chamado de balde de bits; (/dev/urandom) Gera números pseudoaleatórios. $ cat /sys/class/net/enp0s3/address 08:00:27:02:b2:74 Memória e Tipos de Memória Em termos gerais, para que um programa possa ser executado, ele precisa ser carregado na memória do computador. Quando mencionamos memória, geralmente estamos nos referindo à Memória de Acesso Aleatório (RAM), que é consideravelmente mais rápida em comparação aos discos rígidos mecânicos. No entanto, a RAM é volátil, o que significa que os dados armazenados nela são perdidos quando o computador é desligado. Apesar dessa característica volátil da RAM, quando se trata de memória, podemos distinguir dois tipos principais em um sistema Linux: a RAM e a memória de armazenamento em disco (como os discos rígidos e os dispositivos de armazenamento em estado sólido). A RAM é usada para armazenar temporariamente os dados e os programas que estão sendo executados no momento, proporcionando uma rápida acessibilidade e execução dos processos em execução. Por outro lado, a memória de armazenamento em disco é utilizada para armazenar dados de forma persistente, permitindo que as informações sejam retidas mesmo após o desligamento do sistema. A RAM é ideal para operações rápidas de leitura e gravação, enquanto a memória de armazenamento em disco é essencial para manter os dados e os arquivos ao longo do tempo. A combinação e a eficiente utilização desses dois tipos de memória são fundamentais para o bom desempenho e funcionamento do sistema Linux. Memória física: a Memória de Acesso Aleatório (RAM), também conhecida como RAM, é composta por chips, que contêm milhões de transistores e capacitores integrados. Esses componentes formam células de memória, que são a unidade básica de armazenamento de dados em um computador. Cada célula de memória possui um código hexadecimal associado, conhecido como 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 é utilizada quando não há mais RAM disponível; Memória virtual: é uma abstração da quantidade total de memória utilizável, incluindo a memória tal como é vista pelos aplicativos. Comando Free O comando "free" analisa o arquivo /proc/meminfo e exibe de forma clara a quantidade de memória livre e em uso no sistema. Com essa simples ferramenta, é possível obter informações valiosas sobre a utilização da memória RAM do sistema, permitindo uma análise rápida e eficiente do status de usoda memória no Linux. Basta abrir o terminal e digitar o comando "free" seguido da opção "-h" para exibir os valores em um formato mais legível (em unidades como KB, MB, GB). Aqui está um exemplo de como o comando "free -h" pode ser usado no Linux: Vamos entender melhor as diferentes colunas do comando “free”: $ free -h (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á em uso; (shared) Quantidade de memória física usada por tmpfs; (bu�/cache) Quantidade de memória física atualmente em uso pelos bu�ers do kernel, a cache e as slabs; (available) Estimativa da memória física disponível para novos processos. Processos Quando um usuário emite um comando, um programa é executado e um ou mais processos são criados. Esses processos são organizados em uma hierarquia. Após o carregamento do kernel na memória, durante a inicialização, o primeiro processo é iniciado, o qual, por sua vez, pode iniciar outros processos, formando uma cadeia de processos. Cada processo tem um identificador exclusivo conhecido como PID (Identificador de Processo) e um identificador de seu processo pai chamado PPID (Identificador de Processo Pai). Esses identificadores são atribuídos como números inteiros positivos em ordem sequencial. Explorando os processos dinamicamente: o comando “top” para obter uma lista dinâmica de todos os processos em execução: Comando Top O comando "top" é uma ferramenta de monitoramento no Linux que exibe informações em tempo real sobre os processos em execução e o uso do sistema. Ele é muito útil para acompanhar a performance do sistema, identificar processos que estão consumindo muitos recursos e diagnosticar problemas de desempenho. No terminal, execute o comando: Conforme mencionado, o comando "top" também fornece informações sobre o consumo geral de memória e CPU do sistema, além de detalhes sobre cada processo em execução. O "top" permite interação por parte do usuário. Por padrão, a saída é classificada em ordem decrescente de acordo com a porcentagem de tempo da CPU utilizada por cada processo. No entanto, é possível modificar esse comportamento pressionando as seguintes teclas dentro do "top": $ top (M) Classifica por uso da memória; (N) Classifica pelo número de identificação do processo; Para alternar entre ordem crescente e decrescente, pressione a tecla “R”. Um Instantâneo dos Processos: ps Outro comando bastante útil para obter informações sobre processos é o "ps". Ao contrário do "top", que oferece informações dinâmicas em tempo real, o "ps" fornece informações estáticas. Quando executado sem opções, o "ps" exibe uma saída específica, limitando-se aos processos associados ao shell atual. As informações exibidas pelo comando "ps" incluem o identificador do processo (PID), o terminal em que o processo está sendo executado (TTY), o tempo de CPU utilizado pelo processo (TIME) e o comando que iniciou o processo (CMD). Uma opção útil para o "ps" é o "-f", que exibe a lista completa no formato detalhado: (T) Classifica pelo tempo de execução; (P) Classifica pela porcentagem de uso da CPU. $ ps $ ps -f Informações sobre Processos no Diretório /proc Já vimos o sistema de arquivos /proc. Ele inclui um subdiretório numerado para cada processo em execução no sistema operacional (PID do processo): Assim, todas as informações sobre um processo específico são incluídas dentro de seu diretório. Vamos apresentar o conteúdo do primeiro processo, aquele cujo PID é 1. Você pode verificar, por exemplo, o executável do processo: A Carga do Sistema Potencialmente, cada processo em um sistema consome recursos de máquina. A chamada “carga do sistema” tenta agregar a carga geral do sistema em um único indicador numérico. Podemos verificar a carga atual com o comando uptime: carol@debian:~# ls /proc # ls /proc/1/ # cat /proc/1/cmdline; echo /sbin/init Os três últimos dígitos indicam a média de carga do sistema para o último minuto (2,91), os últimos cinco minutos (1.59) e os últimos quinze minutos (0.39), respectivamente. Cada um desses números indica quantos processos estavam aguardando recursos da CPU ou a conclusão das operações de entrada/saída (I/O). Isso significa que esses processos estariam prontos para execução quando recebessem os respectivos recursos. Acessando Arquivos de Log Ao explorar arquivos de log, você precisa ser root do sistema operacional (se não tiver permissões de leitura) e utilizar um paginador como less: $ uptime 22:12:54 up 13 days, 20:26, 1 user, load average: 2.91, 1.59, 0.39 # less /var/log/messages Jun 4 18:22:48 debian liblogging-stdlog: [origin software="rsyslogd" swVersion="8.24.0" x-pid="285" x-info="http://www.rsyslog.com"] rsyslogd wa HUPed Jun 29 16:57:10 debian kernel: [ 0.000000] Linux version 4.9.0-8-amd6 (debiankernel@lists.debian.org) (gcc version 6.3.0 20170516 (Debian 6.3.0-18+deb9u1) ) #1 SMP Debian 4.9.130-2 (2018-10-27) Jun 29 16:57:10 debian kernel: [ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.9.0-8-amd64 root=/dev/sda1 ro quiet Outra possibilidade é utilizar o comando “tail” com a opção -f para ler as mensagens mais recentes do arquivo e exibir dinamicamente as novas linhas conforme elas são incluídas: Configuração de Rede Atualmente, qualquer tipo de dispositivo de computação troca informações por meio de Redes de Comunicação. No cerne do conceito das Redes de Computadores, estão as conexões físicas e lógicas entre um dispositivo e seus pares. Essas conexões são chamadas links e constituem a conexão mais básica entre dois dispositivos diferentes. Os links podem ser estabelecidos por meio de vários meios físicos de comunicação e, dentre eles, podemos citar os cabos de cobre, as fibras óticas e as ondas de rádio (Redes sem fio). # tail -f /var/log/messages Jul 9 18:39:37 debian kernel: [ 2.350572] RAPL PMU: hw unit of domain psys 2^-0 Joules Jul 9 18:39:37 debian kernel: [ 2.512802] input: VirtualBox USB Tablet as /devices/pci0000:00/ 0000:00:06.0/usb1/1-1/1 1:1.0/0003:80EE:0021.0001/input/input7 Jul 9 18:39:37 debian kernel: [ 2.513861] Adding 1046524k swap on /dev/sda5 Priority:-1 extents:1 across:1046524k FS Jul 9 18:39:37 debian kernel: [ 2.519301] hid-generic 0003:80EE:0021.0001: input,hidraw0: USB HID v1.10 Mouse [VirtualBox USB Tablet] on usb-0000:00:06.0- 1/input0 Jul 9 18:39:37 debian kernel: [ 2.623947] snd_intel8x0 0000:00:05.0: white list rate for 1028:0177 is 48000 Jul 9 18:39:37 debian kernel: [ 2.914805] IPv6: ADDRCONF(NETDEV_UP): enp0s3 link is not ready Jul 9 18:39:39 debian kernel: [ 4.937283] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX Jul 9 18:39:39 debian kernel: [ 4.938493] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready Jul 9 18:39:40 debian kernel: [ 5.315603] random: crng init done Jul 9 18:39:40 debian kernel: [ 5.315608] random: 7 urandom warning(s) miss due to ratelimiting Figura 3 – Configuração de Placa de Rede no Linux Fonte: Reprodução #ParaTodosVerem: imagem que apresenta uma placa de Rede com seus circuitos impressos a mostra e sua interface principal Ethernet com dois leds abaixo, em fundo branco. Fim da descrição. Comunicação na Camada de Link A função de um pacote de Rede é transportar informações da origem até o destino por meio de um link que conecta os dois dispositivos. Para que os dispositivos se identifiquem, é utilizado um endereço de camada de link. Em redes Ethernet, os endereços de Controle de Acesso de Mídia (Media Access Control ou MAC) são utilizados para identificar dispositivos individuais. Um endereço MAC consiste em 48 bits. No entanto, esses endereços não são necessariamente exclusivos globalmente e não podem ser usados para endereçar dispositivos fora do link atual. Portanto, eles não podem ser utilizados para rotear pacotes para outros links. Ao receber um pacote, o destinatário verificase o endereço de destino corresponde ao seu próprio endereço de camada de link. Se houver correspondência, o pacote é processado. Caso contrário, o pacote é descartado. Uma exceção a essa regra são os pacotes de broadcast, que são enviados para todos os dispositivos em uma determinada Rede local e sempre são aceitos. O comando “ip link show” exibe uma lista de todas as interfaces de Rede disponíveis e seus respectivos endereços da camada de link, além de outras informações como, por exemplo, o tamanho máximo do pacote: A saída anterior do comando apresenta o dispositivo possuidor de duas interfaces, lo e ens33. A lo é o dispositivo de loopback e tem o endereço MAC 00:00:00:00:00:00, ao passo que ens33 é uma interface Ethernet com o endereço MAC 00:0c:29:33:3b:25. Rede IPv4 Para acessar sites como o Youtube, Google ou Cruzeirodosul, verificar e-mails ou permitir a conexão entre Empresas, os pacotes devem ser capazes de atravessar diferentes camadas de link. Frequentemente, essas Redes estão conectadas indiretamente, com várias camadas intermediárias que os pacotes devem percorrer para alcançar seu destino. Os endereços de camada de link de uma interface de Rede não podem ser usados fora da Rede específica em que estão. Esses endereços não têm significado para os dispositivos de camada de link de outras Redes. Portanto, é necessário um esquema de endereçamento globalmente exclusivo para possibilitar o roteamento entre Redes. Esse esquema de endereçamento globalmente exclusivo, juntamente com o conceito geral de roteamento, é implementado pelo Protocolo de Internet (Internet Protocol ou IP). O IP permite que os pacotes sejam roteados de forma eficiente por diferentes Redes, garantindo que eles $ ip link show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens33: mtu 1500 qdisc fq_codel state U Mode DEFAULT group default qlen 1000 link/ether 00:0c:29:33:3b:25 brd ff:ff:ff:ff:ff:ff cheguem ao seu destino corretamente, independentemente das camadas de link intermediárias que precisam ser atravessadas, ele fornece um sistema de endereçamento único e globalmente reconhecido (mundialmente reconhecido), permitindo a conectividade entre dispositivos em diferentes Redes. Configuração do Endereço IPv4 Existem duas maneiras principais de configurar endereços IPv4 em um computador: atribuição manual de endereços (estático) ou uso do Protocolo de Configuração Dinâmica de Host (Dynamic Host Configuration Protocol ou DHCP) para configuração dinâmica (automática). Com o DHCP, um servidor central controla a distribuição de endereços para os dispositivos conectados. Além dos endereços IP, o servidor DHCP também pode fornecer outras informações de Rede, como os endereços IP dos servidores DNS e o endereço IP do roteador padrão. Em muitos sistemas, o DHCP já está habilitado por padrão (deafault), o que significa que, ao se conectar a uma Rede, você provavelmente receberá automaticamente um endereço IP atribuído. Isso facilita a configuração e a conectividade com a Rede, pois, nesse caso, não é necessário inserir manualmente as informações de endereço IP. Como dito, também é possível adicionar endereços IP manualmente (ou estaticamente) a uma interface usando o comando “ip addr add”. Aqui, adicionamos o endereço 192.168.0.5 à interface ens33. A Rede, nesse caso, utiliza a máscara de rede 255.255.255.0, que equivale a /24 (somatória de bits ligadas na porção rede) em notação CIDR: Agora, podemos observar se o endereço IP realmente foi adicionado, usando o comando “ip addr show”: $ sudo ip addr add 192.168.0.5/255.255.255.0 dev ens33 A saída anterior apresenta a interface lo e a interface ens33 com seu endereço IPv4 atribuído. Para verificarmos se um dispositivo está acessível, utilizamos o comando “ping”, que envia um tipo especial de mensagem chamado echo request (solicitação de eco), na qual o remetente solicita uma resposta ao destinatário. Se a conexão entre os dois dispositivos estiver estabelecida com sucesso, o destinatário retornará uma resposta de eco, confirmando a conexão, ou seja, o “ping” testa a conectividade entre dispositivos: $ ip addr show 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 25: ens33: mtu 1500 qdisc mq state UP gro default qlen 1000 link/ether 00:0c:29:33:3b:25 brd ff:ff:ff:ff:ff:ff inet 192.168.0.5/24 192.168.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::010c:29ff:fe33:3b25/64 scope link noprefixroute valid_lft forever preferred_lft forever $ ping -c 3 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=2.16 ms 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.85 ms 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=3.41 ms --- 192.168.0.1 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 5ms rtt min/avg/max/mdev = 1.849/2.473/3.410/0.674 ms Roteamento IPv4 O roteamento de pacotes refere-se ao processo pelo qual um pacote IP é encaminhado da Rede de origem para a Rede de destino. Cada dispositivo tem uma Tabela de Roteamento que contém informações sobre quais Redes IP podem ser acessadas diretamente por meio de sua conexão com a camada de link e quais redes IP podem ser alcançadas por meio do encaminhamento de pacotes para um roteador. Essa Tabela de Roteamento permite que o dispositivo determine o caminho mais adequado para encaminhar os pacotes com base em seu endereço de destino. As entradas na Tabela de Roteamento são atualizadas e mantidas por meio de Protocolos de Roteamento, que permitem que os dispositivos compartilhem informações de roteamento entre si. Além das rotas específicas, existe também uma rota padrão, também conhecida como rota de gateway padrão. Essa rota é usada quando não há uma rota específica correspondente ao endereço de destino do pacote. Em vez de descartar o pacote, ele é encaminhado para o roteador definido na rota padrão, que é responsável por receber todos os pacotes que não se encaixam em nenhuma outra rota da Tabela de Roteamento. Isso permite que os pacotes sejam direcionados para fora da rede local e alcancem outras Redes. O comando “ip route show” lista a Tabela atual de Roteamento IPv4: Para adicionar uma rota padrão, você pode usar o comando a seguir, substituindo "192.168.0.1" pelo endereço interno do roteador que deseja definir como gateway padrão: $ ip route show 127.0.0.0/8 via 127.0.0.1 dev lo0 192.168.0.0/24 dev ens33 scope link Esse comando adicionará uma rota padrão na Tabela de Roteamento do sistema, direcionando todos os pacotes que não correspondam a nenhuma outra rota específica para o endereço IP do roteador definido como gateway padrão. Para confirmar, execute “ip route show” novamente: $ sudo ip route add default via 192.168.0.1 $ ip route show default via 192.168.0.1 dev ens33 127.0.0.0/8 via 127.0.0.1 dev lo0 192.168.0.0/24 dev ens33 scope link Indicações para saber mais sobre os assuntos abordados nesta Unidade: Livros Linux na Prática: Linux para Iniciantes ANJOS, R. Linux na Prática: Linux para Iniciantes. E-Book Kindle. São Paulo, 2023. Linux: Guia do Administrador do Sistema NEMETH, E.; SNYDER, G. Linux: Guia do Administrador do Sistema. São Paulo: Novatec, 2008. Shell Linux: A Bíblia BLUM, R. Shell Linux: A Bíblia. São Paulo: Altabooks, 2014. Página 2 de 3 📄 Material Complementar Linux Essentials: Um Guia do Sistema Operacional Linux para Iniciantes WILSON, A.; SILVA, L. A. Linux Essentials: um guia do sistema operacional Linux para iniciantes.E-Book Kindle. São Paulo, 2020. HILL, B. M.; BACON, J. O livro oficial do Ubuntu 2. Porto Alegre: Bookman, 2008. LPI. Linux Essentials. Linux Professional Institute. Estados Unidos da América: [n.p], 2021. NEMETH, E.; SNYDER, G.; HEIN, T. R. Manual Completo do Linux Guia do Administrador. São Paulo: Pearson, Prentice Hall, 2007. Página 3 de 3 📄 Referências