Herramientas de usuario

Herramientas del sitio


informatica:certificaciones:lpic:lpic-1:101_system_architecture:101.1_determine_and_configure_hardware_settings

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, udev and dbus.
  • The following is a partial list of the used files, terms and utilities:
    • /sys/
    • /proc/
    • /dev/
    • modprobe
    • lsmod
    • lspci
    • lsusb

Comandos básicos

Durante todo el curso, se hará uso frecuentemente de los siguientes comandos:

  • cat: volcar por pantalla el contenido de un fichero
  • more, less: similar a cat. pero más cómodo con ficheros largos
  • man: manual del sistema
  • ls: 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 usuario root (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 comando lscpu)
  • /proc/meminfo: memoria (también podríamos usar el comando free)
  • /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:

  • 00 corresponde al número de bus PCI
  • 00.0 corresponde 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_forwardnet.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.

informatica/certificaciones/lpic/lpic-1/101_system_architecture/101.1_determine_and_configure_hardware_settings.txt · Última modificación: por tempwin