OpenBSD kernel GENERIC a GENERIC.MP

Escrito por Adrian Ali el 29 de octubre de 2023, usando OpenBSD Release 7.4 contacto: adrianali arroba fortix.com.ar

Índice

1. Introducción
2. Pasos para cambiar el kernel
2.1. Hacer backup del kernel actual
2.2. Hacer rollback de los patch aplicados
2.3. Borrar archivos del kernel GENERIC
2.4. Montar la imagen de instalación
2.5. Acceder al archivo de Set para sacar el kernel GENERIC.MP
2.6. Relinkear el nuevo kernel GENERIC.MP
2.7. Aplicar patch al nuevo kernel
2.8. Finalizando
3. Conclusión
4. Referencias

1. Introducción

OpenBSD en el momento de instalación detecta cuantos CPUs tenemos en nuestra computadora. Si tenemos uno solo instala un kernel que no soporta Multi Processing (MP), este kernel en OpenBSD se denomina:

GENERIC

si tenemos más de un CPU instala un kernel con soporte para Multi Processing (MP), que en OpenBSD se denomina:

GENERIC.MP

En el momento de escribir esta documentación, hasta la versión actual de OpenBSD (7.4), existe una condición y es que cuando instalamos en una computadora con un solo CPU se instala en el sistema un kernel "GENERIC". Luego migrar ese kernel a uno "GENERIC.MP" no es tan fácil, más para el usuario acostumbrado al mundo Linux en donde todo es un paquete, recordar que los sistemas BSDs tienen la base del sistema (kernel, userland) fuera del sistema de instalación de paquetes. Entonces en OpenBSD el kernel viene en algo que se llama "Set", los Sets son conjuntos de archivos que se instalan para armar el sistema, esto son:

  1. base

  2. comp

  3. game

  4. man

  5. xbase

  6. xfont

  7. xserv

  8. xshare

el kernel, no el código fuente, sino los archivos objectos para construir el binario vienen en el Set llamado:

base

en el siguiente punto vamos a aprender como extraer ese kernel GENERIC.MP de ese Set para instalarlo en una computadora con nombre de host "puffy".

2. Pasos para cambiar el kernel

Antes de proceder a ejecutar los pasos para realizar el cambio de kernel, comprobemos en nuestro kernel GENERIC que estamos usando un solo CPU, eso lo podemos hacer con el siguiente comando:

puffy ~ # sysctl hw.ncpu
hw.ncpu=1
puffy ~ #

como vemos en la computadora llamada "puffy" nuestro kernel OpenBSD detecta un solo CPU.

2.1. Hacer backup del kernel actual

Por cualquier error que cometamos es imprescindible hacer un backup del kernel actual, para que podamos arrancar con el backup si es que el nuevo no funciona. Comando para hacer el backup:

puffy / # cp bsd bsd.ori

teniendo el backup a mano, podemos arrancar con el escribiendo en el programa de boot lo siguiente:

>> OpenBSD/amd64 BOOT 3.65
boot> bsd.ori

2.2. Hacer rollback de los patch aplicados

Es muy probable que a nuestro kernel GENERIC actual le hayamos aplicado patchs, los cuales también quisiéramos aplicar al kernel GENERIC.MP una ves instalado. Para lograr esto tenemos que quitar los patch instalados en el sistema para luego aplicarlos nuevamente en el nuevo kernel, comando:

puffy ~ # syspatch -R

el comando anterior dejara el siguiente directorio vacío:

/var/syspatch

antes de ejecutar el comando este directorio contenía archivos relacionados a los patchs.

2.3. Borrar archivos del kernel GENERIC

Ahora vamos a borrar los archivos del kernel GENERIC, comandos:

puffy ~ # cd /usr/share/relink/kernel
puffy /usr/share/relink/kernel #
puffy /usr/share/relink/kernel # rm -fr GENERIC

2.4. Montar la imagen de instalación

Ahora debemos montar la imagen de instalación equivalente a la versión que tenemos instalada. Esta documentación fue escrita haciendo el ejercicio propuesto sobre un OpenBSD 7.4 release. Suponiendo que la imagen esté en el directorio:

