<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Aprigio Simoes's Blog]]></title><description><![CDATA[Eu trabalho com TI já a muitos anos, especificamente com sistemas UNIX e distribuições Linux. Sou consultor e instrutor, mestre de RPG e adoro tomar café ;-)]]></description><link>https://aprigiosimoes.com.br</link><generator>RSS for Node</generator><lastBuildDate>Fri, 10 Apr 2026 09:39:07 GMT</lastBuildDate><atom:link href="https://aprigiosimoes.com.br/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Processos no UNIX(R) e GNU/Linux]]></title><description><![CDATA[Em sistemas UNIX e Linux um processo é uma abstração utilizada para representar um programa em execução. Pelo uso e tempo de CPU, memória, recurso de E/S e I/O, podemos monitorar o uso desses processos através do seu "process id", ou PID. No sistema ...]]></description><link>https://aprigiosimoes.com.br/processos-no-unixr-e-gnulinux</link><guid isPermaLink="true">https://aprigiosimoes.com.br/processos-no-unixr-e-gnulinux</guid><dc:creator><![CDATA[Aprigio Simoes]]></dc:creator><pubDate>Sun, 02 Apr 2023 20:07:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1680811225582/456029ba-2936-443e-bc79-6ae80b003d2b.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Em sistemas UNIX e Linux um processo é uma abstração utilizada para representar um programa em execução. Pelo uso e tempo de CPU, memória, recurso de E/S e I/O, podemos monitorar o uso desses processos através do seu "process id", ou PID. No sistema ele é identificado e monitorado constantemente pelo kernel e pelo administrador de sistema através de diversos utilitários ou ferramentas para isso.</p>
<p>Um dos melhores e mais conhecidos comandos para visualizar o status dos processos no mundo UNIX e Linux é o comando ps ou "Process Status". Eu pessoalmente nao gosto de utilitários como o top e htop, apesar deles serem bastante intuitivos e atraentes, existem alguns outros que também valem a sua consideração como o atop, vtop, btop++ (esse é fantastico), nmon, ytop, o bom e velho glance que você encontra em sistemas como HP-UX, AIX,Tru64 e até mesmo no Linux.</p>
<p>Porem, de todos estes que eu citei ai em cima, ainda sim, a maneira que o ps faz para extrair informações de um processo é suficiente para administrar um bom sistema Unix e Linux.</p>
<p>Basicamente suas opções são estas:</p>
<pre><code class="lang-plaintext"># ps &lt;opções&gt;
  u Infomrações sobre os usuarios do processo 
incluindo informações como $USER, UID, %CPU, %MEM, VSZ, RSS e START.
  x Exibe processos que não estão relacionados a algum terminal.
  f Exibe os processos no formato floresta, incluindo o PPID e o PID.
  w Exibe os processos da forma não encurtada.
  p exibe informações de um processo específico.
  o especifica o formato de saida, personalizando o output do comando ps. 
