PDA

Ver la Versión Completa : Script para desfragmentar el disco duro



soyasi
21-may-2013, 03:00
Ya se que el foro no es un blog, pero me han parecido de utilidad, si incumplo pues a la hoguera!!

Navegando por la red me he encontrado con estos dos scripts para desfragmentar los disco duros en Linux y la curiosidad me picó, los baje y los ejecuté.

fragmentacion.pl (http://forums.gentoo.org/viewtopic-p-3111409-highlight-.html#3111409)


#!/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");

desfragmentacion.pl (http://ck.kolivas.org/apps/defrag/)


#!/bin/bash
# defrag v0.08 by Con Kolivas <kernel@kolivas.org
# Braindead fs-agnostic defrag to rewrite files in order largest to smallest
# Run this in the directory you want all the files and subdirectories to be
# reordered. It will only affect one partition. It works best when run twice.
# Are you really crazy enough to be using this? It might blow your data
# into tiny little useless chunks.


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


cuando los bajemos hay que darles permisos:

chmod u+x fragmentacion.pl
chmod u+x desfragmentacion.pl

se ejecutan con:

sudo ./fragmentacion.pl /home
sudo ./desfragmentacion.pl /home

Dejo mis resultados:


./fragmentation.pl /home/
0.900713642347398% non contiguous files, 1.03784729439479 average fragments.



./desfragmentacion.pl /home/
Creating list of files...
5 files will be reordered

0 files left
Succeeded

La verdad es que nunca se me hubiera ocurrido pensar en una "desfragmentación" de los disco en Linux, pero al menos ahora se que es posible, aunque no sea necesaria.

karlggest
21-may-2013, 04:45
man e4defrag
man xfs_fsr

Salud!!

DiabloRojo
21-may-2013, 21:23
Ya se que el foro no es un blog, pero me han parecido de utilidad, si incumplo pues a la hoguera!!Pues te debería echarte a la hoguera por no citar la fuente donde has copiado esos scripts, copion. :D

Tripanarium
22-may-2013, 13:48
:confused: Me has pillado desprevenido! Pensaba que eso era cosa de NTFS o FAT... Gracias por compartir! :aplausos:
Saludos!

xisco
23-may-2013, 12:07
hola,
yo siempre he oido que en linux no se produce desfragmentacion por como esta diseñado el sistema de ficheros, aunque algo de debe producir se supone minima.

Salu2

karlggest
23-may-2013, 15:26
hola,
yo siempre he oido que en linux no se produce desfragmentacion por como esta diseñado el sistema de ficheros, aunque algo de debe producir se supone minima.

Salu2
Bien, en primer lugar no es lo mismo reiserfs que ext4 que xfs... en segundo lugar, la fragmentación siempre ha de existir (imagínate que tienes un archivo de un "giga" y borras parte de él ;) ) y en tercer lugar que la fragmentación, si existe, impacta de forma distinta en unos y otros sistemas.

Así que si estás en el improbable caso de tener un sistema de ficheros muy fragmentado, pues ya sabes, defragméntalo; y a diferencia de otros, lo cierto es que la mayoría de usuarios de GNU/Linux bien puedan pasarse años sin que les afecte demasiado. Y es que, como he dicho antes, hay herramientas para esto en la propia distribución.

Salud!!