btrfs filesystem defragment tut nix
-
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()
-
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 wennfilefrag
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...
-
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.
-
Dieser Beitrag wurde gelöscht!
-
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.
-
@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\.)
.
-
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...)