Explorar Dispositivos de Hardware no Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá as habilidades essenciais para explorar, identificar e inspecionar dispositivos de hardware em um ambiente Linux. Você ganhará experiência prática com utilitários de linha de comando poderosos para entender como o sistema operacional interage com os componentes físicos. O objetivo é construir uma compreensão fundamental do gerenciamento de hardware no Linux, o que é crucial para administração de sistemas, ajuste de desempenho e resolução de problemas.

Você começará listando dispositivos de bloco usando lsblk e lshw para obter uma visão geral do armazenamento. Em seguida, usará o udevadm para inspecionar propriedades e regras detalhadas dos dispositivos. O laboratório então o guiará pela visualização das hierarquias de barramento PCI e SCSI para ver como os dispositivos estão conectados. Por fim, você se aprofundará em informações de baixo nível do sistema examinando os sistemas de arquivos virtuais /proc e /sys, obtendo uma visão abrangente do hardware do seu sistema sob a perspectiva do kernel.

Listar Dispositivos de Bloco com lsblk e lshw

Nesta etapa, você aprenderá como identificar e listar os dispositivos de bloco conectados ao seu sistema. Dispositivos de bloco são dispositivos de armazenamento que transferem dados em blocos de tamanho fixo, como discos rígidos, unidades de estado sólido (SSD) e pen drives USB. Usaremos dois comandos comuns para esse propósito: lsblk e lshw.

Primeiro, vamos usar o comando lsblk para obter uma visualização em árvore de todos os dispositivos de bloco disponíveis. Este comando lê o sistema de arquivos sysfs e o banco de dados udev para reunir informações.

Execute o comando lsblk no seu terminal:

lsblk

Você verá uma saída semelhante a esta, listando os dispositivos e quaisquer partições que eles contenham.

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  89.4M  1 loop /snap/lxd/31333
loop1    7:1    0     4K  1 loop /snap/bare/5
loop2    7:2    0  63.9M  1 loop /snap/core20/2318
loop3    7:3    0 242.9M  1 loop /snap/firefox/2710
loop4    7:4    0 244.5M  1 loop /snap/firefox/2800
loop5    7:5    0 349.7M  1 loop /snap/gnome-3-38-2004/140
loop6    7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7    7:7    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9    7:9    0    87M  1 loop /snap/lxd/28373
loop10   7:10   0  73.9M  1 loop /snap/core22/2010
loop11   7:11   0  38.8M  1 loop /snap/snapd/21759
loop12   7:12   0  50.9M  1 loop /snap/snapd/24718
loop13   7:13   0  63.8M  1 loop /snap/core20/2599
vda    252:0    0    40G  0 disk
├─vda1 252:1    0     1M  0 part
├─vda2 252:2    0   200M  0 part /boot/efi
└─vda3 252:3    0  39.8G  0 part /var/snap/firefox/common/host-hunspell
                                 /

Aqui está uma breve explicação das colunas:

  • NAME: O nome do dispositivo.
  • MAJ:MIN: Os números maior (major) e menor (minor) do dispositivo, usados pelo kernel para identificá-lo.
  • RM: Dispositivo removível (1 se sim, 0 se não).
  • SIZE: O tamanho do dispositivo.
  • RO: Dispositivo somente leitura (1 se sim, 0 se não).
  • TYPE: O tipo de dispositivo (ex: disk, part, loop).
  • MOUNTPOINTS: Onde o dispositivo está montado no sistema de arquivos.

Embora o lsblk seja ótimo para uma visão geral rápida, o comando lshw (list hardware) pode fornecer informações muito mais detalhadas. O comando lshw pode não estar instalado por padrão. Vamos instalá-lo primeiro.

sudo apt-get update && sudo apt-get install -y lshw

Assim que a instalação for concluída, você poderá usar o lshw para obter informações detalhadas sobre classes específicas de hardware. Por exemplo, para ver detalhes sobre controladores de armazenamento (como seu controlador SATA ou NVMe), você pode usar a opção -class storage.

