Capítulo 10. Gestión de información

# Capítulo 10. Gestión de información

Se describen las herramientas y operaciones para la gestión de información en formato binarios y texto.

## 10.1. Compartición, copia y archivo

| Aviso
El acceso de escritura sin coordinación a los dispositivos disponibles y a los archivos desde varios procesos no debe realizarse sin evitar la condición de carrera. Para evitarla se puede utilizar el mecanismo de bloqueo del archivo (file locking) flock(1).

La seguridad de la información y el control de su compartición tiene varios aspectos.

- La creación de un repositorio de información

- El acceso al almacenamiento remoto

- La duplicación

- El seguimiento del histórico de modificaciones

- Las facilidades de la compartición de la información

- Evitar el acceso no autorizado a archivos

- La detección de modificaciones no autorizadas de archivos

Esto se puede llevar a cabo por la combinación de algunas herramientas.

- Herramientas de repositorios y compresión

- Herramientas de sincronización y copia

- Sistemas de archivos en red

- Medios de almacenamiento extraíbles

- El intérprete de órdenes seguro

- El sistema de autenticación

- Herramientas de sistemas de control de versiones

- Herramientas de criptográficas de cifrado y resumen

### 10.1.1. Herramientas de repositorios y compresión

Aquí esta un resumen de las herramientas de repositorio y compresión disponibles en un sistema Debian.

Tabla 10.1. Relación de las herramientas de repositorios y compresión

paquete | popularidad | tamaño | extensión | orden | comentario
--- | --- | --- | --- | --- | ---
`tar` | V:908, I:1000 | 3085 | `.tar` | tar(1) | herramienta estándar del archivo (predeterminada)
`cpio` | V:352, I:999 | 1201 | `.cpio` | cpio(1) | Archivador estilo Unix System V, utilizado con find(1)
`binutils` | V:190, I:640 | 1119 | `.ar` | ar(1) | archivador para la creación de bibliotecas estáticas
`fastjar` | V:1.0, I:9.6 | 182 | `.jar` | fastjar(1) | archivador para Java (similar a zip)
`pax` | V:5.5, I:9.6 | 167 | `.pax` | pax(1) | nuevo archivador estándar POSIX, comprometido entre `tar` y `cpio`
`gzip` | V:904, I:1000 | 256 | `.gz` | gzip(1), zcat(1), … | Utilidad de compresión GNU LZ77 (estándar de facto)
`bzip2` | V:163, I:972 | 113 | `.bz2` | bzip2(1), bzcat(1), … | La utilidad de compresión por ordenamiento de bloques Burrows-Wheeler tiene el índice de compresión mayor que gzip(1) (más lento que `gzip` con una sintaxis similar)
`lzma` | V:1, I:10 | 349 | `.lzma` | lzma(1) | Utilidad de compresión LZMA con mayor ratio de compresión que gzip(1) (obsoleto)
`xz-utils` | V:318, I:982 | 1520 | `.xz` | xz(1), xzdec(1), … | La utilidad de compresión XZ tiene un índice de compresión mayor que bzip2(1) (más lento que `gzip` pero más rápido que `bzip2`; es el sustituyo del la utilidad de compresión LZMA)
`zstd` | V:318, I:803 | 2309 | `.zstd` | zstd(1), zstdcat(1), … | Utilidad de compresión rápida sin pérdidas Zstandard
`p7zip` | V:6, I:198 | 8 | `.7z` | 7zr(1), p7zip(1) | 7-Zip archivador de archivos con alto índice de compresión (compresión LZMA).
`p7zip-full` | V:20, I:222 | 12 | `.7z` | 7z(1), 7za(1) | 7-Zip archivador de archivos con alto ratio de compresión (compresión LZMA y otros).
`lzop` | V:12, I:134 | 164 | `.lzo` | lzop(1) | La utilidad de compresión LZO tiene una velocidad de compresión y descompresión más alta que gzip(1) (menor índice de compresión que `gzip` con una sintaxis parecida)
`zip` | V:49, I:361 | 627 | `.zip` | zip(1) | InfoZIP: herramienta de archivo y compresión DOS
`unzip` | V:110, I:749 | 387 | `.zip` | unzip(1) | InfoZIP: herramienta de desarchivo y descompresión DOS

| Aviso
No asigne la variable «`$TAPE`» a menos que sepa sus consecuencias. Esta cambia el comportamiento tar(1).

- Cuando se realiza una compresión gzip de un archivo tar(1) se utiliza la extensión de archivo «`.tgz`» o «`.tar.gz`».

- La compresión xz de un archivo tar(1) utiliza la extensión de archivo «`.txz`» o «`.tar.xz`».

- Los métodos de compresión más populares entre las herramientas FOSS como tar(1) ha evolucionado como se muestra: `gzip` → `bzip2` → `xz`

- cp(1), scp(1) y tar(1) puede tener alguna limitación con archivos especiales. Cpio(1) es más versátil.

- cpio(1) esta diseñado para ser utilizado con find(1) y otras órdenes y archivos de órdenes para la creación de copias de respaldo ya que la parte de selección de archivo del archivo de órdenes puede ser probado de forma independiente.

- La estructura interna de los archivos de información de Libreoffice son archivos «`.jar`» los cuales pueden incluso abrirse con `unzip`.

- La herramienta de archivo multiplataforma de facto es `zip`. Para conseguir la máxima compatibilidad utilícela mediante «`zip -rX`». Si el tamaño del fichero es importante añada también la opción «`-s`».

### 10.1.2. Herramientas de sincronización y copia

Aquí hay un resumen de las herramientas de copia y respaldo disponibles en el sistema Debian.

Tabla 10.2. Relación de las herramientas de copia y sincronización

paquete | popularidad | tamaño | herramienta | función
--- | --- | --- | --- | ---
`coreutils` | V:911, I:1000 | 17994 | GNU cp | copia archivos y directorios localmente («-a« para hacerlo recursivo)
`openssh-client` | V:915, I:996 | 4210 | scp | copia archivos y directorios de forma remota (cliente, `-r`» para hacerlo recursivo)
`openssh-server` | V:768, I:819 | 3359 | sshd | copia archivos y directorios de forma remota (servidor remoto)
`rsync` | V:195, I:541 | 835 |  | sincronización y respaldo remoto en un sentido
`unison` | V:3, I:12 | 14 |  | sincronización y respaldo remoto en dos direcciones

La copia de archivos con rsync(8) aporta muchas más funcionalidades que otros.

- el algoritmo de transferencia delta envía únicamente las diferencias entre los archivos de origen y los archivos que hay en el destino

- el algoritmo de comprobación rápido (quick check algorithm) (por omisión) busca los archivos que han cambiado su tamaño o su fecha de última modificación

- las opciones «`--exclude`» y «`--exclude-from`» son parecidas a las de tar(1)

- la sintáxis de «una barra «/« en el directorio origen« evita la creación de un nivel de directorios adicional en el destino

| Sugerencia
Las herramientas de sistemas de control de versiones (VCS) en Tabla 10.14, “Lista de otras herramientas del sistema del control de las versiones” pueden operar como herramientas de sincronización y copia en múltiples sentidos.

### 10.1.3. Formas de archivado

Aquí están algunas formas de archivar y desarchivar el contenido entero de un directorio «`./origen`» utilizando diferentes herramientas.

GNU tar(1):

    $ tar -cvJf archive.tar.xz ./source
    $ tar -xvJf archive.tar.xz

Otra forma es como se muestra.

    $ find ./source -xdev -print0 | tar -cvJf archive.tar.xz --null -T -

cpio(1):

    $ find ./source -xdev -print0 | cpio -ov --null > archive.cpio; xz archive.cpio
    $ zcat archive.cpio.xz | cpio -i

### 10.1.4. Formas de copia

Aquí hay diferentes maneras de copiar el contenido completo de un directorio «`./source`» utilizando diferentes herramientas.

- Copia local: directorio «`./origen`» → directorio «`/destino`»

- Copia remota: directorio «`./origen`» en el equipo local → directorio «`/destino`» en el equipo «`usuario@equipo.dom`»

