2021/08/16

Notas del curso Advanced Linux: The Linux Kernel

Max CPUs de s390 y powerpc
Max CPUs de s390 y powerpc

 

Preparándome para regular la velocidad de un cooler en una Raspberry PI para reducir el ruido, tema recurrente en mi vida, gracias a mi trabajo que me dá LinkedIn Learning, tomé algunos cursos, también como parte de mi campaña de recertificación y reaprendizaje continuo.

En el caso de Advanced Linux: The Linux Kernel, buena parte del curso ya la sé, pero siempre hay detalles nuevos y necesarios refrescos.

Comparto algunas cositas que me parecieron interesantes y algunas de mis pruebas.

 

El operador |&

 

Este no lo conocía, te junta stderr en stdout, fantástico.

 

view

 

Es una versión de vim en modo readonly, ¡que estúpido! llevo como veinticinco años mirando archivos con less que no tiene highlight, vos quizás pienses que lo estúpido es usar vim/view, cuestión de gustos y origen de varias flame wars.

 

initramfs


En el curso dice que el initramfs se abre con cpio y quizás gunzip, pero no, escarbando un poco en man cpio:

$ cpio --no-absolute-filenames -i < initrd.img-5.4.0-58-generic

 

sólo trae esto:

tree kernel/
kernel/
└── x86
    └── microcode
        └── AuthenticAMD.bin

   

Recordando mis fracasos con el router dañando por un rayo, usé binwalk:

$ sudo apt install binwalk

En particular en Mint Mate 20.1 no resuelve en las dependencias lzop, así que te enterás en el medio que falta, no importa, rm -r,

$ sudo apt install lzop

$ binwalk -e initrd.img-5.4.0-58-generic

Esto es más compeletito:


_initrd.img-5.4.0-58-generic.extracted/
├── 0.cpio
├── 17D6ECC
├── ....
├── 1DCEE71
├── 1DCEE71.zlib
├── 1E2C581
├── 1E2C581.zlib
├── 220582A.zip
├── 26DCC87.gz
├── ...
├── 3E9AA31.gz
├── 3FE8E9D.gz
├── 43CD22.gz
├── 4A69999.gz
├── 4B60465.xz
├── 4D6447.lzo
├── 4D64CC.xz
├── 51D939A
├── 51D939A.zlib
├── 7C00.cpio
├── cpio-root
│   └── kernel
│       └── x86
│           └── microcode
│               └── AuthenticAMD.bin
├── cpio-root-0
│   └── kernel
│       └── x86
│           └── microcode
│               └── GenuineIntel.bin
└── T1:X3_101115_1_8_1_expROM_FW_uni_template_eeprom0.bin

 

No me gusta para nada, estoy seguro que falta de todo, pero bueno, no voy a analizar esto con profundidad, ya que excede el alcance del curso, sólo completando...

Pero, si te aguantás dos minutos más, presenta el comando unmkinitramfs que hace exactamente lo que hace falta

 $ tree -L 2
.
├── early
│   └── kernel
├── early2
│   └── kernel
└── main
    ├── bin -> usr/bin
    ├── conf
    ├── etc
    ├── init
    ├── lib -> usr/lib
    ├── lib32 -> usr/lib32
    ├── lib64 -> usr/lib64
    ├── libx32 -> usr/libx32
    ├── run
    ├── sbin -> usr/sbin
    ├── scripts
    ├── usr
    └── var

 

¡Qué falta de paciencia y qué acertado no haber intentado profundizar! Me hubiese llevado semanas o para siempre, mirá el contenido de unmkinitramfs que es bash.

 

Modules

 

Busqué rápido y no encontré como identificar de los 5000 módulos disponibles cuáles están en uso (lsmod) y cuáles han sido usados (supongo que en dmesg) para eliminarlos del disco como medida de hardening y recuperación de espacio. La medida de hardening es blacklist. Queda para investigar algún  día...

 

Kernel Source

 

Si te falla make ctags con 

xargs: ctags: No such file or directory
sed: can't read tags: No such file or directory

Es por que te falta ctags:

$ sudo apt install   universal-ctags

 

Building

 

Si al hacer make xconfig te dice:

* Could not find Qt via pkg-config.
* Please install either Qt 4.8 or 5.x. and make sure it's in PKG_CONFIG_PATH

Dale :

$ apt install qtbase5-dev

Si querés ver las opciones para otras arquitecturas, por ejemplo ARM:


$ make ARCH=arm xconfig


Igual no te olvides que necesitás toolchain y setear la variable de cross compilation, ya volveré sobre este tema en otra entrada a futuro.

 

Detalles ejercicios


Para entrar en GRUB en Linux Mint (Ubutnu) es con shift, recordá si estás en virtual box que Right Ctrl te hace recuperar el punteroo del mouse. Recordá que el layout del teclado de GRUB no necesariamente corresponde con lo que tengas.


En el ejercicio propone comparar dmesg con apic=debug, pero por algún motivo mi cerebro lo convirtió en acpi=debug.

La mejor táctica es ir probando con las diversas opciones (apic, acpi, nada) y luego tomar de /var/log/dmesg.X.gz los resultados, renombrar acordemente y ahí comparar con:

for FILE in dmesg.*; do
  for DEBUG in ACPI APIC; do
    echo -n "$FILE $DEBUG "
    grep "$DEBUG" "$FILE" | wc -l
  done
done

dmesg.acpi ACPI 50
dmesg.acpi APIC 7
dmesg.apic ACPI 50
dmesg.apic APIC 58
dmesg.original ACPI 50
dmesg.original APIC 7


Hay un ejercicio de agregar una entrada a grub.cfg, que se hace con update-grub. Como nunca lo hice le desconfío, así que comencé por regenerar grub.cfg al lado como referencia.

$ sudo grub-mkconfig -o grub.cfg.original

Si la salida de diff te parece muy rústica y  no querés instalar kdiff3:

$ diff --side-by-side grub.cfg.original /boot/grub/grub.cfg -W160 | less

Lo importante es que agregó $vt_handoff a los parámetros del kernel y tocó un par de etiquetas, ok, esto indica que hay un cierto desfasaje entre la configuración y la realidad.

Luego fuí mirando cada archivo en  /etc/grub.d, su stdout va a parar a /boot/grub.cfg

Estaría bueno que fuera generando comentarios para poder mapear de dónde sale cada cosa, ah, me adelanté, hay unos separadores en /boot/grub.cfg que indican cuál fué el archivo generador.

Para hacer el ejercicio tenemos dos caminos, agregar una custom entry en /etc/grub.d y ejecutar e proceso de conversión o editar directamente grub.cfg, hice esto último pues el ejercicio no pide que persista.

No te voy a contar lo que ocurre pero si que si agregás rdinit=/bin/sh te tira un busybox, interesante...

 

Curiosidades

 

Estos son algunos de los números de CPUs que soportan algunas arquitecturas:

arm: 32

x86: 64 

s390: 512

powerpc: 8192

 

Conclusiones

 

El curso en general está bueno y me ha servido, pero no me parece tan advanced, quizás me perdí los intro/basic/intermediate.

Los ejercicios han sido útiles, pero el tiempo previsto no me corresponde a lo que le invertí, tipo que el primero lo hice en 15 minutos y decía 60 y el segundo decía 45 y estuve un par de horas.

Algunos ejercicios tienen leves discrepancias que me han ayudado a que los haga de modo no automático, sacando ventaja de los errores...





No hay comentarios:

Publicar un comentario