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 poderosos utilitários de linha de comando 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 a administração de sistemas, ajuste de desempenho e soluçã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 o guiará pela visualização das hierarquias de barramento PCI e SCSI para entender como os dispositivos estão conectados. Por fim, você se aprofundará nas 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 a partir da 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 coletar 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
                                 /

O nome do seu disco principal pode ser vda, sda ou nvme0n1, dependendo da imagem da VM. Nas próximas etapas, use sempre o nome do disco que o lsblk mostra para o dispositivo montado em /.

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

  • NAME: O nome do dispositivo.
  • MAJ:MIN: Os números maior e menor do dispositivo, usados pelo kernel para identificar o dispositivo.
  • 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 (por exemplo, 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ê pode 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, mas mais detalhado que o lsblk, 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ê pode obter uma visão tanto de alto nível quanto detalhada e de baixo nível dos dispositivos de armazenamento no seu sistema Linux.

Inspecionar Propriedades do Dispositivo com udevadm

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

Vamos inspecionar as propriedades do disco principal que contém seu sistema de arquivos raiz. Primeiro, identifique a partição raiz e seu disco pai:

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"

Para exibir as propriedades desse disco em um formato simples de chave-valor, execute o seguinte comando. A flag -q property diz ao udevadm para consultar o banco de dados para todas as propriedades conhecidas do dispositivo, e -n "/dev/$DISK_NAME" especifica o nome do nó do dispositivo.

udevadm info -q property -n "/dev/$DISK_NAME"

A saída será uma lista de variáveis de ambiente que descrevem o dispositivo. Seus valores exatos serão diferentes, mas a saída deve ser semelhante a esta:

DEVPATH=/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
DEVNAME=/dev/nvme0n1
DEVTYPE=disk
MAJOR=259
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_MODEL=Alibaba Cloud Elastic Block Storage
ID_REVISION=1.0
ID_SERIAL=Alibaba_Cloud_Elastic_Block_Storage_xxxxxxxxxxxx
ID_SERIAL_SHORT=xxxxxxxxxxxx
ID_TYPE=disk
ID_PATH=pci-0000:00:04.0-nvme-1
ID_PATH_TAG=pci-0000_00_04_0-nvme-1
DEVLINKS=/dev/disk/by-id/nvme-... /dev/disk/by-path/pci-0000:00:04.0-nvme-1
TAGS=:systemd:

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

Para uma visão hierárquica ainda mais detalhada, você pode consultar o dispositivo usando seu caminho sysfs. Primeiro, encontre o caminho sysfs para o disco que você selecionou:

udevadm info -q path -n "/dev/$DISK_NAME"

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

/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

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

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

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

Visualizar a Hierarquia de Barramento PCI e SCSI

Nesta etapa, você explorará como os dispositivos sã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 entender 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 esteja.

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 o que são os dispositivos. Para torná-la mais útil, adicione a opção -v (verbose). Isso incluirá nomes de dispositivos e o driver do kernel em uso para cada dispositivo. Como a saída pode ser longa, vamos enviá-la para o more para que você possa rolar 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.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-02.0  Cirrus Logic GD 5446
           +-03.0  Red Hat, Inc. Virtio console
           +-04.0  Intel Corporation QEMU NVM Express Controller
           +-05.0  Red Hat, Inc. Virtio network device
           \-06.0  Red Hat, Inc. Virtio memory balloon

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

Em seguida, vamos olhar para o barramento SCSI. Nesta VM, o disco principal pode ser exposto através de NVMe em vez de Virtio ou SCSI, mas você ainda pode explorar quaisquer dispositivos SCSI presentes. 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 Sistema de Baixo Nível em /proc

Nesta etapa, você se aprofundará no sistema de arquivos virtual /proc para inspecionar recursos de sistema de baixo nível. 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 em /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 sendo usados atualmente, você pode visualizar o conteúdo do arquivo /proc/dma.

cat /proc/dma

A saída é geralmente 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 é frequentemente o único listado em hardware moderno.

Em seguida, vamos examinar as solicitaçõ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 uma análise detalhada 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 esse núcleo de CPU.
  • A última coluna mostra o nome do driver de dispositivo associado a essa interrupção. Isso é muito útil para depurar conflitos de hardware.

Finalmente, vamos olhar para as portas de E/S. Esses são endereços de memória especiais que a CPU usa para se comunicar diretamente com dispositivos de hardware. O arquivo /proc/ioports lista as regiões de porta de E/S que estão atualmente reservadas para dispositivos. Como a lista pode ser longa, é melhor visualizá-la com 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 do Dispositivo 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 dispositivo 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 a partir de /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 seu disco principal. Observe que estes são links simbólicos apontando para seus locais 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 nvme0n1 -> ../devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

Encontre o disco pai para seu sistema de arquivos raiz novamente e, em seguida, inspecione esse diretório. Este diretório contém vários arquivos que representam os atributos do dispositivo.

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"

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

alignment_offset  diskseq  holders  nvme0n1p2  ro       uevent
bdi               events   inflight nvme0n1p3  size     wwid
capability        events_async integrity power  slaves
dev               events_poll_msecs mq    queue  stat
device            ext_range nsid    range  subsystem
discard_alignment hidden    nvme0n1p1 removable trace

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/"$DISK_NAME"/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 nvme0n1p1, nvme0n1p2 e nvme0n1p3, que contêm seus próprios conjuntos de atributos. Em outras imagens, os nomes das partições podem usar um prefixo de dispositivo diferente.

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

Mesmo que seu disco de armazenamento não seja um dispositivo de bloco Virtio, a VM ainda pode expor outros dispositivos Virtio. Vamos olhar dentro do diretório /sys/bus/virtio/devices para listá-los.

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 apontando de volta para a árvore de dispositivos principal.

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 nível superior usam para relatar o hardware do sistema. É uma maneira poderosa de entender como o kernel Linux vê 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 um formato de árvore, e o comando lshw para obter especificações de hardware mais detalhadas. O laboratório também cobriu 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 pseudo-sistemas de arquivos. 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.