sábado, 19 de abril de 2025

Instalação e Configuração do Chrony

c h r o n y


   Veremos duas maneiras de instalar o Chrony (como todo programa): instalação semi-automática e manual.
   O Chrony (NTP/NTS) é uma ferramenta que sincroniza o tempo em redes, servidores e desktops funcionando como uma implementação do Network Time Protocol (NTP). Ele pode sincronizar o relógio do sistema com servidores NTP, relógios de referência (por exemplo, receptor GPS) e entrada manual usando wristwatch e teclado. Ele também pode operar como um servidor NTPv4 (RFC 5905) e um peer para fornecer um serviço de sincronização de tempo a outros computadores na rede.
Link ao final.

   O Chrony é indicado pelo ntp.br:
"O Chrony é uma implementação moderna e versátil do NTP. É seguro e confiável e recomenda-se seu uso para as funções de cliente e servidor.
Em particular, para a função de cliente NTP, o Chrony é a principal recomendação do NTP.br . Isso por diversas razões: se configurado como aqui sugerido o chrony vai se comportar apenas como um cliente NTP, ou seja, não vai abrir um socket na porta 123 UDP e atender requisições."
Link ao final.

INSTALANDO PELO GERENCIADOR DE PACOTES

   No Debian, Ubuntu, Mint, Kali:
$ sudo apt install chrony

   No Red Hat e Fedora:
$ dnf install -y chrony

   OpenSuse:
$ zypper install chrony

   No Debian 12, os repositórios tem a versão 4.3.2 e o Chrony está na versão 4.6.1.
   Fica à sua escolha, pois as configurações depois são iguais.
   Deixarei aqui a instalação manual, mesmo passando um perrengue desgraçado porque o Chrony instalado manualmente não instala por padrão alguns arquivos necessários e, além disso, não tem "make uninstall", porém, isso não é exclusivo do Chrony. Alguns desenvolvedores optam por não colocar "make uninstall" porque não tem como saber em qual diretório o usuário instalará o programa e o diretório padrão de alguns arquivos muda de acordo com cada distribuição, e mesmo que na instalação automática o pacote já vem pronto com as configurações para cada distribuição, ainda assim pode mudar de acordo com uma nova versão.

   A instalação manual parece trabalhosa, mas depois que se "pega o jeito" ela flui naturalmente e só demora o tempo da compilação (make) porque a digitação dos comandos é simples. Como aprendizado todo mundo deveria fazer pelo menos uma vez. É trabalhoso, mas não é difícil!
   Muitos programas, basicamente, quando você vai atualizar basta executar "make uninstall" (os que trazem ele) estando dentro do diretório da instalação atual e instalar a versão mais recente estando dentro do diretório dessa nova versão.
   Os programas que não trazem "make uninstall" delete o diretório da instalação atual, faça uma busca e delete os arquivos e diretórios remanescentes, crie o diretório da nova versão, baixe a versão mais recente, descompacte, entre no diretório e execute "./configure". "make", "make install".
   Muita gente se engana ao pensar que na instalação manual depois fica um monte de arquivos como lixo no sistema, porém, quando você utiliza um gerenciador de pacotes (apt, dnf, zypper, etc) também ficam pacotes para trás na desinstalação e isso não é culpa dos gerenciadores de pacotes e/ou dos desenvolvedores porque, como já foi dito, não tem como adivinhar em qual diretório o usuário instalará o programa e o diretório padrão muda nas distribuições. E mesmo que na instalação [semi]-automática o pacote já vem pronto com as configurações para cada distribuição, ainda assim pode mudar de acordo com uma nova versão.
   Em todo e qualquer sistema sempre ficam arquivos para trás ocupando espaço, por isso é necessário fazer uma limpeza no sistema de vez em quando.


INSTALAÇÃO MANUAL

Instalação manual (Debian 12 - esta instalação serve de maneira geral para qualquer programa a ser instalado manualmente)

   Com essa instalação manual você evita erros como:
No NTS support;
Could not read valid frequency and skew from driftfile /var/lib/chrony/drift;
Could not open /var/log/chrony/tracking.log : Permission denied;
501 Not authorised; etc.

IMPORTANTE
   Na instalação manual de qualquer programa aconselho sempre primeiro a desinstalar a versão anterior, pois pode acontecer de ter mudanças profundas de uma para outra versão e isso pode dar problemas.
   Ao final tem uma lista de arquivos e diretórios para remover em caso de desinstalação.

   Instalando dependências:
$ sudo apt update
$ sudo apt install pkg-config build-essential libc6 libtomcrypt1 libtomcrypt-dev libcap-dev golang-github-seccomp-libseccomp-golang-dev gnutls-bin libgnutls28-dev openssl wget

   Criando o usuário:
$ sudo useradd chrony

   Criando o diretório em /opt (Debian 12)

Entre no diretório:
$ cd /opt

O Debian não toca nos diretórios /opt e /usr/local cujos são próprios para instalações de programas que não vem por padrão. O mais aconselhável é o /opt,

   Criando o diretório geral para downloads, descompactação, bkp, etc:
$ sudo mkdir croni

   Criando o diretório para instalação:
$ sudo mkdir chrony

$ cd croni
$ sudo wget https://chrony-project.org/releases/chrony-4.6.1.tar.gz

   ou acesse o site
   e faça o download da última versão.

$ ls
$ sudo tar -xf chrony-4.6.1.tar.gz
$ cd chrony-4.6.1

   Configurando e instalando no diretório /opt/chrony estando dentro de /opt/croni/chrony-4.6.1:

