Copie toda la jerarquía del sistema de archivos de una unidad a otra


95

Me gustaría copiar toda la jerarquía del sistema de archivos de una unidad a otra ... es decir, el contenido de cada directorio, así como los archivos normales en la plataforma Linux. Le agradecería saber la mejor manera de hacerlo con posiblemente las funciones incorporadas de Linux. El sistema de archivos es una familia ext.


1
Umm ... ¿dónde está el amor dd? dd if=/dev/sda1 of=/dev/sdb1 bs=4096
juniorRubyist

@juniorRubyist +1 para dd. Yo siempre uso eso. ¿Pero qué banderas usar? Yo uso conv=notrunc,noerror,sync.
BeniBela

-1 por dd2 razones: en primer lugar, es una mala idea realizar una copia a nivel de bloque de un sistema de archivos que está montado (que es el caso /) y, en segundo lugar dd, no copiará datos de fuentes montadas dentro del sistema de archivos como /booty /home.
Eric

Respuestas:


33

A menudo uso

> cp -ax / /mnt

Presumiendo / mnt es el nuevo disco montado en / mnt y no hay otros montajes en /.

el -x lo mantiene en el único sistema de archivos.

Esto, por supuesto, debe hacerse como root o usando sudo.

Este enlace tiene algunas alternativas, incluida la anterior.

http://linuxdocs.org/HOWTOs/mini/Hard-Disk-Upgrade/copy.html


Si bien esta es una respuesta antigua, vale la pena señalar que generalmente NO desea copiar todas las cosas presentes /, excluyendo /dev, por ejemplo /sys, /procetc. Por lo tanto, antes de emitir eso cp, sugiero buscar mejores enfoques (también usando rsync)
Marcin Orlowski

2
El uso de la -xbandera por @MarcinOrlowski WolfJM significa que los sistemas de archivos sintéticos que menciona no se copiarán.
Jim L.

192

Lo que quieres es rsync .

Este comando se puede utilizar para sincronizar una carpeta y también reanudar la copia cuando se cancela a mitad de camino. El comando para copiar un disco es:

rsync -avxHAX --progress / /new-disk/

Las opciones son:

-a  : all files, with permissions, etc..
-v  : verbose, mention files
-x  : stay on one file system
-H  : preserve hard links (not included with -a)
-A  : preserve ACLs/permissions (not included with -a)
-X  : preserve extended attributes (not included with -a)

Para mejorar la velocidad de copia, agregue -W( --whole-file), para evitar calcular deltas / diffs de los archivos. Este es el valor predeterminado cuando tanto el origen como el destino se especifican como rutas locales, ya que el beneficio real del algoritmo de transferencia delta de rsync es la reducción del uso de la red.

También considere agregar --numeric-idspara evitar la asignación de valores uid / gid por nombre de usuario / grupo.


1
Genio, gracias. Por cierto, terminé usando rsync -avxHAWX --numeric-ids --progress / mnt/pero debería haberlo hecho rsync -avxHAWX --numeric-ids --progress / mnt/ > ~/rsync.out. Sospecho que verter la salida al terminal ralentizó el proceso. : D
Chris K

28
--info=progress2en lugar de --progresses útil para transferencias grandes, ya que proporciona un progreso general, en lugar de (millones de líneas para) archivos individuales.
Florian

3
Tuve que reemplazar Xy Acon E, porque los atributos extendidos y las ACL están cubiertos Een mi mac. Probado:rsync version 2.6.9 protocol version 29
Jonathan Komar

1
Además de > ~/rsync.out, 2> ~/rsync.errguardará cualquier error en un archivo separado.
Aneel

2
Si va a copiar de alguna otra carpeta que /, teniendo en cuenta que una barra diagonal (o no) en el directorio de origen marca la diferencia: rsync source/ dest/copia todo el interior source/a dest/, mientras que rsync source dest/las copias de la carpeta sourcey todo el interior en dest/.
semi-extrínseco

45

La respuesta de Michael Aaron Safyan no tiene en cuenta los archivos dispersos. -SLa opción corrige eso.

