wiki:UpdateGlibc

NOTA:

Este documento sustituye y amplia a este de drupal

1. Bajarse la versión y descomprimir en /INSTALACIONES/glibc

2. Crear las carpetas glibc-XXX-obj32 y glibc-XXX-obj64

3. Si hubiera dependencias para esa versión ponerlas en la carpeta PARA-glibc-XXX

4. En cada una de las carpetas obj32 y obj64, hacer el ../glibc-XXX/configure con las opciones que se estimen

5. Hacer el make y make check para ver que todo va bien

6. Crear los directorios /INSTALACIONES/dirtmp32 e /INSTALACIONES/dirtmp64

7. Desde cada uno de los directorios obj, hacer make install_root=/INSTALACIONES/dirtmpXX install donde XX es 32 o 64.

8. En la máquina donde estemos compilando, que tiene que tener acceso RW y de root al repositorio TS3, montar en /DESTINO el repositorio de test, normalmente será /TS3/TEST y sincronizar la versión de 32 bits con rsync -aHSv /INSTALACIONES/dirtmp32/ /DESTINO/

9. En la máquina que se utilizará para probar la nueva glibc, que usará el repositorio TEST como /usr/local (debía estar arrancada de antes para asegurarnos poder hacer este paso), hacer ldconfig -v y asegurarnos de que se haya copiado /etc/ld.so.cache a /usr/local/etc/ld.so.cache

10. (NO ES NECESARIO) Si la glibc no hubiera creado el locale es_ES por defecto, se crearía con localedef -i es_ES -f ISO-8859-1 es_ES, aunque puede que no haga falta en glibc modernas pues lo hace lo del punto 14.

11. En el entorno de desarrollo de imágenes, crear el paquete para esta nueva glibc. Hay que asegurarse de que será el último que se incluya en el proceso de generación de la imagen, para lo que lo precedemos por los caracteres necesarios para que salga el último en el ls. Esto es así porque las librerías y binarios de este paquete hay que asegurarse que sean los que se incluyan en el initrd que se genere.

12. En el paquete anterior copiamos el etc de la versión anterior y en su caso customizamos el glibc-init si fuera necesario (se documentaría en el ticket específico de cada versión las customizaciones realizadas). El directorio lib llevará el contenido de /INSTALACIONES/dirtmp32/lib y el bin del /INSTALACIONES/dirtmp32/bin. Aparte copiamos el nscd del sbin al bin

13. Generamos la imagen y la subimos al tftp, configuramos la máquina de test para que use el repositorio de TEST, generamos y subimos al tftp, modificamos el dhcp para que arranque dicha imagen y comprobamos que arranca bien.

14. En la máquina de test con la nueva glibc arrancada seguramente nos aparecerán errores al hacer LC_ALL=es_ES.UTF8 o al ejecutar locale con un usuario que tenga el idioma diferente de C o POSIX. Esto se debe a que los locales son incompatibles entre versiones y hay que generarlos de nuevo. Para ello hacemos cp /usr/local/etc/locale.gen /etc y después /usr/local/sbin/locale-gen. Esto actualiza el /lib/locale.archive y no se si otras cosas más.

15. Rebotamos, comprobamos que todo va bien incluyendo los locales. Volvemos a montar /INSTALACIONES con prepjhbuild y sincronizamos las librerías de 64 bits con rsync -aHSV /INSTALACIONES/dirtmp64/lib /usr/local/lib64/, hacemos lo mismo con el directorio bin

En principio en este punto tendría que estar todo correcto a falta de realizar los tests de integridad.

PASOS POSTERIORES

Aunque en este punto la máquina con la nueva glibc debe arrancar y ejecutar la mayoría de las aplicaciones y servisios correctamente, hay algunos pasos posteriores para que funcione bien el entorno de 64bits y sobre todo la compilación en 64bits. Estos son:

  • Copiar los includes de 64 bits de la nueva glibc: Se encuentran en /usr/local/include/x86_64-linux-gnu. Hay que copiarlos desde /INSTALACIONES/dirtmp64/include.
  • libc.so en lib64: Este fichero tiene la ruta de la libc. Cuando se compila la versión de 64 bits se piensa que /lib/libc.so.6 será la versión de 64bits, porque así se lo hemos dicho al compilarla, cuando no será así pues pondremos la libc de 64 en /lib64, así que el fichero hay que cambiarlo de este:
    /* GNU ld script
       Use the shared library, but some functions are only in
       the static library, so try that secondarily.  */
    OUTPUT_FORMAT(elf64-x86-64)
    GROUP ( //lib/libc.so.6 //lib/libc_nonshared.a  AS_NEEDED ( //lib/ld-linux-x86-64.so.2 ) )
    
    a este:
    /* GNU ld script
       Use the shared library, but some functions are only in
       the static library, so try that secondarily.  */
    OUTPUT_FORMAT(elf64-x86-64)
    GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )
    
  • Binarios de 64 que están en 32: En principio para binarios normales daría un poco igual la ruta, a menos que tengamos versiones de aplicaciones en 64 y 32 que difieran. Pero si es importante para aplicaciones como ldd, gdb, etc. En principio para estas habría que usar las versiones de 64 bits, luego es mejor que en /usr/local/bin se enlazen a ../bin64
Last modified 3 months ago Last modified on Feb 9, 2024, 9:40:59 AM