/imagenes

los comandos para montar serían:

vnconfig vnd0 /imagenes/install74.img
mount -o ro /dev/vnd0a /mnt

2.5. Acceder al archivo de Set para extraer el kernel GENERIC.MP

Ahora que la imagen esta montada podemos acceder a extraer una copia del Set:

puffy ~ # cd /mnt/7.4/amd64
puffy /mnt/7.4/amd64 # cp base74.tgz /tmp

descomprimimos en "/tmp" el Set:

puffy /mnt/7.4/amd64 # cd /tmp
puffy /tmp # tar xvfz base74.tgz

ingresamos al siguiente directorio:

puffy /tmp # cd usr/share/relink/
puffy /tmp/usr/share/relink #

copiamos el siguiente archivo a "/tmp"

puffy /tmp/usr/share/relink # cp kernel.tgz /tmp

ahora con ese archivo si ya podemos sacar el kernel GENERIC.MP y ubicarlo en el directorio que corresponde:

puffy /tmp/usr/share/relink # cd /tmp
puffy /tmp # tar xvfz kernel.tgz -C /usr/share/relink/kernel GENERIC.MP

2.6. Relinkear el nuevo kernel GENERIC.MP

Ingresamos al directorio:

puffy ~ # cd /usr/share/relink/kernel/GENERIC.MP
puffy /usr/share/relink/kernel/GENERIC.MP #

y ejecutamos los siguientes comandos, primero relinkeamos:

puffy /usr/share/relink/kernel/GENERIC.MP # make newbsd
LD="ld" sh makegap.sh 0xcccccccc gapdummy.o
ld -T ld.script -X --warn-common -nopie -o newbsd ${SYSTEM_HEAD} vers.o ${OBJS}
text    data    bss     dec     hex
21328490        405520  1245184 22979194        15ea27a
mv newbsd newbsd.gdb
ctfstrip -S -o newbsd newbsd.gdb
rm -f bsd.gdb
mv -f newbsd bsd
puffy /usr/share/relink/kernel/GENERIC.MP #

ahora instalamos:

puffy /usr/share/relink/kernel/GENERIC.MP # 
puffy /usr/share/relink/kernel/GENERIC.MP # make newinstall
install -F -m 700 bsd /bsd && sha256 -h /var/db/kernel.SHA256 /bsd
puffy /usr/share/relink/kernel/GENERIC.MP #

el comando anterior ya nos dejo el nuevo kernel en:

puffy / # ls -la bsd
-rwx------  1 root  wheel  25419908 Oct 28 20:49 bsd
puffy / #

2.7. Aplicar patch al nuevo kernel

En un paso anterior habiamos realizado un roolback de los patch aplicados en el sistema con el fin de poder re aplicarlos ahora con el nuevo kernel, procedemos:

puffy ~ # syspatch   
Get/Verify syspatch74-001_xserver... 100% |*******************************************************************| 4466 KB 00:00    
Installing patch 001_xserver
Get/Verify syspatch74-002_msplit.tgz 100% |*******************************************************************| 93204   00:00    
Installing patch 002_msplit
Relinking to create unique kernel... done; reboot to load the new kernel
Errata can be reviewed under /var/syspatch
puffy ~ #

consultamos los patch aplicados:

puffy ~ # syspatch -l
001_xserver
002_msplit
puffy ~ #

son los mismos que teniamos antes.

2.8. Finalizando

Al terminar todos los pasos anteriores ahora procedemos a reiniciar el sistema:

puffy ~ # reboot

una ves reiniciado controlamos si ya se ven desde el kernel ambos CPUs:

puffy ~ # sysctl hw.ncpu                                                                                                          
hw.ncpu=2
puffy ~ #

como podemos ver se ven ambos CPUs.

3. Conclusión

Hay otras formas de realizar esta tarea, algunas mas sencillas incluso, me pareció interesante documentar esta porque nos deja un conocimiento sobre varios pormenores de OpenBSD como los Sets, el relinkeo del kernel, aplicar Patch, etc.

4. Referencias

man sysctl

man biosboot

man boot

man boot_config