Tutoriales

5 formas más rápidas de copiar archivos grandes o millones en Linux

Ha estado usando cp para copiar archivos durante años, y si desea mover una copia de seguridad de 50 GB o sincronizar un árbol de directorios a un servidor remoto, este hábito le está costando silenciosamente tiempo, visibilidad y capacidad de recuperación todos los días.

este cp El comando solo hace una cosa: copia archivos, pero no tiene indicador de progreso, límite de velocidad, soporte de recuperación ni verificación de suma de verificación incorporada.

En una copia nativa de unos pocos megabytes esto está bien, pero cuando presionas un 40GB Volcar una base de datos a través de un enlace de red o copiar 200.000 archivos pequeños a un disco nuevo requiere más que un cursor parpadeante y oraciones silenciosas.

Por qué cp no funciona bien con copias grandes

cp es un POSIX Estándar, por lo que siempre está ahí, pero está diseñado para simplificar, no para operaciones con materiales a granel. Lee el archivo y escribe secuencialmente, sin paralelismo, sin lógica incremental y sin retroalimentación al terminal.

Si el viaje se interrumpe, como por un corte de energía, tiempo de espera de SSH, accidente Ctrl+C Empiezas de nuevo completamente porque no tienes currículum.

Si está copiando a un host remoto, debe hacerlo mediante un paso separado como scp, que tiene el mismo comportamiento de todo o nada y agrega una sobrecarga de cifrado incluso si no lo necesita en una LAN confiable.

Si mueve con frecuencia grandes conjuntos de datos entre servidores y aún necesita cp, Comparte con tu equipo – Las siguientes herramientas pueden ahorrarle a alguien el tiempo de tener que hacerlo todo de nuevo a las 2 a. m.

rsync: la herramienta preferida para transferencias de archivos reanudables

rsync es la primera herramienta para aprender cp No es suficiente, ya que solo copia las diferencias entre el origen y el destino, admite la recuperación y funciona tanto localmente como a través de SSH.

Si aún no existe, instálalo:

sudo apt install rsync         [On Debian, Ubuntu and Mint]
sudo dnf install rsync         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add rsync             [On Alpine Linux]
sudo pacman -S rsync           [On Arch Linux]
sudo zypper install rsync      [On OpenSUSE]    
sudo pkg install rsync         [On FreeBSD]

este sudo El prefijo ejecuta el comando con privilegios de root, que se requiere para instalar paquetes de software. Para una copia básica de un archivo nativo, no necesita sudopero será necesario para sincronizar los directorios del sistema.

Una copia estándar del directorio local se ve así:

rsync -av --progress /source/directory/ /destination/directory/

producción:

