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.