rsync(8):

    # cd ./source; rsync -aHAXSv . /dest
    # cd ./source; rsync -aHAXSv . user@host.dom:/dest

Puede utilizar la sintaxis de «barra «/« en el directorio origen«.

    # rsync -aHAXSv ./source/ /dest
    # rsync -aHAXSv ./source/ user@host.dom:/dest

Otra forma es como se muestra.

    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
    # cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

cp(1) de GNU y scp(1) de openSSH:

    # cd ./source; cp -a . /dest
    # cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1):

    # (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
    # (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

cpio(1):

    # cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

Puede sustituir «`.`» por «`foo`» para todos los ejemplos que contienen «`.`» para copiar archivos desde el directorio «`./origen/foo`» al directorio «`/destino/foo`».

Puede sustituir «`.`» por la ruta absoluta «`/ruta/al/origen/foo`» para todos los ejemplos que contienen «`.`» para eliminar «`cd ./source;`». La copia de estos archivos a diferentes ubicaciones depende de las herramientas utilizadas como se muestra.

- «`/destino/foo`»: rsync(8), GNU cp(1) y scp(1)

- «`/destino/ruta/al/origen/foo`»: GNU tar(1) y cpio(1)

| Sugerencia
Rsync(8) y GNU cp(1) tiene la opción «`-u`» para no tener en cuenta los archivos que son más nuevos que los recibidos.

### 10.1.5. Formas de selección de archivos

La orden find(1) se utiliza para la selección de archivos en combinación con las órdenes de archivado y copia (consulte Sección 10.1.3, “Formas de archivado” y Sección 10.1.4, “Formas de copia”) o por xargs(1) (ver Sección 9.4.9, “Repetición de una orden sobre archivos”). Esto se puede mejorar con la utilización de los parámetros de la orden.

La sintaxis básica de find(1) se puede resumir en lo que se muestra.

- los parámetros condicionales son evaluados de izquierda a derecha

- Esta evaluación se para una vez que se ha determinado la salida.

- El «OR lógico« (que se escribe «`-o`» entre condiciones) tiene menor precedencia que el «AND lógico« (que se escribe «`-a`» o vacio entre condiciones).

- El «NOT lógico« (que se escribe «`!`» antes de la condición) tiene mayor precedencia que el «AND lógico«.

- La expresión «`-prune`» devuelve siempre un TRUE lógico y, si es un directorio, la búsqueda del archivos se detiene al llegar a este punto.

- La expresión «`-name`» encaja con los nombres de archivos con el mismo tipo de expresiones regulares que se usan en el intérprete de órdenes (glob) (ver Sección 1.5.6, “Expansión de un patrón en el intérprete de órdenes”) pero también encaja su «`.`» inicial con metacaracteres como «`*`» y «`?`». (Nueva funcionalidad de POSIX)

- La expresión «`-regex`» encaja con rutas absolutas al estilo de emacs BRE (ver Sección 1.6.2, “Expresiones regulares”) por defecto.

- La expresión «`-size`» encaja con los archivos en base a su tamaño (el valor precedido de «`+`» para mayor y precedido de «`-`» para menor)

- La expresión «`-newer`» encaja con archivos más recientes que el que consta como parámetro.

- La expresión «`-print0`» devuelve siempre un VERDADERO lógico e imprime el nombre de archivo completo (finalizado con un null) por la salida estándar..

La orden find(1) se utiliza frecuentemente con el estilo que se muestra a continuación.

    # find /path/to \
        -xdev -regextype posix-extended \
        -type f -regex ".*\.cpio|.*~" -prune -o \
        -type d -regex ".*/\.git" -prune -o \
        -type f -size +99M -prune -o \
        -type f -newer /path/to/timestamp -print0

Lo que se traduce en las acciones siguientes.

1. Busca todo los archivos que comienzan con «`/ruta/a`»

2. Limita la búsqueda globalmente al comienzo de su sistema de archivos y en su lugar utiliza ERE (ver Sección 1.6.2, “Expresiones regulares”)

3. Excluye los archivos que encajan con las expresiones regulares «`.*\.cpio`» o «`.*~`» de la búsqueda sin procesarlos

4. Excluye los directorios que encajan con la expresión regular de «`.*/\.git`» de la búsqueda sin procesarlas

5. Excluye los archivos cuyo tamaño es mayor de 99 Megabytes (en bytes 1048576 ) de la búsqueda sin procesarla

6. Imprime los nombres de los archivos que cumplen los criterios de búsqueda anteriores y son más nuevos que «`/path/to/timestamp`»

Por favor, tenga el cuenta la forma en que se utiliza «`-prune -o`»para excluir los archivos en los ejemplos anteriores.

| Nota
Para sistemas no Debian tipo Unix, algunas opciones de find(1) pueden no estar disponibles. En ese caso, por favor, considere ajustar los métodos de encaje y sustituya «`-print0`» con «`-print`». Puede que también necesite ajustar las órdenes parecidas.

### 10.1.6. Medios de archivo

Cuando elija los medios de almacenamiento de información para el archivo de información importante, debe tener cuidado con sus limitaciones. Para el respaldo de pequeñas cantidades de información personal, yo utilizo CD-R y DVD-R de una compañía conocida y los almaceno en un lugar fresco, sin luz, seco y limpio. (El medio de archivo en cinta parece una opción común en entornos profesionales).

| Nota
Un lugar resistente al fuego tiene sentido para documentos en papel. La mayor parte de los medios de almacenamiento de información tienen menor tolerancia a la temperatura que el papel. Yo normalmente mantengo almacenadas varias copias cifradas en diferentes ubicaciones seguras.

Tiempo de vida optimista de los medios de archivo (la mayor parte proveniente de los proveedores del medio).

- Más de 100 años: papel libre de ácido con tinta

- 100 años : almacenamiento óptico (CD/DVD, CD/DVD-R)

- 30 años: almacenamiento magnético (cinta, disquete)

- 20 años: almacenamiento óptico con cambio de fase (CD-RW)

Esto no tiene en cuenta los errores mecánicos debido al manejo etc.

Ciclo de escritura de medios de archivos optimista visto en internet (proveniente de la información aportada por el vendedor).

- Más de 250,000 ciclos : discos duros

- Más de 10,000 ciclos : memoria flash

- 1,000 ciclos : CD/DVD-RW

- 1 ciclo : CD/DVD-R, papel

| Atención
Los datos que vida de los medios de almacenamiento y de los ciclos de escritura que hemos comentado no se deben tener en cuenta para la toma de decisiones sobre almacenamiento de datos críticos. Por favor, consulte la información especifica del producto que proporciona el fabricante.

| Sugerencia
Ya que los CD/DVD-R y el papel tienen únicamente un ciclo de escritura, impide de informa intrínseca la pérdida de datos por sobreescritura. ¡Esto es una ventaja!

| Sugerencia
Si necesita copias de respaldo rápidas, frecuentes y de grandes cantidades de información, un disco duro en un equipo remoto con una conexión de red rápida, puede ser la única opción real.

| Sugerencia
Si usas medios regrabables para tus copias de seguridad, usa un sistema de archivos como btrfs o zfs que admite solo la lectura de las instantáneas pueden ser una buena idea.

### 10.1.7. Dispositivos de almacenamiento extraíbles

Los dispositivos de almacenamiento extraíbles pueden ser cualquiera de los siguientes.

- dispositivo USB flash

- disco duro

- disco óptico

- Cámara digital

- reproductor digital de música

Se pueden conectar de las siguientes maneras.

- USB

- IEEE 1394 / FireWire

- PC Card

Los entornos de escritorio modernos como GNOME y KDE pueden montar automáticamente estos dispositivos extraíbles sin su entrada correspondiente en «`/etc/fstab`».

- El paquete `udisks2` proporciona un daemon (servicio) y utilidades asociadas para montar y desmontar estos dispositivos.

- D-bus crea los actos para iniciar automáticamente dicho proceso.

- PolicyKit aporta los permisos necesarios.

| Sugerencia
Los dispositivos que se montan de forma automática pueden tener la opción de montaje «`uhelper=`» que lo utiliza umount(8).

