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ção | Descrição |
---|---|
-a | Mostra 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âmetrodisable_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:
- Adicioná-lo diretamente ao arquivo
/etc/modules
, listando um módulo por linha:
btrfs
loop
psmouse
- 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/
.