Fragmentar y desfragmentar un HDD en linux, no es algo tan extraño. De todos es sabido… que por el sistema inteligente de manejo de datos en linux (ZFS, EXT, JFS, XFS, ReiserFS, Btrfs, etc…), no siempre es necesario. Pero debes saber, que aunque no es necesario, si es recomendable realizar estas operaciones de vez en cuando, sobre todo si tienes un PC, un tanto antiguo. Notaras una mejoría significativa en el rendimiento del sistema.
Existe un comando para desfragmentar:
sudo e4defrag /dev/sda*
personalmente no me convence el resultado, mucho mejor creando unos scripts en perl para estas operaciones.
Vamos a ello.
Fragmentar
Copiamos, pegamos y guardamos en un editor, el siguiente script perl:
#!/usr/bin/perl -w #this script search for frag on a fs use strict; #number of files my $files = 0; #number of fragment my $fragments = 0; #number of fragmented files my $fragfiles = 0; #search fs for all file open (FILES, "find " . $ARGV[0] . " -xdev -type f -print0 |"); $/ = "\0"; while (defined (my $file = <FILES>)) { open (FRAG, "-|", "filefrag", $file); my $res = <FRAG>; if ($res =~ m/.*:\s+(\d+) extents? found/) { my $fragment = $1; $fragments += $fragment; if ($fragment > 1) { $fragfiles++; } $files++; } else { print ("$res : not understand for $file.\n"); } close (FRAG); } close (FILES); print ( $fragfiles / $files * 100 . "% non contiguous files, " . $fragments / $files . " average fragments.\n");
Si quieres… lo puedes descargar directamente desde: AQUÍ.
Le damos permisos.
chmod u+x fragmentacion.pl
Lo ejecutamos…
sudo ./fragmentacion.pl /home
y a esperar.
Desfragmentar
De la misma forma que anteriormente, copiamos, pegamos y guardamos en un editor, el siguiente script perl:
#!/bin/bash # defrag hdd trap 'abort' 1 2 15 renice 19 $$ > /dev/null abort() { echo -e "\nAborting" rm -f tmpfile dirlist exit 1 } fail() { echo -e "\nFailed" abort } declare -i filesize=0 declare -i numfiles=0 #The maximum size of a file we can easily cache in ram declare -i maxsize=$((`awk '/MemTotal/ {print $2}' /proc/meminfo`*1024)) (( maxsize-= `awk '/Mapped/ {print $2}' /proc/meminfo` )) (( maxsize/= 2)) if [[ -a tmpfile || -a dirlist ]] ; then echo dirlist or tmpfile exists exit 1 fi # Sort in the following order: # 1) Depth of directory # 2) Size of directory descending # 3) Filesize descending # I made this crap up. It's completely unvalidated. echo "Creating list of files..." #stupid script to find max directory depth find -xdev -type d -printf "%d\n" | sort -n | uniq > dirlist #sort directories in descending size order cat dirlist | while read d; do find -xdev -type d -mindepth $d -maxdepth $d -printf "\"%p\"\n" | \ xargs du -bS --max-depth=0 | \ sort -k 1,1nr -k 2 |\ cut -f2 >> tmpfile if (( $? )) ; then fail fi done rm -f dirlist #sort files in descending size order cat tmpfile | while read d; do find "$d" -xdev -type f -maxdepth 1 -printf "%s\t%p\n" | \ sort -k 1,1nr | \ cut -f2 >> dirlist if (( $? )) ; then fail fi done rm -f tmpfile numfiles=`wc -l dirlist | awk '{print $1}'` echo -e "$numfiles files will be reordered\n" #copy to temp file, check the file hasn't changed and then overwrite original cat dirlist | while read i; do (( --numfiles )) if [[ ! -f $i ]]; then continue fi #We could be this paranoid but it would slow it down 1000 times #if [[ `lsof -f -- "$i"` ]]; then # echo -e "\n File $i open! Skipping" # continue #fi filesize=`find "$i" -printf "%s"` # read the file first to cache it in ram if possible if (( filesize < maxsize )) then echo -e "\r $numfiles files left \c" cat "$i" > /dev/null else echo -e "\r $numfiles files left - Reordering large file sized $filesize ... \c" fi datestamp=`find "$i" -printf "%s"` cp -a -f "$i" tmpfile if (( $? )) ; then fail fi # check the file hasn't been altered since we copied it if [[ `find "$i" -printf "%s"` != $datestamp ]] ; then continue fi mv -f tmpfile "$i" if (( $? )) ; then fail fi done echo -e "\nSucceeded" rm -f dirlist
Si quieres… lo puedes descargar directamente desde: AQUÍ.
Le damos permisos.
chmod u+x desfragmentacion.pl
Lo ejecutamos…
sudo ./desfragmentacion.pl /home
y a esperar.
Una vez terminen los dos scripts, reinicia el sistema. Veras como notas una diferencia que puede ser considerable.
Nota: dependiendo del tamaño de tus discos y de la cantidad de archivos, el proceso puede ser más largo o menos.
Buen aporte, funciona a la perfección.