====== Hardware en Linux ======
===== Herramientas =====
==== lspci ====
Muestra información sobre los buses PCI y los dispositivos que tienen conectados.
Tarjeta de red, tarjeta gráfica, etc.
lspci
Ejemplo de salida:
00:00.0 Host bridge: Intel Corporation Xeon E3-1200 v2/Ivy Bridge DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port (rev 09)
00:06.0 PCI bridge: Intel Corporation Xeon E3-1200 v2/3rd Gen Core processor PCI Express Root Port (rev 09)
00:1a.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #2 (rev 05)
00:1c.0 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 1 (rev b5)
00:1c.4 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 5 (rev b5)
00:1c.6 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 7 (rev b5)
00:1c.7 PCI bridge: Intel Corporation 6 Series/C200 Series Chipset Family PCI Express Root Port 8 (rev b5)
00:1d.0 USB controller: Intel Corporation 6 Series/C200 Series Chipset Family USB Enhanced Host Controller #1 (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation C204 Chipset Family LPC Controller (rev 05)
00:1f.2 RAID bus controller: Intel Corporation 6 Series/C200 Series Chipset Family SATA RAID Controller (rev 05)
01:00.0 System peripheral: Hewlett-Packard Company Integrated Lights-Out Standard Slave Instrumentation & System Support (rev 05)
01:00.1 VGA compatible controller: Matrox Electronics Systems Ltd. MGA G200EH
01:00.2 System peripheral: Hewlett-Packard Company Integrated Lights-Out Standard Management Processor Support and Messaging (rev 05)
01:00.4 USB controller: Hewlett-Packard Company Integrated Lights-Out Standard Virtual USB Controller (rev 02)
02:00.0 Memory controller: Hewlett Packard Enterprise Device 005f
03:00.0 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
03:00.1 Ethernet controller: Broadcom Limited NetXtreme BCM5720 Gigabit Ethernet PCIe
04:00.0 USB controller: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller (rev 03)
El primer par de dígitos hace referencia al bus (00 suele ser integrado en placa)
Más información sobre los dispositivos
lspci -v
Más detalles:
lspci -vv
Si queremos mostrar información solo de cierto dispositivo:
lspci -s
==== lsusb ====
Muestra info sobre los buses y dispositivos usb conectados
lsusb
Para más información:
lsusb -v
El descriptor ''bDeviceSubClass'' indica si se está usando el puerto USB
Más detalles todavía:
lsusb -vv
Información sobre determinado dispositivo:
lsusb -s
Si queremos ver información en árbol y la velocidad del puerto USB:
lsusb -t
Ejemplo de salida:
/: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
|__ Port 3: Dev 3, If 0, Class=Hub, Driver=hub/2p, 480M
|__ Port 1: Dev 4, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
|__ Port 5: Dev 3, If 0, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 5: Dev 3, If 1, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 5: Dev 3, If 2, Class=Vendor Specific Class, Driver=btusb, 12M
|__ Port 5: Dev 3, If 3, Class=Application Specific Interface, Driver=, 12M
USB soporta muchos dispositivos en un mismo bus
* USB 1.1 velocidad de lectura hasta 12 Mb/s (1,5 MB/s)
* USB 2.0 velocidad de lectura hasta 480 Mb/s (60 MB/s)
* USB 3.0 velocidad de lectura hasta 5000 Mb/s (600 MB/s)
==== Interrupciones ====
Para ver las interrupciones asociadas: ''/proc/interrupts''
Las interrupciones son señales hardware que se envían a la CPU para que gestione alguna petición.
Si un dispositivo hardware dispone de DMA, podrá acceder a bloques de memoria sin intervención de la CPU. La información respecto a canales DMA se puede consultar en ''/proc/dma''
Para consultar las direcciones de memoria de los procesos de entrada/salida, se consulta en ''/proc/ioports''
===== /sys =====
Sistema de ficheros virtual que contiene información sobre el hardware.
Ver los dispositivos por clases, en el directorio ''/sys/class/''
Si queremos ver información de las interfaces: ''/sys/class/net/''
$ ls -l
total 0
lrwxrwxrwx 1 root root 0 oct 15 21:40 enp0s25 -> ../../devices/pci0000:00/0000:00:19.0/net/enp0s25
lrwxrwxrwx 1 root root 0 oct 15 21:40 lo -> ../../devices/virtual/net/lo
lrwxrwxrwx 1 root root 0 oct 15 21:40 wlp2s0 -> ../../devices/pci0000:00/0000:00:1c.2/0000:02:00.0/net/wlp2s0
Dirección MAC de una tarjeta de red:
cat /sys/class/net/wlp2s0/address
===== /dev =====
Todo lo que hace referencia a algún dispositivo. Está menos organizado que ''/sys'' (''/sys'' es una mejora de ''/dev'') y se utiliza básicamente para poder referenciar los dispositivos y poder utilizarlo.
El contenido de este directorio varía en función de los dispositivos que se tenga conectados.
Útil por ejemplo para la identificación de los discos:
ls -l /dev/disk/by-uuid
Cuando conectamos un pendrive USB, aparecerán nuevos elementos:
ls /dev/sd*
También podríamos verlo desde ''/sys/class/block/'', donde habrá diferentes enlaces a la información del hardware.
===== Módulos del kernel =====
Los módulos son partes del kernel que podemos activar o desactivar para añadir o quitar funcionalidades. Tiene una relación muy estrecha con los drivers.
Son archivos terminados con la extensión ''.ko'' y se suelen almacenar en ''/lib/modules/version_kernel/kernel/''
==== lsmod ====
Muestra los módulos cargados en el sistema
Module Size Used by
softdog 16384 0
veth 20480 0
xt_nat 16384 86
xt_tcpudp 16384 106
xt_conntrack 16384 8
ipt_MASQUERADE 16384 18
nf_conntrack_netlink 49152 0
nfnetlink 16384 2 nf_conntrack_netlink
xfrm_user 45056 1
xfrm_algo 16384 1 xfrm_user
xt_addrtype 16384 2
iptable_filter 16384 1
iptable_nat 16384 20
nf_nat_ipv4 16384 2 ipt_MASQUERADE,iptable_nat
* Nombre de los módulos
* Tamaño
* Cuántas veces se ha utilizado
* Quién lo ha usado
==== modinfo ====
Amplía información de un módulo
$ modinfo bluetooth
filename: /lib/modules/4.19.0-0.bpo.9-amd64/kernel/net/bluetooth/bluetooth.ko
alias: net-pf-31
license: GPL
version: 2.22
description: Bluetooth Core ver 2.22
author: Marcel Holtmann
srcversion: 333F9F6A8EDC24E53008B30
depends: rfkill,ecdh_generic,crc16
retpoline: Y
intree: Y
name: bluetooth
vermagic: 4.19.0-0.bpo.9-amd64 SMP mod_unload modversions
signat: PKCS#7
signer:
sig_key:
sig_hashalgo: md4
parm: disable_esco:Disable eSCO connection creation (bool)
parm: disable_ertm:Disable enhanced retransmission mode (bool)
==== insmod ====
Carga un fichero ''.ko'' en el sistema.
Para cargar el módulo, debemos indicar la ruta al mismo:
insmod /lib/modules/4.19.0-0.bpo.9-amd64/kernel/drivers/block/floppy.ko
==== rmmod ====
Quita el módulo del sistema.
Con la opción ''-w'' indicamos que espera a que deje de utilizarse para que se quite del sistema.
==== modprobe ====
Carga o borra módulos y resuelve las dependencias entre estos.
Es más recomendable usar este comando en lugar de ''insmod'' y ''rmmod''
* ''-f'': fuerza la carga del módulo aunque la versión del kernel no coincida con la esperada.
* ''-r'': elimina el módulo.
* ''-v'': muestra información adicional de lo que realiza.
* ''-n'': hace una simulación pero no inserta el módulo
===== Almacenamiento =====
Si queremos ver particiones e información sobre ellas, podemos usar ''parted'':
$ sudo parted -l
[tempwin@zeta ~]$ sudo parted -l
[sudo] password for tempwin:
Model: ATA KINGSTON SUV500M (scsi)
Disk /dev/sda: 240GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Numero Inicio Fin Tamaño Sistema de ficheros Nombre Banderas
1 1049kB 538MB 537MB fat32 EFI System Partition arranque, esp
2 538MB 22,0GB 21,5GB ext4
3 22,0GB 65,0GB 42,9GB ext4 arch
4 65,0GB 240GB 175GB ext4 data
===== Arranque =====
- BIOS
- MBR (si tenemos UEFI, nos saltamos este paso)
- GRUB (gestor de arranque)
- Kernel: es iniciado por el gestor de arranque
- Initramfs (initial ram file system). Es el sistema de archivos ram inicial (ramdisk). Archivo comprimido que contiene un pequeño sistema de archivos que se cargará en la memoria RAM en el proceso de arranque del núcleo. El kernel lo necesita para completar tareas relacionadas con módulos y controladores de dispositivos para poder arrancar el verdadero sistema de archivos raíz instalado en el disco duro e invocar al proceso init. En el fichero de configuración del GRUB lo vemos en una línea como ''initrd /boot/initramfs-linux.img''.
- El kernel llama al primer programa del SO que se encargará de configurar todos los servicios, demonios y cargar las particiones para poner el sistema en funcionamiento. Este programa se llama **init**, suele tener el identificador de proceso número 1 y es el padre del resto de procesos que empiezan a arrancar la máquina.
Al arrancar Llinux se muestran mensajes según se van cargando controladores o funciones del sistema. Para revisarlos se utiliza el comando ''dmesg'' que acepta las siguientes opciones recomendadas:
* ''-T'': muestra las marcas de tiempo en forma de fecha y hora
* ''-k'': muestra solo los mensajes del kernel.
* ''-H'': salida coloreada y paginada.
* ''-l'': filtra por niveles (''warn'', ''err'', etc).
==== Procesos de inicio ====
Podemos encontrar 3 tipos de procesos encargados de iniciar y gestionar los servicios o demonios de entornos Linux
=== SysVinit ===
Utiliza scripts y niveles de ejecución para controlar el inicio, apagado y gestión de los procesos del sistema.
La configuración básica está en ''/etc/inittab''.
Niveles de ejecución (pueden variar según la distribución de Linux):
* 0: Parar
* 1: Monousuario
* 2: Multiusuario
* 3: Multiusuario con soporte de red
* 4: Igual que el 3
* 5: Multiusuario gráfico (X11)
* 6: Reiniciar.
=== Systemd ===
Agrupa los servicios en "target" en lugar de niveles de ejecución (//runlevel//) estableciendo en ellos dependencias y el orden de ejecución de los procesos.
Aprovecha características de los kernel más modernos e intentar que el arranque sea más rápido, lanzar procesos de forma paralela, etc.
Se ejecuta un único programa que utilizará ficheros de configuración para cada servicio a gestionar.
Utiliza **unidades** que pueden ser de diversos tipos: automount, device, mount, path, service, snapshot, socket y target.
Cada unidad se define en un fichero con el nombre de dicha unidad y en la extensión se indica el tipo de unidad, por ejemplo, ''ssh.service''. Estos ficheros pueden estar en distintos directorios:
* ''/usr/lib/systemd/system''
* ''/lib/systemd/system''
* ''/etc/systemd/system''
=== Upstart ===
Utiliza eventos para gestionar el arranque o parada de los procesos.
===== Comandos del sistema =====
Desde el terminal podemos enviar comandos para la parada o reinicio del sistema.
* ''shutdown'': apaga el sistema de forma planificada.
* ''halt'': apaga el sistema sin enviar señal ACPI de apagado de alimentación eléctrica (tendríamos que apagarlo físicamente)
* ''poweroff'': apaga el sistema con señal ACPI
* ''reboot'': reinicia el sistema.
Si queremos reiniciar en 5 minutos avisando a los usuarios que estén en consola:
shutdown +5 "El sistema se apagará en 5 minutos"
Podemos indicar la hora de apagado con ''shutdown HH:MM''. Si queremos que se apague ahora mismo: ''shutdown now''
Si quisiéramos cancelar el apagado programado:
shutdown -c
Se puede utilizar el comando ''wall'' para enviar mensajes al resto de usuarios conectados por terminal
Se pueden utilizar varios comandos para reiniciar:
* ''reboot''
* ''shutdown -r''
* ''halt --reboot''
Se pueden utilizar varios comandos para cerrar el sistema:
* ''halt''
* ''shutdown -H''
* ''reboot --halt''
Y para apagar:
* ''poweroff''
* ''shutdown -P''
* ''halt -p''