Skip to main content

201.3 Kernel em Tempo Real


Vamos ver comandos para conseguir informações sobre o Kernel que está em execução em uma máquina e os módulos do Kernel. Vamos ver como funciona o Udev e alguns comandos para trabalhar com o Hardware.



Uname


Veja sobre o uname aqui.


Todas as informações mostradas pelo comando uname são coletadas do /proc, por exemplo, veja abaixo:

# Mostrando alguns arquivos que o 'uname' usa:
$ cat /proc/version
Linux version 5.14.8-001-maddogs (root@lpic2) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #2 SMP Mon Oct 11 17:37:40 UTC 2021


Sysctl


O comando sysctl é usado para configurar parâmetros do Kernel em tempo real, tudo que for alterado só funcionará até o próximo reboot.


Vamos ver um pouco da sintaxe desse comando.


Existe um arquivo que determina qual a quantidade máxima de arquivos abertos que o sistema consegue lidar, ele fica localizado em /proc/sys/fs/file-max.

# Listando conteúdo de '/proc/sys/fs/file-max':
$ cat /proc/sys/fs/file-max
9223372036854775807

Uma outra forma de ver isso é usando o comando sysctl. Coloque em mente que esse comando só trabalha após o diretório /proc/sys/, então para listar qualquer coisa dentro de algum diretório, devemos informar o diretório e o arquivo, ficando dir.file ou dir1.dir2.file e por ai vai, vejamos abaixo:

# Listando o conteúdo de '/proc/sys/fs/file-max':
$ sysctl fs.file-max
fs.file-max = 9223372036854775807

# Listando o conteúdo de '/proc/sys/fs/quota/drops':
$ sysctl fs.quota.drops
fs.quota.drops = 0

OpçãoDescrição
-aMostra todos os parâmetros disponível em /proc/sys
-w (file)Altera um valor em tempo real.

Agora vamos ver como alterar esses valores:

# Alterando o valor usando o 'echo':
\# echo "1000000000000000000" > /proc/sys/fs/file-max

# Usando o 'sysctl':
$ sudo sysctl -w fs.file-max=1000000000000000000

Para que isso não se perca ao reiniciar a máquina, podemos recompilar o Kernel informando os novos parâmetros (que seria muito complicado) ou podemos adicionar os parâmetros num arquivo, podemos usar o arquivo /etc/sysctl.conf ou criando algum arquivo dentro de /etc/sysctl.d/, ficando assim o conteúdo:

fs.file-max=1000000000000000000


Relembrando alguns comandos


Para relembrar esses comandos, veja abaixo:


LSDEV


É usado para listar os dispositivos de hardware disponíveis no sistema. É necessário instalar o pacote procinfo.

$ sudo lsdev
Device DMA IRQ I/O Ports
------------------------------------------------
0000:00:01.1 0170-0177 01f0-01f7 0376-0376 03f6-03f6 c100-c10f
0000:00:01.2 c0c0-c0df
0000:00:01.3 0600-063f 0700-070f
0000:00:03.0 c000-c07f
0000:00:04.0 c080-c0bf
0000:00:05.0 c0e0-c0ff
ACPI 0600-0603 0604-0605 0608-060b afe0-afe3
acpi 9
ata_piix 14 15 0170-0177 01f0-01f7 0376-0376 03f6-03f6 c100-c10f
cascade 4
dma 0080-008f
dma1 0000-001f
dma2 00c0-00df
fpu 00f0-00ff
fw_cfg_io 0510-051b
i8042 1 12
keyboard 0060-0060 0064-0064
PCI 0000-0cf7 0cf8-0cff 0d00-ffff
pic1 0020-0021
pic2 00a0-00a1
piix4_smbus 0700-0708
QEMU0002:00 0510-051b
rtc0 8 0070-0071
serial 03f8-03ff
timer 0
timer0 0040-0043
timer1 0050-0053
uhci_hcd c0c0-c0df
uhci_hcd:usb1 11
virtio0-config 24
virtio0-req.0 25
virtio2-config 26
virtio2-input.0 27
virtio2-output.0 28


Módulos


Para relembrar consulte aqui.

Relembre também o uso do depmod.


Com o comando modprobe, podemos carregar módulos do kernel passando parâmetros personalizados, semelhantes a argumentos em scripts. Esses parâmetros modificam o comportamento do módulo no momento em que ele é inserido no kernel.

# Desative o módulo 'r8169':
$ sudo moprobe -r r8169

