Comment un système de fichiers peut-il être copié tel quel?

10

J'ai un système de fichiers pour un appareil que je programme et dont je voudrais faire une copie exacte. Idéalement, je voudrais que cette copie soit identique au dossier à partir duquel elle a été copiée. J'ai essayé d'utiliser cp -r cp -aet rsync -azvPd'essayer d'y parvenir. Cependant, chacun entraîne un dossier de taille différente (en utilisant du -s) et, finalement, même si mon appareil fonctionne à partir du dossier d'origine, il ne fonctionnera pas à partir de celui que j'ai copié.

  • Qu'est-ce qui laisse de côté le fait que les commandes que j'ai utilisées ne tiennent pas compte?
  • Est-il possible de garder tout identique lors de la copie d'un système de fichiers / dossier? Si oui, comment pourrais-je procéder?

PS J'ai posté une question similaire sur StackOverflow mais j'ai vite réalisé que je l'avais posée sur le mauvais échange


Edit: Cela peut ne pas être utile, mais quelle que soit la méthode que j'utilise le répertoire copié provoque toujours la machine en question à Kernel Panic avec la sortie suivante.

VFS: impossible de monter le root fs via NFS, en essayant la disquette. VFS: impossible d'ouvrir le périphérique racine "nfs" ou bloc inconnu (2,0) Veuillez ajouter une option de démarrage "root =" correcte; voici les partitions disponibles: 1f00
64 mtdblock0 (driver?) 1f02 64 mtdblock2 (driver?) 1f04 2432 mtdblock4 (driver?) 1f05 128 mtdblock5 (driver?) 1f06 4352 mtdblock6 (driver?) 1f07 204928 mtdblock7 (driver?) 1f08 mtdblock8 (pilote?) 0800
8388608 pilote sda: sd Panique du noyau - pas de synchronisation: VFS: impossible de monter root fs sur unknown-block (2,0)

TopGunCoder
la source
5
Une différence de dusortie n'est pas un indicateur que le contenu n'est pas le même.
Ignacio Vazquez-Abrams
Mon appareil ne démarre pas en utilisant le répertoire copié. Je prends cela comme un indicateur et je me demande ce que je fais exactement de mal que le système de fichiers copié ne soit pas traité de la même manière
TopGunCoder
Vous devez spécifier exactement ce que vous essayez de faire. rsync -aou cp -afaites des copies exactes des répertoires, mais vous essayez de copier un disque amorçable, il y a quelques autres choses que vous devez faire pour terminer cela.
forcefsck
1
Quel type d'appareil? Quel type de système de fichiers? Quel type de support de stockage?
michas
1
Pour moi, il semble que vous souhaitiez utiliser quelque chose comme dd if=/some/location of=/some/other/location bs=4Mlire et écrire des données telles quelles.

Réponses:

12

J'utilise généralement l'une des alternatives suivantes:

  • rsync -aHAX(ajouter v pour la verbosité) garantit que vous conservez toute structure de lien et x-attrs dans le dossier cible lors de la copie. N'oubliez pas que l' aarchivage signifie et préserve déjà le temps, la propriété et les autorisations.
  • Simple tar cvf(ne pas compresser pour gagner du temps, juste les tarer), c'est ce que j'utilise si le premier ne répond pas à ce dont j'ai besoin pour une raison quelconque et que je n'ai pas de temps, mais j'essaie toujours le premier.

Pour vérifier que tout s'est bien passé, vous pouvez exécuter diff -r <folder1> <folder2>ensuite si vous le souhaitez.

bayindirh
la source
1
Cela a fait l'affaire! J'avais aussi juste besoin de m'assurer que le périphérique que je initialisais (via NFS) était éteint et ne pouvait pas accéder au système de fichiers pendant la copie.
TopGunCoder
1
Ah, les clients NFS avec accès en lecture-écriture peuvent parfois pimenter les choses!
bayindirh
3
Cela ne copiera pas sur des fichiers épars sans -S. Cela fait peut-être partie de la du -sdifférence. J'avais l'habitude rsync -axXSAHde tout copier. Le -x copiera uniquement dans le système de fichiers, et non les fichiers montés à partir d'un autre système de fichiers.
Victor Roetman
Et les --numeric-ids?
0x2207
@ 0x2207 Il n'est utile que lorsqu'un utilisateur a des ID numériques différents sur différents systèmes (par exemple, l'utilisateur hbayindir se trouve sur les deux systèmes et a l'UID 1000 sur la source et 1536 sur la destination). Je n'ai jamais eu à utiliser cette option, car je dois conserver le véritable propriétaire, pas l'UID et le GID. Si un utilisateur n'est présent ni source ni destination, l'ID numérique est utilisé comme solution de rechange.
bayindirh
4