Además, esta variante no genera spam con el progreso de cada archivo y no hace sincronización delta que mata el rendimiento en casos que no son de red.

Perfecto para copiar el sistema de archivos de una unidad local a otra unidad local.

rsync -axHAWXS --numeric-ids --info=progress2

1
Asombroso. Esto realmente está haciendo un buen trabajo
Gildas

1
Esta debería ser la respuesta aceptada, funciona muy bien. Ejemplo55,431,669,792 57% 97.47MB/s 0:06:56 xfr#2888, ir-chk=5593/8534)
Drew el

1
<3 esto es perfecto
Tim Strijdhorst

6

Para una copia local de una toma de una unidad a otra, supongo que cp es suficiente como lo describe Wolfmann aquí arriba.

Para trabajos más grandes, como copias de seguridad locales o remotas, por ejemplo, lo mejor es rsync .

Por supuesto, rsync es significativamente más complejo de usar.

Por qué rsync:

  • esto le permite copiar (copia sincronizada) todo o parte de su unidad A a la unidad B, con muchas opciones, como excluir algunos directorios de la copia (por ejemplo, excluir / proc).

  • Otra gran ventaja es que esta herramienta nativa monitorea la transferencia de archivos: por ejemplo, para transferencias masivas, si la conexión se interrumpe, continuará desde el punto de interrupción.

  • Y por último, pero no menos importante, rsync usa una conexión ssh, por lo que le permite obtener "copias" seguras sincronizadas de forma remota. Eche un vistazo a la página del manual , así como aquí, para ver algunos ejemplos .


4

Como Michael Safyan sugiere anteriormente, lo he usado rsyncpara este propósito. Sugiero usar algunas opciones adicionales para excluir directorios que probablemente no desee copiar.

Esta versión es bastante específica para los sistemas basados ​​en Gnome y Debian / Ubuntu, ya que incluye subdirectorios de directorios de inicio de los usuarios que son específicos de Gnome, así como el caché del paquete APT.

La última línea excluirá cualquier directorio llamado cache / Cache / .cache, que puede ser demasiado agresivo para algunos usos:

rsync -WavxHAX --delete-excluded --progress \
  /mnt/from/ /mnt/to/
  --exclude='/home/*/.gvfs' \
  --exclude='/home/*/.local/share/Trash' \
  --exclude='/var/run/*' \
  --exclude='/var/lock/*' \
  --exclude='/lib/modules/*/volatile/.mounted' \
  --exclude='/var/cache/apt/archives/*' \
  --exclude='/home/*/.mozilla/firefox/*/Cache' \
  --exclude='/home/*/.cache/chromium'
  --exclude='home/*/.thumbnails' \
  --exclude=.cache --exclude Cache --exclude cache

2

Agregar dos bits útiles al hilo re rsync: cambiar el cifrado y usar --update:

Según la publicación de Wolfman, cp -axes elegante y genial para las cosas locales.

Sin embargo, rsynctambién es increíble. Además de la respuesta de Michael -W, cambiar el cifrado también puede acelerar las cosas (sin embargo, lea sobre las implicaciones de seguridad).

rsync --progress --rsh="ssh -c blowfish" / /mnt/dest -auvx

Existe cierta discusión (y puntos de referencia) sobre el hecho de que una CPU lenta es el cuello de botella real, pero parece ayudarme cuando la máquina se carga haciendo otras cosas concurrentes.

Una de las otras grandes razones para usar rsync en una copia grande y recursiva como esta es debido al modificador -u (o --update ). Si hay un problema durante la copia, puede solucionarlo y rsync continuará donde lo dejó (no creo que scp tenga esto). Al hacerlo localmente, cp también tiene un interruptor -u.

(No estoy seguro de cuáles son las implicaciones de --update y --who-file together juntas, pero siempre parecen funcionar de manera sensata para mí en este tipo de tarea)

Me doy cuenta de que esto no es un hilo sobre las características de rsync, pero algunos de los más comunes que uso para esto son:

  • --delete-after, etc. (como Michael mencionó en el seguimiento), si desea sincronizar el nuevo sistema con el lugar original o algo así. Y,
  • --excluir : para omitir directorios / archivos, para casos como copiar / crear un nuevo sistema en un nuevo lugar mientras se omiten los directorios de inicio de los usuarios, etc. (ya sea que esté montando hogares desde otro lugar o creando nuevos usuarios, etc.).