Por exemplo, existe a possibilidade de adcionar colunas com informações,
tais como do pid,cpu,mem,ppid,comando executado,processo,usuario que executou e muitas outras coisas.
</code></pre>
<p>Alguns comandos interessantes dele são:</p>
<pre><code class="lang-plaintext">[root@poder ~]# ps -eo pid,ppid,user,comm,cmd,%cpu,%me
    PID    PPID USER     COMMAND         CMD                         %CPU %MEM
      1       0 root     systemd         /usr/lib/systemd/systemd --  0.1  0.1
      2       0 root     kthreadd        [kthreadd]                   0.0  0.0
      3       2 root     rcu_gp          [rcu_gp]                     0.0  0.0
      4       2 root     rcu_par_gp      [rcu_par_gp]                 0.0  0.0
      6       2 root     kworker/0:0H-ev [kworker/0:0H-events_highpr  0.0  0.0
      9       2 root     mm_percpu_wq    [mm_percpu_wq]               0.0  0.0
     10       2 root     rcu_tasks_rude_ [rcu_tasks_rude_]            0.0  0.0
     11       2 root     rcu_tasks_trace [rcu_tasks_trace]            0.0  0.0
     12       2 root     ksoftirqd/0     [ksoftirqd/0]                0.0  0.0
... output foi cortado
</code></pre>
<p>A maneira mais tradicional de todas:</p>
<pre><code class="lang-plaintext">[root@poder ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           2  0.0  0.0      0     0 ?        S    18:52   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I&lt;   18:52   0:00  \_ [rcu_gp]
root           4  0.0  0.0      0     0 ?        I&lt;   18:52   0:00  \_ [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I    18:52   0:00  \_ [kworker/0:0-cgroup_pidlist_destroy]
root           6  0.0  0.0      0     0 ?        I&lt;   18:52   0:00  \_ [kworker/0:0H-events_highpri]
root           7  0.0  0.0      0     0 ?        I    18:52   0:00  \_ [kworker/0:1-cgroup_destroy]
.... output foi cortadof
</code></pre>
<p>Nesse resultado você encontra informações como:</p>
<ul>
<li><p>Nome do usuário que iniciou o processo.</p>
</li>
<li><p>Numero do processo.</p>
</li>
<li><p>Porcentagem do consumo do CPU por aquele processo.</p>
</li>
<li><p>Porcentagem da memoria física que o processo esta usando.</p>
</li>
<li><p>o <strong>VSZ</strong> que é o tamanho da memoria virtual que esta sendo utilizada pelo processo em kilobytes, incluindo a memoria compartilhada por ele.</p>
</li>
<li><p>o <strong>RSS</strong>, que é o tamanho residente e real da memoria usada pelo processo em kilobytes (essa informação exclui o uso o uso da memoria compartilhada)</p>
</li>
<li><p><strong>TTY</strong>, que define o terminal que o processo esta sendo executado. Se aparecer "?", é pq não esta associado a nenhum terminal.</p>
</li>
<li><p><strong>STAT</strong> que define o estado do processo. Ou seja: R (rodando), S (interrompido! Dormindo! Só de olho e aguardando a conclusão de um evento, rsrs), <strong>D</strong> (dormindo, bloqueado), <strong>Z</strong> (zumbi, processo finalizado, mas ainda na tabela de processos enchendo a paciência), <strong>T</strong> (parado, porem quando <strong>t</strong> minúsculo pode identificar um processo em debug durante um tracing).</p>
</li>
<li><p><strong>START</strong>, horário de inicio do processo.</p>
</li>
<li><p><strong>TIME,</strong> Tempo de CPU usado pelo processo.</p>
</li>
<li><p><strong>COMMAND</strong>, que é o nome do comando que iniciou o processo. (Espere altas emoções aqui ....)</p>
</li>
</ul>
<p>Uma observação no Linux, nesse output do comando ps acima vc vai encontrar processos em colchetes, na maioria dos casos em 99%, são processos relacionados a módulos do kernel como o kthreadd e kworker/0.</p>
<p>Vale a pena lembrar que o comando ps extrai todas as informações dos processos do sistema que estão sendo executados, quase como uma fotografia. Porém, essa informação pode ser extraída com "-" ou sem o "menos", dependendo da sua opção. Por exemplo, o comando <strong><em>ps aux</em></strong> terá o mesmo resultado que <strong><em>ps -aux</em></strong>, mas não acontecerá o mesmo com o comando <strong><em>ps -ef</em></strong> para <strong><em>ps ef</em></strong>. O que muda o formato de uso do traço ou não é o modelo utilizado no seu desenvolvimento do bom e velho BSD para o formato UNIX SystemV.</p>
<p>No caso do Linux ele usa o modelo de conceito escrito pelo projeto GNU, ou seja, sem o traço. Talvez ai no MacOS vc seja obrigado a usar o "-", assim como em outros sistemas operacionais. Ou talvez não. Mas isso não importa! O formato encontrado no Linux, ou seja, oferecido pelo projeto GNU através do <strong>procps-ng</strong> e do GNU Core Utilities (<strong>gnucoreutils</strong>), vc terá todos os tipos e gostos para os resultados gerados pelo comando ps e de outros comandos, como um simples ls.</p>
<p>Mas existem diferenças dos comandos "core" do <strong>GNU/Linux</strong> para <strong>UNIX(R)</strong>? SIM e como!! Todos os comandos que vc encontra em <strong><em>procps, findutils e coreutils</em></strong> são bem diferentes em diversos sistemas UNIX. Por exemplo, no <strong>AIX</strong> para visualizar partições montadas e quanto elas estão consumindo em <em>"GB",</em> vc usa o <strong>df -sg</strong> e no Linux um simples <strong><em>df -h.</em></strong></p>
<p>O interessante do comando ps no Linux, assim como muitos sistemas UNIX é que ele extrai todas as informações dos processos utilizando o diretório /proc como critério, ou especificamente do <strong>/proc/&lt;PID&gt;</strong> em arquivos lá dentro como status, cmdline, stat, statm, meminfo e cpuinfo.</p>
<p>Mas o que é o <strong>/proc</strong>? Ele é um sistema de arquivos virtual chamado de procfs, que é criado toda vez que vc da um boot no sistema operacional, sendo atualizado constantemente durante o uso do OS e que fornece todas as informações sobre processos que estão ativos no sistema. No Linux, ele também fornece informações do hardware, extraindo um inventário durante o boot e isso é bem diferente no mundo UNIX. Ele coleta a todo momento informações do sistema operacional como: processos em execução, informações sobre os dispositivos adicionados no sistema, informações sobre a utilização de memoria e cpu, tal como informações sobre os sistemas de arquivos utilizados e como estatísticas de I/O deles. Tudo em um grande pseudo-filesystem criado de maneira virtual pelo próprio kernel.</p>
<p>Para cada processo ativo no sistema, ele vai receber um PID que será automaticamente disponibilizado em /proc com informações e caracteristicas deste processo.</p>
<p>Alguns arquivos são:</p>
<p><img src="https://media.licdn.com/dms/image/D4D12AQF0LU3W4y2lHw/article-inline_image-shrink_1500_2232/0/1680458295540?e=1686182400&amp;v=beta&amp;t=xCGkaFpr-qwxa6xtaHqB1M-yBKfwOO7Lv_r6-tGFgVQ" alt="Não foi fornecido texto alternativo para esta imagem" /></p>
<p>Imagem retirada do site do kernel (material da versão 2.4, mas sempre de bom grado)</p>
<p>Essa imagem acima eu tirei do site do próprio kernel em <a target="_blank" href="https://docs.kernel.org/filesystems/proc.html">The /proc Filesystem — The Linux Kernel documentation</a> e já antecipo que se você é um apaixonado pelo kernel Linux como eu, vai encontrar um mundo de informações ali sobre processos como o conteúdo e descrição dos processos encontrados nos arquivos mencionados acima.</p>
<p>Mas gostaria de pontuar algumas coisas interessantes da imagem acima.</p>
<p>Por exemplo. Digamos que eu abri um programa e ele esta agora em execução no meu sistema. O kernel entregou a ele o PID de número <strong>20200</strong> e armazenou no procfs em <strong><em>/proc/20200.</em></strong> No meio de tantos arquivos que podemos encontrar la dentro, um deles é o arquivo wchan, que exibe o nome da função do kernel em que o processo está aguardando. No meu exemplo aqui eu tive um <strong><em>core_sys_select</em></strong>, ou seja, isso me diz que este processo que eu estava analisando está aguardando a conclusão de uma chamada de sistema que esta registrando uma I/O no meu disco. Por exemplo, esperando por uma resposta de um dispositivo de armazenamento? Ele tambem poderia me informar um <strong><em>"poll_schedule_timeout"</em></strong> que diz que o processo esta aguardando uma chamada poll() do kernel, ou seja, usada para monitorar o estado das entradas de E/S, tudo organizado pelo kernel, como arquivos, soquetes e pipes. Ou até mesmo me dizer que o processo esta "dormindo" ou <strong><em>"sched:sleep"</em></strong>. <strong>Enfim, muita coisa apenas com um único arquivo.</strong></p>
<p>Mas eu tambem poderia utilizar o procfs para verificar qual o comando utilizado para executar esse "process id" ou processo. Então, verificando os arquivos /proc/20200/comm ou /proc/20200/cmdline ele me informa o nome do programa/processo.</p>
<pre><code class="lang-plaintext">cat /proc/494/comm
top

cat /proc/494/cmdline
top
</code></pre>
<p>O arquivo status contém informações completas elevadas ao quadrado do uso de memoria do processo, tais como:</p>
<ul>
<li><p><strong>nome do processo</strong></p>
</li>
<li><p>estado dele, se esta executando, suspenso ou esperando.</p>
</li>
<li><p>o <strong>tgid</strong> que é o grupo de threads do processo.</p>
</li>
<li><p>O PID do processo e seu processo pai (PPID)</p>
</li>
<li><p>Informações do usuário que executou, como UID e GID.</p>
</li>
<li><p><strong>VmPeak</strong>, que é o pico de memoria virtual do processo em uso.</p>
</li>
<li><p><strong>VmSize</strong>, que é o tamanho total da memoria virtual usada pelo processo.</p>
</li>
<li><p><strong>VmLck</strong>, que fornece o tamanho do da memoria em "locked" do processo. Isso significa que essa memoria fica reservada ou fixada em algum lugar da sua RAM (tadinha), e isso impede que ela seja movida para a área de SWAP. Isso é muitooooooooo maneiro, pq isso garante que alguns dados armazenados na memória, que são críticos para o processo, permaneçam sempre disponíveis para a memória física, sem que nenhum outro processo o roube a área ou acesse essa informação valorosa.</p>
</li>
<li><p><strong>VmRSS</strong>, que é o tamanho real da memoria do processo (resident set size).</p>
</li>
<li><p><strong>Threads</strong>, que é o número de threads do processo em execução</p>
</li>
</ul>
<p>e muitas outras coisas... se eu escrever todas vão dar um livro.........................</p>
<pre><code class="lang-plaintext"># cat /proc/494/status
Name:   top
Umask:  0022
State:  T (stopped)
Tgid:   494
Ngid:   0
Pid:    494
PPid:   120
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1001
NStgid: 494
NSpid:  494
NSpgid: 494
NSsid:  120
VmPeak:    52128 kB
VmSize:    52108 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      4196 kB
VmRSS:      4196 kB
RssAnon:             672 kB
RssFile:            3524 kB
RssShmem:              0 kB
VmData:     1020 kB
VmStk:       132 kB
VmExe:       108 kB
VmLib:      6824 kB
VmPTE:       140 kB
VmSwap:        0 kB
... output cortado pq o bichinho é bem grande. O poder!
</code></pre>
<p>Outro arquivo que auxilia muito os administradores de sistema é o stat, que também se encontra no procfs. Ele tem algumas informações interessantes sobre o processo, mas é importante vc sempre ler o manual do kernel, pq as informações não são muito interativas. Mas ali vc encontra informações como o PID, comando de execução, o estado, PPID, <strong>Pgrp</strong> que é o grupo de processos, Session ID que define a sessao que o processo pertence, <strong>Tty_nr</strong>, <strong>flags</strong> do bitmasks, <strong>minflt</strong> e varias outras coisas.</p>
<p>Outro arquivo interessante do procfs associado sempre ao processo é o <strong>"io",</strong> ou <strong>/proc/PID/io</strong>, que informa quanto o processo esta fazendo de <strong><em>I/O</em></strong>.</p>
<ul>
<li><p><strong>rchar</strong>, ou quantidade total de bytes lidos e escritos pelo processo. Mesmo que as informações tenham sido descartadas.</p>
</li>
<li><p><strong>wchar</strong>, que é a quantidade total de bytes escritos "com sucesso" pelo processo.</p>
</li>
<li><p><strong>syscw</strong>, que é o numero de chamadas do sistema que o processo usou para escrever dados no sistema de arquivo.</p>
</li>
<li><p><strong>read_bytes</strong>, quantidade total de bytes lidos pelo processo no disco.</p>
</li>
<li><p><strong>write_bytes</strong>, que é a quantidade total de bytes gravados pelo processo no disco. E quando falo disco eu falo do filesystem.</p>
</li>
</ul>
<p>Muitos dos arquivos que estou mostrando servem para debugar e fazer troubleshoot para resolução de muitos problemas e um deles que serve muito para debugar informações sobre processos é o "<strong>environ"</strong>, que vai informar todas as variáveis que esse processo em execução esta utilizando. Por exemplo, vou verificar com o comando pidof o pid do crond. Após isso, vou verificar o arquivo environ.</p>
<pre><code class="lang-plaintext">[root@poder ~]# pidof cron
1670
[root@poder ~]# cat /proc/1670/environ
LANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binINVOCATION_ID=c6d4f05193a740ecb12c773a10e96e55JOURNAL_STREAM=9:32739CRONDARGS=n
</code></pre>
<p>Com essa saída eu consigo entender que um simples crond, usado para agendar tarefas no sistema, esta sendo gerenciado pelo systemd. Eu percebi isso por causa do seu <strong>INVOCATION_ID</strong> que contém o seu identificador único para cada execução do systemd. Também observado que ele possui a sua própria variável, extraída do seu arquivo de configuração como <strong>PATH e CRONDARGS</strong>. Outra coisa interessante é que vejo que este processo esta sendo monitorado pelo systemd-journald do systemd. Mas pq eu vejo isso? Percebam o <strong>JOURNAL_STREAM</strong>? Então, ele é o fluxo de registro, ou quase uma "fila" para o systemd-journald.</p>
<p>Outro arquivo muito importante do procfs é o <strong>"uid_map"</strong>, que indica o valor do mapeamento "original"do namespace do processo. Isso é muito útil para entender o quanto o processo pode ser isolado pelo kernel.</p>
<p>Interessante né? podemos explorar bastante coisa do mundo de processos no UNIX e Linux. É o poder ;)</p>
<p><a target="_blank" href="mailto:aprigiosimoes@gmail.com">aprigiosimoes@gmail.com</a></p>
]]></content:encoded></item><item><title><![CDATA[Processos de Boot no UNIX e Linux]]></title><description><![CDATA[Fala pessoal tudo bom?
Tem tempo que eu não escrevo nada, não é verdade? Então deixa eu me apresentar novamente como se fosse a primeira vez...Eu sou o Aprigio Simões e durante anos, basicamente entre 1998 a 2016 eu tive um blog hospedado em aprigios...]]></description><link>https://aprigiosimoes.com.br/processos-de-boot-no-unix-e-linux</link><guid isPermaLink="true">https://aprigiosimoes.com.br/processos-de-boot-no-unix-e-linux</guid><category><![CDATA[Linux]]></category><category><![CDATA[linux for beginners]]></category><category><![CDATA[unix]]></category><category><![CDATA[System Architecture]]></category><category><![CDATA[init]]></category><dc:creator><![CDATA[Aprigio Simoes]]></dc:creator><pubDate>Sat, 18 Mar 2023 20:02:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1679188210546/2f857ccd-02ee-4a2f-8470-0d34cec47160.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Fala pessoal tudo bom?</p>
<p>Tem tempo que eu não escrevo nada, não é verdade? Então deixa eu me apresentar novamente como se fosse a primeira vez...Eu sou o Aprigio Simões e durante anos, basicamente entre 1998 a 2016 eu tive um blog hospedado em <a target="_blank" href="http://aprigiosimoes.com.br"><strong>aprigiosimoes.com.br</strong></a><strong>.</strong> Eu escrevia diversas matérias sobre o mundo UNIX, Linux e tudo que sobre Free Software e Opensource. Eu gostava muito daquele blog, principalmente pela famosa frase: "Linux é o poder, não trava, não da tela azul e se vc jogar pro espaço vira satélite" rsrs. Enfim, recebia bastante mensagens e meu twitter era sempre cheio. Ai virei papai, trabalho aumentou, fui morar no exterior e entao ficou muito dificil de manter ele e então tirei do ar.. mas sabe como é rsrs, meu amor por esses sistemas maravilhosos é grande demais e graças a Deus estou aqui de novo para ajudar quem busca informações sobre o mundo UNIX e Linux. E como sempre eu disse: vamos falar sobre o <strong>PODER</strong> !!! ;-)</p>
<p>Hoje eu gostaria de trazer um assunto bem legal no mundo Unix e Linux, que é sobre o processo de boot e do seu controle no sistema.</p>
<p>Para não ficar muito grande, vamos iniciar com os "processos de inicialização e desligamento" ou "gerenciamento de boot".</p>
<p>Quando iniciamos a máquina onde esta instalado o sistema operacional, independente da sua arquitetura, existem algumas etapas que o processo de inicialização do sistema do hardware fará, até alcançar o sistema operacional pelo seu gerenciamento de boot. Um deles é o famoso <strong>POST ou Power-On Self-Test</strong> que é um conjunto de testes que o hardware faz para saber se esta tudo ok. Após isso, dependendo da sua arquitetura utilizada, inicializará o processo de "carga" do OS (sistema operacional). No caso de um servidor Power/IBM e até semelhantemente em hardware x86, ele inicializará o IPL ou "Initial Program Load" que após o POST que se encarregará de verificar a existência de discos e/ou dispositivos de armazenamentos, onde está o OS (operating system).</p>
<p>Após isso, inicializará o seu "bootloader", que é o software que carrega o sistema operacional, ou seja, em uma plataforma x86 ele é dividido em pelo menos em dois estágios, ou seja, um pequeno binário inicial no MBR que se ocupa de localizar todo o setor de inicialização do sistema operacional e seu setor de boot, seja ele em disco interno, externo ou qualquer outra coisa. Para quem gosta de assunto, por favor, não tente limpar sua faixa de 640 a 1024k, a sua RAM agradece ;)</p>
<p>O <strong>bootloader</strong> vai depender muito do sistema operacional e da sua arquitetura. Por exemplo, em sistemas Linux instalado em hardware padrão PC/x86 se usa o <strong>GRUB</strong> (atualmente na versao 2), antes era o <strong>LILO</strong> ( era lindo isso ), porem se vc instalar Linux em um hardware PPC (PowerPC), vc vai precisar de usar o <strong>Yaboot</strong> cujo o seu arquivo de configuração é o /etc/yaboot.conf (isso tb é lindo), porem isso nao é uma regra, apesar do GRUB suportar diversas arquiteturas. Nele vc encontra a opção --target que permite definir o destino para a instalação dele, dependendo da arquitetura utilizada. Por exemplo, para instalar o grub em uma arquitetura padrão PC se usa --target=x86_64-efi (que é a opção default), para instalar em sistemas <strong>Sun Sparc</strong>, utilizasse sparc64-ieee1275, ou arm-efi para <strong>ARM</strong>, sendo aarch64-efi para ARM/UEFI, ia64-efi para <strong>Itanium</strong> e i386-pc para o bom e velho <strong>PC</strong>. Porem as opções de target variam muito e em muitos casos na ultima versão do GRUB passam despercebidas, hoje ta tudo muito fácil. Se vc é das antigas como eu, deve lembrar o maravilhoso <strong>syslinux</strong> que se utiliza em dispositivos de armazenamento externos e independentes, tal como o LOADLIN. Imagine vc carregar o sistema através de um floppy disk (disquete), facilitando o boot em sistemas como MSDOS. Um exemplo do seu arquivo de configuração syslinux.cfg. Ta bom, eu confesso... adoro coisa retro :-)</p>
<p>No UNIX/Linux esse processo de inicialização é constituído do famoso bootstrapping que consiste em carregar o kernel na memoria e inicializar todos os processos para disponibilizar o sistema operacional para o usuário/administrador. Uma importante observação é que quando o kernel é iniciado, com ele são carregados um conjunto muito grande de tarefas que investigará o seu hardware e concluindo com o carregamento de diversos drivers que contem essas "regras" e que vão "ligar" esses dispositivos.</p>
<p>Um exemplo de configuração do GRUB:</p>
<pre><code class="lang-plaintext">title Red Hat Enterprise Linux 8 (4.18.0-80.el8.x86_64
  root (hd0)
  kernel /boot/vmlinuz-4.18.0-80.el8.x86_64 ro root=UUID=58013e4a-11c0-4195-8fd8-e4b33e5b17d6 console=hvc0 LANG=en_US.UTF-8
  initrd /boot/initramfs-4.18.0-80.el8.x86_64.img)
</code></pre>
<p>Neste exemplo podemos ver claramente o boot do RHEL8 sendo gerenciado pelo GRUB, onde ele carrega a imagem do kernel vmlinuz. Hoje por questões de padrnizacao <em>essa opção "kernel" foi renomeada</em> no arquivo de configuração do grub para "linux", que tornou as opções mais coerentes com o "standard". Quando se vê a opção <strong>linux16</strong>, siginifica que para carregar a imagem do kernel instalada o sistema precisa fazer uma inicialização do kernel em 16 bits. Isso é necessário apenas em sistemas muito antigos que usam o bom e velho BIOS em vez do EFI. Além disso vc encontra a imagem do kernel initrd e initramfs "<strong>Initial RAM Disk</strong>" que contem um pseudo sistema de arquivos temporário que será utilizado durante o processo de inicialização do kernel Linux. Essa imagem é carregada e descompactada para proceder com a "carga" desses módulos continuando o processo de boot e através dele serão carregados e "linkados" enquanto o kernel estiver em execução. Ele tambem possibilita que a imagem do kernel durante o boot seja bem menor, pois os "drivers" no kernel serão carregados apenas se forem necessários. O que vc poderá fazer depois da carga completa do kernel com os comandos insmod e modprobe.</p>
<p>Se deu tudo certo e nada de Kernel Panic, levante aos mãos para o alto, glorifique e seja feliz :)</p>
<p><img src="https://media.licdn.com/dms/image/D4D12AQEewqiQJRRnGQ/article-inline_image-shrink_1500_2232/0/1679152589881?e=1684368000&amp;v=beta&amp;t=XZgW9zOpfthtQSD2JeZ7oga90DoHu4uh4QinGZqD5oM" alt="Não foi fornecido texto alternativo para esta imagem" class="image--center mx-auto" /></p>
<p>Processo de inicialização do Kernel Linux com SysVinit</p>
<p><strong>O processo de inicialização do Linux</strong> vai depender muito da sua distribuição e da versão dela, no caso vc pode encontrar distribuições com o bom e velho SysVinit (init), Upstart e o atual Systemd, existem diversos outros como o RuInit, OpenRC, Shepherd e Nosh.</p>
<p>O openrc é um caso muito interessante e que eu gostava muito, ele foi muito utilzado pelo Gentoo como padrão e durante o procedimento de boot ele carregava os daemons referenciados em /etc/rc.conf cujo suas opções e variáveis eram carregados nos arquivos dentro de /etc/conf.d/, como por exemplo o ssh em /etc/conf.d/sshd. Essa estrutura sempre me lembrou com ótimos olhos o que temos no HP-UX em /etc/rc.config.d. Estes processos no gentoo eram inicializados pelo rc-update.</p>
<p>Ja na maioria, distribuições Linux sempre utilizavam o init do SysvInit. O processo era definido como o "pai" de todos os processos e o seu <strong>"PID - Process IDentifier</strong>" sempre foi 1. O interessante e curioso é que nessa época as distribuições Linux eram muito descentralizadas e dependiam muito do seu mantedor, por exemplo, o Debian era um belo malcriado e tinha a estrutura de scripts de inicialização muito mal documentado e era muito bagunçado, MAS ... para mim era o mais maneiro de todos.. tudo bem.. que cada um coma a sua própria comida de cachorro, como desabafou bem o <strong><em>Adrian</em></strong> no seu bom e velho <strong>BSD-NOW</strong> no capitulo 101 (<a target="_blank" href="https://www.youtube.com/watch?v=TX_x6K-bopk">I'll Fix Everything | BSD Now 101 - YouTube</a>)</p>
<p>O <strong>Debian</strong> tinha um conceito de scripts de inicialização um pouco diferente das outras distros com o init, mas no final das contas o resultado era o mesmo. Todo o processo de boot ocorria dentro dos arquivos preliminares do /etc/rc.S/, tal como o hostname e nomeclaturas de interfaces de rede. Por exemplo, ele tinha um conjunto de variaveis a ser carregados em /lib/init/vars.sh para entao executar os scripts e no caso do simples hostname, ele construía a $HOSTNAME pelo <a target="_blank" href="http://S01hostname.sh">S01hostname.sh</a> em /etc/rcS.d/ fazendo um simples <em>HOSTNAME="$(cat /etc/hostname)</em>. Enfim, de todas as distros que usava o SyvInit, o Debian deixava tudo sempre muito mais "emocionante". No Debian todos os daemons eram iniciados na runlevel 2 por padrão e eram atualizados e interrompidos pelo seu "gestor" invoke-rc.d. Eu adorava isso!! Vale lembrar que o "rc" significa "Run Commands" e o "S" significa "Startup".</p>
<p>O bom e velho <strong>Slackware</strong>, distro que iniciei o meu amor pelo Linux, possui um modo de inicialização um pouco diferente e usa o layout do formato BSD-like para a inicialização dos scripts do sistema. Todo os scripts são carregados pelo diretório /etc/rc.d e atraves dos scripts rc, tal como rc.serial, rc.inetd, rc.inet1, rc.sshd e por ai vai.</p>
<p>O <strong>SysVinit</strong> era utilizado em praticamente todas as distribuições Linux e o seu conceito de inicialização de scripts era totalmente baseado em BASH SCRIPTS. Assim como diversos sistemas UNIX o Linux possuía um método de ordem de boot baseado em <strong>níveis de execução, o que chamamos de RUNLEVEL</strong>. Estes níveis de execução em UNIX são representados por números de 0 a 9. Já no caso do Linux e alguns outros sistemas representados de 0 a 6.</p>
<p>Porém, deixa eu te contar um segredinho. Na verdade no Linux também possui 9 níveis de execução, sendo a 7, 8 e 9 personalizadas pelo usuário, mas desde uma determinada versão do kernel com distribuições que vieram com o upstart (scripts em /etc/init), como o caso do Ubuntu, Fedora 9 ao 15 e RHEL6, não podem mais ser executadas.</p>
<p><img src="https://media.licdn.com/dms/image/D4D12AQEzxjLTamHU6A/article-inline_image-shrink_1500_2232/0/1679157799770?e=1684368000&amp;v=beta&amp;t=6XfdkCldWlAgKN3kuveEJkNyrsjhQRGRu58Fyr4i2wQ" alt="Não foi fornecido texto alternativo para esta imagem" /></p>
<p>Um exemplo dos niveis de execução em distribuições LINUX com o SysvInit e sua comparação ao Systemd.</p>
<p>O Linux antes de receber o systemd, utilizava os modos de carga de scripts baseado no processo "rc", ou seja, o modo de operação do sistema operacional era definido pelo numero da runlevel selecionado em <strong>/etc/inittab</strong>, o arquivo era constituído com a configuração seguinte: <em>&lt;id&gt;:&lt;runlevels&gt;:&lt;action&gt;:&lt;process&gt;</em></p>
<pre><code class="lang-plaintext">id:3:initdefault:
</code></pre>
<p>O <strong>inittab</strong> alem de definir a runlevel padrão, também definia varias outras funções especiais, como o uso do <strong><em>control+alt+del</em></strong> e da construção dos terminais locais tty pelo <strong><em>getty, mingetty ou mgetty,</em></strong> além da execução do script sulogin que era executado com a runlevel 1 (modo de single-user). Com isso, os scripts shell armazenados em em distribuições baseadas no formato da RedHat eram iniciados em /etc/rc.d/init.d (havia um link simbolico para /etc/init.d) ou o proprio /etc/init.d em distribuições baseadas em Debian. Uma observação interessante sobre o mgetty é que ele suportava o PPP (Protocolo Ponto-a-Ponto), mas ai já é um assunto para um outro tópico retro ;-)</p>
<p>Mas como esses scripts eram iniciados? Eles eram indicados por ordem de prioridade e indicados em /etc/rcX.d, sendo o X o número da runlevel selecionada. Ou seja, algo parecido com isso aqui: rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/.</p>
<p>Mas até isso era relativo, pois dependendo do nível de execução, os scripts eram descarregados em vez de carregados. Ou seja, por padrão em distribuições baseadas em Red Hat (formato rpmdb), iniciavam todos os scripts mencionados em /etc/rc3.d, cujo eles eram referenciados por uma ordem de boot que variava entre 10 a 99, sendo 01 a 10 para os scripts mais importantes. Esses scripts eram "linkados" com o diretório /etc/rc.d/init.d ou /etc/init.d para gerenciar a ordem de boot, <strong>sendo S para "start" e K "para kill"</strong>.</p>
<p>No antigo formato SysVinit no Linux os modos eram constituídos assim:</p>
<p><strong>Nivel 0</strong>: Para o desligamento do sistema operacional. Era invocada pelo comando halt.<br /><strong>Nível 1</strong>: era dedicada ao modo de usuário único, usado para reparar o sistema sem que sejam carregados os scripts operacionais, como a rede.<br /><strong>Nível 2</strong>, que no Debian e Ubuntu era a padrão de uso do usuário. Mas em distribuições como o Suse, não carregavam a rede.<br /><strong>Nível 3</strong>, que em distribuições como baseadas em RedHat, Fedora, CentOS era o nível de execução padrão para o uso do usuário <strong><em>sem a utilização da interface gráfica</em></strong>, ou seja, não carregava gerenciadores de login automaticamente como o <strong>xdm, gdm e kdm.</strong><br /><strong>Nível 4</strong>, que era uma runlevel opcional para uso do usuário. Porem na maravilhosa distribuição Slackware era a padrão, e também podia executar o X11.<br /><strong>Nivel 5</strong>, que em distros baseadas em Red Hat carregava o X11 durante o boot, ou seja, o gerenciador de login grafico pelo XDM, ou KDM ou GDM ou LightDM.<br /><strong>Nivel 6</strong>, para reboot. Era invocada pelo comando reboot.</p>
<p>Os comandos <em>runlevel</em> ou <em>who -r</em> identificam a runlevel que o administrador esta conectado tal como a ultima modificação, que quando apresentado por "N", é sem modificação anterior.</p>
<pre><code class="lang-plaintext">runlevel
who -r
</code></pre>
<p>Gostaria também de dizer que o antigo e maravilhoso Red Hat Linux 4,5,6,7, 8 e 9 (atualmente o RHEL) e o SuSE (atualmente o SLE). Sempre foram muito bem documentados, sendo o SuSE com seus belos arquivos de configuração cheios de comentários, o que ajudava muito na época em vez de abrir livros e consulta ao TLDP <a target="_blank" href="https://tldp.org/">The Linux Documentation Project (</a><a target="_blank" href="http://tldp.org">tldp.org</a><a target="_blank" href="https://tldp.org/">)</a>.</p>
<p>Hoje, distribuições Linux são construídas e atualizadas com o maravilhoso Systemd, que lembra muito sistemas como o SMF "Service Management Facility". implementado no Solaris 10, tal como o Launchd, implementado no MacOS na versão 10.4. Ele é sistema muito semelhante a estes na sua maneira de trabalhar, tudo bem... não sejamos radicais ...... mas é verdade..</p>
<p>O <strong>Systemd</strong> foi desenvolvido para centralizar o processo de inicialização dos scripts do sistema operacional Linux e substituir de vez o init do bom e velho sysvinit, facilitando o gerenciamento de serviços e e processos dos mesmos, tudo de uma maneira bastante centralizada. Ele é totalmente compatível com o formato SysVinit porem possui outro modo de inicialização quando comparado as velhas RUNLEVELs. Ele possui os modos "multi-user" que da no mesmo que a antiga runlevel 3, "graphical-user" que lembra a runlevel 5, além de existir os "modos" dedicados para reparação do sistema e modos de emergência.</p>
<p>O grande diferencial do Systemd é que ele executa os scripts de inicialização sob demanda através de ativações via socket e bus. Ele utiliza o cgroups para gerenciar os recursos do sistema como CPU, MEM, I/O e permite que os processos sejam isolados, limitando, controlando e monitorando esses recursos. Desta forma o systemd reduz o tempo de inicialização do sistema e otimiza o uso dos recursos, centralizado tudo na sua unidade de configuração e gerenciamento do sistema. Cada unidade é representada por arquivos como .service, .target, .mount, .socket e muitos outros tipos. Estes podem ser encontrados no diretório das unidade, instalados em <strong><em>/usr/lib/systemd/system</em></strong> e os arquivos de configuração local em <strong><em>/etc/systemd/system.</em></strong> No SystemD vc pode verificar qual target esta conectado com o comando <strong><em>systemctl get-default</em></strong></p>
<pre><code class="lang-plaintext">[root@gurunix~]# systemctl get-default
multi-user.targett
</code></pre>
<p><strong>Mas e no UNIX?</strong> Bom ali era um pouco diferente.</p>
<p>Em <strong>sistemas Solaris</strong> ou SunOS, o nível 5 que desliga o sistema, assim como a 0. Já os modos de manutenção eram o "s" ou "S", sendo para administração e diferente da runlevel 1. No Solaris a runlevel 2 que era a multi-user. O seu processo de boot é gerenciado pela <strong>OpenBoot PROM</strong>, sendo necessário entrar na sua administração pela tecla L1/STOP (ai vai depender do seu teclado da Sun Microsystems). O disco de boot <em>/dev/rdsk/c0t0d0s0</em>, se for o primeiro, é então iniciado pela opção do boot, carregando o kernel em <strong><em>/etc/system</em></strong>. Caso fosse necessário carregar um outro kernel fora do diretório padrão, poderia ser feito com o comando boot -a &lt;especificando o caminho&gt;. Ou boot -s para single user diretamente no shell da openboot.</p>
<p>No <strong>IBM AIX</strong> ainda é bem diferente. Existem diversos níveis de execução, sendo de 0 a 9, também declarados no bom e velho /etc/inittab. Não se espante se vc ver prefixos como a, b, c, m, M, s e S.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1679169674332/0e697671-9987-4509-be10-b11bba2e5807.jpeg" alt class="image--center mx-auto" /></p>
<p>No AIX a runlevel 2 é a padrão e todo o seu processo de boot e seus scripts rc são realizados em ordem. Um dos scripts de boot e um dos mais importantes no AIX é o <a target="_blank" href="http://rc.mls"><strong>rc.mls</strong></a><strong>.boot,</strong> que carrega todo o processo de segurança do sistema. No AIX após o BLV "Boot Logical Volume" ser carregado por completo, o script rc.boot é executado algumas vezes para concluir todo o processo de inicialização. Outro ponto interessante é que o AIX possui um formato de base de dados chamado ODM ou Object Data Manager. Ele é utilizado para armazenar informações sobre o hardware e tudo o que há no OS.</p>
<p>No sistema FreeBSD o processo de inicialização ocorre através do "boot0 boot manager" instalado através do comando boot0cfg na sua área de boot. Ele é realizado através do /boot/boot0 que define o primeiro setor de boot do freebsd em sistemas x86 (boot0).</p>
<p>Em hardwares x86 o FreeBSD assim como todos os outros sistemas operacionais no padão IBM-PC, usa uma área "legacy", chamada MBR, que possui 512 bytes, cujo destes são reservados 446 bytes para o bootloader. E no FreeBSD é exatamente isso que ocorre com a inicialização do boot0. Durante esse processo de inicialização do sistema o arquivo /boot/loader.rc é executado e ele se encarrega de de ler o arquivo /boot/defaults/loader.conf (/boot/loader.conf). Encontrando o setor de boot, então o kernel do FreeBSD se encarrega de todo o seu processo, até fazer a leitura de toda a configuração que se encontra no /etc/defaults/rc.conf e detalhes específicos em /etc/rc.conf entregando o terminal ao administrador. "Semelhantemente" no NetBSD. Já no OpenBSD esse processo é bem similar no /etc/boot.conf.</p>
<p>Enfim, eu gostaria de ficar aqui até amanha escrevendo sobre o processo de boot destes sistemas, mas se transformaria em um livro. Eu apenas resumi ai em cima como funciona o boot process em UNIX e Linux, porém, eu gostaria muito de entrar em detalhes. Eu me lembro de uma matéria que eu escrevi no meu blog sobre o Systemd, assim que ele foi lançado. Eu detalhei muito os arquivos de configuração e os comandos de administração dele e prometo que farei uma segunda versão dele aqui.</p>
<p>Próximo artigo vamos ver o uso de comandos como o service do antigo formato sysvinit, systemctl do systemd tal como ps, kill, top, pgrep, pkill, strace, nice, renice e muitos outros. Mas adoraria falar também do svcadm ;)</p>
<p>é o poder ;)</p>
]]></content:encoded></item><item><title><![CDATA[é o poder]]></title><description><![CDATA[Fala ai pessoal tranquilo? Por motivos de trabalho e tempo eu acabei não escrevendo mais para o meu blog, MAS eu resolvi voltar na ativa e escrever algumas coisas aqui bem legais.... 
Vamos nos ver em videos também ok?
Eu trabalho com TI praticamente...]]></description><link>https://aprigiosimoes.com.br/e-o-poder</link><guid isPermaLink="true">https://aprigiosimoes.com.br/e-o-poder</guid><dc:creator><![CDATA[Aprigio Simoes]]></dc:creator><pubDate>Sun, 10 Oct 2021 00:15:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1633824882533/wtm0YeXmX.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Fala ai pessoal tranquilo? Por motivos de trabalho e tempo eu acabei não escrevendo mais para o meu blog, MAS eu resolvi voltar na ativa e escrever algumas coisas aqui bem legais.... </p>
<p>Vamos nos ver em videos também ok?</p>
<p>Eu trabalho com TI praticamente há 22 anos, especificamente com sistemas UNIX e distribuições Linux. Sou consultor e instrutor de Linux, para certificações técnicas e para administração do ambiente.</p>
<p>Entre em contato comigo:
EMAIL: aprigiosimoes@gmail.com</p>
<p>E lembre-se, Linux é o poder !!!!</p>
<p>--
Aprigio Simoes
twitter:  <a target="_blank" href="https://twitter.com/aprigiosimoes">@aprigiosimoes</a> </p>
]]></content:encoded></item></channel></rss>