En lisant votre réponse dans les commentaires, il semble que vous essayez de copier le dossier racine ("Mon appareil ne démarre pas en utilisant le répertoire copié"). Dans ce cas, vous devez faire plusieurs choses.

$ cd /
$ mkdir backups

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

Une fois que vous avez copié le dossier racine sur le nouveau système, vous devrez mettre à jour grub avant de démarrer.

$ grub-install --recheck /dev/sdX (Where X is the partition number)
$ update-grub
Jeight
la source
+1 Je pense que l'indice se trouve dans le message de démarrage qui a échoué dans l'OP et cela le résout.
msw
Comme il s'avère que quelque chose de très similaire à cela a fonctionné. J'avais affaire à un système de fichiers (FS) sur ma machine que je devais copier. Tout ce qu'il a été pour moi tar calors tar xil. Le kicker était cependant de s'assurer que ma machine était éteinte depuis que je la démarrais en utilisant le FS qui était local sur ma machine, mais distant sur le périphérique que je démarrais (je démarrais le périphérique via NFS)
TopGunCoder
grub-install: error: embedding is not possible, but this is required for cross-disk install.
Vitaly Zdanevich
2

Vous pouvez essayer FSArchiver . Il est le successeur de la même image, qui n'est plus entretenue. J'ai utilisé à la fois partimage et FSArchiver dans le passé, et ils ont tous deux bien fonctionné. Pour autant que je sache, ils font tous les deux des copies d'un système de fichiers aussi proche que possible de l'original. Je pense que FSArchiver est un peu plus puissant que partimage. Par exemple, cela fonctionne avec ext4, contrairement à partimage. Voir le tableau de comparaison FSArchiver / partimage .

Faheem Mitha
la source
2

Utiliser dupour comparer des dossiers est intrinsèquement gênant. Si vous voulez vraiment comparer 2 répertoires uniquement en fonction de leur taille, utilisez ducomme ceci:

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

Ce commutateur indiquera la taille réelle des répertoires par rapport à la quantité d'espace disque qu'il consomme lorsqu'il est stocké sur le support de disque physique. Les disques sont organisés en blocs et les fichiers sont écrits sur ces blocs. Si un fichier n'a besoin que de BLOC + 1 d'espace, il consommera 2 BLOCS d'espace, et c'est ce qui est dunormalement signalé. N'oubliez pas que le nom de l'outil est l'utilisation du disque!

Étant donné que vous avez affaire à ce qui ressemble à un système de fichiers complet, je serais enclin à utiliser ddpour faire une copie exacte de la partition sur laquelle se trouve le répertoire

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

Vous pouvez ensuite l'utiliser boot.imgpour restaurer la partition où vous le souhaitez.

$ dd if=/srv/boot.img of=/dev/sdb1
slm
la source
du indiquera également la taille sur le disque (donc les fichiers épars et les liens durs prennent moins de place). Par exemple, du -sh /vardonne 21G mais du -sh --apparent-size /vardonne 209G sur mon système.
Victor Roetman
0

Cela dépend un peu de ce que vous entendez par «identique».

  • Faire juste rsyncserait bien la plupart du temps. Parfois, vous souhaitez utiliser tarpour emballer tout dans un fichier et l'extraire à l'autre endroit.
  • Si vous souhaitez un clone du système de fichiers complet, vous pouvez utiliser ddpour copier l'intégralité du système de fichiers lui-même.

Si vous avez un moyen de déboguer votre appareil, essayez de savoir exactement quel est le problème pour lequel il ne fonctionne pas actuellement.

michas
la source