Por cierto, si alguna vez tengo que usar Windows, uso rsync de cygwin para hacer grandes copias recursivas, debido a que el explorador tiene un poco de muerte cerebral que quiere comenzar desde el principio (aunque encuentro que Finder es OS X aún peor)


2

rsync

"Se considera que este enfoque es mejor que la clonación de disco con dd, ya que permite utilizar un tamaño, una tabla de partición y un sistema de archivos de diferente tamaño, y es mejor que copiar también con cp -a, porque permite un mayor control sobre los permisos de archivo, los atributos , Listas de control de acceso (ACL) y atributos extendidos ".

De:

https://wiki.archlinux.org/index.php/Full_system_backup_with_rsync

Página del hombre aquí


2

Como se menciona en los comentarios de juniorRubyist, el enfoque preferido aquí debería ser el uso dd. La razón principal es el rendimiento, es una copia bloque por bloque en lugar de archivo por archivo.

Clonando una partición

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress

Clonando un disco completo

# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress

Referencias

  1. https://wiki.archlinux.org/index.php/disk_cloning

ddes una muy mala idea por 2 razones: en primer lugar, realizar una copia a nivel de bloque de un sistema de archivos que está montado (que es el caso /) probablemente dddará lugar a errores en el sistema de archivos de destino y, en segundo lugar , no copiará datos de fuentes montadas en el sistema de archivos como /booty /home. Su enlace es válido para clonar discos, no para clonar "jerarquía de archivos"
Eric

1

'dd' es impresionante, pero ddrescue (apt install gddrescue) es aún mejor. Si dd se interrumpe, no hay forma de reiniciar (otra buena razón para usar rsync). Cuando utiliza ddrescue con un archivo de registro, realiza un seguimiento de los bloques que se han copiado.

Cuando hago una copia de seguridad de un sistema Windows / Linux de arranque dual, uso ntfsclone para las particiones de Windows y ddrescue para la partición de Linux y dd para el MBR. (No he intentado hacer una copia de seguridad de un sistema de arranque dual usando GPT / UEFI).

Lo que me encantaría ver es una herramienta ddrescue que puede crear archivos como ntfsclone donde el espacio no asignado está marcado con caracteres de control. Esto hace que la imagen no se pueda montar directamente, pero permite que sea tan grande como los datos contenidos.

Alguien presente el "formato de imagen especial" ntfsclone para ddrescue ...


0

rsync es la solución perfecta como se explicó anteriormente.

Simplemente agregaría -S" manejar archivos dispersos de manera eficiente " en caso de que haya un volumen de docker devicemapper o similar para copiar.


0

Probé los comandos rsync propuestos aquí, pero finalmente obtuve resultados mucho más limpios y rápidos partclone. Desmonta las particiones de origen y destino y luego ejecuta lo siguiente:

partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
e2fsck -f /dev/sd(target)
resize2fs /dev/sd(target)

Esto realiza los siguientes pasos:

  1. Clonar (solo las partes usadas de) la partición
  2. asegúrese de que el sistema de archivos esté bien (resize2fs aplica este paso)
  3. cambiar el tamaño de la partición al nuevo sistema de archivos

Lo anterior funciona en caso de que la partición de destino sea del mismo tamaño o mayor que la fuente. Si su objetivo es más pequeño que la fuente (pero se ajusta a todos los datos), haga lo siguiente:

e2fsck -f /dev/sd(target)
resize2fs -M /dev/sd(target)
partclone.ext4 -b -s /dev/sd(source) -o /dev/sd(target)
resize2fs /dev/sd(target)

resize2fs -M reduce el sistema de archivos al tamaño mínimo antes de clonar los datos.

Tenga en cuenta que partcloneno está instalado por defecto en la mayoría de los sistemas. Use una distribución en vivo como clonezilla o instale partclone desde su administrador de paquetes de distribución ( apt-get install partcloneen sistemas basados ​​en Debian).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.