| Sugerencia
En los entornos de escritorio modernos el automontaje ocurre únicamente cuando el dispositivo no posee una entrada en «`/etc/fstab`».

El punto de montaje en el entorno de escritorio moderno se elige como "`/media/username/disk_label`" que se puede personalizar de la siguiente manera.

- mlabel(1) para el sistema de archivos FAT

- genisoimage(1) con la opción «`-V`» para el sistema de archivos ISO9660

- tune2fs(1) con la opción «`-L`» para los sistemas de archivos ext2/ext3/ext4

| Sugerencia
Puede que necesite dar el tipo de codificación como una opción a la hora del montaje (ver Sección 8.1.3, “Codificación del nombre de archivo”).

| Sugerencia
Si utiliza el menú del interfaz gráfico de usuario para desmontar un sistema de archivos puede eliminar su nodo de dispositivo generado dinámicamente como «`/dev/sdc`». Si quiere mantener el node del dispositivo, desmóntelo con la orden umount(8) desde el cursor del intérprete de órdenes.

### 10.1.8. Selección del sistema de archivos para compartir datos

Cuando comparte información con otro sistema por medio de un dispositivo de almacenamiento extraíble, podría formatearlo en un sistema de archivos que tenga soporte en ambos sistemas. Aquí esta una relación de posibles candidatos.

| Nota
Statements on hard disk (HDD) are applicable to other storage devices such as SSD / USB flash drive / Memory card / ... . Replace device names in examples such as `/dev/sda` with applicable device names `/dev/nvme0`, `/dev/mmcblk0`, ... .

Tabla 10.3. Relación de posibles sistemas de archivos para dispositivos de almacenamiento extraíbles con sus casos de uso normales

nombre del sistema de archivos | escenario típico de uso
--- | ---
FAT12 | compartición de información entre diferentes plataformas mediante disquete (<32MiB)
FAT16 | compartición de información entre plataformas con el uso de dispositivos como pequeños discos duros (<2GiB)
FAT32 | compartición de información entre plaaformas mediante dispositivos como un gran disco duro (<8TiB, soportados por MS Windows95 OSR2 y posteriores)
exFAT | Intercambio de datos multiplataforma en dispositivos de disco duro grandes (<512TiB, compatible con Windows XP, Mac OS X Snow Leopard 10.6.5 y Linux kernel versión 5.4 y superior)
NTFS | compartición de información entre plataformas mediante un dispositivo como un gran disco duro (soporte nativo en MS Windows NT y versiones posteriores y soportado porNTFS-3G por medio de FUSE en Linux)
ISO9660 | compartición de información entre plataformas de datos no volátiles en CD-R y DVD+/-R
UDF | escritura incremental de información en CD-R y DVD+/+R (nuevo)
MINIX | almacenamiento de información en archivos unix eficiente en disquete
ext2 | almacenamiento de información en dispositivos como discos duro para sistemas Linux antiguos
ext3 | almacenamiento de información en dispositivos como discos duro para sistemas Linux antiguos
ext4 | compartición de datos en un dispositivo como un disco duro para sistemas Linux actuales
btrfs | uso compartido de datos en el disco duro como dispositivo con sistemas Linux actuales con instantáneas de solo lectura

| Sugerencia
Consulte Sección 9.9.1, “Cifrado de discos externos con dm-crypt/LUKS” para la compartición de información entre plataformas utilizando cifrado a nivel de dispositivo.

El sistema de archivos FAT esta soportado por casi todos los sistemas operativos modernos y es bastante útil para el intercambio de información por medio de un disco duro externo.

Cuando se formatea un disco duro externo con el sistemas de archivos FAT para compartir información entre diferentes plataformas, lo siguiente podrían ser las opciones más seguras.

- Se particiona con fdisk(8), cfdisk(8) o parted(8) (ver Sección 9.6.2, “Configuración del particionado de disco”) en una única partición primaria y la marcamos como se muestra.

  - Tipo «6« para FAT15 para dispositivos menores de 2 GB.

  - Tipo «c« para FAT32 (LBA) para dispositivos grandes.

- Formateemos la partición primaria con mkfs.vfat(8) como se muestra.

  - Si el nombre del dispositivo fuera, p. ej. «`/dev/sda1`» para FAT16

  - La opción explícita para FAT32 y su nombre de dispositivo, p.ej. «`-F 32 /dev/sda1`»

Cuando se utiliza el sistema de archivos FAT o ISO9660 para compartir los datos, los siguientes son los problemas de seguridad a los que se debe prestar atención.

- El archivo de archivos se recomienda utilizar primero tar(1), o cpio(1) par mantener los nombres de archivos largos, los enlaces blandos, los permisos originales de Unix y la información del propietario.

- Para protegerlo de las limitaciones de tamaño divida el archivo en trozos menores de 2GiB con la orden split(1).

- Cifre el archivo para asegurar que no existirán accesos no autorizados.

| Nota
En sistemas de archivos FAT debido a su diseño, el tamaño máximo de un archivo es `(2^32 - 1) bytes = (4GiB - 1 byte)`. Para algunas aplicaciones antiguas en SSOO de 32 bits, el tamaño máximo de archivo es todavía menor `(2^31 - 1) bytes = (2GiB - 1 byte)`. Debian no tiene este último problema.

| Nota
La propia compañía Microsoft no recomienda el uso de FAT para dispositivos o particiones menores de 200 MB. Microsoft resalta en su «Visión de conjunto de los sistemas de archivos FAT, HPFS y NTFS« su uso ineficiente del espacio de disco. Sin duda en Linux habitualmente usaremos el sistema de archivos ext4.

| Sugerencia
Para más información acerca de sistemas de archivos y su uso, por favor lea «Cómo Sistemas de Archivos«.

### 10.1.9. Compartir información a través de la red

Para compartir información con otros sistemas a través de internet, debería utilizar un servicio común. He aquí algunas pistas.

Tabla 10.4. Relación de los servicios de red disponibles con el escenario típico de utilización

servicio de red | descripción del caso de uso normal
--- | ---
SMB/CIFS sistema de archivos en red montado con Samba | compartición de archivos por medio de«Microsoft Windows Network«, consulte smb.conf(5) y Cómo Oficial y Guía de Referencia de 3.x.x o el paquete `samba-doc`
Sistema de archivos montado NFS con el núcleo de Linux | compartir archivos mediante una «Red Unix/Linux«, ver exports(5) y Linux NFS-HOWTO
servicio HTTP | compartiendo archivos entre cliente/servidor web
servicio HTTPS | compartiendo archivos entre servidor web/cliente con cifrado con «Secure Sockets Layer« (SSL) o «Transport Layer Security« (TLS)
servicio FTP | compartiendo archivos entre servidor FTP/cliente

Aunque los sistemas de archivos montados a través de la red pueden ser útiles, estos pueden ser inseguros. Sus conexiones de red deben ser securos como se muestra.

- Cifrado con SSL/TLS

- Con túnel con SSH

- Con túnel por medio de VPN

- Limitando al área interna cubierto por un cortafuegos

Consulte además Sección 6.5, “Servidores de aplicaciones en otras redes” y Sección 6.6, “Otros clientes de aplicaciones de red”.

## 10.2. Respaldo y recuperación

Todos sabemos que los equipos fallan algunas veces o los errores humanos producen daños en el sistema o la información. Las operaciones de copia de seguridad y respaldo son una parte esencial de la administración de sistemas. Todos los errores posible ocurrirán alguna vez.

| Sugerencia
Mantenga su sistema de respaldo simple y cree copias de seguridad con frecuencia. El hecho de tener copias de seguridad de la información es más importante que la forma en las que las realice.

### 10.2.1. Política de respaldo y recuperación

Existen tres factores que determinan la directriz de copia de seguridad y recuperación real.

