Restic: Format de référentiel v2

CrĂ©Ă© le 19 sept. 2016  Â·  51Commentaires  Â·  Source: restic/restic

J'aimerais lancer la discussion sur le changement du format du référentiel vers la version 2. Ceci est nécessaire pour prendre en charge la compression (voir #21).

La liste suivante sera mise Ă  jour lorsque de nouvelles propositions arriveront.

Accepté:

  • Compresser les fichiers : dĂ©placez l'en-tĂȘte au dĂ©but du fichier. Pour le moment, l'en-tĂȘte est Ă  la fin. J'ai pensĂ© que ce serait bien d'Ă©crire simplement le fichier et quand cela est fait, Ă©crivez l'en-tĂȘte. Cependant, il s'est avĂ©rĂ© que pour pouvoir rĂ©essayer les requĂȘtes backend ayant Ă©chouĂ©, nous devons de toute façon mettre le fichier en mĂ©moire tampon localement. Nous pouvons donc Ă©crire le contenu (blobs) dans un fichier temporaire, puis Ă©crire l'en-tĂȘte lors du tĂ©lĂ©chargement du fichier pack sur le backend. Cela permet de lire plus facilement l'en-tĂȘte, puisque nous n'avons pas besoin de commencer Ă  partir de la fin du fichier.
  • Fichiers de pack : pour le moment, l'en-tĂȘte du fichier de pack est une structure binaire personnalisĂ©e (voir le document de conception ). Ceci est rigide, nĂ©cessite un analyseur personnalisĂ© et n'autorise pas l'extension sans modifier le format du rĂ©fĂ©rentiel. J'aimerais reconstruire l'en-tĂȘte du pack en tant que structure de donnĂ©es JSON, de la mĂȘme maniĂšre que les objets d'arborescence sont stockĂ©s dans le rĂ©fĂ©rentiel. Cela permet une extension sans avoir Ă  modifier le format de donnĂ©es sous-jacent.
  • Pack fichiers/Index : lorsque l'en-tĂȘte du pack est modifiĂ©, ajoutez la prise en charge de la compression (algorithme, longueur compressĂ©e/non compressĂ©e). Ajoutez Ă©galement la taille compressĂ©e/non compressĂ©e aux fichiers d'index.
  • Fichiers d'instantanĂ©s : Autoriser les instantanĂ©s compressĂ©s afin que le fait d'avoir beaucoup d'instantanĂ©s devienne utilisable (cf #523)
  • Ajoutez un fichier README dans de nouveaux rĂ©fĂ©rentiels qui dĂ©crit ce que contient ce rĂ©pertoire.
  • Supprimer le nom d'utilisateur et le nom d'hĂŽte des fichiers clĂ©s (#2128)

À discuter:

  • Existe-t-il un moyen d'ajouter des codes de correction d'erreurs aux fichiers ? D'autres idĂ©es pour rĂ©cupĂ©rer des erreurs de donnĂ©es ?
  • Modifier le format d'index pour amĂ©liorer l'utilisation de la mĂ©moire
  • Ajoutez une indirection de chiffrement : notez dans l'en-tĂȘte quelle clĂ© est utilisĂ©e pour l'authentification/le chiffrement de chaque blob (afin que nous puissions implĂ©menter #187 plus facilement plus tard)

Reporté/refusé :

  • Passer Ă  une fonction de hachage plus rapide (SHA3/Keccak/Blake2 au lieu de SHA256)
  • Prend en charge la cryptographie asymĂ©trique

Rien d'autre?

project repo v2 discussion

Commentaire le plus utile

Est-il important d'avoir une taille non compressée dans le fichier d'index ou le pied de page du pack ?

Oui : l'en-tĂȘte du pack dĂ©crit le contenu du pack et indique au processus d'extraction Ă  quoi s'attendre (en termes d'algorithme de compression, de taille non compressĂ©e, et plus tard Ă©galement d'autres attributs comme la clĂ© qui a Ă©tĂ© utilisĂ©e pour le chiffrement). La mĂȘme chose doit ĂȘtre reprĂ©sentĂ©e dans l'index, qui a Ă©tĂ© introduit pour que restic n'ait pas besoin de rechercher chaque blob dans un en-tĂȘte de pack. Donc, la mĂȘme information doit ĂȘtre prĂ©sente ici.

À mon avis, le format de rĂ©fĂ©rentiel 2 == le premier octet de donnĂ©es blob indique le format de compression, c'est tout ce qui est nĂ©cessaire. Peut-ĂȘtre que l'un des 255 formats possibles pourrait ĂȘtre {64 bits de longueur non compressĂ©e}{donnĂ©es compressĂ©es}.

Je n'aime pas cette idĂ©e, cela complique le format du fichier : nous aurons des informations de contrĂŽle Ă  deux endroits diffĂ©rents : au dĂ©but d'un blob et dans l'en-tĂȘte. L'en-tĂȘte est prĂ©cisĂ©ment l'emplacement qui contient les informations de contrĂŽle.

Je pense que la correction d'erreur est une bonne idée pour la sauvegarde. Mais je pense que c'est une responsabilité du systÚme de fichiers.

En principe, je suis d'accord, mais les systÚmes de fichiers sont des choses trÚs compliquées, et la propagation des erreurs (par exemple des erreurs de lecture/écriture du support) est souvent sous-optimale. Pour les données de sauvegarde trÚs réduites (en termes de redondance, par exemple dédupliquées), je pense toujours que c'est une bonne idée d'ajouter (ou de proposer d'ajouter) une autre couche de correction d'erreurs.

Tous les 51 commentaires

Je ne suis pas sĂ»r de dĂ©placer l'en-tĂȘte vers l'avant. Je sais que ce n'est pas implĂ©mentĂ© actuellement, mais pour un rĂ©fĂ©rentiel local, avoir l'en-tĂȘte Ă  la fin signifie que nous pouvons enregistrer une copie de fichier.

Point intĂ©ressant, merci. Je ne sais pas encore comment juger ce qui est mieux. Pour les backends distants, nous pourrions Ă©galement (aprĂšs quelques modifications de l'interface backend) simplement passer un io.Reader et peut-ĂȘtre que la stdlib pourra utiliser sendfile pour diffuser le fichier directement depuis le disque. hum.

Juste pour votre information, je me demandais pourquoi vous n'utilisiez pas GCM, alors j'ai exécuté les tests de performance. AES-CTR + Poly1305 est assez rapide si le CPU n'a pas AES-NI (50% plus rapide que Go intégré GCM). Avec AES-NI, le code d'assemblage optimisé de Go pour GCM est probablement imbattable.

Intel Xeon E312xx

restic:
BenchmarkEncrypt-4        50      32470322 ns/op     258.35 MB/s

stupidgcm:
Benchmark4kEncStupidGCM-4     200000         10620 ns/op     385.67 MB/s
Benchmark4kEncGoGCM-4         300000          5540 ns/op     739.22 MB/s

Intel Pentium G630 (pas d'AES-NI)

restic:
BenchmarkEncrypt-2            10     108468078 ns/op      77.34 MB/s

stupidgcm:
Benchmark4kEncStupidGCM-2          50000         24182 ns/op     169.38 MB/s
Benchmark4kEncGoGCM-2              20000         96391 ns/op      42.49 MB/s

Cela n'appartient pas Ă  ce problĂšme, mais je rĂ©pondrai quand mĂȘme:

Je pense qu'Ă  l'Ă©poque oĂč j'ai commencĂ© restic, Go n'avait pas de version optimisĂ©e de GCM. De plus, je ne me sentais pas Ă  l'aise d'utiliser GCM car je ne le comprenais pas, alors que le papier Poly1305 Ă©tait beaucoup plus facile Ă  lire et Ă  comprendre.

Je pense que votre benchmark traite des blobs de donnĂ©es beaucoup plus petits, peut-ĂȘtre qu'il se rapprochera lorsque les blobs seront plus grands.

Je vois. Ouais le GCM optimisé est assez récent, je pense que Cloudflare en a fait don pour Go 1.5.

En ce qui concerne la taille des blocs, le benchmark restic utilise 8 MiB tandis que stupidgcm utilise 4kiB . J'ai réessayé avec une taille de bloc de 8 MiB pour stupidgcm mais les résultats sont pratiquement identiques.

Alors ne perdons pas de temps lĂ -dessus, je pense que CTR+Poly1305 est assez rapide.

Est-il important d'avoir une taille non compressée dans le fichier d'index ou le pied de page du pack ? Je pense que ce serait bien de le savoir uniquement dans le blob, alors moins de changements sont nécessaires dans restic. Permet-il à de nouvelles fonctionnalités de le faire connaßtre à cet endroit supplémentaire ?

À mon avis, le format de rĂ©fĂ©rentiel 2 == le premier octet de donnĂ©es blob indique le format de compression, c'est tout ce qui est nĂ©cessaire. Peut-ĂȘtre que l'un des 255 formats possibles pourrait ĂȘtre {64 bits de longueur non compressĂ©e}{donnĂ©es compressĂ©es}.

Je pense que la correction d'erreur est une bonne idée pour la sauvegarde. Mais je pense que c'est une responsabilité du systÚme de fichiers. Souhaitez-vous également implémenter RAID à l'intérieur de restic ?

Est-il important d'avoir une taille non compressée dans le fichier d'index ou le pied de page du pack ?

Oui : l'en-tĂȘte du pack dĂ©crit le contenu du pack et indique au processus d'extraction Ă  quoi s'attendre (en termes d'algorithme de compression, de taille non compressĂ©e, et plus tard Ă©galement d'autres attributs comme la clĂ© qui a Ă©tĂ© utilisĂ©e pour le chiffrement). La mĂȘme chose doit ĂȘtre reprĂ©sentĂ©e dans l'index, qui a Ă©tĂ© introduit pour que restic n'ait pas besoin de rechercher chaque blob dans un en-tĂȘte de pack. Donc, la mĂȘme information doit ĂȘtre prĂ©sente ici.

À mon avis, le format de rĂ©fĂ©rentiel 2 == le premier octet de donnĂ©es blob indique le format de compression, c'est tout ce qui est nĂ©cessaire. Peut-ĂȘtre que l'un des 255 formats possibles pourrait ĂȘtre {64 bits de longueur non compressĂ©e}{donnĂ©es compressĂ©es}.

Je n'aime pas cette idĂ©e, cela complique le format du fichier : nous aurons des informations de contrĂŽle Ă  deux endroits diffĂ©rents : au dĂ©but d'un blob et dans l'en-tĂȘte. L'en-tĂȘte est prĂ©cisĂ©ment l'emplacement qui contient les informations de contrĂŽle.

Je pense que la correction d'erreur est une bonne idée pour la sauvegarde. Mais je pense que c'est une responsabilité du systÚme de fichiers.

En principe, je suis d'accord, mais les systÚmes de fichiers sont des choses trÚs compliquées, et la propagation des erreurs (par exemple des erreurs de lecture/écriture du support) est souvent sous-optimale. Pour les données de sauvegarde trÚs réduites (en termes de redondance, par exemple dédupliquées), je pense toujours que c'est une bonne idée d'ajouter (ou de proposer d'ajouter) une autre couche de correction d'erreurs.

Pour les codes Reed-Solomon, il existe une implémentation Go pure sur https://github.com/klauspost/reedsolomon avec quelques données de performances.

Selon https://www.usenix.org/legacy/event/fast09/tech/full_papers/plank/plank_html/ ZFEC devrait ĂȘtre plus rapide. Une implĂ©mentation se trouve dans https://gitlab.com/zfec/go-zfec qui semble ĂȘtre basĂ©e sur https://pypi.python.org/pypi/zfec.

Les ECC sont appliqués aprÚs compression et sont normalement entrelacés dans le fichier de données, car leur distribution les rend plus robustes si les données sont transférées sur des canaux de communication peu fiables ou bruyants.

Dans les groupes binaires Usenet, ils utilisent des fichiers sĂ©parĂ©s (voir https://en.wikipedia.org/wiki/Parchive) qui contiennent les informations ECC. Cela ajouterait juste un autre sous-rĂ©pertoire Ă  la disposition du rĂ©fĂ©rentiel et appliquer ECC aux informations de gestion du rĂ©fĂ©rentiel (config, index, ...) serait Ă©galement facile. Mais je ne sais pas si cela affaiblirait le schĂ©ma ECC (peut-ĂȘtre que la robustesse contre les erreurs de cluster dans les informations ECC diminue).

Merci pour les conseils. J'ai trouvé la version PDF de l'article ici : https://www.usenix.org/legacy/event/fast09/tech/full_papers/plank/plank.pdf

L'implémentation ZFEC Go n'est qu'un wrapper autour de la bibliothÚque C.

Pour ZFEC il existe un port Go avec des ajouts (utilisation de goroutines) nommé jfec sur [https://github.com/korvus81/jfec].

J'ai ajoutĂ© un "projet" (un ajout rĂ©cent Ă  GitHub) pour suivre la mise en Ɠuvre du nouveau format de rĂ©fĂ©rentiel : https://github.com/restic/restic/projects/3

Quelques idĂ©es qui pourraient ĂȘtre examinĂ©es lors de la rupture de la rĂ©trocompatibilité :

  • Passer de sha256 Ă  sha512

L'utilisation de sha512 (ou sha512/256) au lieu de sha256 entraßnera-t-elle une augmentation de la vitesse de sauvegarde ? Autant que je sache, cela est vrai pour la plupart des plates-formes, à l'exception d'ARM.

Discussion sur la synchronisation (https://github.com/syncthing/syncthing/issues/582)

Discussion Borg (https://github.com/jborg/attic/issues/209)

Article sur sha512/256 (https://eprint.iacr.org/2010/548.pdf)

  • Utiliser le cryptage Ă  clĂ© publique au lieu d'un simple mot de passe

Actuellement, tous ceux qui ont accÚs en écriture au référentiel ont accÚs en lecture à partir de celui-ci. Le chiffrement à clé publique éliminerait cela et permettrait toujours la déduplication basée sur les hachages.

L'application d'un cryptage Ă  clĂ© publique aux blobs de donnĂ©es fonctionnerait, mais je ne suis pas assez familier avec la façon dont restic traite la structure arborescente pour savoir si elle pourrait ĂȘtre implĂ©mentĂ©e avec succĂšs pour cela Ă©galement. Cela pourrait Ă©ventuellement introduire beaucoup de complexitĂ©. Si seuls les blobs de donnĂ©es sont masquĂ©s, il y a encore beaucoup d'informations dans les arbres.

NaCl - https://godoc.org/golang.org/x/crypto/nacl/box

  • Identification du rĂ©fĂ©rentiel

Actuellement, il n'y a aucun moyen de savoir que vous regardez un rĂ©fĂ©rentiel restic lorsque vous tombez sur le rĂ©fĂ©rentiel. Nous divulguons actuellement "created":"TIMESTAMP","username":"XXXXX","hostname":"XXXXX" dans les fichiers clĂ©s. Je suggĂ©rerais de masquer ces informations et d'inclure Ă  la place des informations sur restic, telles que restic repository version X . Peut-ĂȘtre aussi simple qu'un README.

Concernant les discussions prĂ©cĂ©dentes ; Je suis trĂšs favorable Ă  la mise en Ɠuvre d'une forme de correction d'erreurs.

@oysols Merci de vous avoir ajouté des idées !

J'ajouterai mes pensées ci-dessous:

Passer de sha256 Ă  sha512 (pour la vitesse)

Pour le moment, je ne suis pas concernĂ© par la vitesse (restic est dĂ©jĂ  trĂšs rapide), donc au moins pour moi, cet Ă©lĂ©ment n'est pas prioritaire. Il existe mĂȘme une version optimisĂ©e de SHA256 pour les processeurs compatibles SIMD vers laquelle nous pouvons simplement basculer. Par contre, quand on dĂ©cide d'accĂ©lĂ©rer le restic et que le hash est Ă  discuter, je prĂ©fĂ©rerais sans doute Keccak (SHA3) ou Blake2, ce sont (pour autant que je sache, je n'ai pas encore fait de benchmarks) Plus vite.

Donc, de mon point de vue, cet article est reporté pour le moment.

Utiliser le cryptage à clé publique au lieu d'un simple mot de passe

Cette fonctionnalitĂ© est prĂ©vue (voir #187), mais elle est compliquĂ©e et demande beaucoup de rĂ©flexion et plusieurs modifications majeures de l'infrastructure. J'aimerais aussi reporter cela et plutĂŽt faire des mises Ă  jour incrĂ©mentielles plus petites au lieu d'une oĂč nous changeons tout -> reportĂ©.

Identification du référentiel (ajoutez un fichier README dans le référentiel)

TrĂšs bon point, on peut mĂȘme en rajouter maintenant sans rien casser.

"Fuite d'informations" du référentiel (suppression du nom d'utilisateur, du nom d'hÎte et de l'horodatage créé des fichiers clés)

C'est aussi un bon point. Nous n'utilisons actuellement ces informations que pour les afficher Ă  cĂŽtĂ© de l'ID de clĂ© dans la commande key list . On peut facilement dĂ©poser username et host , l'horodatage ne donne pas beaucoup d'informations, dans la plupart des cas ce sera le mĂȘme que la date de crĂ©ation du fichier.

Je voudrais déposer username et host et laisser l'horodatage créé.

J'ai jouĂ© avec https://github.com/klauspost/reedsolomon aujourd'hui et je pense que nous pouvons ajouter des codes de correction d'erreurs assez facilement Ă  la fin du fichier pack (une fois que nous avons dĂ©placĂ© l'en-tĂȘte du pack au dĂ©but du fichier ). Il y a cependant deux inconvĂ©nients :

  • La taille du fichier augmentera d'environ 14 Ă  30 %, en fonction des paramĂštres que nous choisissons pour Reed-Solomon
  • Nous devrons stocker les sommes de contrĂŽle (pas nĂ©cessairement les hachages cryptographiques) des sections du fichier pack dans le fichier pack lui-mĂȘme, celles-ci sont nĂ©cessaires pour la reconstruction car l'algorithme de reconstruction doit savoir quelles parties du fichier ont Ă©tĂ© endommagĂ©es. Cela prend donc un peu plus de temps Ă  calculer, bien que nous puissions choisir d'utiliser une somme de contrĂŽle rapide (comme CRC ou autre).

Les pensées?

La protection des tiges de donnĂ©es pourrait-elle alors ĂȘtre facultative? Je considĂšre que l'augmentation de la taille est plus que marginale (c'est une fonctionnalitĂ© intĂ©ressante pour les autres, mĂȘme si je crois !)

Permettez-moi de jouer un peu avec cela, afin que je puisse avoir une idĂ©e de la taille (ou de la taille) du dĂ©pĂŽt lorsque l'ECC est combinĂ© Ă  la compression. Nous ajoutons peut-ĂȘtre deux types de codes : un pour l'en-tĂȘte du pack et un (peut-ĂȘtre facultatif) pour les donnĂ©es.

supprimer le nom d'utilisateur et l'hĂŽte

Ça semble ĂȘtre une bonne idĂ©e. Si nous voulons conserver les informations, elles pourraient ĂȘtre ajoutĂ©es Ă  un champ cryptĂ© sĂ©parĂ©, de la mĂȘme maniĂšre que la clĂ© principale.

ECC : la taille du fichier augmentera d'environ 14 à 30 %,

Je ne pense pas que ce soit une bonne idĂ©e d'inclure l'ECC dans les fichiers du pack eux-mĂȘmes. Ils ne sont d'aucune utilitĂ© dans un scĂ©nario de restauration typique et ne sont utilisĂ©s que si les fichiers du pack sont endommagĂ©s.

Je suggÚre que les données de parité soient placées dans un répertoire séparé :

repo/data/1e/1ef7267...
repo/parity/1e/1ef7267...
  • La paritĂ© sera complĂštement facultative et pourra ĂȘtre crĂ©Ă©e aprĂšs la sauvegarde.
  • Aucun ralentissement des opĂ©rations de restauration. Aucune bande passante supplĂ©mentaire nĂ©cessaire pour la restauration.
  • Des noms de fichiers identiques facilitent l'identification des donnĂ©es de paritĂ© correctes. Cela signifie que les donnĂ©es de paritĂ© ne sont pas nommĂ©es d'aprĂšs leur propre hachage sha256, mais aucun index supplĂ©mentaire ne sera nĂ©cessaire. (La vĂ©rification des donnĂ©es de paritĂ© doit ĂȘtre effectuĂ©e en vĂ©rifiant les fichiers du pack, de toute façon.)
  • L'utilisateur a une idĂ©e de la quantitĂ© de donnĂ©es de paritĂ©.

Peu importe comment il est mis en Ɠuvre; Avec de nombreuses couches de compression et de cryptage, je pense qu'une sorte d'ECC est nĂ©cessaire. Un mauvais morceau peut causer beaucoup de problĂšmes.

Merci pour vos commentaires, déplaçons la discussion vers un problÚme séparé que je viens de créer : #804.

Je ne peux pas m'empĂȘcher d'avoir l'impression qu'il y a deux groupes qui se parlent des codes de correction d'erreur directe en restic. Un groupe veut (juste) protĂ©ger le repo du bitrot, car mĂȘme un seul bitflip peut crĂ©er un Ă©norme problĂšme dans un repo dĂ©dupliquĂ©. L'autre groupe souhaite utiliser des codes d'effacement pour rĂ©partir le rĂ©fĂ©rentiel sur plusieurs domaines dĂ©faillants (par exemple, des disques non RAID). Les deux objectifs peuvent ĂȘtre servis par les codes Reed-Solomon, mais ils nĂ©cessitent des paramĂštres diffĂ©rents et des dispositions de stockage diffĂ©rentes.

J'ai effectué une vérification rapide de mon référentiel avec mon script python (https://github.com/oysols/restic-python).

header_length:        8688549
tree_length:         53898054
data_length:     146443506727
treeblobs:               8466
datablobs:             200975
packfiles:              29351
---- repo size by dir ----
            155   config
146 510 470 574   data
     27 538 629   index
          4 545   keys
          4 243   locks
         14 041   snapshots
          4 096   tmp
-----
Currently 116071 original files contained in the backup.

Sur une sauvegarde de 146 Go, les blobs d'arborescence ne font que 54 Mo et se compresseront bien à environ un tiers de l'espace d'origine, lorsque nous implémenterons la compression.

Y aurait-il une amélioration des performances en séparant les blobs d'arbres des blobs de données ?

Il semble que la plupart des opĂ©rations effectuĂ©es lors d'une restauration soient effectuĂ©es sur la base des blobs de l'arbre, avant de restaurer rĂ©ellement les donnĂ©es. Les sĂ©parer dans des fichiers de pack sĂ©parĂ©s minimiserait la quantitĂ© de donnĂ©es devant ĂȘtre tĂ©lĂ©chargĂ©es pour analyser l'arborescence d'une sauvegarde. Étant donnĂ© la petite taille des blobs d'arborescence, il peut mĂȘme ĂȘtre plus rapide de tĂ©lĂ©charger tous les blobs d'arborescence avant de dĂ©marrer le processus de restauration.

Bien sĂ»r; Cette distribution peut ne pas ĂȘtre la mĂȘme pour tous les dĂ©pĂŽts.

Pensez-vous que cela mĂ©rite d'ĂȘtre approfondi ?

Y aurait-il une amélioration des performances en séparant les blobs d'arbres des blobs de données ?

C'est peut-ĂȘtre l'une des optimisations que j'ai en tĂȘte pour l'avenir.

En dehors de cela, j'aimerais Ă©galement ajouter un cache local pour les mĂ©tadonnĂ©es, afin qu'elles n'aient pas du tout besoin d'ĂȘtre extraites du rĂ©fĂ©rentiel. Cela devrait grandement amĂ©liorer la vitesse de nombreuses opĂ©rations.

Y aurait-il une amélioration des performances en séparant les blobs d'arbres des blobs de données ?

Cela pourrait théoriquement améliorer le fonctionnement prune , car moins de remballage serait nécessaire si les blobs d'arbres et les blobs de données étaient dans des packfiles séparés (il pourrait devenir possible de supprimer en gros un ancien packfile au lieu de le reconditionner).

Je regarde déjà ça pendant #842

gcm contre ctr : http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html

sym vs asym : l'idée est de chiffrer par pubkey une clé de "session", n'est-ce pas ?

Ne parlons pas de crypto dans ce numéro, car il est reporté pour le moment. Le problÚme pertinent pour les discussions sur la cryptographie asymétrique est le #187. De plus, j'aimerais maintenir la discussion à un niveau élevé jusqu'à ce que nous ayons défini le cas d'utilisation. Ensuite, nous pouvons parler de crypto de bas niveau.

Supprimez le nom d'utilisateur et le nom d'hÎte des fichiers clés.

Énorme fuite de mĂ©tadonnĂ©es !
Par exemple, "username":"WorldBank\\JimYongKim" indique clairement un propriétaire de haut rang .

En attendant que cela soit _supprimé_ (ou _crypté_) depuis la compilation du premier binaire Windows en janvier 2017.
Heureusement, j'ai examiné la sauvegarde avant de télécharger ou de recommander Restic à des personnes soucieuses de la confidentialité.

Edit : le fuseau horaire de l'utilisateur est également mentionné en texte brut, ce qui va également à l'encontre du principe de confidentialité .

Re : SHA3 - voici une opinion expliquant pourquoi cela ne vaut pas la peine d'ĂȘtre adoptĂ© (encore ?) : https://www.imperialviolet.org/2017/05/31/skipsha3.html

Ainsi, je pense que SHA-3 ne devrait probablement pas ĂȘtre utilisĂ©. Il n'offre aucun avantage convaincant par rapport Ă  SHA-2 et entraĂźne de nombreux coĂ»ts. Le seul argument que je peux crĂ©diter est qu'il est agrĂ©able d'avoir une fonction de hachage de sauvegarde, mais SHA-256 et SHA-512 sont gĂ©nĂ©ralement pris en charge et ont des cƓurs diffĂ©rents. Nous avons donc dĂ©jĂ  dĂ©ployĂ© deux fonctions de hachage sĂ©curisĂ©es et je ne pense pas que nous en ayons besoin d'une autre.

J'ai lu le post et je comprends les arguments d'agl. Pour restic, ce n'est pas si pertinent : nous utilisons la fonction de hachage pour identifier (de maniÚre unique) les blobs, et non comme un élément constitutif d'un protocole cryptographique. Mon idée de regarder d'autres fonctions de hachage était principalement que SHA-256 est lent à calculer, en particulier sur les systÚmes bas de gamme. D'autres fonctions de hachage sont beaucoup plus rapides (par exemple blake2).

Vous ne savez pas s'il s'agit d'un truc au format repo : que diriez-vous de rendre le cryptage facultatif ? Je pense aux sauvegardes qui seront stockées sur un serveur de sauvegarde de confiance qui a déjà des disques chiffrés.

@mschiff Voir # 1018 pour cette discussion. ;)

Que diriez-vous de faire de la taille des piĂšces une option ?
Actuellement, j'ai 4-6 Mo par fichier. Avec moins de fichiers mais plus volumineux, la sauvegarde Ă  distance sera beaucoup plus rapide.

@fd0 a Ă©crit :

Pour le moment, je ne suis pas concernĂ© par la vitesse (restic est dĂ©jĂ  trĂšs rapide), donc au moins pour moi, cet Ă©lĂ©ment n'est pas prioritaire. Il existe mĂȘme une version optimisĂ©e de SHA256 pour les processeurs compatibles SIMD vers laquelle nous pouvons simplement basculer. Par contre, quand on dĂ©cide d'accĂ©lĂ©rer le restic et que le hash est Ă  discuter, je prĂ©fĂ©rerais sans doute Keccak (SHA3) ou Blake2, ce sont (pour autant que je sache, je n'ai pas encore fait de benchmarks) Plus vite.

Une autre considération pour un algorithme de hachage plus rapide et moins gourmand en CPU (comme Blake2) serait la réduction de l'utilisation de la batterie sur les ordinateurs portables lors des sauvegardes sans connexion à une source d'alimentation.

RĂ©ponse au premier post :

Supprimez le nom d'utilisateur et le nom d'hÎte des fichiers clés.

Cela serait-il remplacĂ© par un nom de clĂ© ou une description quelconque ? Je pense qu'un moyen de distinguer diffĂ©rentes clĂ©s (sans avoir accĂšs Ă  la clĂ© elle-mĂȘme, par exemple lors de la rĂ©vocation de l'accĂšs Ă  une machine) est utile pour rendre la gestion des clĂ©s utile ?

Une nouvelle suggestion : que diriez-vous d'utiliser une clĂ© diffĂ©rente pour les blobs, les arbres et les instantanĂ©s ? Cela permettrait, AFAICS, un scĂ©nario oĂč l'oubli et l'Ă©lagage se produisent sur le serveur de stockage de sauvegarde, plutĂŽt que sur les clients. En accordant au serveur de stockage l'accĂšs Ă  l'arborescence et aux objets d'instantanĂ©, il doit disposer de suffisamment d'informations pour dĂ©terminer quels objets sont nĂ©cessaires Ă  quels instantanĂ©s et quels objets ne sont plus utilisĂ©s. Si le serveur de stockage est compromis, l'accĂšs est obtenu aux mĂ©tadonnĂ©es de l'arborescence, mais pas au contenu rĂ©el du fichier.

Cela peut ĂȘtre lĂ©gĂšrement renforcĂ© en n'autorisant l'accĂšs qu'Ă  la liste des identifiants d'objets rĂ©fĂ©rencĂ©s par un arbre, sans autoriser l'accĂšs au reste des mĂ©tadonnĂ©es (mais cela nĂ©cessiterait une structure de donnĂ©es supplĂ©mentaire pour chaque arbre).

Si ce qui prĂ©cĂšde Ă©tait rendu possible, cela ouvrirait la voie Ă  l'utilisation d'un type de stockage en Ă©criture seule / ajout uniquement (oĂč le client sauvegardĂ© ne peut pas supprimer les sauvegardes, voir #784), sans avoir Ă  sacrifier l'Ă©lagage automatisĂ©, ou sĂ©curitĂ© des donnĂ©es.

Concernant mon commentaire prĂ©cĂ©dent (Ă©lagage sans avoir besoin d'un accĂšs complet aux donnĂ©es) : cela s'applique Ă©galement (peut-ĂȘtre mĂȘme plus fort) Ă  la vĂ©rification de la sauvegarde. Il est logique de vĂ©rifier un rĂ©fĂ©rentiel sur le serveur de stockage pour des raisons d'efficacitĂ© (AFAICS pour vĂ©rifier un rĂ©fĂ©rentiel Ă  distance nĂ©cessite le transfert de tout le contenu), ou lors de la mise en Ɠuvre d'un vĂ©ritable support en Ă©criture seule (voir https://github.com/ncw/rclone/issues /2499).

De plus, pour une vĂ©ritable approche en Ă©criture seule, des modifications sont nĂ©cessaires pour restreindre les fichiers Ă  lire (selon https://github.com/ncw/rclone/issues/2499#issuecomment-418609301). Je ne sais pas si cela nĂ©cessite Ă©galement des changements de format de rĂ©fĂ©rentiel, si tel est le cas, il pourrait ĂȘtre utile de les inclure ici?

Vérifier et élaguer un référentiel sur le serveur distant serait vraiment génial. Je suis en train de configurer restic pour sauvegarder plusieurs hÎtes et j'aimerais effectuer toutes les tùches de maintenance à distance afin que la configuration du client soit aussi simple que possible et ne nécessite que la sauvegarde pour s'exécuter réguliÚrement.

J'aimerais discuter de certains ajouts (peut-ĂȘtre facultatifs) au format de fichier d'instantané :

  • Ajouter la liste des fichiers d'index utilisĂ©s (voir #1988)
  • Ajouter la possibilitĂ© pour les donnĂ©es dĂ©finies par l'utilisateur (comme les descriptions d'ajouts, etc., n'a pas trouvĂ© le problĂšme pour le moment)
  • Ajoutez des donnĂ©es statistiques telles que le nombre de fichiers/blobs, l'espace utilisĂ©, etc. Cela pourrait rendre l'affichage des statistiques beaucoup plus rapide et permettre Ă©galement des vĂ©rifications supplĂ©mentaires

À propos du format de fichier pack, je voudrais demander pourquoi ne pas supprimer complĂštement l'en-tĂȘte.
Les informations sont incluses de maniĂšre redondante dans les fichiers d'index. Il y a eu des discussions sur l'ajout de redondance pour la correction d'erreurs, mais IMO cela devrait (et peut) ĂȘtre sĂ©parĂ© du format de dĂ©pĂŽt gĂ©nĂ©ral et peut ĂȘtre ajoutĂ© ou non ajoutĂ© en plus de cela.

Pour faire court : si vous n'avez pas besoin ou si vous ne souhaitez pas d'informations supplĂ©mentaires pour la correction des erreurs, il n'est pas nĂ©cessaire de dupliquer les informations dans les fichiers d'en-tĂȘte et d'index du pack. Les fichiers d'index sont nĂ©cessaires pour un fonctionnement performant et utilisĂ©s partout. Les en-tĂȘtes de pack sont rarement utilisĂ©s - et si c'est le cas uniquement pour une double vĂ©rification ou une correction d'erreur.

Autre proposition : ajoutez le nom d'utilisateur, le nom d'hÎte et le contenu du fichier de configuration à la section data du fichier de clé. Supprimez donc complÚtement le fichier de configuration.

Comme dĂ©jĂ  proposĂ©, le nom d'utilisateur et l'hĂŽte ne doivent ĂȘtre prĂ©sents que sous forme cryptĂ©e. Pour vĂ©rifier si la clĂ© dĂ©rivĂ©e de KDF est valide, il suffit dĂ©jĂ  de vĂ©rifier le MAC de la section chiffrĂ©e data .
IMO, il est logique d'y mettre toutes les informations nécessaires à l'identification de la clé. L'ajout des informations stockées dans le fichier config ATM supprime simplement un fichier supplémentaire du référentiel et facilite l'initialisation du référentiel.

DĂ©solĂ© pour la question "stupide", mais y a-t-il des efforts sĂ©rieux en cours pour introduire prochainement un format amĂ©lioré ? Je suis ce problĂšme depuis des annĂ©es. restic ne fonctionne actuellement pas bien pour les grands ensembles de donnĂ©es, ou lorsqu'il y a de nombreux instantanĂ©s, et qu'il nĂ©cessite beaucoup de mĂ©moire. Il semble que le manque de compression et la surcharge importante des mĂ©tadonnĂ©es encodĂ©es JSON soient les gros problĂšmes de restic. Peut-ĂȘtre que l'effort s'est arrĂȘtĂ© parce qu'il y a un besoin perçu d'atteindre la « perfection » ?

Je m'intéresse aussi à ce que l'avenir apportera à restic. Surtout en crypto asymétrique et en compression.
Au fait, pour une nouvelle fonction de hachage, il y a aussi blake3 qui est tout nouveau et aussi extrĂȘmement rapide : https://github.com/BLAKE3-team/BLAKE3
Si aucune dĂ©cision n'a dĂ©jĂ  Ă©tĂ© prise concernant un changement de fonction de hachage, cela pourrait ĂȘtre intĂ©ressant.

Quelques idées supplémentaires pour repo.v2 :

  • enregistrer l'arborescence et les blobs de donnĂ©es dans diffĂ©rents rĂ©pertoires (dans le passĂ©, l'arborescence et les donnĂ©es Ă©taient mĂ©langĂ©es, mais cela a Ă©tĂ© dĂ©prĂ©ciĂ© avec l'introduction du cache).
  • ajouter des informations sur le "temps de crĂ©ation" aux blobs de donnĂ©es.

Cela devrait simplifier la prise en charge du stockage "froid" avec un téléchargement trÚs lent ou coûteux comme Amazon Glacier.

* save tree and data blobs to different directories (in the past tree and data was mixed, but this was deprecated with introduction of cache).

Je n'aime pas cette idée .. Cela facilite beaucoup l'estimation de la taille des fichiers de sauvegarde alors que je n'en vois pas l'avantage.

* add 'created time' info to data blobs.

Je ne vois aucune utilité à ajouter un "temps créé". Pouvez-vous donner un cas d'utilisation?

Cela devrait simplifier la prise en charge du stockage "froid" avec un téléchargement trÚs lent ou coûteux comme Amazon Glacier.

Je dirais que la prise en charge du "stockage Ă  froid" peut dĂ©jĂ  ĂȘtre obtenue avec le format de dĂ©pĂŽt actuel en ajoutant des possibilitĂ©s de rĂ©glage fin au restic et au double stockage des fichiers jamais moins frĂ©quemment utilisĂ©s, par exemple dans un cache local. Voir aussi #2504

* save tree and data blobs to different directories (in the past tree and data was mixed, but this was deprecated with introduction of cache).

Je n'aime pas cette idée .. Cela facilite beaucoup l'estimation de la taille des fichiers de sauvegarde alors que je n'en vois pas l'avantage.

L'avantage est bien présenté dans les commentaires précédents sur cette question :
https://github.com/restic/restic/issues/628#issuecomment -280436633
https://github.com/restic/restic/issues/628#issuecomment -280833405
Les résultats du premier commentaire montrent également que le mélange de ces deux types de blobs ne masque pas la taille des fichiers de maniÚre significative.

message connexe sur le forum :
https://forum.restic.net/t/feature-using-an-index-for-restic-find/1773

@cfbao Les commentaires auxquels vous faites référence concernent le mélange d'arborescence et de blob de données dans un seul fichier de données (pack). Séparer cela était utile pour activer la gestion du cache. Ceci est également déjà modifié dans restic.

Cependant, je ne vois toujours aucun avantage à enregistrer des arbres et des blobs de données dans différents répertoires . Pouvez-vous donner un cas d'utilisation? (IMO le sujet du forum de recherche n'est pas lié - je vous répondrai là-bas)

Séparer les entrées d'arbre et de blob de données dans des fichiers d'index séparés (par exemple, les répertoires "index-data" et "index-tree") permettrait cependant quelques améliorations.

Les blobs d'arbres sont déjà stockés dans des fichiers de pack séparés (cela a été introduit avec le cache).
Le simple fait de les écrire dans un répertoire différent ouvrira un moyen d'améliorer la prise en charge des stockages trÚs lents à télécharger (3 à 5 heures pour la norme Amazon Glacier). Comme stocker toutes les métadonnées (index + instantanés + arborescence dans S3 standard et données dans Glacier).

2504 l'améliore un peu, mais je n'aime pas l'idée de compter sur le "cache local" ou d'attendre beaucoup pour remplir le cache.

J'aime beaucoup plus l'idée d'avoir un proxy inverse qui stockera tree+index+snapshots sur S3 normal ou tout autre endroit, mais placera les données dans une archive approfondie.
Dans tous les cas, il est sûrement possible d'utiliser restic tel quel avec certaines limitations. Mais certains changements de format peuvent améliorer/simplifier les choses.

@cfbao pour autant que je sache d'aprĂšs le code restic find n'en bĂ©nĂ©ficiera pas. Il marche dĂ©jĂ  sur les instantanĂ©s. Fondamentalement, c'est la mĂȘme chose que restic ls <all-snapshots> | grep something .

@dionorgua
J'aime l'idĂ©e d'ajouter un rĂ©fĂ©rentiel arbitraire en tant que cache "supplĂ©mentaire" oĂč tout sauf les packs de donnĂ©es est mis en cache. Cela ne nĂ©cessite pas de modification de la disposition du rĂ©fĂ©rentiel et IMO est beaucoup plus flexible.
J'y travaille déjà, voir aussi #2516, dernier commentaire.

C'est peut-ĂȘtre une idĂ©e stupide mais qu'en est-il d'un format compatible avec borg ou kopia ?

@aawsome

Les commentaires auxquels vous faites référence concernent le mélange d'arbres et de blob de données dans un seul fichier de données (pack).

Vrai. Ma faute. Oui, c'est la seule chose qui m'intéresse.

Ceci est également déjà modifié dans restic.

Savez-vous dans quel PR/version cela a Ă©tĂ© modifié ? La derniĂšre fois que j'ai vĂ©rifiĂ© mon rĂ©fĂ©rentiel, j'ai remarquĂ© un mĂ©lange de donnĂ©es et d'arbres dans les mĂȘmes fichiers de pack. Comment puis-je (probablement lentement) convertir mon dĂ©pĂŽt pour avoir une meilleure sĂ©paration ?

Je ne vois toujours aucun avantage à enregistrer des arbres et des blobs de données dans différents répertoires. Pouvez-vous donner un cas d'utilisation?

Je n'ai aucune idée. Comme mentionné précédemment, je ne m'en soucie pas vraiment.


@dionorgua

pour autant que je sache d'aprĂšs le code restic find n'en bĂ©nĂ©ficiera pas. Il marche dĂ©jĂ  sur les instantanĂ©s. Fondamentalement, c'est la mĂȘme chose que restic ls| grep quelque chose.

La séparation des blobs d'arbres des blobs de données ne réduirait-elle pas le nombre d'appels d'API nécessaires à la recherche ? S'il est concentré, le nombre de fichiers de pack contenant des blobs d'arborescence serait réduit et restic peut télécharger un plus petit nombre de fichiers entiers au lieu de récupérer de nombreux segments à partir de nombreux fichiers de pack. Cela est important pour les backends qui sont relativement lents et ont une limitation de débit plus stricte (par exemple, Google Drive).

De toute façon, je peux (probablement lentement) convertir mon repo pour avoir mieux
séparation?

Avec une version récente de restic, une série de 'prune' devrait reconstruire ces packs mixtes..
Notez que l'implémentation réelle de 'prune' génÚre beaucoup de trafic pour les référentiels distants. Avec la réimplémentation expérimentale dans # 2718, vous ne pourrez remballer que des packs mixtes tout en ayant un trafic minimal.

La séparation des blobs d'arbres des blobs de données ne réduirait-elle pas le nombre d'API
appels nécessaires pour trouver?

Dans une version récente et avec un référentiel qui n'a pas de packs mixtes, toutes les informations nécessaires sont mises en cache localement.

Une autre idée pour un format de référentiel amélioré :

Comme nous l'avons vu, il est avantageux de séparer les fichiers de pack par type de blob (les blobs d'arborescence et de données vont dans des fichiers de pack différents). Ne serait-il pas judicieux de séparer également les fichiers d'index par type de blob ? Les PR d'index récents vont déjà dans le sens de la séparation des entrées d'index pour les arbres et les blobs de données dans la représentation en mémoire.
Il existe Ă©galement des optimisations possibles pour ne charger qu'une partie de l'index

Faire cela également dans le référentiel permettrait une représentation plus compacte, par exemple

{
  "supersedes": [
    "ed54ae36197f4745ebc4b54d10e0f623eaaaedd03013eb7ae90df881b7781452"
  ],
  "type": "data",
  "packs": [
    {
      "id": "73d04e6125cf3c28a299cc2f3cca3b78ceac396e4fcf9575e34536b26782413c",
      "blobs": [
        {
          "id": "3ec79977ef0cf5de7b08cd12b874cd0f62bbaf7f07f3497a5b1bbcc8cb39b1ce",
          "offset": 0,
          "length": 25
        },{
          "id": "9ccb846e60d90d4eb915848add7aa7ea1e4bbabfc60e573db9f7bfb2789afbae",
          "offset": 38,
          "length": 100
        },
        {
          "id": "d3dc577b4ffd38cc4b32122cabf8655a0223ed22edfd93b353dc0c3f2b0fdf66",
          "offset": 150,
          "length": 123
        }
      ]
    }, [...]
  ]
}
Cette page vous a été utile?
0 / 5 - 0 notes