--prefix=/opt/chrony - diretório onde será instalado;
--enable-scfilter - suporte ao recurso de computação segura do Linux (seccomp);
--enable-nts - suporte a Network Time Security (NTS) para sincronização de horário segura.
$ sudo ./configure --prefix=/opt/chrony --enable-scfilter --enable-nts
$ sudo make
$ sudo make install
$ sudo apt update


CONFIGURANDO

   Criando os diretórios e arquivos necessários e setando permissões e proprietários:

$ cd /var/lib
   O diretório /var/lib/chrony é o único que essa instalação cria, mas temos que alterar o proprietário:
$ sudo chown -R chrony chrony
$ cd
$ sudo mkdir /var/log/chrony
$ cd /var/log
$ sudo chown -R chrony chrony
$ cd
$ sudo touch /etc/chrony.keys
$ sudo chown chrony /etc/chrony.keys
$ sudo chmod 400 /etc/chrony.keys

  Configurando (utilizo o vim, você utilize teu editor de texto predileto):
$ sudo vim /etc/chrony.keys
   Coloque dentro:

1 SHA256 b1gS3cr3tKey123!
2 SHA256 Ch4v&S&cr3t4ch4v3?

   Aconselho a mudar os caracteres e colocar sua própria combinação de caracteres.
   A parte "1 SHA256"e "2 SHA256" deixe assim. Pode colocar mais chaves caso queira: "3 SHA sdFJ3dftj&*cDnHHmSA!", etc. Coloque um máximo de 4 chaves. Não há um limite de chaves, mas é aconselhado não muitas chaves.
   No entanto, a chave utilizada para autenticação deve ter um ID (por exemplo, b1gS3cr3tKey123!) sem sinal no intervalo de 1 a 2^32-1 (2 elevado na 32 menos 1).
   A função hash padrão é MD5, que é sempre suportada.
   Se o chronyd foi criado com suporte habilitado para hash usando uma biblioteca de criptografia (nettle, nss ou libtomcrypt), as seguintes funções estão disponíveis: MD5, SHA1, SHA256, SHA384 e SHA512. Dependendo da biblioteca e da versão que o chronyd está usando algumas ou todas das seguintes funções e/ou criptografias também podem estar disponíveis: SHA3-224, SHA3-256, SHA3-384, SHA3-512, RMD128, RMD160, RMD256, RMD320, TIGER e WHIRLPOOL .

   Copiando o chrony.conf porque nessa instalação ele não cria por padrão:
$ sudo cp /opt/croni/chrony-4.6.1/examples/chrony.conf.example2  /etc/chrony.conf
$ sudo vim /etc/chrony.conf

   Deixe como abaixo:

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
cmdallow 127.0.0.1
local stratum 2
#pool pool.ntp.org iburst
server a.st1.ntp.br iburst nts
server b.st1.ntp.br iburst nts
server c.st1.ntp.br iburst nts
server d.st1.ntp.br iburst nts

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 0.1 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
#sourcedir /run/chrony-dhcp
#sourcedir /etc/chrony/sources.d

# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *

# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2

# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Serve time even if not synchronized to a time source.
#local stratum 10

# Require authentication (nts or key option) for all NTP sources.
#authselectmode require

# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys

# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony

# Insert/delete leap seconds by slewing instead of stepping.
leapsecmode step
leapsectz right/UTC

# Set the TAI-UTC offset of the system clock.
#leapseclist /usr/share/zoneinfo/leap-seconds.list

# Specify directory for log files.
logdir /var/log/chrony

# Select which information is logged.
log measurements statistics tracking

# Erro máximo tolerado em ppm em relação aos servidores
maxupdateskew 10

   Salve e saia.

   É uma configuração própria para sincronizar a contento o relógio do sistema, caso quiser adapte para você.

   Criando o UNIT para o famigerado Systemd (utilizei o vim, você utilize teu editor preferido):
$ sudo vim /etc/systemd/system/chrony.service

[Unit]
Description=Chrony NTP/NTS
After=syslog.target ntpdate.service sntp.service ntpd.service
Conflicts=ntpd.service systemd-timesyncd.service

[Service]
Type=notify
PIDFile=/run/chrony/chronyd.pid
ExecStart=/opt/chrony/sbin/chronyd -f /etc/chrony.conf -u chrony
ExecStop=/opt/chrony/sbin/chronyd

[Install]
WantedBy=multi-user.target
Alias=chrony.service

   Salve e saia.
   Veja bem, caso você executou a instalação em outro lugar que não /opt/chrony, ajuste os caminhos no arquivo acima.


CONFIGURAÇÕES FINAIS

   Reconfigurando, habilitando e iniciando:
$ sudo systemctl daemon-reexec
$ sudo systemctl daemon-reload
$ sudo systemctl enable chrony
$ sudo systemctl start chrony
$ sudo systemctl status chrony


Caso tenha feito tudo certo estará como na imagem acima.
A mensagem em amarelo é porque foi a primeira sincronização, depois ela some.

Pode sempre verificar os servidores atuais em
   A título de verificação acesse o site e verifique se no lado direito aparece:

"HORA CERTA XX:XX:XX SUA HORA XX:XX:XX UTC-3
A hora do seu computador está correta".

   Caso não estiver, dê um refresh no site e se persistir refaça as configurações do arquivo /etc/chrony.conf com calma.
   Os servidores "a.ntp.br, b.ntp.br", etc, são IPv6, caso quiser acrescentar, mas veja que não tem o NTS (Network Time Security) que é uma extensão de segurança do protocolo NTP (Network Time Protocol).

   Criando 'aliases':
$ cd
$ vim apelidos (dê o nome que quiser)
   Coloque dentro:

alias chronyc='/opt/chrony/bin/chronyc'
alias chronyd='/opt/chrony/sbin/chronyd'
alias chronycaut='sudo /opt/chrony/bin/chronyc -N authdata'
alias chronycmks='sudo /opt/chrony/bin/chronyc makestep'

   Salve e saia.

$ vim .bashrc

   Acrescente no final:

if [ -f apelidos ]; then
. apelidos
fi

   Salve e saia.
$ source .bashrc

   Testando:
$ chronyc
$ chronyd --version
$ chronycaut
$ chronyc tracking

Para os 4 comandos é necessário criar 'aliases', pois a instalação é manual.
Os comandos 'chronyc tracking', 'chronyc sources -v', além de outros, são reconhecidos automaticamente.
Caso aparecer mais algum comando que não for reconhecido basta acrescentar no arquivo de 'aliases'.
Serve para qualquer instalação de qualquer programa no Linux.

   Na página de FAQ do Chrony:

"4.2. Continuo recebendo o erro: 501 Não Autorizado
Este erro indica que o chronyc enviou o comando para o chronyd usando um soquete UDP em vez do soquete de domínio Unix (por exemplo, /var/run/chrony/chronyd.sock), o que é necessário para alguns comandos. Por motivos de segurança apenas os usuários root e chrony têm permissão para acessar o soquete.
Também é possível que o soquete não exista. O chronyd não criará o soquete se o diretório tiver um proprietário ou permissões incorretas. Nesse caso deve haver uma mensagem de erro do chronyd no log do sistema."

   É melhor criar aliases do que mudar permissões e proprietários, nesse caso.

E assim finalizamos a instalação e configuração do Chrony.

   Para reiniciar: sudo systemctl restart chrony
   Parar: sudo systemctl stop chrony
   Status: sudo systemctl status chrony

   Para recomeçar do zero:
$ cd /opt/croni
$ sudo rm -rf chrony-4.6.1
$ sudo rm -rf /opt/chrony
$ sudo mkdir /opt/chrony
$ sudo tar -xf chrony-4.6.1.tar.gz
$ cd chrony-4.6.1
$ sudo ./configure --prefix=/opt/chrony --enable-scfilter --enable-nts
$ sudo make
$ sudo make install
e proceda com as configurações.

   Caso queira remover completamente:
/opt/croni/
/etc/chrony.conf
/etc/chrony.keys
/etc/systemd/system/chrony.service
/var/log/chrony
/var/lib/chrony
/etc/systemd/system/multi-user.target.wants/chrony.service
/etc/systemd/system/chrony.service
/run/chrony
/opt/chrony
/opt/croni
/sys/fs/cgroup/system.slice/chrony.service

   Faça uma busca:
$ sudo find / | grep chrony | less

   Para remover o usuário:
$ sudo deluser chrony

Projeto Chrony:

   Recomendações e comparações do ntp.br:

Referências


quinta-feira, 17 de abril de 2025

Debian 12 -- Errata - Correções Importantes de Segurança



Deparei-me hoje com o seguinte site:

referindo-se a algumas correções de segurança no Debian 12, algumas vindas desde julho de 2023, como podem ver no site oficial do Debian.


# Atualizações propostas para a versão 12
deb https://deb.debian.org/debian bookworm-proposed-updates main contrib non-free-firmware non-free

Resolvi colocar esse repositório no arquivo /etc/apt/sources.list e executar "sudo apt update" acreditando que nada aconteceria.

Para minha surpresa, em um computador veio:

Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto
62 packages can be upgraded. Run 'apt list --upgradable' to see them.

e em outro:

Construindo árvore de dependências... Pronto
Lendo informação de estado... Pronto
41 packages can be upgraded. Run 'apt list --upgradable' to see them.

sendo que os dois tem Debian 12 instalados esse ano e sempre atualizados.
Depois executei "sudo aptitude safe-upgrade (ou sudo apt upgrade)" e os pacotes foram atualizados.

A pergunta é: como tinham todas essas atualizações de segurança desde julho de 2023?

Aconselho a quem tem o Debian 12 que execute esse procedimento o mais breve possível.

quinta-feira, 10 de abril de 2025

Immanuel Kant (ou seja lá qual for nome dele)

 


   O celibatário Kant representou a volta brutal e avassaladora dos mentirosos sofistas na história da humanidade.

   O estrago que esse sofista infeliz fez - e ainda faz - na cabeça das pessoas é uma coisa incomensurável.

   Kant influenciou Fichte, Hegel, Marx, Gramsci, a Escola de Frankfurt (com todos seus autores), mais recentemente Heidegger, Paulo Freire, Foucault, etc. Esta cepa ideológica-filosófica, esta corrente de pensamento maldita.

   A influência de Kant foi no estilo de escrita, desdobramentos, ilusões (nada é o que parece ser, ou seja, não acredite nos seus próprios olhos).

   Aristóteles e Platão tiveram embates terríveis com os sofistas.

   Principalmente Aristóteles. Ele dizia que - falando numa linguagem popular: "esses caras [os sofistas] nem lêem o que eu escrevo, tiram uma frase minha do contexto e julgam ser o meu pensamento inteiro."

   A considerada "obra-prima" de Kant: "Fundamentação da Metafísica dos Costumes" é uma coleção de tautologias, redundâncias e repetições desnecessárias. Basta você ler as 3 ou 4 primeiras páginas que já se entende as bobagens... o resto das 112 páginas é um blá blá blá sem fundamento. São desdobramentos das 3 ou 4 primeiras páginas, são repetições e redundâncias idiotas.

    Tem uns que consideram "A Crítica da Razão Pura" a obra-prima de Kant, mas há controvérsias. Nem dá para considerar que ele (Kant) tenha uma obra-prima literária.

   Acredito que a obra-prima dele seja enganar as pessoas.

