Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/05/2008, à 13:03

pnprog

Défragmenteur naïf

Bonjour à tous !
J'ai réalisé un petit script bash qui permet de défragmenter ses dossiers sur une partition ext3.
En fait, il ne défragmente pas, il duplique/supprime/recrée les fichiers qui sont fragmentés. Autrement dit, il aide ext3 à "s'auto-défragmenter à l'usage" et c'est pour ça que je l'appelle défragmenteur naïf.

Il utilise la commande filefrag pour fonctionner. Filefrag permet de tester la fragmentation d'un fichier. Donc le script ne déplace que les fichiers fragmentés.

Voici le code du script:

#!/bin/bash
#défragmenteur naïf
#auteur: pnprog AT no-log DOT org
#fichier: n_defrag.sh
#version 0.3
#ce script est proposé sous licence GPL2 (General Public License)



########################################
############ initialisation ############
########################################

#nom d'essais par defaut
nb_max_try=10
#le fichier qui servira de buffer
buffer=$(pwd)/buffer
#le fichier de "journalisation"
current_operation=$(pwd)/current

#variables pour les statistiques
nb_fragmented_files=0
nb_files=0
nb_error_files=0
nb_undefragmentable_files=0
fbmo_sum_before=0
fbmo_sum_after=0


########################################
###### affichage du mode d'emploi ######
########################################

display_usage_and_quit()
{
	echo Usage:
	echo -e "\t$0 [-t try] directory"
	echo -e "\tAnalyse and defragment files in directory."
	echo -e "\tThe -t option indcates how many times the programme can try"
	echo -e "\tto defragment a file. Default value is 10."
	echo ""
	echo -e "\t$0 -r"
	echo -e "\tUse this option in case an analyse has been interrupted."
	exit 1
}


########################################
###### vérification des arguments ######
########################################

#répertoire à défragmenter
rep_start=""

#l'utilisateur peut lancer le mode recovery, si l'analyse a été intérompue
if let "$#==1"
then
	if [ "$1" = "-r" ] ;
	then
		#### mode recovery ####
		#on récupere le fichier en cours de l'analyse, si intérompue
		file=$(cat "$current_operation" 2>>/dev/null)
		interrupted=$?
		if [ "$interrupted" = "0" ]
		then
			#recréation du fichier
			cp -p "$buffer" "$file" 2>>/dev/null
		fi
		echo "Recovery done."
		exit 0
	else
		##### mode normal ####
		rep_start="$1"
	fi
fi

#l'utilisateur peut spécifier le nombre d'essais
if let "$#==3"
then
	if [ "$1" = "-t" ] && [ "$2" -ge 0 ] ;
	then
		#### l'utilisateur spécifie le nombre d'essais ####
		rep_start="$3"
		nb_max_try="$2"
	else
		display_usage_and_quit
	fi
fi

#nombre d'argument incohérent (0, 2, 4 ou plus)
if [ "$rep_start" = "" ]
then
	display_usage_and_quit
fi

########################################
#### vérification de filefrag et bc ####
########################################

#http://www.debian.org/doc/developers-reference/ch-best-pkging-practices.fr.html
which filefrag >> /dev/null
if [ "$?" = "1" ]
then
	echo You must install filefrag.
fi

which bc >> /dev/null
if [ "$?" = "1" ]
then
	echo You must install bc.
fi


########################################
#### vérification des droits (root) ####
########################################

UID_ROOT=0
if [ "$UID" -ne "$UID_ROOT" ]
then
	echo You must be root to run filefrag.
	exit 1
fi



########################################
############### fonctions ##############
########################################

