¿Cómo se puede copiar un sistema de archivos exactamente como está?


10

Tengo un sistema de archivos para un dispositivo que estoy programando del que me gustaría hacer una copia exacta. Idealmente, me gustaría que esta copia sea idéntica a la carpeta desde la que se copió. He intentado usar cp -r cp -ay rsync -azvPtratar de lograr esto. Sin embargo, cada uno da como resultado una carpeta con un tamaño diferente (usando du -s) y, en última instancia, aunque mi dispositivo se ejecute fuera de la carpeta original, no se ejecutará de la que copié.

  • ¿Qué se deja de lado que los comandos que he usado no tienen en cuenta?
  • ¿Es posible mantener todo idéntico al copiar un sistema / carpeta de archivos? Si es así, ¿cómo voy a hacer eso?

PD: publiqué preguntas similares en StackOverflow pero rápidamente me di cuenta de que lo había hecho en el intercambio incorrecto


Editar: Esto puede no ser útil, pero no importa qué método utilizo, el directorio copiado siempre hace que la máquina en cuestión Kernel Panic con el siguiente resultado.

VFS: no se puede montar la raíz fs a través de NFS, intentando disquete. VFS: No se puede abrir el dispositivo raíz "nfs" o el bloque desconocido (2,0) Agregue una opción de arranque "root =" correcta; Aquí están las particiones disponibles: 1f00
64 mtdblock0 (controlador?) 1f02 64 mtdblock2 (controlador?) 1f04 2432 mtdblock4 (controlador?) 1f05 128 mtdblock5 (controlador?) 1f06 4352 mtdblock6 (controlador?) 1f07 204928 mtdblock7 (controlador? 4 1f0 1 mtdblock8 (controlador?) 0800
8388608 controlador sda: sd Kernel panic - no se sincroniza: VFS: no se puede montar la raíz fs en un bloque desconocido (2,0)


55
Una diferencia en la dusalida no es un indicador de que el contenido no es el mismo.
Ignacio Vazquez-Abrams

Mi dispositivo no arrancará usando el directorio copiado. Estoy tomando eso como un indicador y me pregunto qué es exactamente lo que estoy haciendo mal para que el sistema de archivos copiado no sea tratado de la misma manera
TopGunCoder

Debe especificar exactamente lo que está tratando de hacer. rsync -ao cp -ahacer copias exactas de directorios, pero está intentando copiar un disco de arranque, hay algunas cosas más que debe hacer para completar eso.
forcefsck

1
¿Qué tipo de dispositivo? ¿Qué tipo de sistema de archivos? ¿Qué tipo de medios de almacenamiento?
michas

1
Para mí, parece que quieres usar algo como dd if=/some/location of=/some/other/location bs=4Mleer y escribir datos tal como están.

Respuestas:


12

Generalmente uso una de las siguientes alternativas:

  • rsync -aHAX(agregue v para verbosidad) se asegura de preservar cualquier estructura de enlace y x-attrs en la carpeta de destino durante la copia. No olvides que asignifica archivar y preserva tiempo, propiedad y permisos.
  • Simple tar cvf(no comprimir para ahorrar tiempo, solo alquitránarlos) es lo que uso si el primero no cumple con lo que necesito por alguna razón y no tengo tiempo, pero siempre intento el primero.

Para comprobar que todo salió como debería, puede ejecutar diff -r <folder1> <folder2>después si lo desea.


1
Esto hizo el truco! También necesitaba asegurarme de que el dispositivo que estaba iniciando (a través de NFS) estaba apagado y no podía acceder al sistema de archivos mientras se realizaba la copia.
TopGunCoder

1
¡Ah, los clientes NFS con acceso de lectura y escritura a veces pueden animar las cosas!
bayindirh

3
Esto no copiará sobre archivos dispersos sin -S. Eso puede ser parte de la du -sdiferencia. Yo solía rsync -axXSAHcopiar todo. El -x solo copiará dentro del sistema de archivos, y no los archivos montados desde otro sistema de archivos.
Victor Roetman

¿Qué pasa con los identificadores numéricos?
0x2207

@ 0x2207 Solo es útil cuando un usuario tiene diferentes ID numéricos en diferentes sistemas (por ejemplo, el usuario hbayindir está en ambos sistemas y tiene UID 1000 en el origen y 1536 en el destino). Nunca tuve que usar esa opción, ya que necesito preservar al verdadero propietario, no UID y GID. Si un usuario no está presente ni en el origen ni en el destino, la ID numérica se utiliza como reserva.
bayindirh 01 de

4

Al leer su respuesta en los comentarios, parece que posiblemente está intentando copiar la carpeta raíz ("Mi dispositivo no arranca usando el directorio copiado"). En ese caso hay varias cosas que debes hacer.

$ cd /
$ mkdir backups

$ tar -cvpf /backups/fullbackup.tar --directory=/ --exclude=proc --exclude=sys \
     --exclude=dev/pts --exclude=backups .

Una vez que haya copiado la carpeta raíz al nuevo sistema, deberá actualizar grub antes de que arranque.

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub

+1 Creo que la pista está en el mensaje de inicio fallido en el OP y esto lo soluciona.
msw

Como resultado, algo muy similar a esto funcionó. Estaba tratando con un sistema de archivos (FS) en mi máquina que necesitaba copiar. Sólo se necesitó para mí tar centonces tar xella. Sin embargo, el truco fue asegurarme de que mi máquina estaba apagada ya que la estaba iniciando usando el FS que era local para mi máquina, pero remoto al dispositivo que estaba iniciando (estaba iniciando el dispositivo a través de NFS)
TopGunCoder

grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich

2

Podrías probar FSArchiver . Es el sucesor de la imagen similar, que ahora no se mantiene. He usado partimage y FSArchiver en el pasado, y ambos han funcionado bien. Hasta donde yo sé, ambos hacen copias de un sistema de archivos que es lo más parecido posible al original. Creo que FSArchiver es un poco más poderoso que la partimage. Por ejemplo, funciona con ext4, mientras que partimage no. Consulte la tabla de comparación FSArchiver / partimage .


2

Usar dupara comparar carpetas es inherentemente problemático. Si realmente desea comparar 2 directorios basados ​​únicamente en sus tamaños, use de duesta manera:

$ du -sh --apparent-size <dir>

Este modificador informará el tamaño real de los directorios frente a la cantidad de espacio en disco que consume cuando se almacena en el medio de la unidad física. Los discos se organizan en bloques y los archivos se escriben en estos bloques. Si un archivo solo necesita BLOQUE + 1 de espacio, consumirá 2 BLOQUES de espacio, y esto es lo que dunormalmente informa. ¡Recuerde que el nombre de la herramienta es el uso del disco!

Dado que está tratando con lo que parece un sistema de archivos completo, me inclinaría a usar ddpara hacer una copia exacta de la partición en la que se encuentra el directorio

$ dd if=/dev/sda1 of=/srv/boot.img

Luego puede usar esto boot.imgpara restaurar la partición donde lo desee.

$ dd if=/srv/boot.img of=/dev/sdb1

du también informará el tamaño en el disco (por lo que los archivos dispersos y los enlaces duros ocupan menos espacio). Por ejemplo, du -sh /varda 21G pero du -sh --apparent-size /varda 209G en mi sistema.
Victor Roetman

0

Depende un poco de lo que quieras decir con "idéntico".

  • Simplemente hacerlo rsyncestaría bien la mayor parte del tiempo. A veces desea utilizar tarpara empacar todo en un archivo y extraerlo en el otro lugar.
  • Si desea un clon del sistema de archivos completo, puede usarlo ddpara copiar todo el sistema de archivos.

Si tiene algún medio para depurar su dispositivo, intente averiguar cuál es exactamente el problema por el que actualmente no se ejecuta.

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.