Hyperspace : l’app Mac qui économise de l’espace disque sans supprimer de fichiers
(hypercritical.co)- Sur Mac, le nettoyage des fichiers en double suppose généralement leur suppression, mais Hyperspace utilise des clones APFS pour faire partager les fichiers identiques et récupérer de l’espace sans les effacer
- Les clones copy-on-write d’APFS, comme avec la commande « Duplicate » du Finder, partagent les données avec l’original au lieu de les réécrire, ce qui permet de dupliquer de très gros fichiers presque instantanément
- Lorsque le disque du développeur a commencé à se remplir, il a créé un script Perl pour repérer les fichiers au contenu identique mais non clonés, et l’espace récupérable s’est révélé atteindre des dizaines de Go, ce qui a conduit à la création de l’app
- L’app peut être téléchargée gratuitement pour lancer un scan et voir l’espace pouvant être économisé, mais la récupération réelle de cet espace nécessite un paiement
- Comme elle modifie des fichiers qu’elle n’a ni créés ni possédés, elle comporte un risque élevé, mais pourrait malgré tout apporter une aide concrète à de nombreux utilisateurs de Mac
Récupérer de l’espace sans supprimer de fichiers grâce aux clones APFS
- Hyperspace transforme en clones APFS les fichiers au contenu identique qui ne sont pas déjà en relation de clonage, afin qu’ils partagent une seule copie des données sur le disque
- Les apps Mac classiques de recherche de doublons économisent généralement de l’espace en trouvant puis en supprimant les fichiers en double, alors que Hyperspace récupère de l’espace sans retirer les fichiers
- Parmi les fonctions clés d’APFS figurent les instantanés ponctuels et les clones copy-on-write
- Les instantanés servent à rendre les sauvegardes Time Machine plus fiables et plus efficaces
- Les clones copy-on-write reposent sur une structure souple séparant les entrées de répertoire du contenu des fichiers
- Quand on duplique un fichier avec la commande « Duplicate » dans le Finder, le contenu réel n’est pas recopié : un fichier clone est créé et partage les données avec l’original
- Grâce à cette structure, la duplication dans le Finder se termine presque instantanément, quelle que soit la taille du fichier
Lancement et notes de développement
- Fin 2024, alors que le disque de son Mac se remplissait, le développeur a écrit un script Perl pour trouver les fichiers non clonés ayant le même contenu et les convertir en clones
- Ce script appelle un outil en ligne de commande écrit en C ainsi qu’un autre écrit en Swift
- À l’exécution, l’espace économisable s’est élevé à des dizaines de Go, et le projet a ensuite évolué en app Mac
- Hyperspace est proposé sur le Mac App Store
- Le téléchargement et le scan sont gratuits
- La récupération effective d’espace nécessite un achat intégré
- Plus de détails sont disponibles dans la documentation Hyperspace
- Du point de vue du développement, Hyperspace est la deuxième app Mac en SwiftUI du développeur, et sa première à utiliser le cycle de vie SwiftUI
- C’est aussi sa deuxième app utilisant Swift 6
- Utiliser Swift 6 dès le début du développement a été bien plus simple que de migrer une app déjà publiée vers Swift 6
- Swift 6 comporte encore de nombreuses aspérités, et des améliorations sont attendues à l’avenir
- Comme lors d’une conversion de HFS+ vers APFS, Hyperspace modifie des fichiers que l’app n’a ni créés ni possédés
- Le développeur la décrit comme l’app la plus risquée qu’il ait jamais créée
- Mais il estime aussi qu’elle pourrait être l’une des plus utiles au plus grand nombre
1 commentaires
Avis sur Hacker News
J’avais créé il y a quelque temps un utilitaire en ligne de commande,
dedup, qui fait la même choseIl a un mode dry-run, choisit « intelligemment » la meilleure source de clone, comprend les liens durs et les autres clones, préserve les métadonnées et gère correctement les fichiers compressés HFS
Il n’a encore jamais corrompu mes données, mais comme toujours avec les outils de système de fichiers, vous l’utilisez à vos propres risques
0 - https://github.com/ttkb-oss/dedup
Hyperspace ne scanne pas tous les fichiers par défaut : il ne regarde que ceux figurant sur une liste d’autorisation, et semble conçu pour devoir comprendre le contenu des fichiers. En tant qu’utilisateur final, je ne vois pas comment il distingue les fichiers texte des fichiers de code source ; le scan par défaut n’a trouvé que 360 Mo déduplicables, mais en autorisant tous les fichiers, ce chiffre est monté à 842 Mo
Par défaut, il ne scanne pas non plus les fichiers de moins de 100 Ko ; en désactivant la limite de taille et en autorisant tous les fichiers, on monte à 1,1 Go. Avec tous les fichiers et sans limite de taille, Hyperspace a scanné 67 309 fichiers sur 68 874, tandis que
dedupen a scanné 67 426Hyperspace a indiqué que 29 522 fichiers pouvaient être dédupliqués, et
dedupen a trouvé 29 447. Il y a une différence d’un fichier puisque 76 fichiers étaient déjà dédupliqués, mais je n’en connais pas la cause exacteLe temps de scan était d’environ 50 secondes pour Hyperspace, contre 14 secondes pour
dedup. Hyperspace semble scanner le système de fichiers, puis calculer les doublons, puis effectuer la déduplication ; je ne comprends pas pourquoi il ne regroupe pas les deux premières étapes. De mon côté, je mets les métadonnées du système de fichiers en file pendant le scan et je lance le calcul des doublons en parallèle ; la plupart des divergences peuvent être éliminées uniquement avec l’information de taille obtenue « gratuitement » lors du parcours des répertoires avecfts_readHyperspace annonçait 1,1 Go économisables, tandis que
dedupa trouvé 1,04 Go, plus 882 Mo déjà économisés. Je n’ai pas l’intention d’acheter Hyperspace, donc je ne sais pas ce qu’il en est du temps réel de déduplication, de la préservation des métadonnées ni de la gestion des fichiers atypiques, maisdedupa pris 31 secondes au total pour scanner et dédupliquerAprès une déduplication avec
dedup, Hyperscan estime encore qu’il reste 2 fichiers déduplicables. Hyperspace semble aussi gérer les fichiers avec plusieurs liens durs, les fichiers vides et plusieurs cas particuliers quededupvérifie. Je ne peux pas tester la préservation des ACL ou d’autres attributs sans payer, mais d’aprèsstrings, cela semble pris en charge ; la compression HFS étant un cas limite délicat, je n’ai pas encore vérifié comment le scan d’Hyperspace la traiteComme le projet n’a pas de licence, ce serait bien d’en ajouter une de votre choix si possible. J’ai aussi ouvert une pull request pour essayer d’améliorer un peu les étapes d’installation : https://github.com/ttkb-oss/dedup/pull/6
Même en ne regardant que certains sous-répertoires, il n’était pas rare de remplacer 50 copies d’un même fichier JS par une seule. Cela dit, comme c’est une « pre-release » et que le dépôt GitHub a encore assez peu d’étoiles, je m’interroge sur sa stabilité : avec ce genre d’outil, les bugs peuvent faire assez peur
makese termine presque instantanément est aussi impressionnantJ’ai utilisé https://github.com/sahib/rmlint par le passé et je n’avais pas vraiment de reproches à lui faire
En lisant le passage disant qu’« Hyperspace n’a aucun moyen de coopérer avec toutes les autres apps ni avec macOS lui-même pour coordonner le moment où le remplacement de fichiers est sûr, ni aucun moyen de prendre de force le contrôle exclusif de ces fichiers », je me demande pourquoi le système de fichiers lui-même ne lance pas en arrière-plan un processus de déduplication similaire
À ce niveau d’abstraction, on pourrait penser que ce genre de problème de sûreté est gérable ; je me demande donc quels seraient les inconvénients si cela se faisait automatiquement à l’intérieur d’APFS
Une implémentation au niveau des fichiers pourrait réduire l’utilisation des ressources, mais je ne sais pas si elle serait plus simple ou plus complexe. Et le fait que, dans un gros fichier, modifier un seul octet obligerait le système de fichiers à recopier ce fichier, générant beaucoup d’activité disque, n’est pas forcément intuitif
Faire la déduplication à cette couche est intéressant, car elle peut alors s’appliquer à plusieurs systèmes de fichiers. Par exemple, si l’on a mille systèmes contenant les mêmes fichiers d’OS, on peut économiser énormément d’espace, les différences se limitant souvent à des réglages propres à chaque système, comme la clé d’hôte ou le nom d’hôte. Un système de fichiers isolé ne peut pas repérer cette similarité
En revanche, cela pose problème si la déduplication réduit le nombre de copies d’un fichier très sollicité. Dans l’exemple précédent, si les mille machines démarrent en même temps, l’image du noyau peut subir une énorme charge d’I/O
On demande poliment au système d’exploitation de dédupliquer un ensemble de plages donné ; l’OS verrouille les plages, vérifie qu’elles sont réellement identiques, puis seulement effectue la déduplication. Comme un champ indique aussi combien d’octets ont été dédupliqués dans chaque plage, un programme en espace utilisateur n’a aucun moyen de corrompre les fichiers
Je l’ai beaucoup utilisée avec ReFS pour des VM Hyper-V, et l’effet était impressionnant. À l’époque, il s’agissait surtout de VM mêlant Windows Server 2016/2019, et l’utilisation du stockage avait diminué d’environ 45 %
J’aime bien le modèle qui consiste à scanner gratuitement pour voir s’il y a un gain, puis à ne payer que pour le résultat réel
Comme j’ai aussi tendance à accumuler les fichiers, je l’ai lancé et il m’a indiqué 7 Go récupérables, mais pour moi ce n’était pas assez pour justifier de payer. Cela dit, c’est bien que ce genre d’outil existe
Après tout, combien de doublons parfaitement identiques peut-on créer par erreur en un mois ?
Il existe aussi un abonnement ou une option d’achat définitif pour ceux qui l’utiliseront souvent, mais pour beaucoup de gens, un achat intégré ponctuel donnant accès pendant une période limitée est assez raisonnable. Et on peut toujours le relancer gratuitement pour voir si assez de doublons se sont accumulés pour payer à nouveau
Je n’en crée pas des quantités énormes, mais certains doublons, partiels ou complets, peuvent devenir gros une fois réunis. Cela arrive souvent dans des situations un peu étranges, quand il faut rapprocher le résultat d’une récupération de disque dur avec des fichiers situés ailleurs, ou aligner un dossier Téléchargements en désordre avec une destination bien organisée
Par exemple, une sauvegarde Time Machine a un jour fait ressortir d’anciennes versions de fichiers dont je ne savais même pas avoir gardé la trace et que je pensais perdus depuis longtemps, mais elle avait abîmé les noms de répertoires et quelque peu obscurci le contenu. Il y avait des milliers de répertoires aux noms numériques, pouvant contenir des fichiers que je voulais conserver, sans structure permettant de savoir si je les avais déjà ni où ils se trouvaient. À l’inverse, beaucoup ne contenaient qu’un seul fichier texte de build system identique, que je pouvais évidemment jeter
Les gens sont-ils déjà tellement habitués aux pièges des abonnements que cela leur semble être un nouveau modèle ?
J’aimerais que ce soit aussi facile à appliquer à d’autres logiciels, mais en général, la courbe d’apprentissage bloque avant même qu’on en perçoive la valeur
Petite astuce : pour ce genre d’essai, utiliser une carte virtuelle que l’on peut verrouiller permet de bloquer le paiement si l’on oublie d’annuler. Mais je me demande si quelqu’un a trouvé le vrai prix de la licence sur le site web
Je me demande quel algorithme l’app utilise pour déterminer si deux fichiers sont identiques
Il existe beaucoup de méthodes intéressantes, comme les hachages ou la comparaison bit à bit, mais chacune a ses inconvénients. Quelle est la meilleure approche quand il y a énormément de fichiers ?
Pour chaque fichier candidat, il faut une « clé » permettant de savoir s’il est identique à un autre candidat. Comme il peut y avoir des millions de fichiers, cette clé doit être petite et rapide à générer, tout en évitant les faux positifs
Aujourd’hui, la réponse évidente est un hachage SHA256 du contenu du fichier. C’est très rapide, la taille de 32 octets n’est pas énorme, et la probabilité de faux positif ou de collision est si faible que le monde aura probablement pris fin avant qu’on y soit confronté. SHA256 est de fait le standard pour ce type d’usage ; je serais donc assez surpris qu’il ait choisi autre chose
C’était un système de fichiers à adressage par contenu utilisant des hachages pour la déduplication, et comme le hachage était calculé au moment de l’écriture, le coût en performance était réparti
Ainsi, pas besoin de hacher entièrement les gros fichiers ; seuls les fichiers ayant le même hachage seraient examinés davantage
Apple fournit aussi une version modifiée de la commande
cpprenant en charge le flag-cpour utiliser la fonction de clonage d’APFScputilisée ne le prend pas en charge, on peut aussi l’appeler depuis PythonPar exemple avec quelque chose comme
import Foundation; Foundation.NSFileManager.defaultManager().copyItemAtPath_toPath_error_(...)Si le fichier A se trouve à deux emplacements et que, après avoir lancé ça, on modifie
A_0, je me demande siA_1change aussi, ou si seul le nouvel état deA_0est matérialisé tandis queA_1reste tel quel.Quand on modifie
A_0, une copie de ce fichier est créée au moment de l’écriture, etA_1n’est pas touché.https://en.wikipedia.org/wiki/Copy-on-write#In_computer_stor...
Donc
A_1est laissé tel quel, et une nouvelle copie est créée pour les modifications deA_0. Pour plus de détails, voir https://developer.apple.com/documentation/foundation/file_sy...Un passage m’a frappé : avant qu’Apple n’annonce APFS à la WWDC 2017, dans le cadre d’une mise à jour iOS 10.x, ils auraient secrètement converti tous les iPhone vers APFS à titre de test, puis les auraient ramenés à HFS+.
Je me demande comment on peut revenir en arrière quand un changement de système de fichiers se passe mal. On peut certes valider le code suffisamment, mais s’il y a un problème, ça semble impossible à retirer.
Lors de la migration de test d’Apple, ils ont effectué toute la migration, y compris la création du superbloc APFS, mais se sont arrêtés juste avant le commit qui remplaçait définitivement le superbloc HFS+ par le superbloc APFS. Pour revenir en arrière, il suffisait de « simplement » nettoyer le superbloc APFS et les blocs de métadonnées créés.
Ayant déjà cassé pas mal de choses en production, je ne sais pas si j’oserais appuyer sur le bouton si on me demandait de lancer une migration aussi énorme.
[0] https://www.youtube.com/watch?v=IcyaadNy9Jk&t=1670s
Dans le monde open source aussi, il existe un outil qui convertit un système de fichiers ext en btrfs, et (1) c’est réversible et (2) on peut aussi monter le système de fichiers ext d’origine pendant qu’on utilise le système de fichiers btrfs.
Ça commence par une histoire, ça resserre ensuite sur le problème, puis ça montre la solution en train de résoudre ce problème comme par magie.
C’est un très bon exemple de excellent marketing.
Je l’ai essayé sur un énorme dossier de projet NodeJS, mais il indiquait ne pouvoir économiser que 1 Go sur un dossier de 8,1 Go.
Je l’ai relancé en incluant aussi le dossier personnel de l’utilisateur, et au total, sur 731 k fichiers, 127 k dossiers et 2 755 fichiers ciblés, l’économie n’était que de 1,3 Go. Soit seulement 300 Mo de plus que lorsque je l’avais lancé sur le seul dossier NodeJS.
J’ai aussi essayé de scanner System et Library, mais ça a été refusé à cause de problèmes de permissions. Comme j’utilise pnpm comme gestionnaire de paquets, l’utilisation du disque est probablement déjà presque optimale.
L’idée est sympa, mais au prix actuel, c’est difficile à justifier ; ce serait mieux sous forme de processus en arrière-plan lancé environ une fois par mois.
https://support.apple.com/guide/security/signed-system-volum...
Elle semble avoir été introduite pour réduire le tampon de comparaison, mais il est possible que les fichiers de node_modules soient en dessous de cette taille et n’aient donc pas été pris en compte.
J’avais déjà créé un script similaire, mais plus simple, qui remplaçait les fichiers ayant le même contenu par des liens physiques.
Ma motivation principale venait des paquets dans les environnements virtuels Python. On installe souvent des paquets similaires, et même lorsque les versions diffèrent, beaucoup de fichiers restent identiques. Certains paquets comme Numpy, PyTorch ou TensorFlow sont assez énormes, donc cela permettait d’économiser beaucoup d’espace disque.
https://github.com/albertz/system-tools/blob/master/bin/merg...
[1] https://en.wikipedia.org/wiki/Apple_File_System#Clones
Je suppose que d’autres outils comme poetry, hatch ou pdm le font aussi, mais je les ai moins utilisés, donc je ne connais pas très bien les détails de leur fonctionnement.