# Ative o módulo 'r8169' com o parâmetro de 'debug' igual a 15:
$ sudo modprobe r8169 debug=15

Antigamente, a configuração persistente de parâmetros de módulos era feita no arquivo /etc/modules.conf. No entanto, esse método foi descontinuado. Atualmente, as configurações são feitas em arquivos dentro do diretório /etc/modprobe.d/.


Esses arquivos permitem definir opções de carregamento de módulos, aplicar blacklist, criar aliases ou redefinir o comportamento de instalação e remoção. Para definir parâmetros persistentes, utilizamos a diretiva options no formato:

options nome_do_módulo parâmetro=valor

Por exemplo, veja o conteúdo de um arquivo de configuração:

# Listando o conteúdo de '/etc/modprobe.d/':
$ sudo ls -l /etc/modprobe.d/
total 48
-rw-r--r-- 1 root root 154 Feb 16 2020 amd64-microcode-blacklist.conf
-rw-r--r-- 1 root root 325 Mar 12 2020 blacklist-ath_pci.conf
-rw-r--r-- 1 root root 1518 Mar 12 2020 blacklist.conf
-rw-r--r-- 1 root root 210 Mar 12 2020 blacklist-firewire.conf
-rw-r--r-- 1 root root 677 Mar 12 2020 blacklist-framebuffer.conf
-rw-r--r-- 1 root root 583 Mar 12 2020 blacklist-rare-network.conf
-rw-r--r-- 1 root root 127 Jan 22 2020 dkms.conf
-rw-r--r-- 1 root root 17 Mar 9 2021 floppy.conf
-rw-r--r-- 1 root root 154 Jun 10 2020 intel-microcode-blacklist.conf
-rw-r--r-- 1 root root 347 Mar 12 2020 iwlwifi.conf
-rw-r--r-- 1 root root 87 Mar 9 2021 local.conf
-rw-r--r-- 1 root root 379 Jan 23 2020 mdadm.conf


$ cat /etc/modprobe.d/local.conf
# Local module settings
# Created by the Debian installer

options ipv6 disable_ipv6=1

Nesse exemplo, o módulo ipv6 será carregado com o parâmetro disable_ipv6=1, desativando o suporte a IPv6 no sistema.


Lembre-se de que os arquivos em /etc/modprobe.d/ não carregam os módulos automaticamente. Eles apenas definem como o módulo deve se comportar caso seja carregado, seja manualmente, pelo udev, ou por outro componente do sistema.


Se você quiser que um módulo seja carregado automaticamente na inicialização do sistema, existem duas formas:

  1. Adicioná-lo diretamente ao arquivo /etc/modules, listando um módulo por linha:
btrfs
loop
psmouse

  1. Criar um arquivo personalizado em /etc/modules-load.d/ contendo os nomes dos módulos que devem ser carregados no boot:
$ echo psmouse > /etc/modules-load.d/psmouse.conf

Esse método é mais moderno e integrado ao systemd.



Udev


Para relembrar consulte aqui.


Também é possível configurar o udev através do arquivo:

/etc/udev/udev.conf

Esse arquivo, normalmente está vazio, ele permite configurar ajustes globais no comportamento do daemon. No entanto, ele carrega um aviso importante:

udevd também é iniciado no initrd. Quando este arquivo for modificado, talvez seja necessário reconstruir o initrd para que ele inclua as alterações.


Ou seja, qualquer modificação feita nesse arquivo só terá efeito completo se o initramfs for atualizado, pois o udevd pode ser executado ainda durante a fase de boot, antes do sistema de arquivos raiz ser montado. Para aplicar as alterações, execute:

sudo update-initramfs -u

Por outro lado, o local recomendado para adicionar regras personalizadas do udev é:

/etc/udev/rules.d/

Neste diretório, você pode criar arquivos .rules com as instruções desejadas. Para aplicar as alterações feitas nessas regras, não é necessário recriar o initramfs. Basta recarregar as regras com:

sudo udevadm control --reload

O sistema já possui regras padrão armazenadas em:

/lib/udev/rules.d/

Essas regras são fornecidas por pacotes do sistema e não devem ser modificadas diretamente, pois podem ser sobrescritas por atualizações. Caso precise alterar ou sobrescrever uma regra existente, o ideal é criar uma nova com o mesmo nome ou com numeração maior dentro de /etc/udev/rules.d/.

As regras em /etc/udev/rules.d/ sempre têm prioridade sobre as regras em /lib/udev/rules.d/.