1. Saber lo qué hay que respaldar y recuperar.

   - Los archivos creados por usted: información en «`~/`»

   - Archivos de información creados por las aplicaciones que utiliza: la información en «`/var/`» (excepto «`/var/cache/`», «`/var/run/`» y «`/var/tmp/`»)

   - Archivos de configuración del sistema: información en «`/etc/`»

   - Programas locales: datos en «`/usr/local/`» o «`/opt/`»

   - Información de la instalación del sistema: un resumen en texto plano de los pasos fundamentales (particionado, ...)

   - Probar el conjunto de datos: confirmarlo mediante la ejecución de operaciones de recuperación

     - Un trabajo cron como un proceso de usuario, los archivos en el directorio «`/var/spool/cron/crontabs`» y reinicie cron(8). Ver Sección 9.4.14, “Planificación regular de tareas” para cron(8) y crontab(1).

     - Trabajos del temporizador del sistema como procesos de usuario: archivos en el directorio "`~/.config/systemd/user`". Ver systemd.timer(5) y systemd.service(5).

     - Tareas de inicio automático como procesos de usuario: archivos en el directorio "`~/.config/autostart`". Ver Desktop Application Autostart Specification.

2. Saber como respaldar y recuperar datos.

   - Seguridad de la información almacenada: protegerlo de la sobreescritura y del fallo del sistema

   - Frecuencia de respaldo: planificación del respaldo

   - Redundancia de respaldo: copias de la información

   - Proceso a prueba de fallos: una única y sencilla orden para crear la copia de respaldo

3. Evaluación de riesgos y costes implícitos.

   - Peligro de pérdida de datos

     - Los datos deben estar al menos en diferentes particiones del disco, preferiblemente en diferentes discos y máquinas para resistir la corrupción del sistema de archivos. Los datos importantes se almacenan mejor en un sistema de archivos de solo lectura. [4]

   - Riesgo de violación de datos

     - Datos de identidad confidenciales, como "`/etc/ssh/ssh_host_*_key`", "`~/.gnupg/*`", "`~/.ssh/*`", "`~/.local/share/keyrings/*`", "`/etc/passwd`", "`/etc/shadow`", "`popularity-contest.conf`", "`/etc/ppp/pap-secrets`", y "`/etc/exim4/passwd.client`" se debe hacer una copia de seguridad cifrada. [5] (Ver Sección 9.9, “Trucos para cifrar información”.)

     - Nunca codifique la contraseña de inicio de sesión del sistema ni la frase de contraseña de descifrado en ningún script, incluso en cualquier sistema confiable. (Ver Sección 10.3.6, “Llavero de contraseña”.)

   - Modo de error en la recuperación y sus posibilidades

     - El hardware (especialmente el disco duro) se romperá

     - El sistema de archivos puede estar dañado y los datos que contiene pueden perderse

     - No se puede confiar en los sistemas de almacenamiento remoto para las brechas de seguridad

     - La protección de la contraseña débil puede verse fácilmente comprometida

     - El sistema de permisos de los archivos puede estar comprometido

   - Uso de recursos para el respaldo: humanos, hardware, software, …

     - Copia de seguridad automática programada con cron job o systemd timer job

| Sugerencia
Puede recuperar la información de configuración debconf con «`debconf-set-selections debconf-selections`» y la selección de información de dpkg con «`dpkg --set-selection <dpkg-selections.list`».

| Nota
No respalde el contenido de los pseudo sistemas de archivos ubicados en `/proc`, `/sys`, `/tmp` y `/run` (consulte Sección 1.2.12, “procfs y sysfs” y Sección 1.2.13, “tmpfs”). A menos que sepa exactamente que está haciendo, estas ubicaciones contienen grandes cantidades de información poco relevantes.

| Nota
Puede que quiera parar algunos demonios como MTA (ver Sección 6.2.4, “Agente de transporte de correo (Mail transport agent, MTA)”) mientras respalda su información.

### 10.2.2. Suites de utilidades de copias de seguridad

He aquí una relación de las suites de copias de seguridad más importantes en un sistema Debian.

Tabla 10.5. Relación de suites de utilidades de copias de respaldo

paquete | popularidad | tamaño | descripción
--- | --- | --- | ---
`bacula-common` | V:6.3, I:7.2 | 2501 | Bacula: copia de respaldo en red, recuperación y verificación - archivos de apoyo comunes
`bacula-client` | V:0.3, I:1.9 | 199 | Bacula: copia de seguridad en red, recuperación y verificación - metapaquete cliente
`bacula-console` | V:0.7, I:2.1 | 112 | Bacula: copia de seguridad en red, recuperación y verificación - consola de texto
`bacula-server` | I:0.60 | 199 | Bacula: copia de seguridad en red, recuperación y verificación - metapaquete del servidor
`amanda-common` | V:0.6, I:2.2 | 9851 | Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Bibliotecas)
`amanda-client` | V:0.6, I:2.2 | 1099 | Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Cliente)
`amanda-server` | V:0.11, I:0.23 | 1093 | Amanda: Archivador Automático de Discos en Red Avanzado Maryland (Servidor)
`backuppc` | V:1.4, I:1.7 | 3088 | BackupPC sistema de copia de respaldo de PCs( basado en disco) de alto rendimiento y ámbito empresarial
`duplicity` | V:6, I:47 | 2670 | respaldo incremental (remoto)
`deja-dup` | V:29, I:43 | 5274 | Interfaz gráfica de usuario para duplicity
`borgbackup` | V:13, I:28 | 3485 | copia de seguridad deduplicada (remota)
`borgmatic` | V:3.2, I:4.4 | 946 | ayudante borgbackup
`rdiff-backup` | V:2.3, I:6.6 | 1207 | respaldo incremental (remoto)
`restic` | V:6, I:12 | 41560 | respaldo incremental (remoto)
`backupninja` | V:2.2, I:2.6 | 360 | sistema meta-backup extensible y ligero
`slbackup` | V:0.11, I:0.13 | 147 | respaldo incremental (remoto)
`backup-manager` | V:0.43, I:0.77 | 573 | herramienta de copia de seguridad en línea de órdenes
`backup2l` | V:0.38, I:0.53 | 110 | herramienta para medios externos para su copia/restauración con bajo mantenimiento (basado en discos)

Las herramientas de copias de seguridad están especializadas en diferentes aspectos.

- Mondo Rescue es un sistema de copias de seguridad centrado en realizar la restauración completa de un sistema rápidamente desde una copia en CD/DVD etc. sin seguir el proceso normal de instalación del sistema.

- Bacula, Amanda, y BackupPC son suites de utilidades de copia de respaldo con funcionalidad completa centradas en la copias de seguridad regulares a través de la red.

- Duplicity, y Borg son utilidades de copia de seguridad más sencillas para estaciones de trabajo típicas.

### 10.2.3. Consejos para copias de seguridad

Para una estación de trabajo personal, las utilidades completas de la suite de copia de seguridad diseñadas para el entorno de servidor pueden no servir bien. Al mismo tiempo, las utilidades de copia de seguridad existentes para estaciones de trabajo pueden presentar algunas deficiencias.

He aquí algunos consejos para facilitar las copias de seguridad con el mínimo esfuerzo por parte del usuario. Estas técnicas pueden utilizarse con cualquier utilidad de copia de seguridad.

Con propósito demostrativo, vamos a suponer que el usuario principal y el nombre de grupo es `pingüino` y crear un ejemplo de script de copia de seguridad e instantánea "`/usr/local/bin/bkss.sh`" como:

    #!/bin/sh -e
    SRC="$1" # source data path
    DSTFS="$2" # backup destination filesystem path
    DSTSV="$3" # backup destination subvolume name
    DSTSS="${DSTFS}/${DSTSV}-snapshot" # snapshot destination path
    if [ "$(stat -f -c %T "$DSTFS")" != "btrfs" ]; then
      echo "E: $DESTFS needs to be formatted to btrfs" >&2 ; exit 1
    fi
    MSGID=$(notify-send -p "bkup.sh $DSTSV" "in progress ...")
    if [ ! -d "$DSTFS/$DSTSV" ]; then
      btrfs subvolume create "$DSTFS/$DSTSV"
      mkdir -p "$DSTSS"
    fi
    rsync -aHxS --delete --mkpath "${SRC}/" "${DSTFS}/${DSTSV}"
    btrfs subvolume snapshot -r "${DSTFS}/${DSTSV}" ${DSTSS}/$(date -u --iso=min)
    notify-send -r "$MSGID" "bkup.sh $DSTSV" "finished!"