segunda-feira, 7 de abril de 2025

Criar entrada (menuentry) ISO no Grub


INTRODUÇÃO

Como criar uma entrada ISO no Grub.

Nível intermediário.

   Na sequência temos os comandos e os arquivos necessários para as configurações.

   O Grub (Grand Unified Bootloader) é um bootloader, ou seja, um carregador de inicialização.

   Isso é tudo o que você precisa saber sobre o Grub no momento, pois o Grub não é o escopo do artigo, o escopo é como criar uma entrada (menuentry) no arquivo /etc/Grub/40_custom, porém, primeiro segue uma explicação necessária sobre o processo de inicialização do Linux.

   O binário do kernel do UNIX é chamado UNIX. Quando o kernel, em tempos antanhos, passou a ter suporte para memória virtual foi renomeado para "vmunix". O "vmlinuz" é derivado de "Virtual Memory LINUx gZip". O Kernel Linux, compactado geralmente com uma extensão z, gz, ou xz como é hoje, passou a se chamar "vmlinuz" e continua até hoje, mesmo tendo, algumas vezes, outra extensão. O "vmlinuz" é um arquivo compactado e inicializável do Kernel Linux, porém, não é apenas um arquivo compactado, ele tem um descompactador embutido no código, além de outras coisas.

   O initrd (Initial ramDisk - Disco RAM Inicial) fornece a capacidade de carregar um disco RAM pelo carregador de inicialização. Este disco RAM inicial pode então ser montado como um sistema de arquivos raiz temporário e pode ser executado a partir dele. Depois, um novo sistema de arquivos raiz pode ser montado a partir de um dispositivo diferente. A raiz anterior (do initrd) é então movida para um diretório e pode ser desmontado posteriormente.

   Grosso modo, o initrd é uma porção de diversos arquivos/ferramentas/módulos, cada qual com sua função, por exemplo, a ferramenta insmod está incluída no initrd, e esse conjunto é juntado nesse pacote chamado initrd que é também um sistema de arquivos temporário carregado na memória RAM durante o processo de inicialização do Linux para que o Kernel possa montar o sistema de arquivos raiz real (aquele que você escolhe durante o particionamento na instalação do sistema, seja ext4, Btrfs, etc.

   Apesar de que cada distribuição tem sua própria maneira de lidar com isso, geralmente é feito desta maneira no Linux, pois até os nomes do "vmlinuz" e "initrd" podem variar.

   O initrd.img é um link simbólico para o initrd que é carregado pelo bootloader junto com a imagem do kernel e é essencial para o processo de inicialização que os sistemas Linux modernos usam. O initrd serve como um sistema de arquivos raiz provisório até que o sistema de arquivos raiz real seja montado. Por isso, às vezes, quando aparece aquela mensagem "you need to load the kernel first - você precisa carregar o kernel primeiro" é porque o "vmlinuz" (o kernel) não foi encontrado ou a assinatura é inválida ou está corrompido, etc. O bootloader (no caso, o Grub) não encontrou o kernel para carregar e montar.

   O processo de inicialização se dá, resumidamente, da seguinte maneira:

   Quando você liga o computador, o BIOS da placa-mãe procura um bootloader (como o Grub, se houver) que, por sua vez, carrega o vmlinuz e o initrd na memória. Isso acontece após você escolher um sistema no menu do Grub ou após o sistema padrão configurado carregar automaticamente;
   A rotina programada no vmlinuz descompacta o kernel na memória;
   Depois da descompactação o controle é passado para o Kernel que então monta o initrd como seu sistema de arquivos raiz inicial temporário;
   O initrd assume o controle e carrega os módulos necessários que são cruciais para que o Kernel acesse o hardware para montar o sistema de arquivos real (ext4, NFS, Btrfs, etc);
Então o Kernel carrega os drivers necessários e depois que os drivers foram carregados, o Kernel monta o sistema de arquivos raiz real e continua o processo de inicialização.

   Fiz essa breve explicação para entendermos o processo de inicialização necessário para criarmos as entradas para as imagens iso no Grub e também evitar os avisos de erro durante a inicialização do Linux, como, por exemplo: "você precisa carregar o kernel primeiro", "memória insuficiente - out of memory", "Invalid magic number", "servidor não encontrado", etc.

   O erro "you need to load the kernel first - você precisa carregar o kernel primeiro" geralmente significa que tem algum parâmetro errado em relação aos caminhos para o vmlinuz. Em caso de Live pelo pendrive pode significar também que o Secure Boot e/ou o TPM estão habilitados, a imagem está corrompida, etc. Este é um erro bastante genérico que, para solucioná-lo, você deve ir pelo processo de eliminação.

   O erro "memória insuficiente - out of memory" é auto-explicativo, porém, em caso de ISO carregada na RAM a partir do disco pode significar que não tem espaço suficiente na RAM ou, caso a ISO tenha sido colocada na partição /boot (não recomendado) pode significar que não tem espaço suficiente na partição /boot para descompactar os arquivos.

   O erro "Invalid magic number" geralmente significa algum erro de verificação do hash (não necessariamente imagem corrompida, somente o hash) ou, em último caso, a imagem está mesmo corrompida. Essa mensagem "número mágico inválido" provavelmente foi uma brincadeira dos desenvolvedores, como os "poderes de super-vaca" do aptitude. O erro "servidor não encontrado" geralmente significa que algum caminho para a imagem foi digitado errado, o hdx,x está errado, o computador está sem internet, a imagem não conseguiu conexão com a internet, etc.

   A causa desses erros podem variar, procurei dar em linhas gerais de acordo com a mensagem e com a experiência.

   Passados os prolegômenos, vamos colocar a mão no mouse!

COMEÇANDO

   Faça o download da imagem ISO (Live ou não) da sua distribuição preferida, por exemplo, em /home/seu_usuario/Downloads ou outra pasta de sua escolha. Extraia os arquivos clicando com o botão direito na pasta > Extrair aqui ou algo parecido.

   Será feita a extração dos arquivos, pois uma imagem iso é, grosso modo, um arquivo compactado.


Imagem iso e sua pasta com os arquivos extraídos.


   Entre na pasta, por exemplo, debian-live-12.10.0-amd64-gnome, dentro encontrará a pasta "live". Entre na pasta live. Dentro encontrará os arquivos "vmlinuz-6.1.0-32-amd64" e "initrd.img-6.1.0-32-amd64". O número 6.1.0-32 é a versão do Kernel Linux da versão 12.10.0 do Debian.

   No Ubuntu os arquivos vmlinuz e initrd.img estão na pasta "casper". Isso muda de acordo com a distribuição, então você terá de descompactar a imagem iso e procurar nas pastas os dois arquivos vmlinuz-alguma_versão e initrd.img-alguma_versão.

  Até aqui o processo é tranquilo, aliás, veremos que o processo todo é fácil, um pouco trabalhoso, mas é fácil, além disso, você fará uma única vez e durará um bom tempo até você trocar de imagem iso. Depois de estar de posse das informações necessárias pode deletar a pasta descompactada, caso quiser.

   De posse dessas informações, vamos começar.

   Abra o terminal e atualize o sistema e instale/atualize para o Grub2, caso quiser, senão somente atualize o sistema (aqui é o Debian, você dê os comandos referentes ao teu sistema):

$ sudo apt update
$ sudo aptitude safe-upgrade
$ sudo apt install grub2

   Abra o terminal e entre no arquivo /etc/grub.d/40_custom (este arquivo é o arquivo correto a ser alterado). Esse arquivo está presente na esmagadora maioria das distribuições Linux que usam o Grub. Caso você não encontrar na sua distribuição, procure na internet qual o arquivo equivalente. Esse processo descrito aqui foi feito no Debian.

Entrando no arquivo /etc/grud.d/40_custom

# vim /etc/grub.d/40_custom
ou
# nano /etc/grub.d/40_custom

   Para editar no vim pressione a tecla Insert, faça a alteração > Esc > para salvar e sair Shift + :, solte o Shift e digite wq ficando assim no canto inferior esquerdo :wq > Enter. Não pressione a tecla +, é somente a tecla Shift e a tecla : (dois pontos). Para salvar sem sair no vim digite somente w e dê enter.
   Para salvar no nano pressione ctrl+o (letra o) e dê Enter; para sair ctrl+x.

Sempre depois de alterar o arquivo /etc/grub.d/40_custom execute:
$ sudo update-grub
ou o comando equivalente da sua distribuição.
Sem atualizar o Grub não terão efeito as alterações no arquivo.
Reinicie e teste.

Visão do interior do arquivo sem as configurações.

   O arquivo 40_custom é o arquivo indicado para se fazer as entradas que aparecerão no menu do Grub na inicialização, sendo que depois de atualizar o Grub com update-grub ou outro comando relativo, essas informações serão gravadas no arquivo /boot/grub/grub.cfg. Junto com o arquivo /etc/default/grub, esses três são os arquivos principais do Grub, porém, somente faça alterações no /etc/default/grub e no /etc/grub.d/40_custom.

   NÃO altere o arquivo /boot/grub/grub.cfg.

   Na sequência do artigo tem as configurações do /etc/grub.d/40_custom para usar com várias distribuições. Como exemplo vamos analisar as seguintes linhas acrescentadas no arquivo original após a última linha:

menuentry 'Debian 12.10.0 LIVE RAM' {
insmod ext2
set isofile='/debina/Downloads/debian-live-12.10.0-amd64-xfce.iso'
rmmod tpm
loopback loop (hd1,6)$isofile
echo 'Loading Linux Live ...'
linux (loop)/live/vmlinuz-6.1.0-32-amd64 boot=live findiso=$isofile components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br toram
echo 'Loading initial ramdisk ...'
initrd (loop)/live/initrd.img-6.1.0-32-amd64
}


Abaixo o conteúdo está numerado como exemplo para maiores explicações.

1- menuentry 'Debian 12.10.0 LIVE' {
2- insmod ext2
3- set isofile='/debina/Downloads/debian-live-12.10.0-amd64-xfce.iso'
4- rmmod tpm
5- loopback loop (hd1,6)$isofile
6- echo 'Loading Linux Live ...'
7- linux (loop)/live/vmlinuz-6.1.0-32-amd64 boot=live findiso=$isofile components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br toram
8- echo 'Loading initial ramdisk ...'
9- initrd (loop)/live/initrd.img-6.1.0-32-amd64
10- }

   Na linha 1, menuentry, você pode colocar o que quiser entre as aspas, e abrimos a chave. Pode colocar aspas duplas ou simples, escolha uma e padronize no arquivo todo, sugiro aspas simples.

   Na segunda linha (linha 2) não altere, pois estamos carregando o módulo do sistema ext2 que é o sistema de arquivos temporário. Não se preocupe, esse ext2 tem nada a ver com o  sistema de arquivos que você escolhe quando particiona um Linux. Ele é somente para carregar o sistema de arquivos provisório, aliás, ele é o sistema de arquivos temporário.

   Na linha 3 estamos setando a variável "isofile" com o caminho para a imagem iso. No caminho coloque somente a partir do nome do usuário, não acrescente /home no começo. Não aconselho a colocar a iso na partição /boot, pois ocupa um espaço desnecessário, além do que a partição /boot não é própria para isso, coloque onde tenha espaço para isso.

   Na linha 4 chamamos o módulo "rmmod" para desabilitar o famigerado tpm do BIOS, caso tiver. Lembram, no começo, que o initrd chama os módulos quando acionado na inicialização.

   Na linha 5 fazemos um "loopback loop" (loop de retorno) que nada mais é do que fazer o dispositivo chamado "device" corresponder ao conteúdo da imagem do sistema de arquivos no arquivo, ou seja, lê a imagem indicada no caminho, descompacta e carrega ela passando-a como ramDisk para o Kernel. "Dispositivo" (device) aqui pode ser qualquer coisa relacionada ao computador, seja hardware (dispositivo físico) ou software (dispositivo virtual).

  Veja, tirado das páginas do manual do Grub (links ao final):
"No entanto, o próprio SO deve ser capaz de encontrar sua raiz. Isso geralmente envolve a execução de um programa de espaço do usuário antes que a raiz real seja descoberta. Isso é obtido pelo GRUB carregando uma pequena imagem especialmente feita e passando-a como ramdisk para o kernel."
"'device' é uma unidade especificada na sintaxe GRUB (consulte Sintaxe do dispositivo ) e 'file' é um arquivo do sistema operacional, que normalmente é um arquivo de dispositivo."

   A parte (hd1,6) da linha 5 veremos adiante o que você tem de colocar ali.

   A parte $isofile da linha 5 chama a variável isofile onde armazenamos o caminho para a imagem iso. Caso quiser pode chamar de $fileiso, $arquiviso, etc.

   Na linha 6 damos um "echo", ou seja, é um comando presente em várias linguagens de programação que exibe uma mensagem que você verá no Grub durante a inicialização do sistema.

   Na linha 7 chamamos o vmlinuz desejado, no caso, o live, e configuramos alguns parâmetros opcionais como o locale para fins de horário e o layout do teclado para fins de podermos digitar sem ter de adivinhar onde foi parar a barra, o ponto de interrogação, etc. Esses parâmetros são opcionais, algumas distribuições em suas imagens ISOs Live já oferecem essas opções ao inicializar a iso Live.

IMPORTANTE:
O parâmetro "toram" ao final da linha 7 indica que é para carregar a imagem live na memória ram.

   Mais adiante veremos que é interessante colocar duas entradas iguais, uma sem o parâmetro toram (to ram - para a ram) ao final e outra com o parâmetro, assim podemos escolher no menu do Grub.

   Colocando na RAM o carregamento e a execução, o sistema live tem um desempenho melhor, porém, caso você tiver pouca RAM física não é aconselhável, então faça as duas entradas iguais, somente uma sem toram e a outra com, pois não custa nada e você pode testar qual fica melhor e eliminar uma depois.

   Na linha 8 damos outro "echo".

   Na linha 9 chamamos o initrd. Na linha 10 fechamos as chaves com chave de ouro!

   O número de linhas para cada entrada (menuentry) pode ser diferente, esse número de 10 linhas não é fixo, vai de acordo com cada distribuição e configurações, mas é tranquilo.

Sempre depois de alterar o arquivo /etc/grub.d/40_custom execute:
$ sudo update-grub
ou o comando equivalente da sua distribuição.
Sem atualizar o Grub não terão efeito as alterações no arquivo.
Reinicie e teste.

   Agora veremos o que colocar em (hd1,6).

   Essa linha 5, já explicada, também indica o disco físico onde está armazenada a imagem iso, por isso segue a seqüência (hdX,X)$isofile: primeiro o disco, depois o caminho para a imagem, o que é lógico. Caso você colocar o disco/caminho errado o Grub emitirá a mensagem de "erro: arquivo '/caminho/para/iso' não encontrado". Em distribuições como o Arch você pode, em vez de hd0,1 colocar o UUID, como veremos adiante.

Erro de "você precisa carregar o kernel primeiro".

   Abra o terminal e execute

$ lsblk
e logo depois
$ sudo fdisk -l

Na saída dos comandos vemos as partições e os discos.

   Repare que tem sda, sdb, etc.

   O hd0 é o dispositivo sda, hd1 é o sdb e assim por diante. Apesar de que o Grub não liga muito para isso, ele prefere seguir o UUID, mas nesse caso podemos confiar. No caso em tela vemos que a partição /home está em sdb6, então a linha ficou com hd1,6. Lembrando que você colocará ali a partição onde está a imagem ISO, no meu caso a imagem está na /home.

   O número após a vírgula você vê na saída dos comandos. O hd começa em 0 e a partição começa em 1. /dev/sda é o disco 0, /dev/sdb significa o disco 1, o disco 2 é o /dev/sdc e assim por diante. A partição começa em 1 e como é sdb6 então colocamos 6.

   Para confirmar entre no arquivo /boot/grub/grub.cfg no modo somente leitura (cat /boot/grub/grub.cfg ou como usário digite nano /boot/grub/grub.cfg sem sudo) e procure na seção do menuentry do Kernel instalado na máquina uma linha iniciada com "set root", provavelmente será "set root='hd1,msdos1'" ou algo parecido. Daí vemos que, neste caso, confirmou que é hd1. Caso estiver hd0 ou outro, veja se coincide com as saídas dos comandos.


Somente veja o conteúdo do arquivo /boot/grub/grub.cfg, não altere.
Dica:
Caso tiver discrepância entre as informações teste a inicialização primeiro com hd0 e depois com hd1, etc, até não dar mais erro de "arquivo não encontrado", pois, às vezes, o Grub se perde na numeração porque o GRUB não distingue IDE de SCSI, por isso para o Grub os dois são hdx,x.

   Porém, para o kernel Linux:

/dev/hda refere-se ao primeiro disco rígido IDE;
/dev/sda refere-se ao primeiro disco rígido SCSI ou SATA;
/dev/nvme0n1 refere-se ao primeiro SSD NVMe;
/dev/nvme1n1 refere-se ao segundo SSD NVMe.

   Na saída do comando fdisk -l também podemos ver se é gpt ou mbr e podemos ver o identificador do disco, no caso, o UUID, aquele numerozão. Para ser mais específico pode se executar:

$ sudo fdisk -l /dev/sda

$ sudo fdisl -l /dev/sdb

e assim para todos os dispositivos.

Sempre depois de alterar o arquivo /etc/grub.d/40_custom execute:
$ sudo update-grub
ou o comando equivalente da sua distribuição.
Sem atualizar o Grub não terão efeito as alterações no arquivo.
Reinicie e teste.

   No Fedora, CentOS, RHEL, openSUSE, o comando geralmente é:

$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg

No Debian e derivados (Ubuntu, Linux Mint, Kali, etc) pode usar:

$ sudo update-grub

ou

$ sudo grub-mkconfig -o /boot/grub/grub.cfg

   Agora que destrinchamos o processo de elaborar entradas (menuentry) no arquivo /etc/grub.d/40_custom vamos ver as entradas de algumas distribuições.

CONTEÚDO FINAL DO ARQUIVO

   Deixo aqui o conteúdo completo de como ficou o arquivo /etc/grub.d/40_custom (você pode colocar somente uma entrada de acordo com a sua distribuição, para reparos, caso dê alguma coisa errada com o sistema... ou você faça besteira, o que é mais provável de acontecer).

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
#probe -u $root --set=rootuuid
#set imgdevpath="/dev/disk/by-uuid/$rootuuid"

menuentry 'Debian 12.10.0 LIVE XFCE RAM' {
insmod ext2
rmmod tpm
set isofile='/debina/Downloads/debian-live-12.10.0-amd64-xfce.iso'
loopback loop (hd1,6)$isofile
        echo    'Loading Debian Live xfce RAM ...'
linux (loop)/live/vmlinuz-6.1.0-32-amd64 boot=live findiso=$isofile toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
echo    'Loading initial ramdisk RAM ...'
initrd (loop)/live/initrd.img-6.1.0-32-amd64
}
menuentry 'Debian 12.10.0 LIVE GNOME RAM' {
        insmod ext2
        rmmod tpm
        set isofile='/debina/Downloads/debian-live-12.10.0-amd64-gnome.iso'
        loopback loop (hd1,6)$isofile
        echo    'Loading Debian Live gnome RAM ...'
        linux (loop)/live/vmlinuz-6.1.0-32-amd64 boot=live findiso=$isofile toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br 
        echo    'Loading initial ramdisk RAM ...'
        initrd (loop)/live/initrd.img-6.1.0-32-amd64
}
menuentry 'Fedora-KDE 41 Live RAM' {
rmmod tpm
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod chain
insmod ext2
# root=live:/dev/sr0 console=ttyS0,9600
        set isofile='/debina/Downloads/Fedora-KDE-Live-x86_64-41-1.4.iso'
        loopback loop (hd1,6)$isofile
        echo    'Loading Fedora Live ...'
        linux (loop)/images/pxeboot/vmlinuz root=live:CDLABEL=Fedora-KDE-Live-41-1-4 rd.live.image verbose iso-scan/filename=$isofile #acpi=off noprompt noeject dis_ucode_ldr toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
        echo    'Loading initial ramdisk ...'
        initrd (loop)/images/pxeboot/initrd.img
}
menuentry 'Arch Linux-2025 RAM' {
insmod ext2
rmmod tpm
set isofile='/debina/Downloads/archlinux-2025.03.01-x86_64.iso'
loopback loop (hd1,6)$isofile
echo 'Loading Arch Linux-2025 Live ...'
# linux (loop)/arch/boot/x86_64/vmlinuz-linux boot=x86_64 iso-scan/filename=$isofile noprompt noeject dis_ucode_ldr toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
linux (loop)/arch/boot/x86_64/vmlinuz-linux archisolabel=ARCH_202503 img_dev=/dev/sdb6 img_loop=$isofile earlymodules=loop toram
echo 'Loading initial ramdisk ...'
initrd (loop)/arch/boot/x86_64/initramfs-linux.img
}
menuentry 'OpenSuse Leap' {
        rmmod tpm
        load_video
        set gfxpayload=keep
set gfxmode=auto
        insmod gzio
        insmod part_gpt
        insmod chain
        insmod ext2
        set isofile='/debina/Downloads/openSUSE-Leap-15.6-DVD-x86_64-Media.iso'
        loopback loop (hd1,6)$isofile
        echo 'Loading OpenSuse-2025 Live ...'
        linux (loop)/boot/x86_64/loader/linux boot=isolinux iso-scan/filename=$isofile toram
        echo 'Loading initial ramdisk ...'
        initrd (loop)/boot/x86_64/loader/initrd
}
menuentry 'Kali-Linux LIVE RAM' {
        insmod ext2
        rmmod tpm
        set isofile='/debina/Downloads/kali-linux-2024.4-live-amd64.iso'
        loopback loop (hd1,6)$isofile
        echo 'Loading Kali-Linux Live ...'
        linux (loop)/live/vmlinuz-6.11.2-amd64 boot=live findiso=$isofile toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
        echo 'Loading initial ramdisk ...'
        initrd (loop)/live/initrd.img-6.11.2-amd64
}
menuentry 'Ubuntu LIVE RAM' {
        insmod ext2
        rmmod tpm
        set isofile='/debina/Downloads/ubuntu-24.04.2-desktop-amd64.iso'
        loopback loop (hd1,6)$isofile
        echo 'Loading Ubuntu Live ...'
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
        echo 'Loading initial ramdisk ...'
        initrd (loop)/casper/initrd
}
menuentry 'Linux Mint LIVE RAM' {
        insmod ext2
        rmmod tpm
        set isofile='/debina/Downloads/linuxmint-22.1-cinnamon-64bit.iso'
        loopback loop (hd1,6)$isofile
        echo 'Loading Linux Mint Live ...'
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject toram components locales=pt_BR.UTF-8 keyboard-model=pc105 keyboard-layouts=br
        echo 'Loading initial ramdisk ...'
        initrd (loop)/casper/initrd.lz
}


Sempre depois de alterar o arquivo /etc/grub.d/40_custom execute:
$ sudo update-grub
ou o comando equivalente da sua distribuição. Sem atualizar o Grub não terão efeito as alterações no arquivo. Reinicie e teste.

Estas duas linhas comentadas logo abaixo do início do arquivo:

#probe -u $root --set=rootuuid
#set imgdevpath="/dev/disk/by-uuid/$rootuuid"

servem mais para o Arch como configuração para o Grub encontrar-se pelo UUID do disco, porém, na configuração acima não foi preciso utilizá-las, é somente para o caso de colocar somente uma única entrada para o Arch. O Arch e o openSUSE não tem distribuições LIVE oficiais. Aquelas entradas ali são para instalação das ISOs oficiais desses sistemas. Para colocar na RAM basta acrescentar o parâmetro "toram".

Alguns parâmetros extras em algumas entradas como, por exemplo, do Fedora e/ou do openSUSE

load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod chain

você encontra dentro da pasta da imagem ISO descompactada, procure nas pastas pelo arquivo de texto grub.cfg e abra-o com seu editor de texto preferido que você encontrará as entradas (menuentry) padrões das configurações que vem na própria ISO.

   Esses parâmetros extras às vezes são necessários para uma boa execução do sistema Live a partir do disco.

   Parâmetros obrigatórios como "root=live:CDLABEL=Fedora-KDE-Live-41-1-4 rd.live.image" do Fedora e "archisolabel=ARCH_202503" do Arch você também encontra nesse arquivo grub.cfg dentro da pasta descompactada.

   Esses parâmetros são o LABEL que é necessário em algumas distribuições, por isso se faz necessário descompactar a ISO e procurar o arquivo grub.cfg.

   A cada nova ISO com uma nova versão da distribuição você deve refazer a entrada no Grub com esses novos parâmetros, pois eles podem mudar a cada nova versão da distribuição.
   Repare que algumas entradas tem iso-scan/filename=$isofile e outras findiso=$isofile, pelo que testei é indiferente, mas pode acontecer que alguma distribuição tenha esse parâmetro fixo por padrão, pois não testei com todas e nem teria como.

   O parâmetro boot=isolinux, boot=live, etc, é necessário em algumas distribuições e em outras não, verifique o arquivo grub.cfg dentro da pasta descompactada. No Arch e no Fedora, por exemplo, não tem tal parâmetro.

   Perceba que, com exceção do openSUSE, esse parâmetro "boot=" refere-se à pasta onde está o arquivo vmlinuz ou parecido, no Debian é a pasta "live", no Ubuntu é a pasta "casper", etc. No openSUSE é boot=isolinux. Lembrando que o openSUSE e o Arch não tem imagens ISO Live oficiais, as imagens que utilizei são imagens ISO para instalação do sistema, baixadas nos sites oficiais.

   Seguem abaixo o consumo da RAM com ISOs carregadas na memória RAM e no disco.

Tela do Debian com Gnome Live executado pelo disco.


Vemos o Debian com Gnome ocupando ~5GB na RAM.


Vemos o Debian com XFCE Live executado pelo disco.


Vemos o Debian com Xfce ocupando ~4GB na RAM.


Vemos o Debian com Xfce executado pelo disco, sem ser carregado direto na RAM, ocupando ~1GB na RAM.

   Lembrando que basta retirar o parâmetro "toram" que a ISO não será toda carregada na memória RAM, mas somente o necessário, o restante será executado/lido do disco físico.

   Em caso de formatação e reparo completo do sistema é aconselhado colocar a imagem toda na RAM, mesmo que você particionou a /home separadamente e não a formatará, pois a instalação completa do sistema mexerá na tabela de partições.

CONCLUSÃO

Mint com Mate ocupando ~4GB na RAM.


Fedora Live rodando do disco.


Arch com ISO rodando do disco.


Vários erros quando você não especifica o caminho correto no arquivo 40_custom.


Menu do Grub com todas as entradas (menuentry).

   Talvez você tenha de adaptar alguma coisa de acordo com a sua distribuição, pois aqui foi utilizado o Debian, porém, basta você entrar na pasta descompactada da ISO e procurar os dois arquivos "vmlinuz" e "initrd" ou algo parecido, como vimos neste artigo, os nomes desses arquivos podem mudar, mas sempre terá linuz(x) e initrd(.img) para procurar.

   Procure dentro da pasta descompactada da ISO as informações relevantes para colocar dentro das entradas (menuentry) de acordo com a sua distribuição. De acordo com as mensagens de erro você vai descobrindo se colocou o caminho errado para a imagem ISO, se colocou o hdx,x errado, etc, e assim vai arredondando o script no arquivo /etc/gub.d/40_custom.

Sempre depois de alterar o arquivo /etc/grub.d/40_custom execute:
$ sudo update-grub
ou o comando equivalente da sua distribuição.
Sem atualizar o Grub não terão efeito as alterações no arquivo.
Reinicie e teste.

Referências