sudo lshw -class storage

A saída mostrará informações sobre a própria interface de armazenamento.

  *-pnp00:03
       product: PnP device PNP0700
       physical id: 3
       capabilities: pnp
  *-ide
       description: IDE interface
       product: 82371SB PIIX3 IDE [Natoma/Triton II]
       vendor: Intel Corporation
       physical id: 1.1
       bus info: pci@0000:00:01.1
       version: 00
       width: 32 bits
       clock: 33MHz
       capabilities: ide isa_compat_mode bus_master
       configuration: driver=ata_piix latency=0
       resources: irq:0 ioport:1f0(size=8) ioport:3f6 ioport:170(size=8) ioport:376 ioport:c060(size=16)
  *-scsi
       description: SCSI storage controller
       product: Virtio block device
       vendor: Red Hat, Inc.
       physical id: 4
       bus info: pci@0000:00:04.0
       version: 00
       width: 64 bits
       clock: 33MHz
       capabilities: scsi msix bus_master cap_list
       configuration: driver=virtio-pci latency=0
       resources: irq:0 memory:fe000000-fe000fff memory:fe001000-fe001fff

Para obter informações mais detalhadas sobre as partições e volumes lógicos, o que é comparável ao lsblk, porém mais minucioso, use a opção -class volume.

sudo lshw -class volume

Este comando fornece uma riqueza de informações, incluindo nomes lógicos, números de série e capacidades de cada partição.

  *-volume:0
       description: BIOS Boot partition
       vendor: EFI
       physical id: 1
       bus info: scsi@0:0.0.0,1
       logical name: /dev/vda1
       serial: xxxx-xxxx
       size: 1MiB
       capacity: 1MiB
       capabilities: primary
  *-volume:1
       description: EFI partition
       vendor: EFI
       physical id: 2
       bus info: scsi@0:0.0.0,2
       logical name: /dev/vda2
       serial: XXXX-XXXX
       size: 200MiB
       capacity: 200MiB
       capabilities: boot fat initialized
       configuration: FATs=32 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro state=mounted
  *-volume:2
       description: Linux filesystem
       physical id: 3
       bus info: scsi@0:0.0.0,3
       logical name: /dev/vda3
       size: 39GiB
       capacity: 39GiB
       capabilities: primary ext4 initialized
       configuration: filesystem=ext4 lastmountpoint=/ modified=2024-xx-xx mounted=2024-xx-xx state=mounted

Ao usar lsblk e lshw, você consegue obter tanto uma visão de alto nível quanto uma visão detalhada e técnica dos dispositivos de armazenamento no seu sistema Linux.

Inspecionar Propriedades de Dispositivos com udevadm

Na etapa anterior, você aprendeu a listar dispositivos de bloco. Agora, você irá se aprofundar e inspecionar as propriedades específicas desses dispositivos usando o comando udevadm. O udev é o gerenciador de dispositivos do kernel Linux, que gerencia dinamicamente os nós de dispositivos no diretório /dev. O comando udevadm é a ferramenta de controle do udev, permitindo consultar o banco de dados do udev para obter informações detalhadas. Isso é particularmente útil antes de criar regras personalizadas do udev para gerenciar dispositivos automaticamente.

Vamos inspecionar as propriedades do disco principal, /dev/vda, que você identificou na etapa anterior.

Para exibir as propriedades de /dev/vda em um formato simples de chave-valor, execute o seguinte comando. A flag -q property instrui o udevadm a consultar o banco de dados por todas as propriedades conhecidas do dispositivo, e -n /dev/vda especifica o nome do nó do dispositivo.

udevadm info -q property -n /dev/vda

A saída será uma lista de variáveis de ambiente que descrevem o dispositivo:

DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1/block/vda
DEVNAME=/dev/vda
DEVTYPE=disk
MAJOR=252
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_VENDOR=Virtio
ID_MODEL=Block_Device
ID_MODEL_ENC=Block\x20Device\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=
ID_SERIAL=Virtio_Block_Device
ID_SERIAL_SHORT=Block_Device
ID_TYPE=disk
ID_BUS=virtio
ID_PATH=pci-0000:00:04.0-virtio-1
ID_PATH_TAG=pci-0000_00_04_0-virtio-1
DEVLINKS=/dev/disk/by-id/virtio-Block_Device /dev/disk/by-path/pci-0000:00:04.0-virtio-1
TAGS=:systemd:

Esta saída fornece detalhes valiosos, como o ID_MODEL, ID_VENDOR e um ID_SERIAL único. Essas propriedades são frequentemente usadas para escrever regras do udev que se aplicam a um dispositivo específico, independentemente da ordem em que ele foi detectado pelo kernel.

Para uma visão hierárquica ainda mais detalhada, você pode consultar o dispositivo usando seu caminho no sysfs. Primeiro, encontre o caminho sysfs para /dev/vda:

udevadm info -q path -n /dev/vda

A saída será o caminho do dispositivo dentro do sistema de arquivos /sys:

/devices/pci0000:00/0000:00:04.0/virtio1/block/vda

Agora, use este caminho com as flags -a (attribute walk) e -p (path) para ver todos os atributos do dispositivo, desde os dispositivos pai até o dispositivo especificado. Isso fornece uma imagem completa do dispositivo e de seus controladores de origem.

udevadm info -a -p $(udevadm info -q path -n /dev/vda)

Este comando produz uma saída muito mais longa, mostrando atributos para o próprio dispositivo de bloco, bem como para seu dispositivo virtio pai e o controlador PCI. Esse nível de detalhe é essencial para o gerenciamento avançado de dispositivos e resolução de problemas. Não mostraremos a saída completa aqui devido à sua extensão, mas sinta-se à vontade para explorá-la.

Visualizar a Hierarquia dos Barramentos PCI e SCSI

Nesta etapa, você explorará como os dispositivos estão organizados nos barramentos do sistema. Um barramento é um sistema de comunicação que transfere dados entre componentes dentro de um computador. Focaremos em dois barramentos importantes: PCI (Peripheral Component Interconnect) e SCSI (Small Computer System Interface). Entender sua hierarquia ajuda a diagnosticar problemas de hardware e a compreender como dispositivos como seu disco rígido estão conectados ao sistema.

Primeiro, vamos examinar o barramento PCI, que conecta a maioria dos componentes de alta velocidade na placa-mãe. O comando lspci é a ferramenta padrão para isso. O pacote pciutils, que fornece este comando, geralmente já vem pré-instalado, mas vamos garantir que ele esteja presente.

sudo apt-get update && sudo apt-get install -y pciutils

Agora, para exibir a hierarquia do barramento PCI em uma estrutura de árvore, use o comando lspci com a opção -t.

lspci -t

A saída será algo parecido com isto, mostrando as conexões entre barramentos e dispositivos:

-[0000:00]-+-00.0
           +-01.0
           +-01.1
           +-01.3
           +-04.0
           \-05.0

Esta árvore mostra as conexões, mas não identifica quais são os dispositivos. Para torná-la mais útil, adicione a opção -v (verbose). Isso incluirá os nomes dos dispositivos e o driver do kernel em uso para cada um. Como a saída pode ser longa, vamos direcioná-la para o comando more para que você possa navegar por ela. Pressione a barra de espaço para rolar para baixo e q para sair.

lspci -tv | more

A saída será muito mais detalhada:

-[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
           +-01.0  Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
           +-01.1  Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-04.0  Red Hat, Inc. Virtio block device
           \-05.0  Red Hat, Inc. Virtio network device

A partir desta saída, você pode ver os componentes de hardware específicos conectados ao barramento PCI, como o controlador IDE e os dispositivos Virtio.

Em seguida, vamos olhar para o barramento SCSI. Em nosso ambiente virtual, o disco rígido /dev/vda é apresentado como um dispositivo de bloco Virtio, mas ainda podemos explorar dispositivos SCSI se houver algum presente. Uma maneira amigável de visualizar essas informações é com o comando systool. Vamos instalar o pacote sysfsutils que o fornece.

sudo apt-get install -y sysfsutils

Agora, use o systool com a opção -b scsi para listar os dispositivos no barramento SCSI.

systool -b scsi

Este comando mostrará os dispositivos conectados ao barramento SCSI:

Bus = "scsi"

  Device = "host0"
  Device = "host1"

Examinar Recursos de Baixo Nível do Sistema no /proc

Nesta etapa, você mergulhará no sistema de arquivos virtual /proc para inspecionar recursos de baixo nível do sistema. O sistema de arquivos /proc não contém arquivos reais no disco; em vez disso, é uma interface direta para as estruturas de dados do kernel. Ao ler arquivos no /proc, você pode ter uma visão em tempo real de como o sistema está gerenciando recursos de hardware, como canais DMA, interrupções e portas de E/S.

Primeiro, vamos olhar para os canais de Acesso Direto à Memória (DMA). O DMA permite que certos dispositivos de hardware acessem a memória do sistema diretamente, sem envolver a CPU, o que melhora o desempenho. Para ver quais canais DMA estão em uso no momento, você pode visualizar o conteúdo do arquivo /proc/dma.

cat /proc/dma

A saída é tipicamente muito simples, especialmente em sistemas modernos ou virtualizados.

 4: cascade

Esta saída mostra os canais DMA registrados. O canal cascade é usado para encadear controladores de interrupção de estilo antigo e costuma ser o único listado em hardware moderno.

Em seguida, vamos examinar as requisições de interrupção (IRQs). Quando um dispositivo de hardware precisa da atenção da CPU, ele envia um sinal de interrupção. O arquivo /proc/interrupts fornece estatísticas sobre quantas interrupções foram recebidas para cada número de IRQ.

cat /proc/interrupts

A saída mostra um detalhamento da atividade de interrupção por núcleo de CPU.

           CPU0
  0:         10   IO-APIC   2-edge      timer
  1:          2   IO-APIC   1-edge      i8042
  8:          1   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 11:        ...   IO-APIC  11-fasteoi   ata_piix, uhci_hcd
 12:          4   IO-APIC  12-edge      i8042
NMI:          0   Non-maskable interrupts
LOC:      ...   Local timer interrupts
...

Aqui está o que as colunas significam:

  • A primeira coluna é o número da IRQ.
  • A coluna CPU0 (e outras colunas de CPU, se presentes) mostra o número de interrupções tratadas por aquele núcleo de CPU.
  • A última coluna mostra o nome do driver do dispositivo associado a essa interrupção. Isso é muito útil para depurar conflitos de hardware.

Por fim, vamos olhar para as portas de E/S (I/O ports). Estes são endereços de memória especiais que a CPU usa para se comunicar diretamente com os dispositivos de hardware. O arquivo /proc/ioports lista as regiões de portas de E/S que estão atualmente reservadas para dispositivos. Como a lista pode ser longa, é melhor visualizá-la com o comando less. Você pode rolar com as teclas de seta e pressionar q para sair.

less /proc/ioports

Você verá uma lista de intervalos de memória e os dispositivos que os utilizam.

0000-0cf7 : PCI Bus 0000:00
  0020-0021 : PIC1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0077 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : PIC2
  00c0-00df : dma2
  00f0-00ff : fpu
0170-0177 : 0000:00:01.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:01.1
  01f0-01f7 : ata_piix
...

Esta saída mostra o intervalo de endereços de memória e o dispositivo que o reivindicou. Por exemplo, você pode ver intervalos para o teclado, temporizadores e o controlador de disco ata_piix que vimos na etapa anterior.

Explorar Informações de Dispositivos no Sistema de Arquivos /sys

Nesta etapa final, você explorará o sistema de arquivos sysfs, montado em /sys. Enquanto o /proc fornece informações sobre processos e alguns recursos de hardware, o /sys oferece uma visão mais estruturada do modelo de dispositivos do sistema. Ele exporta uma representação hierárquica de objetos do kernel, dispositivos e drivers. Muitas das ferramentas que você usou nas etapas anteriores, como lsblk e udevadm, obtêm suas informações lendo o /sys.

Primeiro, vamos ver como os dispositivos de bloco são representados. O diretório /sys/block contém um subdiretório para cada dispositivo de bloco conhecido pelo sistema.

Liste o conteúdo de /sys/block para ver os dispositivos:

ls -l /sys/block

A saída mostra os dispositivos de bloco, incluindo os dispositivos de loop e nosso disco principal vda. Observe que estes são links simbólicos apontando para suas localizações reais dentro da hierarquia /sys/devices.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop1 -> ../devices/virtual/block/loop1
...
lrwxrwxrwx 1 root root 0 Jan  1 00:00 vda -> ../devices/pci0000:00/0000:00:04.0/virtio1/block/vda

Agora, vamos inspecionar o diretório do dispositivo vda. Este diretório contém vários arquivos que representam os atributos do dispositivo.

ls /sys/block/vda

Você verá uma lista de arquivos e diretórios:

alignment_offset  bdi  capability  dev  device  discard_alignment  events  events_async  events_poll_msecs  ext_range  holders  inflight  integrity  power  queue  range  removable  ro  vda1  vda2  vda3  size  slaves  stat  subsystem  trace  uevent

Cada arquivo contém uma informação específica. Por exemplo, para encontrar o tamanho do disco, você pode ler o arquivo size.

cat /sys/block/vda/size

A saída será um número:

83886080

Este número representa o tamanho do dispositivo em setores de 512 bytes. Você também pode ver diretórios para cada partição, como vda1, vda2 e vda3, que contêm seus próprios conjuntos de atributos.

Em seguida, vamos explorar como os dispositivos são organizados por tipo de barramento no diretório /sys/bus. Isso fornece uma maneira alternativa de navegar na hierarquia de dispositivos.

ls /sys/bus

Você verá uma lista de diferentes tipos de barramento suportados pelo kernel:

acpi  amba  clocksource  container  cpu  event_source  hid  i2c  i8042  ide  mdio_bus  memory  pci  pci_express  platform  scsi  serial  serio  soc  system  usb  virtio  workqueue

Como sabemos que nosso disco /dev/vda é um dispositivo de bloco Virtio, vamos olhar dentro do diretório /sys/bus/virtio/devices. Isso listará todos os dispositivos Virtio detectados.

ls -l /sys/bus/virtio/devices

A saída mostra os dispositivos Virtio, identificados por seus IDs de dispositivo. Estes também são links simbólicos que apontam de volta para a árvore principal de dispositivos.

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio0 -> ../../../devices/pci0000:00/0000:00:05.0/virtio0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio1 -> ../../../devices/pci0000:00/0000:00:04.0/virtio1

Ao explorar o /sys, você pode acessar diretamente os dados brutos que as ferramentas de alto nível usam para relatar o hardware do sistema. É uma maneira poderosa de entender como o kernel Linux enxerga e organiza os dispositivos.

Resumo

Neste laboratório, você aprendeu a identificar e inspecionar dispositivos de hardware em um ambiente Linux. Você praticou o uso do comando lsblk para listar dispositivos de bloco e suas partições em formato de árvore, e o comando lshw para obter especificações de hardware mais detalhadas. O laboratório também abordou o uso do udevadm para inspecionar propriedades de dispositivos gerenciadas pelo subsistema udev, e como visualizar as hierarquias de barramento do sistema para dispositivos PCI e SCSI.

Além disso, você explorou as informações de baixo nível apresentadas pelo kernel através de sistemas de arquivos virtuais. Você examinou o sistema de arquivos /proc para visualizar dados brutos de recursos do sistema e navegou pelo sistema de arquivos /sys para explorar uma representação estruturada dos dispositivos do sistema e seus atributos. Isso proporcionou uma compreensão abrangente de como encontrar e interpretar informações de hardware diretamente do sistema operacional.