sending incremental file list
database/
database/dump_2024.sql
    2,147,483,648 100%   98.45MB/s    0:00:20 (xfr#1, to-chk=0/2)

sent 2,147,483,909 bytes  received 35 bytes  102.24MB/s total size is 2,147,483,648

Rompe la bandera:

  • -a Habilita el modo de archivo, que conserva permisos, marcas de tiempo, enlaces simbólicos y estructuras de directorios recursivos en un solo token.
  • -v Imprima el nombre de cada archivo durante la transferencia.
  • --progress Muestra la tasa de transferencia en tiempo real y el porcentaje de cada archivo.

barra diagonal después /source/directory/ IMPORTANTE: Con una barra diagonal, rsync Copie el contenido del directorio. sin él, rsync Copia el directorio como un subdirectorio dentro del destino. Hazlo mal y terminarás con /destination/directory/directory/ En lugar de lo que esperas, este es un error común por primera vez.

Para copiar a un servidor remoto vía SSH, la sintaxis es casi la misma:

rsync -av --progress /local/path/ user@remote-ip:/remote/path/

reemplazar remote-ip Con la dirección IP de su servidor, puede encontrarlo a través de ip a.

ip a

Si la transmisión se interrumpe a mitad de camino, ejecute el mismo comando nuevamente y rsync Continúe exactamente donde lo dejó, omitiendo los archivos que se hayan transferido correctamente.

Sumérgete más profundo rsync Bien vale la pena tu tiempo. Curso SSH en Pro TecMint Cubre 54 capítulos sobre transporte basado en SSH, autenticación de claves y modo rsync remoto.

pv: agrega una barra de progreso para la transferencia de archivos

pv (Visor de tuberías) es una pequeña utilidad ubicada dentro de una tubería Unix que muestra la velocidad de transferencia, el tiempo transcurrido y la finalización estimada. no reemplazará cp o rsyncpero los envuelve.

Instálalo:

sudo apt install pv         [On Debian, Ubuntu and Mint]
sudo dnf install pv         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add pv             [On Alpine Linux]
sudo pacman -S pv           [On Arch Linux]
sudo zypper install pv      [On OpenSUSE]    
sudo pkg install pv        [On FreeBSD]

El uso más sencillo es copiar un único archivo grande con una barra de progreso instantánea:

pv /source/large-file.iso > /destination/large-file.iso

producción:

8.35GiB 0:01:22 [ 104MiB/s] [=========>          ] 63% ETA 0:00:47

Este resultado muestra exactamente qué tan rápido se escribe realmente el disco, algo que nunca se puede obtener con el hardware básico. cp. También puedes canalizar pv Compacte una vez para archivar y copiar:

pv /source/large-file.tar | gzip > /destination/large-file.tar.gz

Romper la tubería:

  • pv /source/large-file.tar Lea archivos fuente e informe el rendimiento a su terminal.
  • gzip Comprime transmisiones sobre la marcha.
  • > /destination/large-file.tar.gz Escriba la salida comprimida en el destino.

dd: Potente herramienta para clonación de discos y copias originales

dd es una herramienta de nivel inferior que se instala en todos los sistemas Linux. Lee y escribe bloques sin formato, lo que la convierte en la herramienta adecuada para clonar particiones o discos completos, crear imágenes de disco y probar el rendimiento del disco sin formato.

Riesgos y dd Los errores tipográficos en la ruta de salida pueden borrar el disco equivocado sin previo aviso, así que asegúrese de verificar el destino antes de ejecutarlo.

Una clonación típica de disco a disco se ve así:

sudo dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress

producción:

50033664512 bytes (50 GB, 47 GiB) copied, 623.847 s, 80.2 MB/s

Rompe la bandera:

  • if=/dev/sda Configure el archivo de entrada, que es el disco de origen.
  • of=/dev/sdb Configure el archivo de salida, es decir, el disco de destino, asegúrese de usar lsblk para confirmar que este es el dispositivo correcto antes de ejecutar.
  • bs=64K Establezca el tamaño del bloque en 64 KB, que es mucho más rápido que el tamaño de bloque predeterminado de 512 bytes para lecturas secuenciales grandes.
  • conv=noerror,sync Decir dd Continúe pasando los errores de lectura y rellene los bloques defectuosos con ceros en lugar de detener la copia completa.
  • status=progress Imprima el rendimiento en tiempo real cada pocos segundos, nuevo en coreutils 8.24: en sistemas más antiguos no tendrá este indicador y deberá enviar manualmente la señal USR1 para obtener informes de progreso.

advertir: dd No se requiere confirmación. si intercambias if y ofescribe el disco de origen en el destino y destruye los datos que se van a copiar.

si te ahorra dolor dd error, páselo a alguien ¿Quién es nuevo en el uso de imágenes de disco?

Paralelo + rsync: copia millones de archivos pequeños más rápido

rsync Es rápido para archivos grandes, pero cada transferencia se realiza en un solo subproceso. Cuando su directorio contiene cientos de miles de archivos pequeños (como un directorio Node.js node_modules, un spool de correo o una biblioteca de fotografías), rsync puede tardar más de lo esperado porque la sobrecarga de cada archivo excede el tiempo real de transferencia de datos.

Paralelo GNU Resuelva este problema ejecutando múltiples rsync Trabajar simultáneamente.

sudo apt install parallel         [On Debian, Ubuntu and Mint]
sudo dnf install parallel         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add parallel             [On Alpine Linux]
sudo pacman -S parallel           [On Arch Linux]
sudo zypper install parallel      [On OpenSUSE]    
sudo pkg install parallel         [On FreeBSD]

luego corre en paralelo rsync En grandes árboles de directorios:

find /source/directory -mindepth 1 -maxdepth 1 -type d | \
  parallel -j 4 rsync -a {} /destination/directory/

Romper la tubería:

  • find /source/directory -mindepth 1 -maxdepth 1 -type d Enumere los subdirectorios de fuentes de nivel superior.
  • parallel -j 4 Se ejecutan 4 trabajos rsync simultáneamente, uno para cada subdirectorio, así que ajuste -j para que coincida con el número de CPU y la velocidad del disco.
  • rsync -a {} /destination/directory/ Sincronice cada subdirectorio con el destino donde {} Reemplace con cada nombre de directorio.

En un directorio que contiene 500.000 archivos pequeños, este enfoque normalmente reduce el tiempo de copia entre un 60% y un 70% en comparación con una sola llamada rsync porque la cola de E/S permanece llena en lugar de esperar un archivo a la vez.

este Más de 100 comandos básicos de Linux Si desea crear fácilmente canalizaciones como esta, las lecciones de Pro TecMint cubren en detalle búsquedas, canalizaciones y combinaciones de línea de comandos.

Verifique la integridad del archivo usando la suma de verificación SHA256

Ninguna de estas herramientas significa mucho si no se verifica que la replicación realmente se haya realizado correctamente. Para cualquier copia crítica, realice una comparación de suma de verificación una vez completada la transferencia.

SHA256 La elección correcta para la mayoría de usos:

sha256sum /source/large-file.iso /destination/large-file.iso

producción:

a3b4c1d2e5f6...  /source/large-file.iso
a3b4c1d2e5f6...  /destination/large-file.iso

Si los dos hashes coinciden, la copia es perfecta en bytes. Si son diferentes, significa que hubo un problema durante la transferencia, como un error de disco, corrupción de la red o una condición de carrera con otro proceso escribiendo en la fuente, y es necesario copiarlo nuevamente antes de confiar en los datos.

en conclusión

cp Bueno para mover perfiles de un directorio a otro, pero para trabajos reales de administración del sistema, como grandes copias de seguridad, sincronización remota, replicación de discos y directorios con millones de inodos.

tienes que usar rsyncque le proporciona currículum y transferencias incrementales, pv Para brindarle visibilidad, dd le brinda control a nivel de bloque, y Sincronización paralela Brindándole rendimiento para directorios pequeños con gran densidad de archivos.

Lo mejor que puede probar ahora es: seleccione un directorio grande en su sistema y cópielo una vez usando el siguiente comando cpy luego con rsync -av --progressy compare la salida y el tiempo. Verás instantáneamente lo que te perdiste, junto con la memoria muscular. rsync A partir de ahí comenzará la construcción.

¿Cuál es su herramienta preferida para copiar archivos por lotes en producción? ¿Alguna vez has estado en una situación en la que nada de esto es suficiente y tienes que buscar algo más? ponlo en comentarios.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba