Copyright
Copyright © José Luis Lara Carrascal 2007-2024
Sumario
Introducción
Características
Instalación
Configuración del Kernel
Configuración de Project C
Los módulos
Notas de actualización del manual
Enlaces
Introducción
Hacer un manual genérico de la instalación de un kernel en GNU/Linux
resulta bastante complicado, con lo que en este documento voy a
explicar de forma clara y concisa cómo actualizo las versiones
del kernel en mi sistema. Salvando las distancias posibles con el mundo
Debian mucha de la
información aquí expuesta debería de resultar
válida para todos los usuarios de todas las distribuciones. En
ningún momento pretendo crear un manual genérico, sino
más bien una radiografía documentada de un proceso que
suelo acometer cuando salen las nuevas versiones del kernel de GNU/Linux.
Lo que empezó siendo un simple manual de instalación, se
ha convertido en un documento de descarga del código fuente de
un kernel personalizado, con características no incluidas en el
oficial.
Características
* Nivel -O3 predefinido de optimización.
* Planificadores de CPU: BORE y Project C (BMQ o PDS). [1]
* Módulo modificado del kernel, it87
(compatible con placas base como la ASUS TUF-B450-PLUS GAMING, para la
monitorización de la temperatura).
* Controlador de monitorización de temperatura, voltaje y
potencia de la CPU, Zenpower3.
* Sistema de archivos, SpadFS. [2]
* Unidad de RAM y almacenamiento en caché, RapidDisk. [2]
* Controlador de frecuencia de CPU, AMD-P-State, (actualizado a los últimos cambios realizados en la versión de desarrollo del kernel).
[1]
Los dos planificadores están desactivados por defecto. El
usuario tendrá que activar uno u otro, en función de sus
necesidades. En el caso de BORE, en General Setup >> Scheduler Features >> Burst-Oriented Response Enhancer, y en el caso de Project C, en General Setup >> Scheduler Features >> Alternative CPU Schedulers. Desde la versión 5.0.0 de BORE, ya no es posible desactivarlo a través de sysctl.
[2] No está aún disponible para la versión 6.12.
Instalación
Dependencias
Herramientas de Compilación
Entre paréntesis la versión con la que se ha compilado el Kernel para la elaboración de este documento.
* GCC - (14.2.0) o Clang - (19.1.4)
* Gawk - (5.3.1)
* Make - (4.4.1)
* Bison - (3.8.2)
* Flex - (2.6.4)
Librerías de Desarrollo
* Xorg - (7.7 / xorg-server 21.1.14)
* Freetype2 - (2.13.3)
* GTK+ - (2.24.33) - (si vamos a usar la interfaz gráfica GTK+ con make gconfig)
* Qt5 - (5.15.16) - (si vamos a usar la interfaz gráfica Qt con make xconfig)
* Ncurses - (6.5) - (si vamos a usar la interfaz gráfica Ncurses (en consola) con make menuconfig)
Aplicaciones
* GNU Binutils - (2.43.1)
* E2fsprog - (1.47.1)
* Kmod - (33)
* Mkinitrd - (6.0.93)
* Procps-ng - (4.0.4)
* Udev - (251)
* Util-linux - (2.40.2)
* Xfsprogs - (6.11.0)
* XZ Utils - (5.6.3)
Descarga
linux-6.12.1-ml.tar.lz
Firma Digital
linux-6.12.1-ml.tar.lz.asc
Verificar la firma digital del paquete
$ gpg --import manualinux.asc
$ gpg --verify linux-6.12.1-ml.tar.lz.asc linux-6.12.1-ml.tar.lz
|
Optimizaciones
# export CFLAGS='-march=znver3 -mtune=znver3'
|
Donde pone znver3 se indica el procesador respectivo de cada sistema seleccionándolo de la siguiente tabla: |
Nota informativa sobre las optimizaciones para GCC
|
* La opción '-march=' establece el procesador mínimo con el que funcionará el programa compilado, la opción '-mtune=' el procesador específico para el que será optimizado.
* Los valores separados por comas, son equivalentes, es decir, que lo mismo da poner '-march=k8' que '-march=athlon64'.
* En versiones de GCC 3.2 e inferiores se utiliza la opción '-mcpu=' en lugar de '-mtune='.
|
Nota informativa sobre las optimizaciones para Clang
|
* La opción '-mtune=' está soportada a partir de la versión 3.4 de Clang.
* Los valores de color azul no son compatibles con Clang.
* Las filas con el fondo de color amarillo son valores exclusivos de Clang y, por lo tanto, no son aplicables con GCC.
|
Valores |
CPU |
Genéricos |
generic |
Produce un código
binario optimizado para la mayor parte de procesadores existentes.
Utilizar este valor si no sabemos el nombre del procesador que tenemos
en nuestro equipo. Este valor sólo es aplicable en la
opción '-mtune=', si utilizamos GCC. Esta opción está disponible a partir de GCC 4.2. |
native |
Produce un código
binario optimizado para el procesador que tengamos en nuestro sistema,
siendo éste detectado utilizando la instrucción cpuid.
Procesadores antiguos pueden no ser detectados utilizando este valor.
Esta opción está disponible a partir de GCC 4.2. |
x86-64 |
Procesador genérico con extensiones 64-bit. Esta opción está disponible a partir de GCC 8 y Clang 1.9. |
x86-64-v2 |
Procesador
genérico con con soporte de instrucciones X86-64 (MMX, SSE,
SSE2, LAHFSAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3) y extensiones
64-bit. Esta opción está disponible a partir de GCC 11 y Clang 12. |
x86-64-v3 |
Procesador
genérico con con soporte de instrucciones X86-64 (MMX, SSE,
SSE2, LAHFSAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3, AVX, AVX2, F16C,
FMA, LZCNT, MOVBE, XSAVE, XSAVEC, FMA4) y extensiones 64-bit. Esta
opción está disponible a partir de GCC 11 y Clang 12. |
x86-64-v4 |
Procesador
genérico con con soporte de instrucciones X86-64 (MMX, SSE,
SSE2, LAHFSAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3, AVX, AVX2, F16C,
FMA, LZCNT, MOVBE, XSAVE, XSAVEC, AVX512*, FMA4) y extensiones 64-bit.
Esta opción está disponible a partir de GCC 11 y Clang 12. |
Intel |
alderlake |
Intel Alderlake con
soporte de instrucciones x86-64 (MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND,
FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC,
XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,
AVX512VNNI, AVX512BF16, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD,
CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16,
AMX-TILE, AMX-INT8, AVX-VNNI) y extensiones 64-bit. Esta opción
está disponible a partir de GCC 11 y Clang 12. |
arrowlake |
Intel Arrow Lake con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES,
XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA,
LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL,
AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 14. |
arrowlake-s |
Intel Arrow Lake S con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES,
XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA,
LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL,
AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD,
AVXVNNIINT16, SHA512, SM3, SM4 y extensiones 64-bit. Esta opción
está disponible a partir de GCC 14. |
atom |
Intel Atom con soporte de
instrucciones MMX, SSE, SSE2, SSE3, SSSE3 y extensiones
64-bit. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición bonnell. |
bonnell |
Intel Bonnell con soporte
de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3 y extensiones
64-bit. Esta opción está disponible a partir de GCC 4.9. |
broadwell |
Intel Broadwell con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW y extensiones 64-bit. Esta
opción está disponible a partir de GCC 4.9 y Clang 3.6. |
cannonlake |
Intel Cannonlake Server
con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND,
FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC,
XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI,
AVX512IFMA, SHA, UMIP y extensiones 64-bit. Esta opción
está disponible a partir de GCC 8 y Clang 3.9. |
cascadelake |
Intel Cascadelake con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES,
AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VNNI y
extensiones 64-bit. Esta opción está disponible a
partir de GCC 9 y Clang 8. |
clearwaterforest |
Intel
Clearwater Forest con soporte de instrucciones MOVBE, MMX, SSE, SSE2,
SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND,
XSAVE, XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX,
GFNI-SSE, CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2,
BMI, BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE,
HRESET, KL, WIDEKL, AVX-VNNI, ENQCMD, UINTR, AVXIFMA, AVXVNNIINT8,
AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4, USER_MSR,
PREFETCHI y extensiones 64-bit. Esta opción está
disponible a partir de GCC 14 y Clang 18. |
cooperlake |
Intel
Cooper Lake con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3,
SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE,
RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT,
XSAVEC, XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,
AVX512VNNI, AVX512BF16 y extensiones 64-bit. Esta opción
está disponible a partir de GCC 10 y Clang 9. |
core2 |
Intel Core2
con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3 y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 4.3. |
core-avx2 |
Intel Core (Haswell). Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición haswell. |
core-avx-i |
Intel Core (ivyBridge)
con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND, F16C y extensiones
64-bit. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición ivybridge. |
corei7 |
Intel Core i7
con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 y
SSE4.2 y extensiones 64-bit. Soporta también los procesadores
Intel Core i3 e i5. Esta opción está disponible
desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición nehalem. |
corei7-avx |
Intel Core i7 con
soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
AVX, AES y PCLMUL y extensiones 64-bit. Soporta también los
procesadores Intel Core i3 e i5. Esta opción está
disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición sandybridge. |
emeraldrapids |
Intel Emerald Rapids. Esta opción está disponible a partir de GCC 13 y Clang 16. |
goldmont |
Intel Goldmont con soporte
de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE y extensiones
64-bit. Esta opción está disponible a partir de GCC 9 y Clang 5. |
goldmont-plus |
Intel Goldmont Plus con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, PTWRITE,
RDPID, SGX, UMIP y extensiones 64-bit. Esta opción está
disponible a partir de GCC 9 y Clang 7. |
grandridge |
Intel Grand Ridge con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES,
XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA,
LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL,
AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, RAOINT y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 13 y Clang 16. |
graniterapids |
Intel Grand Ridge con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND,
F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW,
AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW,
AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI,
VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ,
PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT,
ENQCMD, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR,
AMX-BF16, AMX-TILE, AMX-INT8, AVX-VNNI, AVX512-FP16, AVX512BF16,
AMX-FP16, PREFETCHI y extensiones 64-bit. Esta opción
está disponible a partir de GCC 13 y Clang 16. |
graniterapids-d |
Intel Granite Rapids D con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, CX16, SAHF, FXSR, AVX, XSAVE, PCLMUL, FSGSBASE, RDRND,
F16C, AVX2, BMI, BMI2, LZCNT, FMA, MOVBE, HLE, RDSEED, ADCX, PREFETCHW,
AES, CLFLUSHOPT, XSAVEC, XSAVES, SGX, AVX512F, AVX512VL, AVX512BW,
AVX512DQ, AVX512CD, PKU, AVX512VBMI, AVX512IFMA, SHA, AVX512VNNI, GFNI,
VAES, AVX512VBMI2, VPCLMULQDQ, AVX512BITALG, RDPID, AVX512VPOPCNTDQ,
PCONFIG, WBNOINVD, CLWB, MOVDIRI, MOVDIR64B, ENQCMD, CLDEMOTE, PTWRITE,
WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16, AMX-TILE, AMX-INT8,
AVX-VNNI, AVX512FP16, AVX512BF16, AMX-FP16, PREFETCHI, AMX-COMPLEX y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 14 y Clang 17. |
haswell |
Intel Haswell con soporte
de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C y
extensiones 64-bit. Esta opción está disponible a
partir de GCC 4.9. |
i386 |
Intel i386.
|
i486 |
Intel i486. |
i586, pentium |
Intel Pentium sin soporte de instrucciones MMX. |
i686 |
Produce un código
binario optimizado para la mayor parte de procesadores compatibles con
la serie 80686 de Intel. Todos los actuales lo son. |
icelake-client |
Intel Icelake Client con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES,
AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI,
AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ,
AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES y extensiones
64-bit. Esta opción está disponible a partir de GCC 8 y Clang 7. |
icelake-server |
Intel Icelake Server con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES,
AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI,
AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ,
AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG, WBNOINVD y
extensiones 64-bit. Esta opción está disponible a
partir de GCC 8 y Clang 7. |
intel |
Intel Haswell y
Silvermont. Este valor sólo es aplicable en la
opción '-mtune='. Esta opción está disponible
a partir de GCC 4.9. |
ivybridge |
Intel Ivy Bridge con
soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND, F16C y extensiones
64-bit. Esta opción está disponible a partir de GCC 4.9. |
knl |
Intel Knights Landing con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER y
extensiones 64-bit. Esta opción está disponible a
partir de GCC 5 y Clang 3.4. |
knm |
Intel Knights Mill con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI,
BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER,
AVX512CD, AVX5124VNNIW, AVX5124FMAPS, AVX512VPOPCNTDQ y extensiones
64-bit. Esta opción está disponible a partir de GCC 8 y Clang 6. |
lakemont |
Intel Quark Lakemont MCU, basado en el procesador Intel Pentium. Esta opción está disponible a partir de GCC 6 y Clang 3.9. |
lunarlake |
Intel Lunar Lake. Esta opción está disponible a partir de GCC 14 y es equivalente a la opción arrowlake-s. |
meteorlake |
Intel Meteor Lake. Esta opción está disponible a partir de GCC 13 y Clang 16. |
nehalem |
Intel Nehalem con soporte
de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT y
extensiones 64-bit. Esta opción está disponible a
partir de GCC 4.9. |
nocona |
Versión mejorada de Intel Pentium4 con soporte de instrucciones MMX, SSE, SSE2, SSE3 y extensiones 64-bit. |
pantherlake |
Intel
Panther Lake con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3,
SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE,
XSAVEC, XSAVES, XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE,
CLWB, MOVDIRI, MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI,
BMI2, F16C, FMA, LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE,
HRESET, KL, WIDEKL, AVX-VNNI, UINTR, AVXIFMA, AVXVNNIINT8,
AVXNECONVERT, CMPCCXADD, AVXVNNIINT16, SHA512, SM3, SM4, PREFETCHI y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 14 y Clang 18. |
penryn |
Intel Penryn con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3 y SSE4.1. |
pentiumpro |
Intel PentiumPro. |
pentium2 |
Intel Pentium2 basado en PentiumPro con soporte de instrucciones MMX. |
pentium3, pentium3m |
Intel Pentium3 basado en PentiumPro con soporte de instrucciones MMX y SSE. |
pentium4, pentium4m |
Intel Pentium4 con soporte de instrucciones MMX, SSE y SSE2. |
pentium-m |
Versión de bajo
consumo de Intel Pentium3 con soporte de instrucciones MMX, SSE y SSE2.
Utilizado por los portátiles Centrino. |
pentium-mmx |
Intel PentiumMMX basado en Pentium con soporte de instrucciones MMX. |
prescott |
Versión mejorada de Intel Pentium4 con soporte de instrucciones MMX, SSE, SSE2 y SSE3. |
raptorlake |
Intel Raptor Lake. Esta opción está disponible a partir de GCC 13 y Clang 16. |
rocketlake |
Intel Rocket Lake con
soporte de instrucciones x86-64 (MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND,
FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC,
XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD, AVX512VBMI,
AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2, AVX512VPOPCNTDQ,
AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES) y extensiones 64-bit. Esta
opción está disponible a partir de GCC 11 y Clang 13. |
sandybridge |
Intel Sandy Bridge con
soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
POPCNT, AVX, AES, PCLMUL y extensiones 64-bit. Esta opción
está disponible a partir de GCC 4.9 y Clang 3.6. |
sapphirerapids |
Intel Sapphire Rapids
con soporte de instrucciones x86-64 (MOVBE, MMX, SSE, SSE2, SSE3,
SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE,
RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT,
XSAVEC, XSAVES, AVX512F, CLWB, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,
AVX512VNNI, AVX512BF16, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD,
CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, TSXLDTRK, UINTR, AMX-BF16,
AMX-TILE, AMX-INT8, AVX-VNNI) y extensiones 64-bit. Esta opción
está disponible a partir de GCC 11 y Clang 12. |
silvermont |
Intel Silvermont con
soporte de instrucciones MOVBE, MMX, SSE, MOVBE, MMX, SSE, SSE2, SSE3,
SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMU, RDRND y extensiones
64-bit. Esta opción está disponible a partir de GCC 4.9 y Clang 3.6. |
sierraforest |
Intel Sierra Forest con
soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1,
SSE4.2, POPCNT, AES, PREFETCHW, PCLMUL, RDRND, XSAVE, XSAVEC, XSAVES,
XSAVEOPT, FSGSBASE, PTWRITE, RDPID, SGX, GFNI-SSE, CLWB, MOVDIRI,
MOVDIR64B, CLDEMOTE, WAITPKG, ADCX, AVX, AVX2, BMI, BMI2, F16C, FMA,
LZCNT, PCONFIG, PKU, VAES, VPCLMULQDQ, SERIALIZE, HRESET, KL, WIDEKL,
AVX-VNNI, AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD y extensiones
64-bit. Esta opción está disponible a partir de GCC 13 y Clang 16. |
skylake |
Intel Skylake
con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES y
extensiones 64-bit. Esta opción está disponible a partir
de GCC 6 y Clang 3.6. |
skylake-avx512 |
Intel Skylake Server
con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA,
BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES,
AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD y extensiones 64-bit.
Esta opción está disponible a partir de GCC 6 y Clang 3.9. |
tigerlake |
Intel
Tiger Lake con soporte de instrucciones OVBE, MMX, SSE, SSE2, SSE3,
SSSE3, SSE4.1, SSE4.2, POPCNT, PKU, AVX, AVX2, AES, PCLMUL, FSGSBASE,
RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT,
XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD,
AVX512VBMI, AVX512IFMA, SHA, CLWB, UMIP, RDPID, GFNI, AVX512VBMI2,
AVX512VPOPCNTDQ, AVX512BITALG, AVX512VNNI, VPCLMULQDQ, VAES, PCONFIG,
WBNOINVD, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT y extensiones 64-bit.
Esta opción está disponible a partir de GCC 10 y Clang 10. |
tremont |
Intel Tremont con soporte
de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2,
POPCNT, AES, PCLMUL, RDRND, XSAVE, XSAVEOPT, FSGSBASE, PTWRITE, RDPID,
SGX, UMIP, GFNI-SSE, CLWB, ENCLV y extensiones 64-bit. Esta
opción está disponible a partir de GCC 9 y Clang 7. |
westmere |
Intel Westmere con soporte
de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT,
AES, PCLMUL y extensiones 64-bit. Esta opción está
disponible a partir de GCC 4.9. |
yonah |
Procesadores basados en la microarquitectura de Pentium M, con soporte de instrucciones MMX, SSE, SSE2 y SSE3. |
AMD |
amdfam10, barcelona |
Procesadores basados en
AMD Family 10h core con soporte de instrucciones x86-64 (MMX, SSE,
SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM y extensiones
64-bit). Esta opción está disponible a partir de GCC 4.3. La definición barcelona está disponible a partir de Clang 3.6. |
athlon, athlon-tbird |
AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y SSE prefetch. |
athlon4, athlon-xp, athlon-mp |
Versiones mejoradas de AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y full SSE. |
bdver1 |
Procesadores basados en
AMD Family 15h core con soporte de instrucciones x86-64 (FMA4, AVX,
XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción
está disponible a partir de GCC 4.7. |
bdver2 |
Procesadores basados en
AMD Family 15h core con soporte de instrucciones x86-64 (BMI, TBM,
F16C, FMA, LWP, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2,
SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y extensiones
64-bit). Esta opción está disponible a partir de GCC 4.7. |
bdver3 |
Procesadores basados en
AMD Family 15h core con soporte de instrucciones x86-64 (FMA4, AVX,
XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción
está disponible a partir de GCC 4.8 y Clang 3.4. |
bdver4 |
Procesadores basados en
AMD Family 15h core con soporte de instrucciones x86-64 (BMI, BMI2,
TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCL_MUL,
CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y
extensiones 64-bit). Esta opción está disponible a partir
de GCC 4.9 y Clang 3.5. |
btver1 |
Procesadores basados en
AMD Family 14h core con soporte de instrucciones x86-64 (MMX, SSE,
SSE2, SSE3, SSE4A, CX16, ABM y extensiones 64-bit). Esta
opción está disponible a partir de GCC 4.6. |
btver2 |
Procesadores basados en
AMD Family 16h core con soporte de instrucciones x86-64 (MOVBE, F16C,
BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM, SSE4A, SSSE3, SSE3,
SSE2, SSE, MMX y extensiones 64-bit). Esta opción
está disponible a partir de GCC 4.8. |
geode |
AMD integrado con soporte de instrucciones MMX y 3DNow!. Esta opción está disponible a partir de GCC 4.3. |
k6 |
AMD K6 con soporte de instrucciones MMX. |
k6-2, k6-3 |
Versiones mejoradas de AMD K6 con soporte de instrucciones MMX y 3DNow!. |
k8, opteron, athlon64, athlon-fx |
Procesadores basados en
AMD K8 core con soporte de instrucciones x86-64 (MMX, SSE, SSE2,
3DNow!, enhanced 3DNow! y extensiones 64-bit). |
k8-sse3, opteron-sse3, athlon64-sse3 |
Versiones mejoradas de AMD
K8 core con soporte de instrucciones SSE3. Esta opción
está disponible a partir de GCC 4.3. |
znver1 |
Procesadores basados en
AMD Family 17h core con soporte de instrucciones x86-64 (BMI, BMI2,
F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES,
PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1,
SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT y extensiones
64-bit). Esta opción está disponible a partir de GCC 6 y Clang 4. |
znver2 |
Procesadores basados en
AMD Family 17h core con soporte de instrucciones x86-64 (BMI, BMI2,
,CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA,
CLZERO, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT y
extensiones 64-bit). Esta opción está disponible a
partir de GCC 9 y Clang 9. |
znver3 |
Procesadores basados en
AMD Family 19h core con soporte de instrucciones x86-64 (BMI, BMI2,
CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA,
CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID,
WBNOINVD, PKU, VPCLMULQDQ, VAES) y extensiones 64-bit. Esta
opción está disponible a partir de GCC 11 y Clang 12. |
znver4 |
Procesadores basados en
AMD Family 19h core con soporte de instrucciones x86-64 (BMI, BMI2,
CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA,
CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID,
WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA,
AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2,
AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI) y extensiones 64-bit.
Esta opción está disponible a partir de GCC 12.3 y Clang 16. |
znver5 |
Procesadores basados en
AMD Family 1ah core con soporte de instrucciones x86-64 (BMI, BMI2,
CLWB, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA,
CLZERO, AES, PCLMUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3,
SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT, RDPID,
WBNOINVD, PKU, VPCLMULQDQ, VAES, AVX512F, AVX512DQ, AVX512IFMA,
AVX512CD, AVX512BW, AVX512VL, AVX512BF16, AVX512VBMI, AVX512VBMI2,
AVX512VNNI, AVX512BITALG, AVX512VPOPCNTDQ, GFNI, AVXVNNI, MOVDIRI,
MOVDIR64B, AVX512VP2INTERSECT, PREFETCHI) y extensiones 64-bit. Esta
opción está disponible a partir de GCC 14. |
Optimizaciones adicionales
Optimizaciones adicionales |
GCC |
Graphite
|
# export CFLAGS+=' -ftree-loop-linear -floop-strip-mine -floop-block'
|
IPA
|
# export CFLAGS+=' -fipa-pta'
|
Clang |
Polly |
# export CFLAGS+=' -mllvm -polly -mllvm -polly-vectorizer=stripmine'
|
Parámetros adicionales
Establecer el uso de enlazador dinámico para GNU ld |
# export LD='ld.bfd' |
Desde la versión 5.3 del kernel, éste no es compatible con GNU gold
(versiones de Binutils 2.33 o superiores). Si lo tenemos como enlazador
dinámico predefinido de nuestro sistema, estableceremos la
variable de entorno correspondiente para que sea GNU ld el utilizado en el proceso de compilación. |
Establecer el uso de enlazador dinámico para LLD |
Clang |
# export LD='ld.lld' |
Establecer las variables de entorno para el uso de la optimización LTO/ThinLTO con Clang |
# export LLVM=1 LLVM_IAS=1 |
Si se establecen estas
variables no
es necesario establecer la variable de entorno para LLD y la de uso de
compilador para Clang. |
Establecer la variable de entorno de uso de compilador para Clang |
# export CC=clang |
Configuración del Kernel
1) Interfaz Gráfica - Qt
# tar axvf linux-6.12.1-ml.tar.lz
# cd linux-6.12.1-ml
# make xconfig
|
Parámetros de configuración opcionales
Cuando guardemos el archivo de configuración, ejecutamos los
siguentes comandos en función de la optimización que
vayamos a utilizar (solo hay que hacerlo la primera vez que vayamos a
utilizar estas optimizaciones, en las posteriores se cargará la
configuración que tengamos del kernel anterior, que ya las
incluirá por defecto):
scripts/config -e LTO_CLANG : Activa el uso de la optimización LTO de Clang a partir de la versión 5.12 del kernel.
scripts/config -e LTO_CLANG_THIN : Activa el uso de la optimización ThinLTO de Clang a partir de la versión 5.12 del kernel.
2) Interfaz Gráfica - GTK+
# tar axvf linux-6.12.1-ml.tar.lz
# cd linux-6.12.1-ml
# make gconfig
|
Parámetros de configuración opcionales
Cuando guardemos el archivo de configuración, ejecutamos los
siguentes comandos en función de la optimización que
vayamos a utilizar (solo hay que hacerlo la primera vez que vayamos a
utilizar estas optimizaciones, en las posteriores se cargará la
configuración que tengamos del kernel anterior, que ya las
incluirá por defecto):
scripts/config -e LTO_CLANG : Activa el uso de la optimización LTO de Clang a partir de la versión 5.12 del kernel.
scripts/config -e LTO_CLANG_THIN : Activa el uso de la optimización ThinLTO de Clang a partir de la versión 5.12 del kernel.
3) Interfaz Ncurses - Consola
# tar axvf linux-6.12.1-ml.tar.lz
# cd linux-6.12.1-ml
# make menuconfig
|
Parámetros de configuración opcionales
Cuando guardemos el archivo de configuración, ejecutamos los
siguentes comandos en función de la optimización que
vayamos a utilizar (solo hay que hacerlo la primera vez que vayamos a
utilizar estas optimizaciones, en las posteriores se cargará la
configuración que tengamos del kernel anterior, que ya las
incluirá por defecto):
scripts/config -e LTO_CLANG : Activa el uso de la optimización LTO de Clang a partir de la versión 5.12 del kernel.
scripts/config -e LTO_CLANG_THIN : Activa el uso de la optimización ThinLTO de Clang a partir de la versión 5.12 del kernel.
En la configuración del kernel la cosa ha mejorado mucho respecto a los de la serie 2.4,
por la sencilla razón que, cuando ejecutamos la
configuración, éste carga por defecto la que tengamos del
kernel que estemos usando en nuestro directorio /boot/config-6.x.x.
Lo que tendremos que hacer en primer lugar y quizá en
último para muchos usuarios nóveles que no quieran
complicarse la vida es seleccionar nuestro procesador en Processor type and features >> Processor family (NEW).
Como se puede ver en la captura de pantalla, la variedad de
procesadores soportados para compilar el paquete es ridículo, de
ahí que se haya incluido en el manual la información
necesaria para que el usuario utilice la definición de
procesador que le venga en gana, para compilar el paquete.
Alternativamente a esto, si no se desea compilar el kernel como se
explica en este manual, en este enlace
podemos encontrar un parche que recoge todos los procesadores
compatibles, cuya definición podremos seleccionar desde esta
misma ventana. Eso sí, las optimizaciones adiciones como
Graphite, IPA o Polly según compilador tendremos que
añadirlas de la misma forma que explico en el manual.
Configuración de Project C
Project C se compone de dos planificadores de CPU: BMQ (el predefinido) y PDS, cuyo uso podemos seleccionar en General Setup >> Scheduler features >> Alternative CPU schedulers
de la configuración gráfica del kernel. Mi experiencia
personal con PDS (derivado de MuQSS) se remonta a cuando tenía
el anterior procesador (AMD Phenom X4 965), y era frustrante ver
cómo estando compilando un paquete, abría el navegador
web y los núcleos de la CPU descendían en velocidad al
mínimo, dejando muerto el proceso de compilación. Con el
actual procesador que tengo (AMD Ryzen 5 5500) no lo he probado, pero
el escaso tiempo que llevo usando BMQ, no noto ninguna diferencia
específica con MuQSS que indique una pérdida de
rendimiento del sistema. El temporizador lo tengo configurado en 100
Hz. (valor recomendable si buscamos rendimiento), el kernel es preemptible y la opción sched_timeslice está en 2, que es el valor recomendable para este tipo de kernel.
1) Opciones a pasarle al cargador de inicio del kernel
Opciones a pasarle al cargador de inicio del kernel |
Parámetro |
Descripción |
sched_timeslice=4 |
Establece el intervalo de tiempo en
milisegundos que tardará el planificador de CPU, en dar
prioridad de un proceso a otro. En sistemas PREEMPTIBLES el valor
recomendable es 2 (2 ms.). El valor por defecto es 4 (4 ms.).
|
2) Opciones adicionales que se pueden establecer en tiempo de ejecución y hacer permanentes editando /etc/sysctl.conf
Opciones adicionales que se pueden establecer en tiempo de ejecución y hacer permanentes editando /etc/sysctl.conf |
Parámetro |
Descripción |
kernel.yield_type = 1 |
Establece el tipo de llamada que se realizará a sched_yield. Puede ser:
0 : Ninguna.
1 : Desimpulsa la tarea y la pone en cola de ejecución (valor por defecto).
|
Los módulos
Los kernel que traen las distribuciones de serie vienen atestados de
infinidad de módulos que nunca vamos a usar, así que lo
primero que deberíamos de hacer es tomar nota de los
dispositivos que tenemos en nuestro sistema (si no lo tenemos claro
dejarlo todo como está y sólo configurar lo antes
comentado respecto al tipo de procesador) y conocer de antemano
qué módulos están relacionados con los mismos,
bastaría ejecutar un lsmod como root para comprobar esto.
Indicar para finalizar lo referente a la configuración que el
sistema de archivos que vayamos a usar por defecto debe de estar
siempre soportado directamente por el kernel y que en la interfaz GTK+
los módulos se activan con el guión en el cuadrado y el
soporte directo del kernel con el otro símbolo como se puede ver
en la imagen de abajo, donde XFS está soportado directamente por el kernel y ReiserFS está configurado para ser compilado como módulo.
Una vez lo tenemos claro respecto a la configuración pulsamos en File >> Save
y esta quedará guardada, ya sólo nos queda salirnos de la
interfaz gráfica de configuración y compilar el kernel.
Compilación
# sed -i '5iKBUILD_CFLAGS := $(filter-out -march=znver3 -mtune=znver3, $(KBUILD_CFLAGS))' net/ipv6/Makefile
# sed -e '944s:-flto:& -funified-lto:' -e
'944aKBUILD_LDFLAGS += --lto=thin' -i Makefile
# make -j$(nproc) cflags-y="${CFLAGS}" |
Explicación de los comandos
sed -i '5iKBUILD_CFLAGS := $(filter-out -march=znver3 -mtune=znver3, $(KBUILD_CFLAGS))' net/ipv6/Makefile : Soluciona el siguiente mensaje de error con Clang 18. Sustituir znver3 por la definición de CPU que utilice cada uno. Más información en este enlace:
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Running pass 'Function Pass Manager' on module 'net/ipv6/ip6_input.o'.
1. Running pass 'X86 DAG->DAG Instruction Selection' on function '@ip6_rcv_core' |
sed -e '944s:-flto:& -funified-lto:' -e
'944aKBUILD_LDFLAGS += --lto=thin' -i Makefile : Convierte la optimización LTO en Unified LTO. Sólo aplicable a partir de la versión 17 de Clang.
-j$(nproc)
: Establece el número de procesos de compilación en
paralelo, en función del número de núcleos e hilos
que tenga nuestro procesador, tomando como referencia la
información mostrada por el sistema con el comando
correspondiente. Si nuestro procesador es mononúcleo de un solo
hilo, no añadir esta opción.
cflags-y="${CFLAGS}"
: Sincroniza la variable de entorno CFLAGS establecida en el manual,
con la variable específica que utiliza el paquete, para
añadir optimizaciones adicionales. Si se añaden
optimizaciones de CPU, este parámetro sobrescribirá las
que se hayan establecido en la interfaz de configuración del
kernel, de eso se trata precisamente.
Instalación de los módulos
Instalación del Kernel
# cp arch/x86/boot/bzImage /boot/vmlinuz-6.12.1-ml
# cp .config /boot/config-6.12.1-ml
# cp System.map /boot/System.map-6.12.1-ml
# mkinitrd /boot/initrd-6.12.1-ml.img 6.12.1-ml |
Explicación de los comandos
cp arch/x86/boot/bzImage /boot/vmlinuz-6.12.1-ml : Copiamos la imagen del kernel comprimida al directorio /boot, y la renombramos a vmlinuz-6.12.1-ml.
cp .config /boot/config-6.12.1-ml : Copiamos el archivo de configuración del kernel que hemos compilado al directorio /boot, renombrándolo a config-6.12.1-ml, y que servirá de referencia para futuras compilaciones del kernel.
cp System.map /boot/System.map-6.12.1-ml : Copiamos el archivo System.map al directorio /boot, renombrándolo a System.map-6.12.1-ml, este archivo contiene toda la información requerida para la carga de los módulos.
mkinitrd /boot/initrd-6.12.1-ml.img 6.12.1-ml : Creamos la
imagen de carga del kernel tomando como referencia el directorio de los
módulos instalados (no es necesario indicar la ruta completa del
mismo).
Configuración e Instalación de Lilo
Abrimos el archivo /etc/lilo.conf
con un editor de texto y añadimos el kernel nuevo (con y sin el
framebuffer activado) dejando el actual como segunda opción de
arranque, un ejemplo,
# File generated by DrakX/drakboot
# WARNING: do not forget to run lilo after modifying this file
default="Linux"
boot=/dev/disk/by-id/ata-ST1000DM010-2EP102_ZN1EH4Q3
map=/boot/map
keytable=/boot/es-latin1.klt
menu-scheme=wb:bw:wb:bw
prompt
nowarn
timeout=100
message=/boot/message
image=/boot/vmlinuz
label="Linux"
root="UUID=2e9b242e-4cb0-4688-8d5d-7d153b3f0e49"
initrd=/boot/initrd.img
append="video=vesafb:ywrap,mtrr:3 iommu=memaper
zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=lz4 amd_pstate=active amd_prefcore=enable"
vga=791
read-only
image=/boot/vmlinuz-6.12.0-ml
label="Linux-6.12.0"
root="UUID=2e9b242e-4cb0-4688-8d5d-7d153b3f0e49"
initrd=/boot/initrd-6.12.0-ml.img
append="video=vesafb:ywrap,mtrr:3 iommu=memaper zswap.enabled=1
zswap.zpool=z3fold zswap.compressor=lz4 amd_pstate=active amd_prefcore=enable"
vga=791
read-only
image=/boot/vmlinuz
label="Linux-nofb"
root="UUID=2e9b242e-4cb0-4688-8d5d-7d153b3f0e49"
initrd=/boot/initrd.img
append="noapic iommu=memaper zswap.enabled=1
zswap.zpool=z3fold zswap.compressor=lz4 amd_pstate=active amd_prefcore=enable"
read-only
other=/dev/sda2
label="Windows-10"
table=/dev/sda
|
Lo guardamos y ejecutamos la instalación del cargador de arranque,
Para terminar, es recomendable tener siempre las fuentes completas del
kernel con éste compilado, aunque esto en sistemas con poco
espacio en disco resulte complicado, pues hagan lo que hacía yo
antes de comprarme el nuevo disco duro, comprimir el directorio y
guardarlo en un cd, cuando haga falta su uso volver a descomprimirlo en
su sitio correspondiente.
Desinstalación del Kernel
Siguiendo el mismo sistema que he instaurado en los manuales de la web, incluyo los scripts de desinstalación, copia de respaldo y restauración de copia
de los binarios creados del kernel (módulos incluidos) y
los archivos de configuración ubicados en el directorio /boot. Queda excluido de estos el directorio de las fuentes.
kernel-6.12.1-ml-scripts.tar.gz
$ su
# tar zxvf kernel-6.12.1-ml-scripts.tar.gz
# cd kernel-6.12.1-ml-scripts
# ./Desinstalar_kernel-6.12.1-ml |
Copia de Seguridad como root
Con este otro script creamos una copia de seguridad de los binarios
compilados, recreando la estructura de directorios de los mismos en un
directorio de copias de seguridad (copibin) que se crea en el directorio /var. Cuando se haya creado el paquete comprimido de los binarios podemos copiarlo como usuario a nuestro home
y borrar el que ha creado el script de respaldo, teniendo en cuenta que
si queremos volver a restaurar la copia, tendremos que volver a
copiarlo al lugar donde se ha creado.
$ su
# tar zxvf kernel-6.12.1-ml-scripts.tar.gz
# cd kernel-6.12.1-ml-scripts
# ./Respaldar_kernel-6.12.1-ml |
Restaurar la Copia de Seguridad como root
Y con este otro script (que se copia de forma automática cuando
creamos la copia de respaldo del programa) restauramos la copia de
seguridad como root cuando resulte necesario.
$ su
# cd /var/copibin/restaurar_copias
# ./Restaurar_kernel-6.12.1-ml
|
Notas de actualización del manual
Desde el 14-04-2019 se incluye una versión personal con los parches del planificador de CPU, MuQSS de Con Kolivas y el deduplicador de memoria, UKSM de Nai Xia, una alternativa más rápida que KSM,
que impide que se utilice más de un proceso de una misma
librería compartida cuando hay varias aplicaciones en
ejecución dependientes de esa librería, produciendo un
significativo ahorro de memoria a costa de un ligerísimo
incremento del uso de la CPU. Este último lo tenemos que activar
en la configuración del kernel, en Memory
Management options >> Enable KSM for page merging >> Choose
UKSM/KSM strategy >> Ultra-KSM for page merging.
Espero en próximas actualizaciones del manual, ampliar la
información relativa a estos dos nuevos elementos que se
incorporan a este documento. La actualización de este manual se
hará siempre que esté disponible y funcional el parche de
Con Kolivas, es decir,
que ya no se actualizará en función de la nueva
versión del kernel que aparezca. Por otro lado, la
actualización siempre incluirá la última
versión del kernel (con punto), cosa que antes no sucedía.
A partir del 01-01-2020 también se ha añadido soporte para el sistema de archivos Reiser4. Para activarlo como módulo nos vamos a File systems >> Reiser4 (EXPERIMENTAL),
y hacemos clic dos veces para que se muestre un guión en la
casilla. Si tenemos pensando pasar nuestra partición raíz
del sistema a este sistema de archivos, volvemos a hacer clic dos veces
para que se compile integrado en el kernel. Para más
información sobre el montaje de este sistema de archivos me
remito a la sección correspondiente de la wiki de la distribución Arch Linux.
Desde el 24-03-2020, se añaden al manual, las optimizaciones de
CPU y adicionales incluidas en la mayoría de manuales de la web,
además de incluir soporte de instalación con Clang.
Reseñar también que el nivel de optimización por
defecto pasa a ser el '-O3'. Si el usuario quiere utilizar el -O2,
basta con ejecutar el siguiente comando en el directorio raíz
del kernel:
# sed -i 's:-O3:-O2:' Makefile
|
También, a partir de esta fecha, se incluye otra versión personal, con el parche del planificador de CPU, Project C de Alfred Chen, de características similares a MuQSS, pero diferente desempeño y aplicación (no activa por defecto que el kernel sea preemptible y tampoco modifica la frecuencia del temporizador) al que se le añaden el resto de parches incluidos en la versión que incluye el parche de Con Kolivas.
Desde el 19-08-2020, se incluye también una versión
modificada del controlador de sensores IT87, cuyo código fuente
podemos encontrar en este enlace, para poder visualizar correctamente la información de los sensores de placas base como la ASUS TUF B450-PLUS GAMING. Para poder cargar el controlador al inicio del sistema, ejecutamos el siguiente comando como root.
# echo it87 > /etc/modprobe.preload.d/it87
|
Desde el 31-08-2022, se incluye el código más actualizado, que podemos obtener en este proyecto derivado del primero.
Desde el 01-09-2021, se incluye el soporte del controlador NTFS3 proporcionado por la compañía Paragon Software,
para poder leer y escribir en particiones NTFS, que ya ha sido incluido
en la rama principal del kernel, a partir de la versión 5.15.
Para activarlo como módulo nos vamos a File systems >> NTFS Read-Write file system support,
y hacemos clic dos veces para que se muestre un guión en la
casilla. También es recomendable marcar la opción activate support of external compression lxz/xpress, para poder copiar contenidos de una partición de sistema de Windows.
Para sustituir las particiones que tengamos montadas con el vetusto y lento controlador, ntfs-3g, por éste, basta editar las entradas del archivo de configuración /etc/fstab y dejarlas así, un ejemplo.
/dev/sdb7 /mnt/win_o ntfs3 noatime,umask=000 0 0 |
Todas las opciones de montaje las podemos encontrar en este enlace,
además de las opciones nativas del comando mount. Los usuarios
que tengan montadas las particiones NTFS en locales que no estén
en UTF-8, tendrán que añadir lo siguiente:
/dev/sdb7 /mnt/win_o ntfs3 noatime,umask=000,iocharset=iso8859-15 0 0 |
A partir del 23-09-2021, y, tras el abandono de Con Kolivas, del desarrollo de los parches del planificador de CPU, MuQSS,
la versión del kernel incluida en este manual relativa a este
proyecto se sustituyó por una que incluye de forma experimental,
el planificador de CPU, CacULE, cuyo desarrollo también ha sido abandonado, pero que, de momento, tiene alguien que lo mantiene.
Desde el 04-11-2021, la versión de CacULE (con el parche
adaptado a la versión 5.15 del kernel por el mantenedor de la
misma) se ha retirado del manual, por problemas de estabilidad del
sistema, cuando se hace un uso intensivo del mismo.
Desde el 29-12-2021, se incluye el soporte del controlador de frecuencia de CPU, AMD-P-State,
que mejora el rendimiento de los procesadores de AMD basados en la
microarquitectura Zen2 y superiores. Para activarlo como módulo
nos vamos a Power management and ACPI options >> CPU frequency scaling >> AMD Processor P-State driver, y hacemos clic dos veces para que se muestre un guión en la casilla.
Para poder cargar el controlador al inicio del sistema, ejecutamos el
siguiente comando como root (puede variar según
distribución):
# echo amd_pstate > /etc/modprobe.preload.d/amd_pstate
|
Y, además, usuarios como era mi caso (AMD Ryzen 3 3100),
tendremos que pasarle la siguiente opción de inicio al kernel
(ya se encargará el controlador de avisarnos si lo hemos
configurado para que se inicie automáticamente):
Procurar también que no se cargue el controlador proporcionado por el kernel, acpi-cpufreq, añadiéndolo a la lista negra de módulos que no se deben de cargar:
# echo "blacklist acpi-cpufreq" > /etc/modprobe.d/acpi-cpufreq.conf
|
Y, por último, lo fundamental, tenemos que activar en la BIOS, las opciones CPPC y CPPC Preferred Cores, para que el módulo pueda funcionar. Opcionalmente también podemos activar Global C-state Control y configurar Power Supply Idle Control
que, en toda la información que podemos encontrar en internet en
relación a CPPC, vienen siempre configuradas del modo que
aparece en la captura. Este controlador ha sido incluido en la rama
principal del kernel, a partir de la versión 5.17.
A partir del kernel 6.1.1, este controlador ya no se puede compilar
como un módulo sino que hay activarlo, marcando la
correspondiente casilla. Y, a partir del kernel 6.1, tendremos que
pasarle lo siguiente a los opciones de inicio del kernel.
Desde el 05-01-2022, se incluye el soporte del controlador de monitorización de temperatura de la CPU, Zenpower3,
que muestra el voltaje, la corriente y la potencia de los procesadores
de AMD basados en la microarquitectura Zen y superiores. Para activarlo
como módulo nos vamos a Device Drivers >> Hardware Monitoring support >> AMD ZEN family CPU Sensors Driver, y hacemos clic dos veces para que se muestre un guión en la casilla.
Para poder cargar el controlador al inicio del sistema, ejecutamos el
siguiente comando como root (puede variar según
distribución):
# echo zenpower > /etc/modprobe.preload.d/zenpower
|
Procurar también que no se cargue el controlador proporcionado por el kernel, k10temp, añadiéndolo a la lista negra de módulos que no se deben de cargar:
# echo "blacklist k10temp" > /etc/modprobe.d/k10temp.conf
|
Para comprobar que lo estamos utilizando, basta ejecutar el comando
sensors, y éste nos mostrará lo siguiente respecto a este
controlador:
zenpower-pci-00c3
Adapter: PCI adapter
SVI2_Core: 1.24 V
SVI2_SoC: 1.09 V
Tdie: +28.2°C (high = +95.0°C)
Tctl: +28.2°C
Tccd1: +27.5°C
SVI2_P_Core: 13.93 W
SVI2_P_SoC: 7.73 W
SVI2_C_Core: 11.86 A
SVI2_C_SoC: 7.06 A
|
Si estamos utilizando fancontrol
para controlar el ventilador o ventiladores de la CPU, tendremos
que volver a ejecutar el comando de configuración, pwmconfig,
para seleccionar el controlador, zenpower. Además de todo esto,
también podemos descargarnos e instalar la aplicación de
monitoreo, Zenmonitor3, desde este enlace y compilarla e instalarla de la siguiente forma (necesitaremos las devel de GTK3):
$ tar zxvf zenmonitor3-2.0.0.tar.gz
$ cd zenmonitor3-2.0.0
$ make
$ su -c "make install PREFIX=/usr" |
Requiere que el módulo msr esté cargado para poder utilizarla:
# echo msr > /etc/modprobe.preload.d/msr
|
Y, para poder visualizar todos los datos como usuario ejecutamos el siguiente comando como root:
# setcap cap_sys_rawio,cap_dac_read_search+ep /usr/bin/zenmonitor |
No olvidar que, tanto zenpower3 y zenmonitor3, son derivados de los proyectos originales creados por Ondrej Čerman.
Desde el 11-01-2022, se incluye soporte para el sistema de archivos SpadFS, desarrollado por Mikulas Patocka (uno de los creadores del navegador web Links), a partir de su tesis doctoral,
cuyas características principales son la sustitución del
registro en diario (journaling) que utilizan la mayoría de
sistemas de archivos modernos, por un recuento de bloqueos y el uso del
algoritmo hash en lugar del clásico btree
para la organización de los directorios, además de
incluir soporte para la recuperación de directorios y archivos
(undelete). Este sistema de archivos lo he conocido de forma casual, al
encontrar el parche del mismo en el repositorio de Piotr Górski.
Para activarlo como módulo nos vamos a File systems >> SPADFS file system support,
y hacemos clic dos veces para que se muestre un guión en la
casilla. Esto sólo activa el módulo, para poder instalar
también las utilidades del sistema de archivos, nos descargamos
este archivo y lo extraemos para poder compilar e instalar las utilidades incluido en el mismo (también incluye el módulo).
$ tar zxvf spadfs-1.0.20.tar.gz
$ cd spadfs-1.0.19
$ make mkspadfs spadfsck
$ su -c "make install-userspace" |
Para crear un nuevo sistema de archivos, por ejemplo, en /dev/sdb1, ejecutamos el siguiente comando como root:
Montamos la partición en el lugar que deseemos, por ejemplo, /mnt/datos, con el siguiente comando:
# mount -t spadfs /dev/sdb1 /mnt/datos
|
Si queremos que se monte de forma automática al inicio del sistema, lo añadimos al archivo /etc/fstab, un ejemplo:
/dev/sdb1 /mnt/datos spadfs umask=000 0 2
|
La opción "umask=000" permite a cualquier usuario escribir en la
partición, de lo contrario, solo el usuario root podrá
escribir en la misma. Para poder recuperar los archivos o directorios
borrados, basta con desmontar la partición, y ejecutar el
siguiente comando como root:
[root@localhost jose]# spadfsck --undelete /dev/sdb1
checking super block...
checking crash count table...
checking apage index...
checking apages...
checking directories and files...
scanning the device...
preparing recovery of lost data...
recovering directories...
RECOVERING DIRECTORY "/LOST+FOUND.0/DIRECTORY.0"
RECOVER? (Y/N/SAME/ALL)
|
Escribimos ALL y todos los directorios borrados serán
restaurados en el directorio LOST+FOUND.0, eso sí sin recuperar
el nombre original de los mismos, pero sí su contenido. Los
comandos mkspadfs y spadfsck, no muestran la ayuda de sus opciones de
línea de comandos, por lo que, es recomendable leerse el manual de usuario disponible en su web, que es el archivo README incluido en el paquete del mismo.
Desde el 23-02-2022, se sustituye el sufijo prjc por ml,
de la versión del kernel incluida en este manual, ya que
éste contiene más parches además del proporcionado
por Alfred Chen, para no crear confusión.
Desde el 11-03-2022, se añade el soporte de Multigenerational LRU,
que optimiza el uso de la memoria para evitar sobrecargas del sistema y
mejorar el rendimiento del mismo. Para activarlo nos vamos a Memory Management options >> Multigenerational LRU, y hacemos clic en dicha selección. Si queremos que se active por defecto, marcamos también Enable by default,
como aparece en la captura de pantalla. De lo contrario tendremos que
añadir el siguiente comando a los scripts de inicio del sistema.
echo 1 > /sys/kernel/mm/lru_gen/enable
|
Desde el kernel 6.1, esta característica está incluida de forma nativa.
Desde el 21-03-2022, se incluye soporte para la utilidad de creación y gestión de discos RAM, RapidDisk, desarrollado por Petros Koutoupis,
cuya característica principal es la posibilidad de crear discos
de RAM caché para acelerar las operaciones de los discos que
tengamos en nuestro sistema.
Para activarlo como módulo nos vamos a Device Drivers >> Block Devices >> RapidDisk and RapidDisck-Cache, y hacemos clic dos veces para que se muestre un guión en la casilla.
Para poder cargar los módulos al inicio del sistema, ejecutamos los siguientes comandos como root:
# echo rapiddisk > /etc/modprobe.preload.d/rapiddisk
# echo rapiddisk-cache > /etc/modprobe.preload.d/rapiddisk-cache
|
Esto sólo activa los módulos, para poder instalar
también las utilidades de creación y gestión de
discos RAM, nos descargamos este archivo
y lo extraemos para poder compilar e instalar las utilidades incluido
en el mismo (también incluye los módulos). Requiere de
las siguientes dependencias para su compilación: libjansson y libmicrohttpd.
$ tar zxvf rapiddisk-9.1.0.tar.gz
$ cd rapiddisk-9.1.0
$ make tools -j$(nproc)
$ su -c "make tools-install" |
En la wiki del proyecto podemos encontrar amplia información sobre el uso del programa.
Desde el 25-05-2022, se retira definitivamente el soporte de UKSM.
La razón: no hay nadie que se haga cargo del mantenimiento del
mismo y las continuas adaptaciones a las versiones que se publican del
kernel, cada vez funcionan peor.
Desde el 22-12-2022, se incluye un parche de características
similares a UKSM y se mejora el uso del controlador de frecuencia de la
CPU, AMD-P-State, con un parche que permite añadir la
opción amd_pstate=guided a las opciones de inicio del kernel, mejorando el rendimiento del mismo. Más información en este enlace.
Desde el 09-06-2023, se incluye soporte para el sistema de archivos ZFS, proporcionado por el proyecto, OpenZFS. Para activarlo como módulo nos vamos a File systems >> ZFS filesystem support,
y hacemos clic dos veces para que se muestre un guión en la
casilla. Los programas para crear y gestionar los volumenes los
tendremos que instalar aparte y esto, merece otro manual que, de
momento, no existe en esta web.
Dados los problemas de licencia
de ZFS, para poder compilar correctamente el módulo, tenemos que
modificar un archivo concreto del módulo de ZFS, con el
siguiente comando:
# sed -i 's:"CDDL":"GPL":' include/zfs/zfs_config.h
|
Recordar que no podremos distribuir de forma pública el kernel
en formato binario con soporte de ZFS, pero si lo podremos utilizar de
forma privada en nuestro sistema.
A partir de la última versión del software de OpenZFS (2.2.0-rc1
en adelante), tendremos que activar (si no le tenemos activado) la opción del kernel, General Setup >> Namespaces support >> User namespace ,
para poder crear sistemas de archivos dentro de la pila (pool) inicial
creada o poder montarlos, si ya existen los mismos. Un ejemplo:
[root@localhost jose]# zpool create zfs -o ashift=12 /dev/sde3 /dev/sdf3
[root@localhost jose]# zfs create -o mountpoint=/mnt/cache2 -o compression=zstd -o relatime=on zfs/cache
cannot create 'zfs/cache': permission denied
|
Desde el 29-08-2023, se sustituye los planificadores de CPU, proporcionados por Project C, por BORE en combinación con EEVDF,
dado el abandono de los primeros por parte de su autor. Si no queremos
hacer uso de BORE, añadimos lo siguiente, al archivo
/etc/sysctl.conf.
# echo kernel.sched_bore=0 >> /etc/sysctl.conf
|
Las opciones de configuración las podemos encontrar en el enlace
al proyecto en GitHub, aunque de primeras, no es necesario tocar nada.
El soporte de EEVDF ya está incluido en el kernel desde la
versión 6.6. Desde la versión 5.0.0 de BORE, ya no es posible desactivarlo a través de sysctl.
Desde el 02-09-2023 y, salvo milagro, podemos dar por fenecido el
soporte de Reiser4, en el kernel personalizado ubicado en este manual.
Desde el kernel 5.18, reiser4 no es compatible con el kernel Linux y
viendo la nula actividad en el repositorio git de su único
mantenedor, Edward Shishkin, dudo mucho que lo vuelva a ser, una pena.
Desde el 27-03-2024, se vuelven a incluir los planificadores de CPU,
proporcionados por Project C, ya que parece ser, su autor ha vuelto a
retomar el proyecto.
Desde el 21-06-2024, se retira de forma definitiva el soporte de
OpenZFS del kernel personalizado ubicado en este manual. La existencia
de bcachefs, que está integrado en el kernel, es el principal motivo para su eliminación.
Enlaces
http://www.kernel.org >> La web del Kernel.
http://www.users.on.net/~ckolivas/kernel >> La web de Con Kolivas.
https://cchalpha.blogspot.com >> El blog de Alfred Chen, mantenedor del planificador de CPU, Project C, de características similares a MuQSS.
https://github.com/sirlucjan/kernel-patches >> Repositorio recopilatorio de parches para el kernel, mantenido por Piotr Górski,
y de los que se nutre este manual, cuando el autor original del parche,
no actualiza el mismo a la nueva versión del kernel,
además de incluir otros parches adicionales bastante
interesantes.
https://reiser4.wiki.kernel.org/index.php/Main_Page >> Enlace a la página principal dedicada a Reiser4 en la web del kernel.
https://wiki.archlinux.org/index.php/Reiser4 >> Enlace a la sección dedicada a Reiser4 en la wiki de la distribución Arch Linux.
https://marc.info/?l=reiserfs-devel&m=157780043509663&w=2 >> Enlace al anuncio de lo que será la próxima versión 5 de Reiser4 y cuyos parches experimentales ya están disponibles en SourceForge.
https://www.phoronix.com/scan.php?page=search&q=Reiser4 >> Información relacionada con Reiser4 en la web de Phoronix.
https://github.com/pkoutoupis/rapiddisk >> Enlace al proyecto de RapidDisk en GitHub.
http://www.jikos.cz/~mikulas/spadfs >> La web del sistema de archivos SpadFS.
https://git.exozy.me/a/zenpower3 >> Enlace al proyecto de Zenpower3 en Gitea.
https://github.com/hamadmarri/cacule-cpu-scheduler >> Enlace al proyecto archivado de CacULE en GitHub.
https://github.com/CachyOS/cacule-cpu-scheduler >> Enlace al continuador del proyecto de CacULE en GitHub.
https://github.com/hamadmarri/TT-CPU-Scheduler >> Enlace al proyecto de TT-CPU-Scheduler en GitHub, del mismo autor de CacULE.
https://github.com/firelzrd/bore-scheduler >> Enlace al proyecto de BORE
en GitHub, una modificación del planificador de CPU del kernel,
CFS, que aumenta el tiempo de respuesta del sistema, en detrimento del
rendimiento.
https://xanmod.org >> Enlace a la web de XanMod, un kernel personalizado que contiene el planificador de CPU, CacULE, además de otras optimizaciones incluidas.
https://github.com/zen-kernel/zen-kernel >> Enlace al proyecto de Zen Kernel en GitHub, un kernel personalizado cuyas características podemos encontrar en este enlace.
https://gitlab.com/post-factum/pf-kernel >> Enlace al proyecto de pf-kernel en GitLab, un kernel personalizado cuyas características podemos encontrar en este enlace.
https://browser.geekbench.com/user/340208 >> Enlace a la cuenta de Manualinux en Geekbench, un medidor de rendimiento de nuestro sistema, en línea.
|