Aquí, sólo se utiliza la herramienta básica rsync(1) para facilitar la copia de seguridad del sistema y el espacio de almacenamiento lo utiliza eficientemente Btrfs.

| Sugerencia
Para su información: Este autor utiliza su propio script de shell similar "bss: Btrfs Subvolume Snapshot Utility" para su estación de trabajo.

#### 10.2.3.1. Copia de seguridad de la GUI

A continuación se muestra un ejemplo para configurar la copia de seguridad con un solo clic de GUI.

- Prepare un dispositivo de almacenamiento USB para utilizarlo como copia de seguridad.

  - Formatea un dispositivo de almacenamiento USB con una partición en btrfs con su nombre de etiqueta como "`BKUP`". Esto se puede cifrar (ver Sección 9.9.1, “Cifrado de discos externos con dm-crypt/LUKS”).

  - Conéctalo al sistema. El sistema de escritorio debería montarlo automáticamente como "`/media/penguin/BKUP`".

  - Ejecute "`sudo chown penguin:penguin /media/penguin/BKUP`" para que el usuario pueda escribir en él.

- Crear "`~/.local/share/applications/BKUP.desktop`" siguiendo las técnicas escritas en Sección 9.4.10, “Iniciar un programa desde el interfaz gráfico de usuario” como:

      [Desktop Entry]
      Name=bkss
      Comment=Backup and snapshot of ~/Documents
      Exec=/usr/local/bin/bkss.sh /home/penguin/Documents /media/penguin/BKUP Documents
      Type=Application

Por cada clic en la GUI, se realiza una copia de seguridad de sus datos desde "`~/Documents`" a un dispositivo de almacenamiento USB y se crea una instantánea de sólo lectura.

#### 10.2.3.2. Montar la copia de seguridad activada por el acto

A continuación se muestra un ejemplo de configuración para la copia de seguridad automática activada por el hecho de montar.

- Prepara un dispositivo de almacenamiento USB que se utilizará para la copia de seguridad como en Sección 10.2.3.1, “Copia de seguridad de la GUI”.

- Crear un archivo de la unidad de servicio systemd "`~/.config/systemd/user/back-BKUP.service`" como:

      [Unit]
      Description=USB Disk backup
      Requires=media-%u-BKUP.mount
      After=media-%u-BKUP.mount

      [Service]
      ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
      StandardOutput=append:%h/.cache/systemd-snap.log
      StandardError=append:%h/.cache/systemd-snap.log

      [Install]
      WantedBy=media-%u-BKUP.mount

- Habilite esta configuración de unidad systemd con lo siguiente:

       $ systemctl --user enable bkup-BKUP.service

Para cada acto de montar, se realiza una copia de seguridad de los datos desde "`~/Documents`" a un dispositivo de almacenamiento USB y se crea una instantánea de sólo lectura.

Aquí, los nombres de las unidades de montaje systemd que systemd tiene actualmente en memoria se pueden pedir al gestor de servicios del usuario que llama con "`systemctl --user list-units --type=mount`".

#### 10.2.3.3. Copia de seguridad activada por acción del temporizador

A continuación se muestra un ejemplo de configuración para la copia de seguridad automática activada por la acción del temporizador.

- Prepara un dispositivo de almacenamiento USB que se utilizará para la copia de seguridad como en Sección 10.2.3.1, “Copia de seguridad de la GUI”.

- Crear un archivo de unidad de temporizador systemd "`~/.config/systemd/user/snap-Documents.timer`" como:

      [Unit]
      Description=Run btrfs subvolume snapshot on timer
      Documentation=man:btrfs(1)

      [Timer]
      OnStartupSec=30
      OnUnitInactiveSec=900

      [Install]
      WantedBy=timers.target

- Crear un archivo de unidad de servicio systemd "`~/.config/systemd/user/snap-Documents.service`" como:

      [Unit]
      Description=Run btrfs subvolume snapshot
      Documentation=man:btrfs(1)

      [Service]
      Type=oneshot
      Nice=15
      ExecStart=/usr/local/bin/bkss.sh %h/Documents /media/%u/BKUP Documents
      IOSchedulingClass=idle
      CPUSchedulingPolicy=idle
      StandardOutput=append:%h/.cache/systemd-snap.log
      StandardError=append:%h/.cache/systemd-snap.log

- Habilite esta configuración de unidad systemd con lo siguiente:

       $ systemctl --user enable snap-Documents.timer

Para cada acción del temporizador, se realiza una copia de seguridad de sus datos desde "`~/Documents`" a un dispositivo de almacenamiento USB y se crea una instantánea de sólo lectura.

Aquí, los nombres de las unidades de usuario del temporizador systemd que systemd tiene actualmente en memoria se pueden pedir al gestor de servicios del usuario llamante con "`systemctl --user list-units --type=timer`".

Para el sistema de escritorio moderno, este enfoque systemd puede ofrecer un control más fino que los tradicionales de Unix usando at(1), cron(8), o anacron(8).

## 10.3. Infraestructura de seguridad de la información

La infraestructura de seguridad de la información es una combinación de herramientas de cifrado de datos, herramientas de resúmenes de mensajes y herramientas de firma.

Tabla 10.6. Relación de herramientas de infraestructura de seguridad de la información

paquete | popularidad | tamaño | orden | descripción
--- | --- | --- | --- | ---
`gnupg` | V:398, I:867 | 464 | gpg(1) | GNU Privacy Guard - herramienta de firma y cifrado OpenPGP
`gpgv` | V:234, I:939 | 555 | gpgv(1) | GNU Privacy Guard - herramienta de verificación de firma OpenPGP
`sq` | V:1, I:27 | 23948 | sq(1) | Sequoia-PGP - herramienta de firma y cifrado OpenPGP
`sqv` | V:416, I:487 | 1702 | sqv(1) | Sequoia-PGP - herramienta de verificación de firma OpenPGP
`paperkey` | V:1, I:13 | 58 | paperkey(1) | extracción únicamente de la información secreta sin considerar las claves secretas OpenPGP
`cryptsetup` | V:35, I:78 | 462 | cryptsetup(8), … | utilidades para dm-crypt cifrado de dispositivos de bloque compatibles con LUKS
`coreutils` | V:911, I:1000 | 17994 | md5sum(1) | crea y comprueba el resumen MD5 de un mensaje
`coreutils` | V:911, I:1000 | 17994 | sha1sum(1) | crea y comprueba el resumen SHA1 de un mensaje
`openssl` | V:847, I:996 | 2532 | `openssl`(1ssl) | crea el resumen de un mensaje con «`openssl dgst`» (OpenSSL)
`libsecret-tools` | V:1, I:11 | 45 | secret-tool(1) | almacenar y recuperar las contraseñas (CLI)
`seahorse` | V:75, I:261 | 7971 | seahorse(1) | herramienta de gestión de claves (GNOME)

Ver Sección 9.9, “Trucos para cifrar información” en dm-crypt y fscrypt que implementan una infraestructura de cifrado automático de datos a través de módulos del núcleo de Linux.

### 10.3.1. Gestión de claves con GnuPG

He aquí las órdenes GNU Privacy Guard para la gestión básica de claves.

Tabla 10.7. Relación de las órdenes GNU Privacy Guard par la gestión de claves

orden | descripción
--- | ---
`gpg --gen-key` | genera una nueva clave
`gpg --gen-revoke my_user_ID` | provoca la revocación de la clave para mi_ID_de_usuario
`gpg --edit-key user_ID` | edición interactiva de la clave, «help« para obtener ayuda
`gpg -o file --export` | export all public keys to file
`gpg -o file --export-secret-keys` | export all private key to file
`gpg --import file` | importa todas las claves desde un archivo
`gpg --send-keys user_ID` | envía la clave de un ID_de_usuario al servidor de claves
`gpg --recv-keys user_ID` | recibe claves del usuario ID_de_usuario desde el servidor de claves
`gpg --list-keys user_ID` | relación de las claves de ID_de_usuario
`gpg --list-sigs user_ID` | relación de las firmas de ID_de_usuarios
`gpg --check-sigs user_ID` | comprueba la firma de ID_de_usuario
`gpg --fingerprint user_ID` | comprueba la huella del ID_de_usuario
`gpg --refresh-keys` | actualiza el círculo de claves local

