URL: https://linuxfr.org/users/pied/journaux/defragmenter-une-partition-fat32-sous-linux Title: Défragmenter une partition FAT32 sous Linux ... Authors: Pinaraf Date: 2018年05月09日T13:15:06+02:00 License: CC By-SA Tags: fat, fragmentation, utilitaire et python Score: 28 Ho putain ce titre de journal, bienvenue dans les années 90 ! Le FAT32 reste, pour notre plus grand malheur, le seul format dont on soit à peu près sûr qu'il soit entièrement utilisable partout. J'utilise donc ce format pour stocker sur clé USB ma collection musicale afin d'en profiter en voiture. Mais ma voiture semblait bouder certains morceaux, de manière reproductible, sans que je ne comprenne le problème : on entendait une saccade 3, 4, 10 fois sur certains fichiers. TRÈS désagréable. Je supputais un problème avec certains codecs (j'ai du flac et du vorbis, qui sont rarement testés par les fabricants). Mais une idée m'est venue : et s'il s'agissait de fragmentation et que le lecteur de la voiture ne pré-chargeait pas correctement le fichier, provoquant donc des saccades ensuite à la lecture ? Je souffre déjà de problèmes similaires sur un disque dur avec des vidéos en HD ou en UHD, il faut réduire au maximum le nombre d'extent pour que la lecture ne soit pas saccadée... Se peut-il ? ## 0) Rappel sur ce qu'est la fragmentation ## La fragmentation, c'est stocker un fichier en plusieurs parties sur le disque dur au lieu d'un ensemble contigu de blocs. Elle se produit quand un disque devient trop rempli, ou quand le système de fichiers est mal ficelé et ne gère pas correctement certaines opérations. ## 1) Les outils pour gérer la fragmentation sous linux ## C'est simple, y'a pas grand monde... Pour vérifier l'état de fragmentation, il y a ```filefrag```, du paquet e2fsprogs, qui marche pour la plupart des systèmes de fichiers. Et il y a les outils spécifiques à certains systèmes de fichier, ```btrfs filesystem defragment``` par exemple. Et c'est tout. Tristesse ## 2) Comment corriger... ## Ma clé USB a beaucoup de place libre. La fragmentation a du se produire lors de l'import de la collection musicale (j'avais copié jusqu'à 3 dossiers en parallèle). Donc a priori une simple copie de chaque fichier devrait être suffisante en FAT32 (il ne fait pas de copy-on-write...) Mais j'ai une centaine de fichiers à corriger, dans une grand arborescence... Donc scriptons ! ```py #!/usr/bin/env python3 from pathlib import Path import re import shutil import subprocess import sys # /my/beautiful/path/filename: 42 extents found ffrag_re = re.compile(r".*: (\d+) extents? found$") FRAGMENT_LIMIT = 5 def get_fragments_count(file_path): f_frag = subprocess.check_output(["filefrag", file_path.as_posix()]) m = ffrag_re.match(f_frag.decode('utf-8')) assert(m is not None) return int(m.group(1)) def defrag(file_path): temp_file = Path(file_path.with_name(file_path.name + '.new')) shutil.copy(file_path, temp_file) new_frags = get_fragments_count(temp_file) if new_frags> FRAGMENT_LIMIT: print("New file %s still has too many fragments - %s", (temp_file.as_posix(), new_frags)) temp_file.unlink() else: file_path.unlink() temp_file.rename(file_path) print("New file has %s fragments" % new_frags) def check_folder(folder, recurse = True): for item in folder.iterdir(): if recurse and item.is_dir(): check_folder(item) else: frags = get_fragments_count(item) if frags> FRAGMENT_LIMIT: print("File %s: TO DEFRAG - %s" % (item.as_posix(), frags)) defrag(item) else: #print("File %s: OK" % item.as_posix()) pass if __name__ == "__main__": if len(sys.argv) != 2: sys.exit(1) folder = Path(sys.argv[1]) check_folder(folder) ``` Ce script est assez basique, je vous laisse rajouter l'aide, le decorum usuel... En gros, on le lance en donnant en paramètre le dossier à défragmenter, il va interroger filefrag pour chaque fichier de chaque dossier récursivement, et si ce fichier a plus de 5 fragments (valeur obtenue par le lancer d'un dé), alors on fait une copie du fichier et l'on écrase l'original. Cela a pour effet de forcer le noyau à créer un nouveau fichier qui ne sera pas fragmenté... Exemple de sortie : ``` File /media/snoopy/KINGSTON/Renaud/A la Belle de Mai/07 - Le petit chat est mort.mp3: TO DEFRAG - 108 New file has 1 fragments File /media/snoopy/KINGSTON/Celtas Cortos - Vamos!/02 - 20 de Abril.flac: TO DEFRAG - 166 New file has 1 fragments ``` Maintenant il n'y a plus qu'à attendre et écouter, j'espère que le problème ne se produira plus, je déteste qu'on abîme ma musique. Et n'hésitez pas à reprendre ce script, l'améliorer, en faire des papillotes ou des tee-shirts ou que sais-je ! :)

AltStyle によって変換されたページ (->オリジナル) /