Autor: Francisco

  • Guía de locale en Ubuntu: idioma, UTF-8 y codificación de archivos

    Un problema muy común en Linux: los acentos y caracteres especiales (ñ, á, é, etc.) aparecen rotos o como símbolos extraños. Casi siempre se debe a una de dos causas: un archivo con codificación incorrecta (no UTF-8), o el locale del sistema mal configurado. Esta guía cubre el diagnóstico y la corrección de ambos casos en Ubuntu 24.04.

    ¿Qué es el locale?

    El locale define el conjunto de convenciones regionales que usa el sistema: idioma de los mensajes, formato de fecha y hora, símbolo de moneda, criterio de ordenamiento alfabético, y — lo más relevante para este problema — la codificación de caracteres que el sistema espera usar (UTF-8, ISO-8859-1, etc.).

    El locale no es una sola variable, sino varias categorías LC_* independientes, que en conjunto forman la configuración regional completa:

    VariableQué controla
    LANGValor por defecto para todas las categorías no especificadas individualmente
    LC_CTYPECodificación de caracteres y clasificación (mayúsculas/minúsculas, qué es una letra)
    LC_TIMEFormato de fecha y hora
    LC_NUMERICFormato de números (separador decimal, de miles)
    LC_MONETARYFormato de moneda
    LC_COLLATECriterio de ordenamiento alfabético
    LC_MESSAGESIdioma de los mensajes del sistema y aplicaciones

    Cuando los acentos se ven mal, la variable más relevante es LC_CTYPE (heredada de LANG si no se define aparte), ya que es la que determina qué codificación de caracteres usa el sistema para interpretar el texto.

    Diagnóstico

    1. Verificar la codificación del archivo

    file archivo.txt

    Este comando detecta y muestra la codificación real del archivo (por ejemplo, UTF-8 Unicode text o ISO-8859 text). Si el archivo no está en UTF-8 y el sistema sí lo está, ahí está el origen del problema — no es un problema del sistema, sino del archivo en sí.

    2. Mostrar caracteres invisibles

    cat -v archivo.txt

    Revela caracteres de control y bytes no imprimibles que normalmente quedan ocultos en una vista normal del archivo — útil para detectar bytes corruptos o secuencias de escape mal interpretadas.

    3. Ver la configuración regional actual

    locale

    Muestra el valor actual de todas las variables LC_* y LANG en la sesión activa. Si alguna aparece vacía o como C/POSIX (el locale mínimo sin soporte real de idioma ni UTF-8), esa es la señal de que el sistema no tiene un locale regional configurado correctamente.

    4. Convertir un archivo a UTF-8

    iconv -f ISO-8859-1 -t UTF-8 archivo_origen.txt -o archivo_utf8.txt

    iconv convierte la codificación de un archivo sin alterar su contenido textual — solo reinterpreta los bytes según la codificación de origen (-f) y los reescribe en la codificación destino (-t). Es la solución cuando el problema es del archivo específico, no del sistema completo.

    Trabajar con locale en Ubuntu 24.04

    1. Ver locales instalados y disponibles

    # Variables activas en la sesión actual
    locale
    
    # Todos los locales ya generados/disponibles en el sistema
    locale -a
    
    # Locales listados para generación en /etc/locale.gen
    cat /etc/locale.gen

    Es importante distinguir estos tres: locale muestra lo que está activo ahora, locale -a muestra lo que está generado y disponible para usar, y /etc/locale.gen es la lista de configuración de qué se debe generar — un locale puede estar en este archivo pero no haber sido generado aún.

    2. Generar un locale (si no existe)

    # Español de España, UTF-8
    sudo locale-gen es_ES.UTF-8
    
    # Español de México, UTF-8
    sudo locale-gen es_MX.UTF-8

    locale-gen compila el locale a partir de sus datos fuente y lo deja disponible para el sistema — es un paso previo obligatorio antes de poder usarlo como LANG o cualquier otra variable LC_*.

    3. Establecer el locale del sistema

    # Establecer LANG global (método clásico)
    sudo update-locale LANG=es_ES.UTF-8
    
    # Alternativa moderna usando localectl (integrado con systemd)
    sudo localectl set-locale LANG=es_ES.UTF-8
    
    # Establecer un parámetro específico, sin afectar los demás
    sudo update-locale LC_TIME=es_ES.UTF-8

    La diferencia entre update-locale y localectl: ambos terminan escribiendo en el mismo archivo de configuración (/etc/default/locale), pero localectl es la herramienta moderna que forma parte del ecosistema systemd (junto con timedatectl y hostnamectl), y valida que el locale exista antes de aplicarlo — update-locale es más directo pero no hace esa validación previa.

    4. Reconfigurar locales con interfaz interactiva

    sudo dpkg-reconfigure locales

    Abre un asistente interactivo (interfaz de texto tipo ncurses) donde se puede: seleccionar qué locales generar de una lista completa, y elegir cuál queda como el locale por defecto del sistema. Es la forma más segura para quienes prefieren no editar archivos de configuración a mano.

    5. Configurar teclado (si afecta a los acentos)

    sudo dpkg-reconfigure keyboard-configuration

    A veces el problema no es el locale del sistema sino la distribución de teclado configurada — si las teclas de acentos y ñ no producen el carácter esperado al escribir directamente en la terminal, este es el comando a revisar.

    6. Archivos donde se guarda la configuración

    ArchivoAlcance
    /etc/default/localeConfiguración global del sistema (todos los usuarios)
    ~/.bash_profileConfiguración específica de un usuario, sobreescribe la global en su sesión

    Ejemplo para fijar el locale de un usuario específico, sin afectar al resto del sistema:

    echo 'LANG=es_ES.UTF-8' >> ~/.bash_profile
    export LANG=es_ES.UTF-8

    7. Aplicar los cambios

    Los cambios de locale a nivel de sistema generalmente requieren cerrar sesión y volver a entrar, o en algunos casos un reinicio completo para que todos los servicios y procesos existentes tomen la nueva configuración:

    sudo reboot

    Resumen del flujo de diagnóstico

    1. Ejecutar locale — si algo aparece vacío o en C/POSIX, el sistema no tiene un locale regional configurado.
    2. Ejecutar file archivo.txt sobre el archivo problemático — si no está en UTF-8, el problema es del archivo, no del sistema.
    3. Si es el sistema: generar el locale con locale-gen, luego fijarlo con update-locale o localectl, y reiniciar sesión.
    4. Si es el archivo: convertirlo puntualmente con iconv, sin tocar la configuración del sistema.
  • Salvando datos de un HDD moribundo: SMART + ddrescue paso a paso

    Diagnóstico y plan de rescate para un disco duro mecánico (HDD) con degradación física acelerada, usando los atributos SMART como evidencia y ddrescue como herramienta de recuperación.

    Estado crítico del disco (HDD Seagate 1TB)

    El análisis partió de los reportes de smartctl -a /dev/sda. El disco presentaba una degradación física acelerada y exponencial en la superficie de los platos, provocada principalmente por desgaste (21,665 horas de uso) y un historial de impactos mecánicos (ID 191 G-Sense: 492 eventos registrados).

    La gravedad se hizo evidente al comparar cómo empeoraron los atributos SMART en cuestión de días:

    Atributo SMARTEvoluciónSignificado
    Sectores Reasignados (ID 5)64 → 1,224 → 1,248El disco se está quedando sin sectores de repuesto
    Sectores Pendientes (ID 197)56 (estable)Sectores inestables esperando ser remapeados
    Errores Incorregibles (ID 187)1 → 37Errores que el hardware no pudo solucionar por sí solo
    Auto-tests (corto y extendido)Fallaron (Read failure)Bloqueo físico al intentar leer el LBA 1934650888

    Por qué estos números importan

    Un disco mecánico sano tiene sectores de repuesto reservados de fábrica para reemplazar automáticamente los que empiezan a fallar — es un proceso normal y silencioso que ocurre en cualquier disco con el paso del tiempo. El problema real empieza cuando el conteo de sectores reasignados crece de forma acelerada en pocos días (como en este caso, de 64 a más de 1,200): significa que el disco está agotando esa reserva mucho más rápido de lo esperado, y que la superficie física está fallando de forma activa, no por desgaste gradual normal.

    Los errores incorregibles son aún más serios: representan sectores que ni siquiera el propio firmware del disco pudo reparar o remapear — ahí es donde empieza la pérdida real de datos si no se actúa a tiempo.

    Estrategia de mitigación: temperatura

    Mantener el disco lo más fresco posible (en este caso, a 26°C) ayuda a estabilizar la mecánica interna y evitar la dilatación térmica de los componentes, ganando tiempo valioso antes de que el disco falle por completo. Sin embargo, esto no frena el daño físico — solo reduce el estrés adicional. La recomendación práctica es mantener el equipo apagado hasta tener listo el disco de reemplazo, y encenderlo solo el tiempo estrictamente necesario para el rescate.

    Monitoreo en tiempo real

    Para vigilar la temperatura del disco mientras se trabaja en él, sin generar lecturas SMART adicionales innecesarias que añadan estrés:

    watch -n 5 "sudo smartctl -A /dev/sdb | grep Temperature"

    Rescate de datos con ddrescue

    ddrescue es la herramienta correcta para este escenario porque, a diferencia de rsync o cp, no se detiene ante un error de lectura: registra el sector problemático en un archivo de log, lo salta, y continúa copiando el resto — maximizando la cantidad de datos recuperados incluso con un disco en mal estado. Herramientas normales de copiado abandonan la operación completa ante el primer error de I/O.

    Opción disco a disco (clonación completa)

    Copia el disco completo, sector por sector, a otro disco de igual o mayor capacidad en bytes:

    sudo ddrescue -d -f -r3 /dev/sdb /dev/sda /home/usuario/rescate.log

    Los parámetros clave: -d usa acceso directo al disco (evita la caché del sistema, más preciso para discos dañados), -f fuerza la operación incluso en dispositivos que ddrescue considera «raros», y -r3 indica 3 reintentos por sector antes de darlo por perdido y continuar.

    Opción rescate selectivo (recomendada para minimizar estrés mecánico)

    En vez de clonar el disco completo, se puede rescatar solo el contenido de una partición específica hacia una carpeta destino en otro disco sano — reduce el tiempo total de operación y el desgaste mecánico adicional sobre un disco que ya está fallando:

    sudo ddrescue -d /dev/sdb1 /home/usuario/datos_rescatados /home/usuario/rescate_datos.log

    Buenas prácticas para este tipo de rescate

    • El archivo de log de ddrescue es crítico: si el proceso se interrumpe (corte de luz, reinicio), volver a ejecutar el mismo comando con el mismo archivo de log retoma exactamente donde quedó, sin repetir sectores ya copiados.
    • Nunca trabajar directamente sobre el disco dañado para tareas que no sean estrictamente el rescate — cada lectura adicional es una oportunidad más de que un sector marginal termine de fallar.
    • Priorizar la opción selectiva cuando se sabe exactamente qué datos importan, en vez de clonar el disco completo — menos tiempo de disco encendido, menos riesgo.
    • La temperatura ayuda pero no cura: es una medida para ganar tiempo durante el rescate, no una solución — el disco debe reemplazarse sin importar cuánto se estabilicen los números tras enfriarlo.