Aquí esta el significado de un código seguro.

Tabla 10.8. Relación del significado del código de confianza

código | descripción de la confianza
--- | ---
`-` | sin asignación del dueño de la confianza /no calculado todavía
`e` | cálculo de confianza fallido
`q` | falta de información suficiente para el cálculo
`n` | no confíe nunca en esta clave
`m` | confianza marginal
`f` | confianza total
`u` | confianza básica

The following generates my key "`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`".

    $ gpg --gen-key
    gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH
    ...
    GnuPG needs to construct a user ID to identify your key.

    Real name: Osamu Aoki
    Email address: osamu@debian.org
    You selected this USER-ID:
        "Osamu Aoki <osamu@debian.org>"

    Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
    ...
    public and secret key created and signed.

    pub   ed25519 2026-02-14 [SC] [expires: 2029-02-13]
          9563FC29932C409F1A77F9C1AB8A1522D8234C6A
    uid                      Osamu Aoki <osamu@debian.org>
    sub   cv25519 2026-02-14 [E] [expires: 2029-02-13]

Lo siguiente carga mi clave «`9563FC29932C409F1A77F9C1AB8A1522D8234C6A`» a un popular servidor de claves «`hkp://keys.gnupg.net`».

    $ gpg --keyserver hkp://keys.gnupg.net --send-keys 9563FC29932C409F1A77F9C1AB8A1522D8234C6A

Un buen servidor de claves por defecto configurado en «`~/.gnupg/gpg.conf`» (o su ubicación antigua «`~/.gnupg/options`») contiene lo siguiente.

    keyserver hkp://keys.gnupg.net

Lo siguiente obtiene las claves desconocidas del servidor de claves.

    $ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
              cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

Existió un error en el Servidor de Claves Públicas OpenPGP (pre versión 0.9.6) el cual corrompía las claves con más de dos subclaves. El nuevo paquete `gnupg` (>1.2.1-2) pueden gestionar estas subclaves corruptas. Consulte gpg(1) bajo la opción «`--repair-pks-subkey-bug`».

Use of SHA-1 for hash has been deprecated. If your old RSA based openPGP key uses SHA-1 for hash, fix it using FixKeyWithSha1.

| Sugerencia
The sq(1) and sqv(1) commands are an alternative set of openPGP commands. See sq user documentation and A Practical Introduction to using sq, Sequoia PGP’s CLI.

### 10.3.2. Usando GnuPG en archivos

Aquí están los ejemplos de utilización de las órdenes GNU Privacy Guard sobre archivos.

Tabla 10.9. Relación de órdenes GNU Privacy Guard sobre archivos

orden | descripción
--- | ---
`gpg -a -s file` | archivo de firma en ASCII del archivo.asc blindado
`gpg --armor --sign file` | , ,
`gpg --clearsign file` | mensaje sin firmar
`gpg --clearsign file|mail foo@example.org` | envía un mensaje de correo sin firmar a `foo@example.org`
`gpg --clearsign --not-dash-escaped patchfile` | parche sin firmar
`gpg --verify file` | comprueba un archivo sin firmar
`gpg -o file.sig -b file` | crea un firma objetivo
`gpg -o file.sig --detach-sign file` | , ,
`gpg --verify file.sig file` | comprueba el archivo con archivo.sig
`gpg -o crypt_file.gpg -r name -e file` | intento de cifrado con clave pública para el nombre del archivo al arhivo binario archivo_cifrado.gpg
`gpg -o crypt_file.gpg --recipient name --encrypt file` | , ,
`gpg -o crypt_file.asc -a -r name -e file` | intento de cifrado con clave pública para el nombre del archivo al archivo blindado ASCII archivo_cifrado.asc
`gpg -o crypt_file.gpg -c file` | cifrado simétrico de archivo a archivo_cifrado_gpg
`gpg -o crypt_file.gpg --symmetric file` | , ,
`gpg -o crypt_file.asc -a -c file` | intento del cifrado simétrico para el nombre desde el archivo fuente al archivo blindado en ASCII archivo_cifrado.asc
`gpg -o file -d crypt_file.gpg -r name` | Descifrado
`gpg -o file --decrypt crypt_file.gpg` | , ,

### 10.3.3. Uso de Mutt con GnuPG

Añada lo siguiente a «`~/.muttrc`» para mantener el lento el inicio automático de GnuPG, mientras permite usarlo pulsado «`S`» del menú principal.

    macro index S ":toggle pgp_verify_sig\n"
    set pgp_verify_sig=no

### 10.3.4. Utilizando Vim con GnuPG

El plugin `gnupg` permite ejecutar GnuPG de forma transparente para los archivos con extensiones "`.gpg`", "`.asc`", y "`.pgp`".[6]

    $ sudo aptitude install vim-scripts
    $ echo "packadd! gnupg" >> ~/.vim/vimrc

### 10.3.5. El resumen MD5

md5sum(1) proporciona la funcionalidad de hacer resúmenes de un archivo utilizando el método descrito en rfc1321 y verificar cada archivo con él.

    $ md5sum foo bar >baz.md5
    $ cat baz.md5
    d3b07384d113edec49eaa6238ad5ff00  foo
    c157a79031e1c40f85931829bc5fc552  bar
    $ md5sum -c baz.md5
    foo: OK
    bar: OK

| Nota
La computación de la suma MD5 es menos intensiva en CPU que la de firma criptográfica de GNU Privacy Guard (GnuPG). Normalmente, solo los archivos resumen de alto nivel están firmados criptologicamente para asegurar la integridad de la información.

### 10.3.6. Llavero de contraseña

En el sistema GNOME, la herramienta GUI seahorse(1) gestiona las contraseñas y las almacena de forma segura en el llavero `~/.local/share/keyrings/*`.

secret-tool(1) puede almacenar la contraseña en el llavero desde la línea de comandos.

Almacenemos la frase de la contraseña utilizada para la imagen del disco encriptada LUKS/dm-crypt

    $ secret-tool store --label='LUKS passphrase for disk.img' LUKS my_disk.img
    Password: ********

Esta contraseña almacenada puede ser recuperada y cedida a otros programas, por ejemplo, cryptsetup(8).

    $ secret-tool lookup LUKS my_disk.img | \
      cryptsetup open disk.img disk_img --type luks --keyring -
    $ sudo mount /dev/mapper/disk_img /mnt

| Sugerencia
Siempre que necesites dar una contraseña en un script, utiliza `secret-tool` y evita codificar directamente la frase de la contraseña en él..

## 10.4. Herramientas para mezclar código fuente

Existen múltiples herramientas para el código fuente. Las siguientes órdenes llamaron mi atención.

Tabla 10.10. Relación de las herramientas para mezclar código fuente

