Actualizar Debian entre versiones estables usualmente es un paseo, excepto cuando no lo es. Leer los Release Notes completamente y con intención, ahorra tiempo -- después de todo, fueron escritas por personas que saben mucho más que uno, y que de verdad hicieron el trabajo.
El directorio LDAP suele ser el sustrato de muchas instalaciones de servicios AAA y correo electrónico. Si esa actualización falla, el servicio también. Este es uno de los pocos servicios que no son triviales de actualizar de manera automática.
LDAP es tan rápido como su backend
La base de datos que almacena el directorio LDAP es fundamentalmente clave-valor. A lo largo de los años, ha evolucionado para maximizar la velocidad de lectura, sin preocuparse por la velocidad de escritura -- es la decisión correcta dado su patrón de uso.
El venerable Berkeley DB cayó en desuso hace más o menos una década. Fue reemplazado por HDB, una variante de BDB que facilita la construcción jerárquica. Tanto BDB como HDB dependen del kernel buffer cache para ser eficientes, siempre y cuando se ajusten cuidadosamente varios parámetros de operación. Aún así, siguen teniendo el problema de doble-copia (de disco a caché, de caché a proceso).
Una manera de evitar la doble-copia es establecer una biyección entre el archivo en disco y direcciones de memoria en el espacio del proceso. Esa técnica es provista por el kernel Linux hace más de una década, y se denomina «memory mapping».
Hasta Debian 11, las instalaciones LDAP se configuraban de manera automática para usar BDB/HDB, y las actualizaciones en sitio no suponían mayor dificultad. Los administradores podían agregar sus ajustes de desempeño, índices, y reglas de control de acceso, sabiendo que hay una traducción 1 a 1 para poder avanzar desde BDB hasta HDB.
Debian 11 introdujo la posibilidad de utilizar MDB. Sin embargo,
no se proveyó mecanismo para configurarla de manera semi-automática
con debconf
. Tampoco se proveyó un mecanismo para transformar
una instalación BDB/HDB hacia MDB, porque no es trivial. Eso hizo
que la mayoría de los administradores se quedaran con BDB/HDB.
A partir de Debian 12, sólo está disponible MDB. Ya no hay
soporte para BDB/HDB. En otras palabras, el servidor slapd
de Debian 12, no va a levantar, si encuentra los datos
en un backend BDB/HDB. Así de simple. Los Release Notes
lo dicen claramente.
Deja para hoy lo que no quieres hacer apurado mañana
En mi opinión, es preferible migrar manualmente desde BDB/HDB
hacia MDB en Debian 11, para que la actualización a Debian 12
no tenga que hacer nada, sino reiniciar el proceso slapd
.
La migración es relativamente sencilla, ejecutando los
siguientes pasos como root
(o con sudo
):
Detenga el servicio LDAP. Usando scripts SYSV o SystemD, detenga el servicio
slapd
. Esto hace que cualquier transacción pendiente sea escrita, y la base de datos quede consistente.Respalde los datos del directorio a un archivo LDIF. Los datos del directorio están bajo
/var/lib/ldap
. Con el servicioslapd
detenido, basta hacerslapcat -l data-backup.ldif
Respalde la configuración del servicio a un archivo LDIF. Las instalaciones modernas de LDAP se configuran con una jerarquía de archivos LDIF inmutables, ubicados bajo
/etc/ldap/slapd.d
. Si su sistema sólo tiene un archivo/etc/ldap/slapd.conf
, estas instrucciones no aplican. Con el servicioslapd
detenido, basta hacerslapcat -n 0 -F /etc/ldap/slapd.d -l config-backup.ldif
Vacíe el directorio de configuración y el directorio de datos. Efectivamente, hay que reconstruir todo desde cero. Para los extra-paranoicos, puede copiar ambos directorios para tener una «recuperación de emergencia».
rm /var/lib/ldap/* rm -rf /etc/ldap/slapd.d/*
Usando su editor preferido, ajuste los contenidos de
config-backup.ldif
para reflejar el cambio de backend hacia MDB. Cuáles y cuántas cosas tendrá que cambiar depende de su instalación particular, y es una de las razones por las cuales no puede haber un «actualizador mágico» que haga el trabajo. Para el caso trivial en el cual hay solamente un backend gestionando una sola base de datos BDB/HDB, tiene que buscar y ajustar lo siguiente:Ubique la entrada con
dn: cn=module{N},cn=config
(dondeN
suele ser0
) y ajusteolcModuleLoad
para usarback_mdb
. Esta entrada indica cuál librería usar para las bases de datos, así que en lugar de BDB/HDB necesita MDB.Ubique la entrada con
dn cn=olcBackend{N}hdb,cn=config
(dondeN
suele ser0
). Ajuste eldn
y elcn
para tenermdb
. Esta entrada declara que existe una base de datos en disco que requiere el backend MDB.Ubique la entrada con
dn olcDatabase={N}hdb,cn=config
(dondeN
suele ser1
). Además de ajustar eldn
y elolcDatabase
para tenermdb
, también tendrá que ajustar elobjectClass
para reflejar que se trata de unolcMdbConfig
Notará muchos atributos relacionados con la raíz de búsqueda, credenciales del administrador, y posiblemente índices para mejorar la eficiencia de búsqueda. Puede dejarlos tal cual.Al cambiar el
objectClass
, es necesario que elimine cualquier directiva de configuración específica para BDB/HDB. No puedo decirle cuáles son porque eso depende de su instalación. En mi caso, tuve que eliminar todos losolcDbConfig
.Así mismo, tiene que agregar la única directiva necesaria para MDB: un número, en bytes, que será el límite de tamaño de la base de datos. Recordando que se trata de un límite superior para hacer memory-mapping, simplemente escoja un número mucho más grande de lo que Ud. estima su base de datos LDAP va a crecer en el tiempo. En mi caso, 1Gb es suficiente así que puse
olcDbMaxSize: 1073741824
. No está dicho explícitamente en ninguna parte, pero es conveniente que el número sea un múltiplo de 4096.
Genere la configuración bajo
/etc/ldap/slapd.d
usando el archivo modificado en el punto (5).slapadd -n 0 -F /etc/ldap/slapd.d -l config-backup.ldif chown -R openldap:openldap /etc/ldap/slapd.d
Si cometió errores en el archivo LDIF, le serán reportados durante el proceso de carga. Elimine los contenidos del directorio
/etc/ldap/slapd.d
, y repita hasta que logre cargar la configuración sin recibir errores ni advertencias.Restaure los datos bajo
/var/lib/ldap
slapadd -l data-backup.ldif chown -R openldap:openldap /var/lib/ldap
Si los datos cargan limpiamente, el directorio
/var/lib/ldap
contendrá exactamente dos archivos:data.mdb
ylock.mdb
.Si los datos no cargan limpiamente, seguramente es porque su instalación tiene configuraciones adicionales que deben ajustarse. En ese caso, interprete los mensajes de error recibidos, y regrese al punto (5) hasta que logre cargar configuración y datos sin problemas.
Inicie el servicio LDAP. Usando scripts SYSV o SystemD, inice el servicio
slapd
. Si el servicio inicia sin reportar errores, conduzca las pruebas necesarias para su plataforma, confirmando que el directorio opera correctamente.
Colofón
Mis instalaciones LDAP suelen tener montones de configuraciones adicionales (índices, ACLs, múltiples credenciales administrativas, esquemas adicionales estándar o de mi propia cosecha). Agregar esas configuraciones adicionales a una instalación «nueva» es engorroso, y susceptible a errores u omisiones. Por eso prefiero hacer la media docena de ajustes descritos más arriba.
Para aquellos que tienen una configuración LDAP mínima de cajita "con el plastiquiiiito", puede resultar más práctico:
Estando en Debian 11, respaldar sólo los datos a LDIF. Asegurarse que se pueden restaurar en otro LDAP nuevo en un Debian 12.
Actualizar a Debian 12.
slapd
no va a subir.Destruir la configuración y los datos LDAP en Debian 12. Usar
dpkg-reconfigure
para generar una nueva base de datos usando MDB desde cero.Restaurar los datos.
Revisar que todo funcione.
Entre los pasos (2) y (3) no hay servicio LDAP. Entre (3) y (4) pueden «pasar cosas» si los servicios tratan de usar LDAP y la base de datos no está completa.
Como siempre, es increíble lo que se puede aprender leyendo la documentación con intención, en lugar de simplemente seguir recetas escritas o en video...