function count_fragments
	{
	#4 cas possibles
		#chaine vide, filefrag a causé une erreur
		#file: 1 extent found
		#file: X extents found
		#file: X extents found, perfection would be 1 extent
	file=$1
	result=$(sudo filefrag "$file" 2>> /dev/null)
	if [ "$result" = "" ]
	then
		echo "-1"
	else
		result=${result#"$file":}
		result=${result%% extent*}
		echo $result
	fi
	}

function file_size
	{
	file=$1
	size=$(du -k "$file")
	size=${size%%"$file"}
	echo $size
	}

function frag_by_mo
	{
	file=$1
	nb_fragments=$(count_fragments "$file")
	size=$(file_size "$file")
	if let "$size>0"
	then
		echo "scale=2 ; 1024 * ( $nb_fragments - 1 ) / $size " | bc
	else
		echo 0
	fi
	}

one_more_analyse()
{
	file=$1
	#on compte le nombre de fragments
	nb_fragments=$(count_fragments "$file")
	if let "$nb_fragments>1"
	then
		assemble "$file"
	else
		echo -n " ok"
	fi
}

assemble()
{
	#recollage du fichier
	file=$1
	#on augmente le compteur du nombre de tentatives
	nb_try=$(($nb_try + 1))
	if let "nb_try<=nb_max_try"
	then
		#il reste des tentatives possibles
		#on copie donc le fichier dans le buffer
		cp -p "$file" "$buffer"
		#création du journal
		$(echo "$(pwd)/$file" > "$current_operation")
		#suppression du fichier original
		rm "$file"
		#recréation du fichier original grâce au buffer
		cp -p "$buffer" "$file"
		#suppression du journal
		$(rm "$current_operation")
		#suppression du buffer
		rm "$buffer"
		#remarque, on pourrait se contenter de déplacer le buffer
		#plutôt qu'en faire une copie
		#mais en cas de coupure, on garde ainsi l'orginal
		echo -n "."
		
		#on relance une alnalyse sur le fichier (récursivement)
		one_more_analyse "$1"
	else
		#on a dépassé le nombre de tentatives autorisé
		nb_undefragmentable_files=$(($nb_undefragmentable_files + 1))
		fbmo=$(frag_by_mo "$file") && fbmo_sum_after=$(echo "scale=2 ; $fbmo_sum_after + $fbmo " | bc)
		echo -n " "
		echo -n $(count_fragments "$file")
	fi
}

analyse()
{
	file=$1
	#on compte le nombre de fragments
	nb_fragments=$(count_fragments "$file")
	if let "$nb_fragments>1"
	then
		#le fichier est fragmenté
		#mise à jour des statistiques
		nb_fragmented_files=$(($nb_fragmented_files + 1))
		fbmo=$(frag_by_mo "$file") && fbmo_sum_before=$(echo "scale=2 ; $fbmo_sum_before + $fbmo " | bc)
		nb_try=0
		echo -n "$(pwd)/$file" $(count_fragments "$file") ""
		#on essaye de le recoller
		assemble "$file"
		echo ""
	elif [ "$nb_fragments" = "-1" ]
	then
		#erreur générée par filefrag
		echo Erreur: filefrag can not analyse $(pwd)/$file
		nb_error_files=$(($nb_error_files + 1))
	fi
}



analyse_only()
{
	file=$1
	#on compte le nombre de fragments
	nb_fragments=$(count_fragments "$file")
	if let "$nb_fragments>1"
	then
		#le fichier est fragmenté
		#mise à jour des statistiques
		nb_fragmented_files=$(($nb_fragmented_files + 1))
		fbm=$(frag_by_mo "$file")
		sum_fbm=$(echo "scale=2 ; $sum_fbm + $fbm " | bc)
		
		
		#echo -n "$(pwd)/$file" $(count_fragments "$file") ""

	elif [ "$nb_fragments" = "-1" ]
	then
		#erreur générée par filefrag
		#echo Erreur: filefrag can not analyse $(pwd)/$file
		nb_error_files=$(($nb_error_files + 1))
	fi
}



########################################
########## fonction principale #########
########################################

#parcours récursif des répertoires
scan()
{

	rep=$1
	#on tente de se placer dans le répertoire
	cd "$rep"
	cd_ok=$?

	if [ "$cd_ok" = "0" ]
	then
		#on est dans le répertoire
		#on liste les fichiers
		for file in *
		do
			#on evite les liens symboliques, les périfériques etc.
			if test ! -h "$file"
			then
				#si c'est un fichier, on l'analyse
				#si c'est un répertoire, on l'explore
				if test -f "$file"
				then
					nb_files=$(($nb_files + 1))
					#lancement de l'analyse
					analyse "$file"
				else
					if test -d "$file"
					then
						#exploration récursive
						scan "$file"
					fi
				fi
			fi
		done
		#le répertoire a été analysé
		#on revient au répertoire parent
		cd ..
	else
		echo Erreur: ne peut ouvrir le répertoire $(pwd)/$rep
	fi
}

#lancement
scan "$rep_start"

#affichage des statistiques
echo "Analyse results for $rep_start"

echo -n $nb_files files
if let "$nb_files>0"
then
	echo -n ": "$(echo "scale=2 ; $fbmo_sum_after / $nb_files " | bc)" f/Mo"
	echo " (before: "$(echo "scale=2 ; $fbmo_sum_before / $nb_files " | bc)" f/Mo)"
else
	echo ""
fi


if let "$nb_error_files>0"
then
	echo $nb_error_files files have not been analysed
fi



echo -n $nb_fragmented_files files were fragmented
if let "$nb_fragmented_files>0"
then
	echo ": "$(echo "scale=2 ; $fbmo_sum_before / $nb_fragmented_files " | bc)" f/Mo"
else
	echo ""
fi


echo -n $nb_undefragmentable_files files are still fragmented
if let "$nb_undefragmentable_files>0"
then
	echo ": "$(echo "scale=2 ; $fbmo_sum_after / $nb_undefragmentable_files " | bc)" f/Mo"
else
	echo ""
fi

#echo $nb_undefragmentable_files files are still fragmented: $(echo "scale=2 ; $fbmo_sum_after / $nb_undefragmentable_files " | bc) f/Mo

exit 0

Dernière modification par pnprog (Le 27/05/2008, à 17:25)

Hors ligne

#2 Le 16/05/2008, à 13:04

pnprog

Re : Défragmenteur naïf

Pour s'en servir, il faut recopier le code dans un fichier, le rendre exécutable et le lancer (dans une console) en mode administrateur en donnant en paramètre un dossier.

sudo ./n_defrag.sh ~/Documents/

Deux options sont disponibles:

-t: qui permet de spécifier le nombre d'essais pour chaque fichier. En effet, même après recopie, un fichier peut parfois être encore fragmenté. Le script recommence alors plusieurs fois jusqu'à défragmentation complète, ou jusqu'à ce que la limite -t soit atteinte. Par défaut, t vaut 10.
Utiliser -t 0 fait que le script analyse uniquement la fragmentation du dossier, et ne cherche pas à le défragmenter. Utile pour avoir une idée de la fragmentation du dossier sans prendre de risques.

sudo ./n_defrag.sh -t 20 ~/Documents/

-r: lance un mode de récupération. Si une précédente défragmentation a été interrompue, il est TRES FORTEMENT recommandé de s'en servir. Vous pourriez sinon perdre le fichier qui était en cours d'analyse.

sudo ./n_defrag.sh -r

Pendant l'analyse, vous verrez défiler les noms des fichiers fragmentés, et les tentatives successives pour les défragmenter:

/home/user/Document/monfichier1.doc 4 ... ok
/home/user/Document/monfichier2.doc 12 .......... 5

Le premier étant un fichier défragmenté avec succes, le second étant un fichier qui n'a pas pu être défragmenté. Le premier chiffre indique le nombre de fragments avant la tentative de fragmentation. Le second chiffre indique le nombre de fragment après, ok voulant dire un seul fragment. Il peut arriver que le second chiffre soit plus important que le premier, autrement dit, le fichier est alors plus fragmenté qu'au début, même si vous aviez beaucoup de place libre sur votre disque. Je ne sais pas à quoi cela est dû.

A la fin de la défragmentation, le programme affiche un petit résumé:

sudo ./n_defrag.sh ~/Documents/
[...]
Analyse results for ~/Documents/
30570 files: 0 f/Mo (before: .01 f/Mo)
2 files have not been analysed
43 files were fragmented: 9.60 f/Mo
28 files are still fragmented: 1.87 f/Mo

Les fichiers non analysés sont liés à un bug de filefrag qui plante en lisant les fichiers commençant par "-" comme par exemple "-monfichier.doc". Le créateur a dû se planter dans la manière de parser l'option "-s" du programme.

L'unité f/Mo signifie en quelque sorte "fragmentation par Mega Octet". Plus précisément, si un fichier de taille X Mo est fragmenté en N morceaux, alors la fragmentation par Mega Octet se calcule ainsi:

fragmentation par Mega Octet = (N-1)/X

Et par conséquent, un fichier non fragmenté a 0 f/Mo. Les futures versions de ce script devront permettre de fixer un seuil minimal de f/Mo au dessous duquel le script n'essaye pas de défragmenter le fichier. En effet, qu'un fichier de 700Mo (une image iso par exemple) soit fragmenté en 4 morceaux (0,004 f/Mo) n'est pas vraiment problématique, car le temps de déplacement de la tête de lecture du disque entre les morceaux sera certainement négligeable devant le temps de lecture complet des données. Donc inutile d'essayer de le défragmenter, opération lourde vu la taille du fichier, et qui peut tout simplement être impossible si il n'y a pas sur la partition 700Mo d'espace libre contigu. Par contre, on aura tout intérêt à défragmenter un fichier de 5Mo fragmenté en plus de 20 morceaux (3,8 f/Mo).


J'ai fait de mon mieux pour éviter les mauvaises surprises, il y a plein de vérifications partout. Cependant, je n'ai pas l'habitude du bash, et je suis sûr que beaucoup d'améliorations pourraient être faites, ou bien certaines parties du code ré-écrites proprement.

Je l'ai lancé sur mon répertoire racine et je n'ai pas eu de problèmes, mais je ne peux pas garantir à tout le monde que ce sera pareil, donc prudence. Prudence en particulier si vous voulez l'utiliser sur les données vitales du système (le noyau dans le dossier /boot par exemple). Le risque étant un plantage du système (si le système cherche à accéder à des fichiers fragmentés en cours de défragmentation) et dans le pire des cas, l'impossibilité de redémarrer le système (si le système a planté au mauvais moment). Utilisez le paramètre -t 0 dans un premier temps pour vérifier si ces données ont réellement besoin d'être défragmentées.

Je l'ai aussi testé sur des partions FAT et NTFS, et ça n'a pas posé pas de problèmes non plus. Donc apparemment ce script peut être utilisé pour défragmenter vos partitions Windows.

Les fichiers souvent fragmentés sont par exemple:
* Les fichiers téléchargés, quand plusieurs fichiers sont téléchargés en même temps depuis des logiciels qui ne réservent pas la place avant le début du téléchargement. Ça me semble être le cas d'Amule et Firefox entre autre (à confirmer).
* Les fichiers sur des partitions partagées avec Windows. Donc les clefs USB et disques externes.

Dernière modification par pnprog (Le 30/05/2008, à 09:58)

Hors ligne

#3 Le 16/05/2008, à 15:57

Ferod

Re : Défragmenteur naïf

Salut

Il se trouve sur quels dépot le paquet de filefrag parce que je le trouve pas... J'ai pourtant les main, universe, restricted et multiverse d'activé. Je suis sous Ubtuntu v8.04.

sebastien@Daneel:520-Script$ sudo apt-get install filefrag
[sudo] password for sebastien: 
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
E: Impossible de trouver le paquet filefrag

OK. Je viens de voir qu'il est installé par défaut...

Dernière modification par Ferod (Le 16/05/2008, à 16:04)


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#4 Le 16/05/2008, à 16:21

Ferod

Re : Défragmenteur naïf

Bon maintenant que ça a tourné je peux faire quelques remarques ! tongue

Analyse results for Vidéos
4260 files
0 files have not been analysed
101 files were fragmented
28 files are still fragmented

Je l'ai lancé avec le nombre d'essais par défaut donc 10.

Mes suggestions :
-> remplacer "0 files have not been analysed" par "all files analysed !" ça fait moins mal à la tête... smile
-> créer un fichier log par défaut. Tout ce qui s'écrit sur le terminal ça peut être intéressant à voir surtout en cas de plantage.
-> rajouter le temps pris pour l'exécution.

Voilà ! smile


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#5 Le 16/05/2008, à 17:13

Brunod

Re : Défragmenteur naïf

Salut,
Un peu HS mais je dois dire que je suis très partisan d'un défrag Linux !
Cela me permettrait de faire le ménage sur mes disques partagés en Fat et ntfs sans plus devoir utiliser un pc Win pour cela.
Donc bravo pour l'initiative !
BD


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#6 Le 16/05/2008, à 17:16

sakul

Re : Défragmenteur naïf

oui mais là si j'ai bien compris, c'est un défrag pour ext3 et je doute que tu ai installé winwin sur du ext3 ....:rolleyes:


commandes de bases ||  Debian testing 64bit - xfce / Intel-Core-2 Quad @ 2.33GHz / 9600 GT

Hors ligne

#7 Le 16/05/2008, à 19:08

pnprog

Re : Défragmenteur naïf

Ferod a écrit :

Il se trouve sur quels dépot le paquet de filefrag parce que je le trouve pas... J'ai pourtant les main, universe, restricted et multiverse d'activé. Je suis sous Ubtuntu v8.04.

OK. Je viens de voir qu'il est installé par défaut...

Autant pour moi, je croyais que c'était un paquet que j'avais installé. En fait c'est une commande.
J'ai commencé à écrire ce script avant ma migration à Hardy Heron (au cas ou je casse tout mon système en faisant les tests, que ça ne soit pas trop grâve !) et je ne me souvenais pas.

J'ai  corrigé mon post, merci !

Hors ligne

#8 Le 16/05/2008, à 19:24

pnprog

Re : Défragmenteur naïf

Ferod a écrit :

Mes suggestions :
-> remplacer "0 files have not been analysed" par "all files analysed !" ça fait moins mal à la tête... smile

Ou même ne pas l'afficher du tout dans ce cas ! En fait, les fichiers commençants par "-" doivent être assez rares, une chance que j'en avais pour me rendre compte du bug de filefrag.
Il y a peut-être d'autres types fichiers qui le font planter, mais ça m'étonnerait.
Je pourrais écrire une rustine pour contourner le problème, par exemple renommer le fichier avant analyse, mais ça ne serait pas très propre. J'enverrai un email à l'auteur pour lui signaler plutôt.

Ferod a écrit :

-> créer un fichier log par défaut. Tout ce qui s'écrit sur le terminal ça peut être intéressant à voir surtout en cas de plantage.

Le log est une bonne idée. En fait, l'idéal serait de récupérer le nombre de fragments des fichiers non défragmentés. J'ai remarqué que certains de mes fichiers sont vraiment très fragmentés (fichiers audios de quelques Mo fragmentés en 20 ou 30 morceaux par exemple).
Certains résistent à mon script même si je passe le nombre d'essais à 100 ou plus ! le nombre de fragments oscille alors autour de la même valeur.
Mais pour l'instant j'ai beaucoup de mal avec bash, je ne sais pas comment faire une simple fonction qui retournerait un résultat (le nombre de fragments). C'est vraiment "bizarre" comme langage :-)


Ferod a écrit :

-> rajouter le temps pris pour l'exécution.

Oui, je commencerai par ça, ça ne doit pas être difficile.

Ferod a écrit :

Voilà ! smile

Merci d'avoir testé, je suis un peu rassuré en voyant que ça ne cause pas de dégâts. On ne sait jamais :-)

Hors ligne

#9 Le 16/05/2008, à 19:30

pnprog

Re : Défragmenteur naïf

Brunod a écrit :

Un peu HS mais je dois dire que je suis très partisan d'un défrag Linux !
Cela me permettrait de faire le ménage sur mes disques partagés en Fat et ntfs sans plus devoir utiliser un pc Win pour cela.

sakul a écrit :

oui mais là si j'ai bien compris, c'est un défrag pour ext3 et je doute que tu ai installé winwin sur du ext3 ....roll

En fait je ne sais pas comment le FAT ou le NTFS est géré par Linux. Est-ce que ces deux formats de partition fragmentent aussi sous Linux ? auquel cas la fragmentation est inhérente à ces formats. Ou bien est-ce qu'ils ne formatent que sous Windows ? auquel cas la fragmentation vient de la manière dont l'OS travaille avec ces types de partitions.

Je n'y ai pas pensé, mais je peux me servir de ma clef USB pour tester avec le FAT ou le NTFS. Je le ferai demain.

Hors ligne

#10 Le 16/05/2008, à 19:35

NicoA380

Re : Défragmenteur naïf

Je testerai à l'occasion smile

Hors ligne

#11 Le 18/05/2008, à 11:41

pnprog

Re : Défragmenteur naïf

J'ai fait quelques modifications dans le script:

* Affichage du nombre de fragments avant et après.
* Gestion des partions FAT et NTFS.
* Un peu de nettoyage du code pour gagner en clarté.

Dans le détail:

La première version ne plantait pas pour les partions FAT ou NTFS, mais le script ne remarquais pas les fichiers fragmentés, donc il ne touchait pas à ces partitions.

J'ai rajouté une fonction qui retourne le nombre de fragment, ça permet de l'afficher et de voir clairement l'amélioration apportée par le script, ou pas. En effet, certains de mes fichiers sont absolument indéframentables, bien que mon disque possède plus de 20 Go de mémoire libre. Plusieurs passage successif du script n'arrange en rien la situation, je me demande pourquoi.

Avec cette fonction, le code est un peu plus clair. Mais surtout, je vais pouvoir m'en servir pour rendre le script plus "intelligent". Par exemple, faire une copie du fichier fragmenté, et si la copie est moins fragmentée, alors remplacer l'original par la copie, sinon, supprimer la copie et recommencer...

Voila voila...

Hors ligne

#12 Le 18/05/2008, à 13:36

figaro

Re : Défragmenteur naïf

A lire pour comprendre la fragmentation :

PS le nouveau format ext4 augmentera la taille réservée à la première écriture par rapport à ext3 et diminuera encore plus le risque de fragmentation sur les partitions Linux.


Le blog de figaro (astuces diverses et tutos Samba pour débutants)
Le blog de cep (astuces Linux avancées)
Debian Lenny 6.0.1, Ubuntu 10.04.2, Ubuntu Remix 9.10, Ubuntu Netbook 10.04

Hors ligne

#13 Le 18/05/2008, à 16:23

ogaby

Re : Défragmenteur naïf

Je n'ai pas tester ce programme mais j'ai déjà fait des defrags "à la main": en gros déplacé le fichier sur une autre partition et le remettre à l'emplacement d'origine.

Un jour, j'ai voulu défragmenter mon noyau.... et je ne pouvais plus démarrer. sad

Défragmentez uniquement vos documents mais pas le système.

Hors ligne

#14 Le 20/05/2008, à 08:48

pnprog

Re : Défragmenteur naïf

Cela confirme ce que je pensais déjà. Ainsi, si un jour Windows supporte ext3 ou un autre format de partition libre, il le fera fragmenter...
Je m'en suis aussi rendu compte en utilisant le script sur une partition ntfs: tout les fichiers étaient défragmentés et répartis sur l'ensemble du disque avec de l'espace entre chacun. On peut le voir en utilisant le défragmenteur de Windows.
J'ai alors forcé Windows à le redéfragmenter à nouveau, et il a compacté tout les fichiers ensembles au début du disques, donc sans laisser d'espace entre. C'est une autre stratégie: rassembler tout les fichiers au même endroits, et au début du disques doit aussi diminuer le temps d'acces au fichiers, la tête de lecture du disque se déplace moins. Par contre, quand la taille de certains fichiers augmente, ils sont automatiquement fragmentés.

Hors ligne

#15 Le 20/05/2008, à 09:04

pnprog

Re : Défragmenteur naïf

ogaby a écrit :

Je n'ai pas tester ce programme mais j'ai déjà fait des defrags "à la main": en gros déplacé le fichier sur une autre partition et le remettre à l'emplacement d'origine.
Un jour, j'ai voulu défragmenter mon noyau.... et je ne pouvais plus démarrer. sad
Défragmentez uniquement vos documents mais pas le système.

J'ai déjà lancé le script sur l'ensemble de mon disque (donc noyau inclus), sans rencontrer de problèmes.
Cela dit, le script ne déplace un fichier QUE s'il est fragmenté, ce qui n'était peut-être pas le cas du noyau. Ou est situé le noyau sur la partition ?

Autre chose, lors de défragmentations à la main avec cp, n'oubliez pas d'utiliser l'option -p qui préserve par défaut les attributs mode, ownership et timestamps.

cp -p fichier copie

Hors ligne

#16 Le 21/05/2008, à 12:38

ogaby

Re : Défragmenteur naïf

le noyau se trouve dans boot/
avec les fichiers initrd.img-2.6.22-14-generic et vmlinuz-2.6.22-14-generic

Si tu souhaites essayer, sois prudent. Fais une copie de ces 2 fichiers et modifie ton grub pour pouvoir les lancer en cas de pépins.

Hors ligne

#17 Le 27/05/2008, à 18:46

pnprog

Re : Défragmenteur naïf

J'ai regardé dans mon dossier /boot mais les fichiers qui s'y trouvent ne sont pas fragmentés. Impossible de dire s'ils l'étaient avant par contre. Et s'ils ne l'étaient pas, alors c'est normal que la défragmentation n'ait pas posée de problèmes, vu que le script n'aura fait que survoler ce dossier sans rien toucher.

Dans tout les cas, je vais rajouter un avertissement dans le mode d'emploi.
Si des casse-cous (ou plutôt des casse-systèmes) ayant leurs noyaux fragmentés veulent essayer...

Dernière modification par pnprog (Le 27/05/2008, à 18:48)

Hors ligne

#18 Le 27/05/2008, à 18:47

pnprog

Re : Défragmenteur naïf

Mise à jour du script:

* Correction de petits bugs (qui étaient sans dangers) dans la lecture des résultats de filefrag.
* Mise à jour du rapport de fragmentation.

En particulier, j'ai imaginé une nouvelle mesure de la fragmentation que je trouve plus claire que les habituels pourcentages.
En effet, dire que sous Linux, la fragmentation ne dépasse pas 3% n'est pas très clair, que signifie ces 3% ?
* 3% des fichiers sont fragmentés ?
* Les fichiers fragmentés representent 3% du disque ? (je crois que c'est plutôt celle-ci)

Bref, le script calcule quelque chose que j'appele la fragmentation par Mega Octet: f/Mo
Si un fichier de taille X Mo est fragmenté en N morceaux, alors la fragmentation par Mega Octet se calcule ainsi:

fragmentation par Mega Octet = (N-1)/X

Et par conséquent, un fichier non fragmenté a 0 f/Mo.
Les futures versions de ce script devront permettre de fixer un seuil minimal de f/Mo au dessous duquel le script n'essaye pas de défragmenter le fichier.
En effet, qu'un fichier de 700 Mo (une image iso par exemple) soit fragmenté en 4 morceaux (0,004 f/Mo) n'est pas vraiment problématique, car le temps de déplacement de la tête de lecture du disque entre les morceaux sera certainement négligeable devant le temps de lecture complet des données.
Donc inutile d'essayer de le défragmenter, opération lourde vu la taille du fichier, et qui peut tout simplement être impossible si il n'y a pas sur la partition 700Mo d'espace libre contigu.
Par contre, on aura tout intérêt à défragmenter un fichier de 5 Mo fragmenté en plus de 20 morceaux (3,8 f/Mo).

Pour une valeur par défaut pour cette limitte, je penche pour 1 f/Mo ou 0.5 f/Mo, qu'en pensez vous ?

Voici ce que ça donne pour l'avoir lancé sur mon répertoire /var/

Analyse results for /var/
9797 files: 1.42 f/Mo (before: 2.12 f/Mo)
359 files were fragmented: 58.07 f/Mo
231 files are still fragmented: 60.56 f/Mo

Bref, on peut voir que la fragmentation a globalement baissé, mais les fichiers restant sont toujours aussi fragmentés.
J'ai eu l'impression que seuls les fichiers les plus lourds se retrouvaient plus fragmentés qu'avant, et que les fichiers légers étaient correctement défragmentés.
Si c'est effectivement le cas, alors c'est plutôt bon pour le système.
Il faudrait que le programme retienne la fragmentation moyenne des ces fichiers particulier avant défragmentation pour comparaison... peut-être dans une prochaine version.


En tout cas, il faudra attendre un peu avant de voir arriver d'autres options: je dois d'abords apprendre à me servir de getopt pour ne pas pondre une usine à gaz...

Hors ligne

#19 Le 28/05/2008, à 10:55

uboops

Re : Défragmenteur naïf

Hello,
Merci pour ce script utile, qui fonctionne très bien (sur ext3, le seul que j'ai testé pour le moment) .

code pour visualiser la fragmentation:
sudo bash n_defrag.sh -t 0 /home/hardy

code pour defragmenter:
sudo bash n_defrag.sh -t 20 /home/hardy

Analyse results for /home/hardy
3253 files: 0 f/Mo (before: .03 f/Mo)
4 files were fragmented: 30.33 f/Mo
0 files are still fragmented

J'ai fait ca aussi sur la racine / , c'est très long (1h05 mais pour 138047 files: .06 f/Mo (before: .43 f/Mo) ) , et il y a quelques erreurs, mais c'est normal sur la racine /.

Dernière modification par uboops (Le 28/05/2008, à 10:57)


“Au lieu de faire que ce qui fût juste fût fort, on a fait que ce qui fût fort fût juste.” (Blaise Pascal).

Hors ligne

#20 Le 28/05/2008, à 17:42

Ferod

Re : Défragmenteur naïf

Hello

J'ai pas retesté encore la nouvelle version mais j'avais une petite idée d'amélioration. C'était de ne déplacer et de défragementer que les fichiers en dessous d'une certaine taille qu'on pourrait spécifier en argument dans la commande d'exécution du script.


"When I was in the military, they gave me a medal for killing
two men, and a descharge for loving one !" Leonard Matlovich

Hors ligne

#21 Le 29/05/2008, à 10:11

roger64

Re : Défragmenteur naïf

Bonjour

Je ne suis pas le phœnix des hôtes de ces bois, alors je patine rien que pour utiliser ton script. smile
Comme tu peux voir, j'ai fait quelques essais :

roger@roger-laptop:~$ sudo n_defrag.sh /home/roger/imageslinux/tux
[sudo] password for roger:
sudo: n_defrag.sh: command not found
roger@roger-laptop:~$ sudo cream n_defrag.sh /home/roger/imageslinux/tux
2 fichiers à éditer
roger@roger-laptop:~$ sudo cream n_defrag.sh -t2 /home/roger/imageslinux/tux
VIM - Vi IMproved 7.1 (2007 May 12, compiled Oct  5 2007 00:50:42)
Trop d'arguments d'édition: "-t2"
Plus d'info avec: "vim -h"
roger@roger-laptop:~$ sudo cream n_defrag.sh -t0 /home/roger/imageslinux/tux
VIM - Vi IMproved 7.1 (2007 May 12, compiled Oct  5 2007 00:50:42)
Trop d'arguments d'édition: "-t0"
Plus d'info avec: "vim -h"
roger@roger-laptop:~$ sudo n_defrag.sh -t2 ~/imageslinux/tux
sudo: n_defrag.sh: command not found
roger@roger-laptop:~$

Peux-tu donner un mode d'emploi pour débutant ? (j'ai débuté il y a tellement longtemps que je suis revenu au point de départ). J'ai copié le texte de ton script dans un fichier texte (j'utilise cream comme éditeur), je l'ai baptisé n_defrag.sh et je l'ai rendu exécutable. Mais apparemment, j'ai des problèmes pour le lancer...

Merci de ta commisération et bravo pour ce projet smile

Hors ligne

#22 Le 29/05/2008, à 11:15

sakul

Re : Défragmenteur naïf

il faut donner l'autorisation d'execution au fichier.

(chmod +x )


commandes de bases ||  Debian testing 64bit - xfce / Intel-Core-2 Quad @ 2.33GHz / 9600 GT

Hors ligne

#23 Le 29/05/2008, à 14:21

roger64

Re : Défragmenteur naïf

je l'avais fait.

Nautilus. Clic droit. Propriétés, onglet permissions, cocher la case "autoriser l'eécution du fichier comme un programme"...
maintenant, je ne sais pas comment nommer ce fichier ni que faire de l'extension sh .

SVP j'ai besoin de point sur le i.
neutral

Dernière modification par roger64 (Le 29/05/2008, à 14:48)

Hors ligne

#24 Le 29/05/2008, à 14:49

uboops

Re : Défragmenteur naïf

Bonjour,
Pour info, au cas ou, on ne sait jamais, il ne faut copier dans ton fichier n_defrag.sh qu'à partir de la ligne :

#!/bin/bash
#défragmenteur naïf
#auteur: pnprog AT no-log DOT org
#fichier: n_defrag.sh
.....
exit 0

#!/bin/bash    doit être ta 1ère ligne du fichier script.

Dernière modification par uboops (Le 29/05/2008, à 14:50)


“Au lieu de faire que ce qui fût juste fût fort, on a fait que ce qui fût fort fût juste.” (Blaise Pascal).

Hors ligne

#25 Le 29/05/2008, à 15:11

roger64

Re : Défragmenteur naïf

Merci. C'est bien ce que j'avais fait.

Bon, j'ai réussi, il fallait que j'écrive

sudo bash n_defrag.sh  /dossier

et non

sudo n_defrag.sh /dossier

Le diable est dans les détails...:)
Bon, maintenant, il va falloir que je trouve quelque chose de fragmenté parce que j'avais tout défragmenté il y a quelques jours, mais ça c'est un autre problème..:lol:

Je vais m'interesser au NTFS  Parce que là, oui; il en reste des fragments.

Cette technique est astucieuse. Il me semble, qu'en dehors du risque de la panne de courant, elle est assez sûre. La naiveté a du bon.

Dernière modification par roger64 (Le 29/05/2008, à 15:27)

Hors ligne