Tabla de Contenidos
101.1 Determine and configure hardware settings
Pertenece a LPI Topic 101: System Architecture
- Weight: 2
- Description: Candidates should be able to determine and configure fundamental system hardware.
- Key Knowledge Areas:
- Enable and disable integrated peripherals.
- Differentiate between the various types of mass storage devices.
- Determine hardware resources for devices.
- Tools and utilities to list various hardware information (e.g.
lsusb,lspci, etc.). - Tools and utilities to manipulate USB devices.
- Conceptual understanding of
sysfs,udevanddbus.
- The following is a partial list of the used files, terms and utilities:
/sys//proc//dev/modprobelsmodlspcilsusb
Comandos básicos
Durante todo el curso, se hará uso frecuentemente de los siguientes comandos:
cat: volcar por pantalla el contenido de un ficheromore,less: similar acat. pero más cómodo con ficheros largosman: manual del sistemals: listar los archivos y carpetas de una ruta.cd: entrar en un directorio.cd ..: subir al directorio inmediatamente superior.
El sistema de ficheros Linux
Debemos tener claro para empezar varios conceptos:
- El origen de todas las rutas del sistema es el
/(raíz o root). - Todo en Linux, dispositivos incluidos, se trata como un fichero.
- El kernel del sistema, que está cargado en memoria, es accesible desde el sistema de ficheros.
Rutas principales del sistema de ficheros Linux
/etc: configuraciones de los servicios del sistema/var: ficheros “variables”: temporales, datos, correo, etc/bin,/sbin,/usr/bin,/usr/sbin: binarios o ejecutables/dev: dispositivos/boot: información para el arranque del sistema/lib: bibliotecas compartidas/usr: binarios, bibliotecas a las que puede acceder cualquier usuario del sistema./home: carpetas personales de usuarios./root: carpeta personal del usuarioroot(administrador del sistema).
/proc
El sistema de ficheros virtual procfs contiene información sobre el sistema como memoria, cpu, etc.
También contiene información sobre las peticiones de interrupción, los accesos directos a memoria (DMA) y los puertos de entrada y salida de los interfaces usados por el sistema (I/O port interface).
En sistemas modernos conviven tanto sysfs como procfs, pero procfs está anticuado.
Es un sistema de ficheros temporal, cuando se apaga el equipo, el contenido de /proc se vacía.
/proc/<PID>: info sobre procesos/proc/sys: opciones dinamicas del kernel/proc/cpuinfo: información de CPU (también podríamos usar el comandolscpu)/proc/meminfo: memoria (también podríamos usar el comandofree)/proc/partitions: muestra las particiones en el sistema./proc/mounts: sistemas de ficheros montados actualmente./proc/swaps: información de swap./proc/version: version del sistema
Ejemplo:
$ ls /proc 1 acpi diskstats kallsyms mdstat schedstat uptime 10 buddyinfo dma kcore meminfo self version 11 bus driver key-users misc softirqs vmallocinfo 185 cgroups execdomains keys modules stat vmstat 226 cmdline filesystems kmsg mounts swaps zoneinfo 43 config.gz fs kpagecgroup mtrr sys 45 consoles interrupts kpagecount net sysvipc 46 cpuinfo iomem kpageflags pagetypeinfo thread-self 81 crypto ioports loadavg partitions timer_list 9 devices irq locks sched_debug tty
Los números hacer referencia al identificador de un proceso, PID, (programa en ejecución) que está corriendo en este momento en el sistema.
/sys
sysfs y procfs son sistemas de ficheros virtuales que se montan sobre /sys y /proc y que son usados por el kernel del sistema linux.
sysfs fue añadido en el kernel 2.6
Este sistema de ficheros contiene ficheros que representan atributos de objetos. Estos objetos también son representados como directorios y son utilizados para obtener información sobre el sistema.
ls /sys
- block: enlaces simbólicos a dispositivos bloqueados
- bus: contiene un diseño de directorio plano de los diferentes tipos de kernel.
- dev: contiene enlaces simbólicos para cada dispositivo descubierto en el sistema que apuntan al directorio del dispositivo bajo root (
/) - devices: contiene un directorio por cada driver.
ls -l /sys/block
Usuario root
El usuario root es el usuario administrador del sistema y, como tal, tiene permisos para editar, modificar y gestionar todo en el sistema.
Y si no tiene permisos para editar un fichero, tiene la capacidad de poder cambiar o forzar dichos permisos
A lo largo del curso usaremos el usuario root, aunque en nuestro día a día, no es lo adecuado. Deberíamos usar nuestro usuario personal e invocar los permisos de root cuando los necesitemos.
Investigando el hardware
Interrupciones
IRQs (Interrupt request) son eventos o señales enviadas a la CPU para ejecutarse.
Cuando un periférico, (por ejemplo una impresora) u otro dispositivo hardware (e.g. una tarjeta de sonido), necesitan “comunicarse” con la CPU utilizan una líneas de notificación preestablecidas denominadas IRQ’s
Las valores IRQ asignados actualmente los podemos ver en el fichero /proc/interrupts. Ejemplo del contenido de este fichero:
$ cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
8: 0 0 0 0 0 0 0 0 IO-APIC 8-edge rtc0
9: 137 0 0 0 0 0 0 0 IO-APIC 9-fasteoi acpi
NMI: 0 0 0 0 0 0 0 0 Non-maskable interrupts
LOC: 0 0 0 0 0 0 0 0 Local timer interrupts
SPU: 0 0 0 0 0 0 0 0 Spurious interrupts
PMI: 0 0 0 0 0 0 0 0 Performance monitoring interrupts
IWI: 0 0 0 0 0 0 0 0 IRQ work interrupts
RTR: 0 0 0 0 0 0 0 0 APIC ICR read retries
RES: 11697 3267 11664 995 8401 3578 10270 11297 Rescheduling interrupts
CAL: 1380 258 85 137 136 164 156 170 Function call interrupts
TLB: 0 0 0 0 0 0 0 0 TLB shootdowns
HYP: 43879 3674 91 53 0 348 9680 1129 Hypervisor callback interrupts
HRE: 0 0 0 0 0 0 0 0 Hyper-V reenlightenment interrupts
HVS: 17591 4752 20795 706 12392 24257 67785 23430 Hyper-V stimer0 interrupts
ERR: 0
MIS: 0
PIN: 0 0 0 0 0 0 0 0 Posted-interrupt notification event
NPI: 0 0 0 0 0 0 0 0 Nested posted-interrupt event
PIW: 0 0 0 0 0 0 0 0 Posted-interrupt wakeup event
I/O Addresses
Localizaciones en memoria reservadas para la comunicación entre CPU y dispositivos HW.
Podemos ver las actualmente asignadas en /proc/ioports
$ cat /proc/ioports 0000-0000 : dma1 0000-0000 : pic1 0000-0000 : timer0 0000-0000 : timer1 0000-0000 : keyboard 0000-0000 : keyboard 0000-0000 : rtc0 0000-0000 : dma page reg 0000-0000 : pic2 0000-0000 : dma2 0000-0000 : fpu 0000-0000 : ACPI PM1a_EVT_BLK 0000-0000 : ACPI PM1a_CNT_BLK 0000-0000 : ACPI PM_TMR 0000-0000 : ACPI GPE0_BLK
Cada uno de esos números hexadecimales es el identificar único de un dispositivo hardware en la placa base. A través de dichos identificadores se comunican con la CPU.
DMA
Direct Memory Addressing. Se trata de los canales de acceso directo a memoria. Sería el equivalente a IRQ, pero refiriéndonos a la memoria, no a la CPU.
Podemos ver las actualmente asignadas en /proc/dma
UDEV
El demonio (servicio) Udev se encarga de gestionar y crear el acceso a los dispositivos.
Durante el arranque, el kernel informa a udev de los dispositivos que detecta y este último se encarga de crear un fichero o nodo de acceso a cada dispositivo dentro de la carpeta /dev.
En /dev podremos ver todos los dispositivos, reales y virtuales, a los que el sistema necesita acceder:
$ ls /dev autofs loop0 ppp ram4 stderr tty17 tty29 tty40 tty52 tty7 vcsu1 block loop1 ptmx ram5 stdin tty18 tty3 tty41 tty53 tty8 vfio bsg loop2 pts ram6 stdout tty19 tty30 tty42 tty54 tty9 vhost-net btrfs-control loop3 ram0 ram7 tty tty2 tty31 tty43 tty55 ttyS0 vsock bus loop4 ram1 ram8 tty0 tty20 tty32 tty44 tty56 ttyS1 zero console loop5 ram10 ram9 tty1 tty21 tty33 tty45 tty57 ttyS2 cpu_dma_latency loop6 ram11 random tty10 tty22 tty34 tty46 tty58 ttyS3 cuse loop7 ram12 rtc0 tty11 tty23 tty35 tty47 tty59 urandom fd mapper ram13 sda tty12 tty24 tty36 tty48 tty6 vcs full mem ram14 sdb tty13 tty25 tty37 tty49 tty60 vcs1 fuse net ram15 sg0 tty14 tty26 tty38 tty5 tty61 vcsa kmsg null ram2 sg1 tty15 tty27 tty39 tty50 tty62 vcsa1 loop-control nvram ram3 shm tty16 tty28 tty4 tty51 tty63 vcsu
Cada elemento que aparece en este directorio, corresponde a un dispositivo diferente. Algunos corresponden con dispositivos físicos (están conectados a la máquina) como sda, sdb (discos duros); otros pueden ser virtuales como ttyX (terminales) o zero y random que son ficheros que generan infomración.
De esta manera, todo lo detectado por el kernel y gestionado por udev, puede ser accedido a través de su entrada en /dev.
EL comando lsdev nos muestra la información de /proc presentándolo de una forma ordenada. Las columnas que podemos ver son:
- Device
- DMA
- IRQ
- I/O Port
Es necesario tener instalado el paquete procinfo
Comandos hardware
lspci
Es un comando que nos muestran los dispositivos conectados al bus PCI (Peripheral Component Interconnect), así como el bus y el slot que ocupan en dicho bus. Los dispositivos PCI pueden ser un componente conectado a la placa base, como controlador de disco o una tarjeta de expansión instalada en una ranura PCI, como una tarjeta gráfica externa.
Si utilizamos la opción -v, -vv o -vvv, podremos ver información más detallada de dichos dispositivos
00:00.0:
00corresponde al número de bus PCI00.0corresponde al slot dentro del bus PCI 00
Completar con un ejemplo en un sistema linux
En CentOS, si no tuviésemos ese programa instalado, podemos buscar a quién pertenece:
yum provides lspci
En Debian, si instalamos el paquete apt-file podemos luego buscar el paquete al que pertenece cierto comando así:
apt-file search lspci
Para ver información sobre un dispositivo:
lspci -s 00:03.0 -v
Suponiendo que 00:03.0 es el identificador que nos ha arrojado lspci que corresponde al hardware que queremos consultar.
Poner ejemplo de todo lo anterior
Si queremos ver el módulo que permite al sistema operativo utilizar cierto hardware, usaremos la opción -k:
lspci -s 00:03.0 -k
Poner ejemplo de todo lo anterior
lsusb
El comando lsusb es similar a lspci, pero enumera información de USB exclusivamente.
Completar con un ejemplo en un sistema linux
En CentOS, si no tuviésemos ese programa instalado, podemos buscar a quién pertenece:
yum provides lspci
El comando lsusb muestra los canales USB disponibles y los dispositivos conectados a ellos.
Al igual que sucede con lspci con la opción -v obtendremos una salida más detallada:
lsusb -v
También podemos centrarnos en un dispositivo proporcionando su ID a la opción -d:detallada:
lsusb -v -d 1781:0c9f
Con la opción -t mostraría las asignaciones actuales de de los dispositivos USB en forma de árbol jerárquico:
Completar con un ejemplo en un sistema linux
Trabajando con el kernel
Kernel
El Kernel es el núcleo del sistema Linux. Durante el proceso de arranque se carga en memoria y es el que nos permite comunicarnos con el hardware del sistema.
Nosotros podemos consultar las opciones que están configuradas en el kernel y modificarlas en tiempo real. Estas opciones las podemos ver en /proc/sys
En sistemas modernos, la información sobre el kernel también está disponible en /sys
La mayoría de estas opciones muestran, si hacemos un cat, valores de 0 o 1. Son valores binarios que implican desactivado o activado.
$ cat /proc/sys/net/ipv4/ip_forward 0
La opción ip_forward permite que nuestra máquina acepte paquetes que no vayan dirigidos a ella (lo que haría un router) y esto se conoce como forwarding.
En otros casos son valores más complejos.
Aunque nosotros veamos ficheros en /proc lo que hay es un sistema de ficheros temporal o especial. Si nosotros editamos estos ficheros estaremos cambiando las opciones del kernel sobre la marcha, pero no de modo persistente. Estas opciones volverán a su estado por defecto tras un reinicio del sistema.
Ejemplo para activar de forma temporal el forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
Si queremos hacer los cambios persistentes, tenemos que editar un archivo de configuración: /etc/sysctl.conf. En este archivo podemos incluir las opciones que queramos siguiendo la sintaxis de la rutas dentro de /proc/sys. Ejemplo:
/proc/sys/net/ipv4/ip_forward → net.ipv4.ip_forward
Así que en el fichero /etc/sysctl.conf tendríamos:
net.ipv4.ip_forward=1
Los cambios se podrían aplicar sin reiniciar con:
sysctl -p
Otro ejemplo para desactivar los mensajes de ICMP (no contestar a los ping):
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
Para hacerlo persistente, editamos /etc/sysctl.conf y ponemos:
net.ipv4.icmp_echo_ignore_all=1
Los cambios se podrían aplicar sin reiniciar con:
sysctl -p
Módulos
Para poder trabajar con los dispositivos, el kernel necesita los drivers o controladores de dichos dispositivos. En Linux se llaman módulos. Algunos se encuentran integrados (compilados) en el kernel, y otros, en su mayor parte, son módulos independientes que suelen almacenarse en /lib/modules. Son archivos con la extensión .ko que se pueden cargar o descargar de la memoria para proporcionar acceso al hardware.
Dentro de /lib/modules puede haber una carpeta por cada kernel que tengamos instalado, así que dentro de ellas estarán los drivers correspondientes a dicha versión.
Para saber el kernel que estamos usando en este momento, uname -r
lsmod
Podemos ver los módulos cargados en memoria con el comando lsmod
Añadir ejemplo de lsmod en un sistema linux real
La columna Used by nos indica cuántos y qué módulos están usando un módulo. Si tiene un 0, quiere decir que no hay nada que lo esté utilizando.
modinfo
Este comando nos da información sobre cierto módulo.
modinfo vfat
Añadir ejemplo de lo anterior
El comando anterior también nos muestra las dependencias, algo muy importante si vamos a cargar módulos de forma manual con el comando insmod
insmod
Para poder cargar un nuevo módulo en memoria usamos el comando insmod con la ruta completa al archivo del módulo:
insmod /lib/modules/2.6.26/kernel/drivers/floppy.ko
Los módulos pueden depender unos de otros. Si intentamos instalar un módulo que depende de otros, la instalación fallará, y tendremos que instalar previamente los módulos que son dependencias.
rmmod
Para quitar un módulo que esté cargado en memoria, usamos el comando rmmod:
rmmod floppy
modprobe
Hoy en día no es normal usar insmod y rmmod para cargar y descargar módulos ya que tenemos una herramienta más cómoda: modprobe.
modprobe gestiona automáticamente las dependencias de los módulos además de no necesitar indicarle la ruta completa al módulo:
modprobe floppy
Para que funcione, el módulo debe estar en la ruta apropiada de /lib/modules
modprobe también nos permite quitar un módulo de la memoria:
modprobe -r floppy
La ventaja que tiene usar modprobe frente a insmod y rmmod es que gestiona de forma inteligente las dependencias.
