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.