paquete | popularidad | tamaño | orden | descripción
--- | --- | --- | --- | ---
`patch` | V:103, I:726 | 242 | patch(1) | aplica un archivo diff al original
`vim` | V:85, I:347 | 4135 | vimdiff(1) | compare dos archivos en vim uno contra otro
`imediff` | V:0.03, I:0.26 | 329 | imediff(1) | herramienta interactiva de fusión 2/3 a pantalla completa
`meld` | V:5, I:24 | 3992 | meld(1) | compara y mezcla archivos (GTK)
`wiggle` | V:0.01, I:0.12 | 175 | wiggle(1) | aplica parches rechazados
`diffutils` | V:896, I:998 | 1768 | diff(1) | compara archivos línea a línea
`diffutils` | V:896, I:998 | 1768 | diff3(1) | compara y mezcla tres archivos línea a línea
`quilt` | V:2, I:17 | 880 | quilt(1) | gestiona un conjunto de parches
`wdiff` | V:6, I:40 | 651 | wdiff(1) | muestra las palabras diferentes en dos archivos de textos
`diffstat` | V:9, I:98 | 79 | diffstat(1) | produce un histograma de los cambios de diff
`patchutils` | V:11, I:97 | 269 | combinediff(1) | crea un parche acumulativo con dos parches incrementales
`patchutils` | V:11, I:97 | 269 | dehtmldiff(1) | extrae un diff de un página HTML
`patchutils` | V:11, I:97 | 269 | filterdiff(1) | extrae o excluye diffs de un archivo diff
`patchutils` | V:11, I:97 | 269 | fixcvsdiff(1) | repara archivos diff creados por CVS que son malinterpretados por patch(1)
`patchutils` | V:11, I:97 | 269 | flipdiff(1) | intercambia el orden de dos parches
`patchutils` | V:11, I:97 | 269 | grepdiff(1) | muestra que archivos son modificados por un parche de acuerdo a una expresión regular
`patchutils` | V:11, I:97 | 269 | interdiff(1) | muestra las diferencias entre dos archivos diff unificados
`patchutils` | V:11, I:97 | 269 | lsdiff(1) | muestra los archivos modificados por un parche
`patchutils` | V:11, I:97 | 269 | recountdiff(1) | recalcula las cuentas y desplazamientos en un contexto diff unificado
`patchutils` | V:11, I:97 | 269 | rediff(1) | repara los desplazamientos y cuentas en un diff editado de forma manual
`patchutils` | V:11, I:97 | 269 | splitdiff(1) | selecciona parches incrementales
`patchutils` | V:11, I:97 | 269 | unwrapdiff(1) | deshace los parches que han sido mezclados
`dirdiff` | V:0.1, I:1.4 | 167 | dirdiff(1) | muestra las diferencias y mezcla los cambios entre árboles de directorio
`docdiff` | V:0.03, I:0.25 | 554 | docdiff(1) | compara dos archivos palabra a palabra / carácter a carácter
`makepatch` | V:0.02, I:0.16 | 99 | makepatch(1) | genera archivos de parches extendidos
`makepatch` | V:0.02, I:0.16 | 99 | applypatch(1) | aplica archivos de parches extendidos

### 10.4.1. extrae las diferencias entre dos archivos fuente

Los procedimientos siguientes extraen las diferencias entre dos archivos de código fuente y crea los archivos diff unificados «`archivo.patch0`» o «`archivo.patch1`» dependiendo de la ubicación del archivo.

    $ diff -u file.old file.new > file.patch0
    $ diff -u old/file new/file > file.patch1

### 10.4.2. Mezcla actualizaciones del archivos de código fuente

Un archivo diff (también llamado un parche o un archivo de parche) se utiliza para enviar una actualización de un programa. Quien lo recibe aplica esta actualización a otro archivo como se muestra.

    $ patch -p0 file < file.patch0
    $ patch -p1 file < file.patch1

### 10.4.3. Integración interactiva

Si tienes dos versiones de un código fuente, puede realizar la fusión bidireccional de forma interactiva utilizando imediff(1) de la siguiente forma.

    $ imediff -o file.merged file.old file.new

Si tiene tres versiones de un código fuente, puede realizar la fusión a tres bandas de forma interactiva utilizando imediff(1) de la siguiente forma.

    $ imediff -o file.merged file.yours file.base file.theirs

## 10.5. Git

Git es la herramienta de elección en estos días para el sistema de control de versiones (VCS) ya que Git puede hacerlo todo tanto para la gestión local como remota del código fuente.

Debian proporciona servicios Git gratuitos a través de Servicio Debian Salsa. Su documentación puede encontrarse en https://wiki.debian.org/Salsa .

Aquí hay algunos paquetes relacionados con Git.

Tabla 10.11. Relación de paquetes y órdenes relacionados con git

paquete | popularidad | tamaño | orden | descripción
--- | --- | --- | --- | ---
`git` | V:406, I:616 | 50972 | git(7) | Git, el sistema de control de versiones rápido, escalable y distribuido
`gitk` | V:4, I:27 | 2022 | gitk(1) | Navegador de repositorios Git GUI con históricos
`qgit` | V:0.2, I:2.0 | 1431 | qgit(1) | Navegador de repositorios Git GUI con históricos
`git-cola` | V:0.7, I:4.6 | 5005 | git-cola(1) | Navegador de repositorios Git GUI con históricos
`tig` | V:2, I:12 | 1243 | tig(1) | console Git repository browser with history
`lazygit` | V:0.9, I:3.6 | 24167 | lazygit(1) | console Git repository browser with history
`git-gui` | V:1, I:17 | 2525 | git-gui(1) | GUI para Git (sin históricos)
`git-email` | V:0.4, I:9.8 | 1204 | git-send-email(1) | Git envía un conjunto de parches como un correo
`git-buildpackage` | V:1.2, I:7.1 | 2027 | git-buildpackage(1) | automatiza la creación de paquetes Debian con Git
`dgit` | V:0.2, I:1.0 | 738 | dgit(1) | interoperabilidad de git con el archivo de Debian
`imediff` | V:0.03, I:0.26 | 329 | git-ime(1) | herramienta de ayuda interactiva para confirmaciones de git separadas
`stgit` | V:0.08, I:0.50 | 6181 | stg(1) | quilt sobre git (Python)
`git-doc` | I:11 | 14896 | N/A | documentación oficial de Git
`gitmagic` | I:0.52 | 721 | N/A | «Git Mágico«, una guía de Git fácil de entender

### 10.5.1. Configuración del cliente Git

Puede que quiera guardar parte de la configuración global en «`~/.gitconfig`» como su nombre y la dirección de correo electrónico que utiliza Git como se muestra.

    $ git config --global user.name "Name Surname"
    $ git config --global user.email yourname@example.com

También puedes personalizar el comportamiento predeterminado de Git de la siguiente manera.

    $ git config --global init.defaultBranch main
    $ git config --global pull.rebase true
    $ git config --global push.default current

Si esta acostumbrado a utilizar órdenes Subversion o CVS, puede que quiera crear algunos alias de orden como se muestra.

    $ git config --global alias.ci "commit -a"
    $ git config --global alias.co checkout

Puede comprobar la configuración global como se muestra.

    $ git config --global --list

### 10.5.2. Comandos Git básicos

La operación Git involucra varios datos.

- El árbol de trabajo que contiene los archivos del usuario y en el que se realizan los cambios.

  - Los cambios a registrar deben ser explícitamente seleccionados y puestos en escena en el índice. Se trata de los comandos `git add` y `git rm`.

- El índice mantiene los archivos organizados.

  - Los archivos almacenados se enviarán al repositorio local en las solicitudes posteriores. Este es el comando `git commit`.

- El repositorio local mantiene los archivos confirmados.

  - Git realiza un seguimiento del historial vinculado de los datos comprometidos y lo administra como una bifurcación en el repositorio.

  - El repositorio local puede enviar datos al repositorio remoto con el comando `git push`.

  - El repositorio local puede recibir datos del repositorio remoto mediante los comandos `git fetch` y `git pull`.

    - El comando `git pull` ejecuta el comando `git merge` o `git rebase` después del comando `git fetch`.

    - Aquí, `git merge` combina los extremos de las historias de dos ramas separadas en un solo punto. (A falta de un `git pull` personalizado, este es el valor predeterminado, y también es bueno para que los autores anteriores publiquen ramas para muchas personas)

    - Aquí, `git rebase` crea una única rama del historial secuencial de la rama remota, seguida de la rama local. (Este es el caso de la personalización `pull.rebase true` y esto puede ser válido para el resto de nosotros.)

- El repositorio remoto que contiene los archivos confirmados.

  - La comunicación con el repositorio remoto utiliza protocolos de comunicación seguros como SSH o HTTPS.

El árbol de trabajo son los archivos fuera del directorio `.git/`. Los archivos dentro del directorio `.git/` contienen el índice, los datos del repositorio local y algunos archivos de texto de configuración de git.

Aquí hay una descripción general de los principales comandos de Git.

Tabla 10.12. Principales comandos de Git

