Cómo desfragmentar en linux

Cómo desfragmentar en linux.

Me sorprendo con las afirmaciones que veo en otros sitios, en ellas se asegura que en linux no es necesario desfragmentar.

Estas equivocado amigo, en linux también puede ser necesario desfragmentar un disco. Lo que pasa es que los sistemas de archivos linux periodizan mucho mejor los archivos que otros sistemas, por ejemplo que windows.

En sistemas Fat y Fat32 los archivos se van acoplando correlativamente (uno detrás de otro), el efecto negativo es, que cuando (ejemplo) subes un archivo a una carpeta ya creada, también lo inserta correlativamente sea cual sea el anterior archivo.

En los sistemas de archivos NTFS este efecto se intento corregir, logrando una pequeña mejora aun insuficiente. Los sistemas de archivos linux como EXT2,3 y 4, JFS, ZFS, XFS, ReiserFS y BTRFS, tratan los archivos de otra forma, digamos que dejan más espacio en blanco para que puedas subir archivos y no tengas problemas de fragmentanción.

El porqué y el cómo, es algo más complejo y largo de explicar pero con la siguiente imagen te puedes hacer una idea de como tratan los archivos los diferentes sistemas.

Desfragmentar en linux

Desfragmentar en linux – Sistemas de archivos

En discos hdd no muy grandes o en maquinas un poco más antiguas es altamente recomendable desfragmentar el disco, no con tanta frecuencia como en Windows pero si cuando notes que la carga de archivos demora demasiado. En este articulo vemos como desfragmentar un disco en linux de forma segura.

 

Cómo desfragmentar en linux

Existen herramientas como e2fsprogs o fsck, pero no las recomiendo (tienes que desmontar el disco). Yo te propongo un script perl que funciona realmente bien, ofreciendo unos resultados espectaculares.

Creamos el script.

sudo nano desfrag.pl

Copia y pega el script.
#!/bin/perl
# 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 "Generando la lista de archivos..."

#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 - Reordenando archivos con tamaño de $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 "\nDesfragmentacion concluida"

rm -f dirlist

 

Guarda el archivo y cierra el editor nano.

El script necesita permisos para ejecutarse, se los concedemos.

chmod u+x desfrag.pl

Llego el momento de ejecutarlo. El script desfragmentador permite desfragmentar todo el disco sin tener que desmontarlo, pero no es necesario. Cuando trabajamos en linux lo hacemos sobre /HOME, y eso es lo que debes desfragmentar.

Ejecuta el siguiente comando.

sudo ./desfrag.pl /home

El proceso comenzara a listar los archivos a reordenar, se paciente.
Inicio de la desfragmentacion en linux

Inicio de la desfragmentacion en linux

Dependiendo del tamaño del disco y de tu sistema, el tiempo del proceso puede variar.

La desfragmentacion del disco a terminado

La desfragmentacion del disco a terminado

 

Nota final:

Es importante que una vez comience la desfragmentación cierres todas las ventanas y aplicaciones del sistema, no lo toques hasta que termine el proceso, déjalo trabajar.

Este script es super recomendado para los que hacen un uso intensivo de las descargas (por ejemplo torrent), bajan de la red una gran cantidad de datos y también los borran.

Una vez termine el proceso de desfragmentación debes reiniciar el sistema, no te preocupes el script no a borrado nada, solo lo cambio de sitio (aun así, debes tener una copia de seguridad). Al reiniciar el sistema notaras enseguida que tu linux corre más ligero.

En algunos sistemas puede aparecer un aviso de error en la linea 26 y 27, no te preocupes no pasa nada, es porque no hemos definido el tamaño de los archivos. El script continuara su proceso sin la intervención del usuario.

 

Canales de Telegram: Canal SoloLinux – Canal SoloWordpress

Espero que este articulo te sea de utilidad, puedes ayudarnos a mantener el servidor con una donación (paypal), o también colaborar con el simple gesto de compartir nuestros artículos en tu sitio web, blog, foro o redes sociales.

 

24 Comentarios

  1. Gorka
    19/01/2020
    • Sergio G.B.
      19/01/2020
  2. Marc
    19/01/2020
    • Sergio G.B.
      19/01/2020
      • Jose Luis G.
        19/01/2020
  3. Gorka
    19/01/2020
    • Sergio G.B.
      19/01/2020
  4. Henry
    19/01/2020
  5. Miguelcm
    19/01/2020
    • Sergio G.B.
      20/01/2020
  6. Héctor R. Ramírez S.
    21/01/2020
  7. Henry
    21/01/2020
    • Sergio G.B.
      22/01/2020
  8. Marc
    22/01/2020
  9. Ramon Bueno
    27/01/2020
    • Sergio G.B.
      27/01/2020
  10. Ramon Bueno
    27/01/2020
    • Sergio G.B.
      27/01/2020
      • Sergio G.B.
        27/01/2020
  11. Manolo
    11/03/2020
    • Sergio G.B.
      11/03/2020
  12. El Loco QFB
    31/05/2020
  13. marc
    01/06/2020
    • DaniX
      02/06/2020

Agregar comentario