btrfs filesystem defragment tut nix


  • Gesperrt

    Nabend,

    ich habe noch eine HDD mit Btrfs, und die soll man ja hin und wieder defragmentieren...

    Also habe ich mir ein Python-Script geschrieben, um Dateien zu defragmentieren, die mehr als 2 Fragmente haben und kleiner als 1,5 GiB sind...

    Das Problem ist, wenn ich das Script zweimal starte, werden immer noch dieselben Dateien für die Defragmentierung angezeigt... Kann das mal bitte jemand testen, ob das bei ihr/ihm auch so ist? Oder was ich übersehen habe? 😞 Danke.

    import os
    import re
    
    sizeLimit = 1024*1024*1500
    
    a = []
    s = os.popen('find . -type f -exec filefrag {} +').read()
    for l in s.splitlines():
        f = re.findall('(.+): (\\d+) extent', l)[0]
        if (len(f) == 2):
            a.append([f[0], int(f[1]), os.path.getsize(f[0])])
        else:
            print(l, f)
    
    a.sort(key=lambda x: x[2], reverse=True)
    a.sort(key=lambda x: x[1], reverse=True)
    
    toDefrag = []
    notToDefrag = []
    for x in a:
        if (x[1] >= 3 and x[2] <= sizeLimit):
            toDefrag.append(x)
        else:
            notToDefrag.append(x)
    
    #print('NOT to defrag:')
    #for x in notToDefrag:
    #    print(x)
    #print()
    
    print('TO DEFRAG:')
    for x in toDefrag:
        print(x)
    print()
    
    print('Start defrag...')
    for x in toDefrag:
        os.system('btrfs filesystem defragment -vf "{}"'.format(x[0]))
    print()
    
    

  • Gesperrt

    Hmmmmmm, das hat sich schon erledigt... mein Script ist fehlerfrei.

    Ich habe mit fragview mal nachgeschaut, was da los ist ( https://aur.archlinux.org/packages/fragview-git ), und die meisten Dateien haben bereits eine Severity von 1,0... das heißt, es ist gar keine Defragmentierung notwendig, auch wenn filefrag mehr als 1 Extends zurück gibt...

    Das muss ich nicht verstehen, ist aber so. 🧐



  • Nutz doch mal deinen IQ von 140-160 den du hier so gerne zur schau stellst, um herauszufinden was die default size eines extents tatsaechlich ist...


  • Gesperrt

    Hmmmm, was ist sie denn eigentlich, der Extents-Wert? Und wie berechnet fragview die Severity? Hat filefrag vielleicht noch andere Ausgabenmöglichkeiten, die ich noch nicht kenne?

    Es ist jetzt schon ein paar mal vorgekommen, dass sich der Extents-Wert nach Defragmentierung von zum Beispiel 14 auf 15 geändert hat...

    Btw.: Auch mit einem hohen IQ kann man nicht Gedanken lesen. 😉



  • Falls der sarkasmus nicht durchgekommen ist, du schaffst es ja nichtmal ne manpage zu lesen, was fuer FS geschichten schon massiv von vorteil waere.


  • Gesperrt

    Dieser Beitrag wurde gelöscht!

  • Gesperrt

    So... mit ext4 ist das wesentlich angenehmer, und filefrag kann nicht das, was ich möchte...

    Ich hab das also neugeschrieben:

    import os
    import re
    
    sizeLimit = 1024*1024*1024 * 1000 # Just a test
    
    a = []
    s = os.popen('find . -type f -exec e4defrag -c {} +').read()
    c = re.compile('<File>\s+now/best\s+size/ext\s+(\S+)\s+(\d+|\-)/(\d+|\-)\s+\-\s+Done\.', re.MULTILINE)
    f = c.findall(s)
    for l in f:
        if l[2] == '-':
            a.append([l[0], int(l[1]), int(l[1]), os.path.getsize(l[0])])
        else:
            a.append([l[0], int(l[1]), int(l[2]), os.path.getsize(l[0])])
    
    a.sort(key=lambda x: x[3], reverse=True)
    a.sort(key=lambda x: x[1], reverse=True)
    
    toDefrag = []
    notToDefrag = []
    for x in a:
        if (x[1] >= 2 and x[1] > x[2] and x[3] <= sizeLimit):
            toDefrag.append(x)
        else:
            notToDefrag.append(x)
    
    #print('NOT to defrag:')
    #for x in notToDefrag:
    #    print(x)
    #print()
    
    print('TO DEFRAG:')
    for x in toDefrag:
        print(x)
    print()
    
    print('Start defrag...')
    for x in toDefrag:
        os.system('e4defrag -v "{}"'.format(x[0]))
    print()
    
    

    Ihr könnt das gerne mal ausprobieren - bei mir sind gerade keine Dateien defragmentiert.

    @Cardiac Deine Antworten sind nicht nützlich.


  • Gesperrt

    @EinNutzer0 sagte in btrfs filesystem defragment tut nix:

    \-

    ups, das ist/war etwas zu streng, denn:

    https://regex101.com/r/Tii8DE/1

    .def würde dann nicht gematched werden...

    Besser wäre ein Lookaround (negative Lookahead) (weil ich nicht weiß, was genau bei size/ext stehen könnte):

    <File>\s+now/best\s+size/ext\s+(\S+)\s+(\d+|\-)/(\d+|\-)\s+(?!Done\.).


  • Gesperrt

    Arrrr, Sorry für das ganze Hin und Her... Noch besser als ein negative Lookahead wäre ein schlichter .:

    <File>\s+now/best\s+size/ext\s+(\S+)\s+(\d+|\-)/(\d+|\-)\s+.+\s+Done\.

    (und sorry, dass das hier in eine offtopic Regex-Diskussion abdriftete...)


Anmelden zum Antworten