Comandos Git | función
--- | ---
`git init` | crea un repositorio (local)
`git clone URL` | clonar el repositorio remoto en un repositorio local con el árbol de trabajo
`git pull origin main` | actualizar la rama local `principal` por el repositorio remoto `origen`
`git add .` | añadir archivo(s) en el árbol de trabajo al índice sólo para archivos preexistentes en el índice
`git add -A .` | añadir archivo(s) en el árbol de trabajo al índice para todos los archivos, incluidas las eliminaciones
`git rm filename` | eliminar archivo(s) del árbol de trabajo y del índice
`git commit` | confirmar los cambios por etapas en el índice al repositorio local
`git commit -a` | agrega todos los cambios en el árbol de trabajo al índice y los envía al repositorio local (agregar + confirmar)
`git push -u origin branch_name` | actualizar el repositorio remoto `origin` por la rama local `branch_name` (invocación inicial)
`git push origin branch_name` | actualizar el repositorio remoto `origin` por la rama local `branch_name` (invocación posterior)
`git diff treeish1 treeish2` | Muestra la diferencia entre la confirmación treeish1 y la confirmación treeish2
`gitk` | Visualización GUI del árbol histórico de ramas del repositorio VCS

### 10.5.3. Consejos para Git

Aquí hay algunos consejos para Git.

Tabla 10.13. Consejos para Git

Línea de comandos Git | función
--- | ---
`gitk --all` | ver el historial completo de Git y operar en ellos, como restablecer HEAD a otro compromiso, seleccionar un parche, crear etiquetas y ramas...
`git stash` | recuperar el árbol de trabajo limpio sin pérdida de datos
`git remote -v` | verifica la configuración del control remoto
`git branch -vv` | verifica la configuración de la rama del repositorio
`git status` | mostrar el estado del árbol de trabajo
`git config -l` | listar la configuración de git
`git reset --hard HEAD; git clean -x -d -f` | revertir todos los cambios en el árbol de trabajo y limpiarlos por completo
`git rm --cached filename` | revertir índice por pasos cambiado por `git add filename`
`git reflog` | obtener el registro de referencia (útil para recuperar confirmaciones de la rama eliminada)
`git branch new_branch_name HEAD@{6}` | crear una nueva rama a partir de la información de reflog
`git remote add new_remote URL` | añadir un repositorio remoto `new_remote` apuntado por URL
`git remote rename origin upstream` | cambiar el nombre del repositorio remoto de `origin` a `upstream`
`git branch -u upstream/branch_name` | establecer el seguimiento remoto en el repositorio remoto `upstream` y su nombre de rama `branch_name`.
`git remote set-url origin https://foo/bar.git` | cambiar la URL de `origin`
`git remote set-url --push upstream DISABLED` | deshabilitar pulsar para `upstream` (Editar `.git/config` para volver a habilitar)
`git remote update upstream` | Obtener actualizaciones de todas las ramas remotas en el repositorio `upstream`
`git fetch upstream foo:upstream-foo` | crear una rama local (posiblemente huérfana) `upstream-foo` como copia de la rama `foo` en el repositorio `upstream`
`git checkout -b topic_branch ; git push -u topic_branch origin` | hacer un nuevo `topic_branch` y llevarlo a `origin`
`git branch -m oldname newname` | cambiar el nombre del nombre de la sucursal local
`git push -d origin branch_to_be_removed` | eliminar una rama remota (nuevo método)
`git push origin :branch_to_be_removed` | eliminar la rama remota (método antiguo)
`git checkout --orphan unconnected` | crear una rama `desconectada` nueva
`git rebase -i origin/main` | reorder/drop/squish commits desde `origin/main` para limpiar el historial de la rama
`git reset HEAD^; git commit --amend` | squash los últimos 2 commits en uno
`git checkout topic_branch ; git merge --squash topic_branch` | squash todo `topic_branch` en un commit
`git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'` | convertir un clon superficial en un clon completo de todas las ramas
`git ime` | dividir el último commit en una serie commits de archivos por archivos más pequeños, etc. (se requiere el paquete `imediff`)
`git repack -a -d; git prune` | Vuelve a empaquetar el repositorio local en un paquete separado (esto puede limitar las oportunidades de recuperar los datos perdidos de ramas eliminadas, etc.)

| Aviso
No utilice etiquetas con caracteres blancos a pesar de que algunas herramientas permiten su utilización como gitk(1). Puede provocar errores en otras órdenes `git`.

| Atención
Si una rama local que se ha enviado a un repositorio remoto se reubica o aplasta, enviar esta rama tiene riesgos y requiere la opción `--force`. Por lo general, esto no es aceptable para la rama `main`, pero puede ser aceptable para una rama temática antes de fusionarse con la rama `main`.

| Atención
Llamar una suborden `git` directamente como «`git-xyz`» desde la línea de órdenes se ha declarado obsoleto desde principios de 2006.

| Sugerencia
Si existe un archivo ejecutable `git-foo` en la ruta determinada por `$PATH`, al escribir «`git foo`» sin guión en la línea de órdenes llama a `git-foo`. Esto es una funcionalidad de la orden `git`.

### 10.5.4. Algunas referencias sobre Git

Ver lo siguiente.

- manpage: git(1) (`/usr/share/doc/git-doc/git.html`)

- Manual de Usuario (`/usr/share/doc/git-doc/user-manual.html`)

- Un tutorial de introducción a git (`/usr/share/doc/git-doc/gittutorial.html`)

- Un tutorial inicial a git: parte dos (`/usr/share/doc/git-doc/gittutorial-2.html`)

- «20 órdenes GIT para todos los días (`/usr/share/doc/git-doc/everyday.html`)

- Git Mágico (`/usr/share/doc/gitmagic/html/index.html`)

### 10.5.5. Otros sistemas de control de versiones

Los Sistemas de control de versiones (VCS) a veces se denominan Sistemas de control de revisiones (RCS) o Administradores de configuración de software (SCM).

Aquí hay un resumen de otros VCS notables que no son Git en sistemas Debian.

Tabla 10.14. Lista de otras herramientas del sistema del control de las versiones

paquete | popularidad | tamaño | herramienta | Tipo de CVS | comentario
--- | --- | --- | --- | --- | ---
`mercurial` | V:3, I:26 | 2575 | Mercurial | distribuido | DCVS escrito en Python y algo en C
`darcs` | V:0.2, I:3.3 | 38856 | Darcs | distribuido | DCVS con notación algebraica inteligente (lento)
`tla` | V:0.04, I:0.72 | 1022 | GNU arch | distribuido | DVCS principalmente por Tom Lord (histórico)
`bzr` | V:0.1, I:4.3 | 28 | GNU Bazaar | distribuido | DVCS influenciado por `tla`, escrito en Python (historic)
`subversion` | V:10, I:57 | 4849 | Subversion | remoto | «CVS bien hecho«, nuevo estándar CVS remoto (histórico)
`cvs` | V:3, I:25 | 4835 | CVS | remoto | estándar remoto anterior VCS (histórico)
`tkcvs` | V:0.12, I:0.88 | 34 | CVS, … | remoto | Visualización GUI del árbol de repositorios VCS (CVS, Subversion, RCS)
`rcs` | V:1.7, I:9.5 | 578 | RCS | local | «Unix SCCS bien hecho« (histórico)
`cssc` | V:0.01, I:0.35 | 2044 | CSSC | local | clon de Unix SCCS (histórico)

[4] Un medio de escritura única, como CD / DVD-R, puede evitar accidentes de sobrescritura. (Ver Sección 9.8, “Datos binarios” para saber cómo escribir en el medio de almacenamiento desde la línea de comandos del shell. El entorno GUI de escritorio GNOME le brinda fácil acceso a través del menú: "Lugares→Creador de CD/DVD".)

[5] Algunos de estos datos no se pueden regenerar introduciendo la misma cadena de entrada en el sistema.

[6] Si utilizas "`~/.vimrc`" en lugar de "`~/.vim/vimrc`", sustituye lo según corresponda.

Capítulo 9. Trucos del sistema |  | Capítulo 11. Conversión de datos