Configurar hardware a Linux
Introducció
Si has utilitzat Linux, probablement algun cop has notat que no tot funciona com hauria (no detecta la tarjeta Wifi o el sistema de ventiladors, no pots controlar els leds de manera nativa,…). En aquest article parlarem precisament d’això: de com Linux gestiona el hardware i com podem nosaltres com a usuaris arreglar o intentar solventar certs problemes amb la detecció d’aquest.
Inspecció de dispositius en Linux
El sistema operatiu, abans de poder controlar el hardware l’ha d’identificar. Normalment, si no l’identifica, és perquè el dispositiu o el port estan defectuosos. Si detecta el dispositiu però no funciona bé, pot ser problema del SO. Per verificar que el nostre SO identifica correctament el hardware, tenim dues comandes, segons com estigui connectat:
- Si el dispositiu està connectat per PCI:
$ lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 07)
00:08.0 System peripheral: Intel Corporation Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
(...)
- Si el dispositiu està connectat per USB:
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 046d:c07e Logitech, Inc. G402 Gaming Mouse
Bus 001 Device 003: ID 04f2:b627 Chicony Electronics Co., Ltd HP Wide Vision HD Camera
Bus 001 Device 004: ID 8087:0029 Intel Corp. AX200 Bluetooth
(...)
Les dues comandes llisten les connexions que tenen, cadascuna on toca (PCI i USB). Si l’aparell que tens connectat no apareix, vol dir que el SO no el detecta.
Dins la BIOS es poden habilitar i deshabilitar perifèrics integrats (controladors de xarxa, ports USB, tarjes de so,…) i també es poden canviar configuracions com la velocitat de la RAM, tot i que normalment deixar-ho per defecte ja és la millor opció.
Pot ser que el dispositiu que busquem encara no estigui completament operatiu, ja que cada part de hardware requereix un component de software per controlar el dispositiu correctament (controlador/mòdul del kernel/driver). Aquests controladors poden estar dins el nucli o afegir-se per separat. Molts d’aquests són escrits per desenvolupadors independents (és quan toca anar a github i baixar-te un programa escrit per algú perquè et funcioni la tarja Wifi).
lspci
Seguint amb l’exemple d’abans:
$ lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
00:01.0 PCI bridge: Intel Corporation 6th-10th Gen Core Processor PCIe Controller (x16) (rev 07)
00:08.0 System peripheral: Intel Corporation Xeon E3-1200 v5/v6 / E3-1500 v5 / 6th/7th/8th Gen Core Processor Gaussian Mixture Model
(...)
Els números hexadecimals són les direccions úniques del dispositiu PCI. Per més detalls sobre un dispositiu específic afegim els paràmetres -s ID -v:
$ lspci -s 00:16.0 -v
00:16.0 Communication controller: Intel Corporation Cannon Lake PCH HECI Controller (rev 10)
Subsystem: Hewlett-Packard Company Device 8600
Flags: bus master, fast devsel, latency 0, IRQ 176, IOMMU group 6
Memory at da21b000 (64-bit, non-prefetchable) [size=4K]
Capabilities: [50] Power Management version 3
Capabilities: [8c] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [a4] Vendor Specific Information: Len=14 <?>
Kernel driver in use: mei_me
Kernel modules: mei_me
Amb aquesta sortida veiem el nom intern del processador (Communication controller), amb marca i model associat (Subsystem). El mòdul del kernel en ús es troba a Kernel driver in use.
D’aquesta sortida podem saber que:
- El dispositiu és identificat.
- S’ha carregat un mòdul al nucli del SO.
- El dispositiu està llest per utilitzar.
lsusb
Seguint també amb l’exemple anterior:
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 046d:c07e Logitech, Inc. G402 Gaming Mouse
Bus 001 Device 003: ID 04f2:b627 Chicony Electronics Co., Ltd HP Wide Vision HD Camera
Bus 001 Device 004: ID 8087:0029 Intel Corp. AX200 Bluetooth
(...)
Amb els paràmetres -v -d IDUSB (on IDUSB és l’id del dispositiu), podem extreure més informació:
$ lsusb -v -d 046d:c07e
Bus 001 Device 002: ID 046d:c07e Logitech, Inc. G402 Gaming Mouse
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 [unknown]
bDeviceSubClass 0 [unknown]
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x046d Logitech, Inc.
idProduct 0xc07e G402 Gaming Mouse
bcdDevice 90.03
iManufacturer 1 Logitech
iProduct 2 Gaming Mouse G402
iSerial 3 6D772F965052
(...)
Mòduls
Per interactuar amb els mòduls ho fem amb el paquet kmod i les seves comandes:
- lsmod Per enumerar els mòduls.
- modprobe Per carregar i descarregar mòduls (modprobe MODULENAME per carregar i modprobe -r MODULENAME per descarregar).
- modinfo Mostra informació sobre el mòdul (descripció, autor, arxiu,…).
Si un mòdul causa problemes, a /etc/modprobe.d/blacklist.conf es pot bloquejar la càrrega del mòdul amb la sintaxi “blacklist MODULENAME” o, preferiblement, afegir un arxiu a /etc/modprobe.d/<MODULENAME>.conf.
Arxius d’informació i arxius de dispositiu
Les comandes lspci, lsusb i lsmod llegeixen informació del dispositiu emmagatzemada al sistema. Aquesta informació es troba als directoris /proc i /sys, que també són punts de muntatge presents en l’espai de RAM utilitzat pel kernel del sistema. Són pseudo-sistemes d’arxius i només existeixen durant l’execució del sistema. El directori /proc conté arxius amb informació sobre processos en execució i recursos de hardware. Alguns dels arxius més importants són:
- /proc/cpuinfo
- /proc/interrupts
- /proc/ioports
- /proc/dma (DMA: Accés Directe a Memòria)
El directori /sys conté arxius amb informació sobre el dispositiu i dades del kernel relacionades amb el hardware.
Un altre directori relacionat amb dispositius és /dev. Cada arxiu dins d’aquest està associat a un dispositiu d’emmagatzematge. Els dispositius extraibles són manejats pel sistema udev, que crea els dispositius a /dev.
El nucli de Linux captura l’event de detecció de hardware i el passa al procès udev, que identifica el dispositiu i crea dinàmicament els arxius corresponents a /dev.
Això seria un petit resum de l’apartat d’LPIC 101.1. Si t’ha estat útil pots deixar un comentari. Ens veiem al següent!