Fragmentar y desfragmentar un HDD en Linux

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.

Fragmentar y desfragmentar un HDD en Linux 1

 

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.

Una respuesta

  1. Suso
    29/03/2018

Agregar comentario