Monthly Archives: May 2012

Réparer une base de données SqLite corrompue

Aujourd'hui j'ai eu un souci avec une base de données SqLite qui me sert dans une application DotNet.

En effet, lorsque j'ai voulu insérer des données dans ma base de données SqLite, j'ai eu un message d'erreur m'indiquant que la base de données était malformée:

The database disk image is malformed

Pour réparer la base de données SqLite j'ai dû vérifier l'intégrité des données via la commande:

sqlite3.exe ma_base_de_donnee.s3db
pragma integrity_check;

Ensuite, il y a deux possibilités:

  • soit vous n'avez aucune erreur et dans ce cas il faut quitter sqlite3 via la commande "quit"
  • soit vous avez une multitude d'erreur et dans ce cas vous devez sauver la base de données (dumper la base de données) et la recharger dans une nouvelle base de données).

Dans mon cas la commande de vérification de l'intégrité des données m'a retourné:

sqlite> pragma integrity_check;
*** in database main ***
On tree page 1337470 cell 6: Rowid 87261 out of order (min less than parent min
of 89285)
On tree page 1331605 cell 79: 2nd reference to page 1337470
On tree page 1331605 cell 79: Child page depth differs
On tree page 1331605 cell 80: Child page depth differs
On tree page 1236289 cell 21: 2nd reference to page 1337472
On tree page 1236289 cell 21: Child page depth differs
On tree page 1236289 cell 22: Child page depth differs
On tree page 1337509 cell 6: Rowid 572766 out of order (min less than parent max
 of 1183107)
On tree page 1337476 cell 6: Rowid 1016553 out of order (max larger than parent
max of 0)
On tree page 1337489 cell 5: Rowid 1016608 out of order (max larger than parent
max of 0)
On tree page 1337502 cell 6: Rowid 572731 out of order (min less than parent min
 of 1016608)
On tree page 1337502 cell 6: Rowid 572737 out of order (max larger than parent m
ax of 0)
On tree page 1335400 cell 53: 2nd reference to page 1337473
On tree page 1335400 cell 53: Child page depth differs
On tree page 1337486 cell 6: Rowid 1016595 out of order (max larger than parent
max of 0)
On tree page 1335400 cell 54: Child page depth differs
On tree page 1337499 cell 6: Rowid 572717 out of order (min less than parent min
 of 1016595)
On tree page 1337499 cell 6: Rowid 572723 out of order (max larger than parent m
ax of 0)
On tree page 1337513 cell 6: Rowid 1318489 out of order (max larger than parent
max of 0)
Fragmentation of 9 bytes reported as 0 on page 1336786
Fragmentation of 9 bytes reported as 0 on page 1337511
On tree page 1337521 cell 6: Rowid 1318537 out of order (max larger than parent
max of 0)
On tree page 100743 cell 16: 2nd reference to page 1337483
On tree page 100743 cell 16: Child page depth differs
On tree page 100743 cell 17: Child page depth differs
On tree page 1337504 cell 6: Rowid 572744 out of order (max larger than parent m
ax of 0)
On tree page 1264401 cell 16: 2nd reference to page 1337469
On tree page 1264401 cell 16: Child page depth differs
On tree page 1264401 cell 17: Child page depth differs
On tree page 1337524 cell 34: 2nd reference to page 1337513
On tree page 1337524 cell 34: Child page depth differs
On tree page 1337524 cell 35: Child page depth differs
On tree page 1337524 cell 37: 2nd reference to page 1337517
On tree page 1337524 cell 37: Child page depth differs
On tree page 1337524 cell 38: 2nd reference to page 1337518
On tree page 1337524 cell 39: Child page depth differs
On tree page 1337524 cell 41: 2nd reference to page 1337521
On tree page 1337524 cell 41: Child page depth differs
On tree page 1337524 cell 42: Child page depth differs
On tree page 1336559 cell 91: 2nd reference to page 1337499
On tree page 1336559 cell 91: Child page depth differs
On tree page 1336559 cell 92: Child page depth differs
On tree page 1336559 cell 93: 2nd reference to page 1337502
On tree page 1336559 cell 93: Child page depth differs
On tree page 1336559 cell 94: 2nd reference to page 1337504
On tree page 1336559 cell 95: Child page depth differs
On page 1336559 at right child: 2nd reference to page 1337509
On tree page 1338044 cell 1: 2nd reference to page 1337511
On tree page 1338044 cell 1: Child page depth differs
On tree page 1338044 cell 2: Child page depth differs
On tree page 1338875 cell 10: 2nd reference to page 1337500
On tree page 1338875 cell 10: Child page depth differs
On tree page 1338875 cell 11: Child page depth differs
On tree page 1337234 cell 56: 2nd reference to page 1337471
On tree page 1337234 cell 56: Child page depth differs
On tree page 1337234 cell 57: Child page depth differs
On tree page 1337234 cell 59: 2nd reference to page 1337476
On tree page 1337234 cell 59: Child page depth differs
On tree page 1337234 cell 60: Child page depth differs
On tree page 1337234 cell 65: 2nd reference to page 1337486
On tree page 1337234 cell 65: Child page depth differs
On tree page 1337234 cell 66: Child page depth differs
On tree page 1337234 cell 67: 2nd reference to page 1337489
On tree page 1337234 cell 67: Child page depth differs
On tree page 1337234 cell 68: Child page depth differs
On tree page 1318070 cell 2: 2nd reference to page 1337469
On tree page 1318070 cell 2: Child page depth differs
On tree page 1318070 cell 3: Child page depth differs
On page 1253912 at right child: 2nd reference to page 1337480
On tree page 1331569 cell 57: 2nd reference to page 1337471
On tree page 1331569 cell 57: Child page depth differs
On tree page 1331569 cell 58: 2nd reference to page 1337485
On page 1331569 at right child: 2nd reference to page 1337498
On tree page 1330087 cell 58: 2nd reference to page 1337472
On tree page 1330087 cell 58: Child page depth differs
On tree page 1330087 cell 59: 2nd reference to page 1337487
On page 1330087 at right child: 2nd reference to page 1337501
On tree page 1212001 cell 36: 2nd reference to page 1337494
On tree page 1212001 cell 36: Child page depth differs
On tree page 1212001 cell 37: Child page depth differs
On tree page 1263070 cell 32: 2nd reference to page 1337477
On tree page 1263070 cell 32: Child page depth differs
On tree page 1263070 cell 33: Child page depth differs
Page 1336479 is never used
Page 1336481 is never used

J'ai donc dû corriger la base de données en utilisant la commande:

sqlite3.exe ma_base_de_donnee.s3db .dump | sqlite3.exe nouvelle_bdd.s3db

Ce qui m'a créé un nouveau fichier de database nommé "nouvelle_bdd.s3db" qui contient l'ensemble de mes données non corrompu.

Voilà j'espère que cette astuce vous aidera 🙂

Utiliser les cookies en JavaScript

Je développe actuellement un portail Internet pour un projet et j'utilise donc plusieurs technologies: PHP, Ajax, Javascript, HTML5, CSS, …

J'ai eu besoin de stocker des cookies en utilisant JavaScript et évidemment j'ai eu besoin de récupérer la valeur d'un cookie en JavaScript.

J'ai trouvé sur internet 2 fonctions qui permettent de gérer les cookies en JavaScript.

Ces fonctions ne sont pas compliquées mais pourquoi réinventer la roue 🙂

Créer un cookie en JavaScript

En JavaScript il est possible de créer des cookies afin de stocker des valeurs. Voici la fonction que j'utilise:

function SetCookie (name, value) {
	var argv=SetCookie.arguments;
	var argc=SetCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=name+"="+escape(value)+	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
		((path==null) ? "" : ("; path="+path))+	((domain==null) ? "" : ("; domain="+domain))+((secure==true) ? "; secure" : "");
}

Les paramètres de la fonction sont:

  • name: qui correspond au nom du cookie
  • value: qui correspond à la valeur à assigner au cookie
  • expires: qui représente la date d'expiration du cookie
  • path: qui indique l'origine du cookie
  • domain: qui est le domaine du site internet
  • secure: qui précise si le cookie est protégé

Notez que seuls les paramètres name et value sont obligatoires.

Et voilà un exemple d'utilisation:

var pathname=location.pathname;
var myDomain=pathname.substring(0,pathname.lastIndexOf('/')) +'/';
var dateExp = new Date();
dateExp.setTime(date_exp.getTime()+(365*24*3600*1000)); // Ici on définit une durée de vie de 365 jours
SetCookie("moncookie","mavaleur",dateExp,myDomain);

Lire un cookie en JavaScript

Après avoir stocké un cookie, il est souvent nécessaire de pouvoir récupérer la valeur stockée.

Pour cela, j'ai trouvé 2 petites fonctions très sympa qui font tout le travail 🙂

function getCookieVal(offset) {
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1)
      		endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {
	var arg=name+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i < clen) {
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg)
                        return getCookieVal (j);
                i=document.cookie.indexOf(" ",i)+1;
                        if (i==0) break;}
	return null;
}

Pour l'utiliser, il suffit de préciser le nom du cookie:

var monCookie = GetCookie("moncookie");

Script de sauvegarde de site Internet

Aujourd'hui j'ai eu besoin de trouver un script de sauvegarde afin de sauvegarder automatiquement mes sites web.

C'est sur le site de Vivek que j'ai alors trouvé ce script qui permet de sauver les fichiers de votre site mais également vos bases de données.

Bien sur pensez à modifier les différents paramètres afin que celui-ci fonctionne avec votre configuration.

#!/bin/bash
# A Simple Shell Script to Backup Red Hat / CentOS / Fedora / Debian / Ubuntu Apache Webserver and SQL Database
# Path to backup directories
DIRS="/home/user/ /var/www/html/ /etc"
 
# Store todays date
NOW=$(date +"%F")
 
# Store backup path
BACKUP="/backup/$NOW"
 
# Backup file name hostname.time.tar.gz
BFILE="$(hostname).$(date +'%T').tar.gz"
PFILE="$(hostname).$(date +'%T').pg.sql.gz"
MFILE="$(hostname).$(date +'%T').mysql.sq.gz"
 
# Set Pgsql username
PGSQLUSER="user"
 
# Set MySQL username and password
MYSQLUSER="user"
MYSQLPASSWORD="password"
 
# Remote SSH server setup
SSHSERVER="backup.example.com" # your remote ssh server
SSHUSER="user"                 # username
SSHDUMPDIR="/backup/remote"    # remote ssh server directory to store dumps
 
# Paths for binary files
TAR="/bin/tar"
PGDUMP="/usr/bin/pg_dump"
MYSQLDUMP="/usr/bin/mysqldump"
GZIP="/bin/gzip"
SCP="/usr/bin/scp"
SSH="/usr/bin/ssh"
LOGGER="/usr/bin/logger"
 
# make sure backup directory exists
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
 
# Log backup start time in /var/log/messages
$LOGGER "$0: *** Backup started @ $(date) ***"
 
# Backup websever dirs
$TAR -zcvf ${BACKUP}/${BFILE} "${DIRS}"
 
# Backup PgSQL
$PGDUMP -x -D -U${PGSQLUSER} | $GZIP -c > ${BACKUP}/${PFILE}
 
# Backup MySQL
$MYSQLDUMP  -u ${MYSQLUSER} -h localhost -p${MYSQLPASSWORD} --all-databases | $GZIP -9 > ${BACKUP}/${MFILE}
 
# Dump all local files to failsafe remote UNIX ssh server / home server
$SSH ${SSHUSER}@${SSHSERVER} mkdir -p ${SSHDUMPDIR}/${NOW}
$SCP -r ${BACKUP}/* ${SSHUSER}@${SSHSERVER}:${SSHDUMPDIR}/${NOW}
 
# Log backup end time in /var/log/messages
$LOGGER "$0: *** Backup Ended @ $(date) ***"

Notez qu'il est également possible d'automatiser vos sauvegardes en ajoutant un cron qui lancera automatiquement le script de backup:

@midnight /root/backup.sh

Monitorer son onduleur sous Linux

J'ai récemment acheté un onduleur Eaton Ellipse 750. Cet onduleur est manageable par USB.

Eaton est un fabricant très important dans la distribution d'onduleurs, notamment depuis le rachat de MGE.

Ce tutoriel s'applique donc également aux onduleurs Eaton, MGE et autres.

Nous allons donc voir comment gérer son onduleur directement sous son ordinateur USB.

Network UPS Tools (NUT)

Sous Linux, et plus précisément sous Ubuntu, c'est l'application Nut qui va nous permettre de configurer et monitorer notre onduleur.

Pour installer Nut, vous devez utiliser le gestionnaire de paquets:

apt-get install nut nut-usb

Une fois installé, il faut configurer certains paramètres via les commandes suivantes (adaptées les à votre configuration):

$ sed -i 's/MODE=none/MODE=standalone/g' /etc/nut/nut.conf
$ echo '
[MGE-Ellipse750]
driver = usbhid-ups
port = auto
desc = "MGE UPS Systems"
' >> /etc/nut/ups.conf
$ sed -i 's/# LISTEN 127\.0\.0\.1 3493/LISTEN 127\.0\.0\.1/g' /etc/nut/upsd.conf
$ echo '
[jhd]
password = password
upsmon master
' >> /etc/nut/upsd.users
$ sed -i 's/# NOTIFYCMD \/usr\/local\/ups\/bin\/notifyme/NOTIFYCMD \/sbin\/upssched/g' /etc/nut/upsmon.conf
$ echo '
MONITOR MGE-Ellipse750@localhost 1 jhd password master
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
' >> /etc/nut/upsmon.conf
$ sed -i 's/CMDSCRIPT \/upssched-cmd/CMDSCRIPT \/etc\/nut\/upssched-cmd/g' /etc/nut/upssched.conf
$ sed -i 's/# PIPEFN \/var\/run\/nut\/upssched\/upssched.pipe/PIPEFN \/var\/run\/nut\/upssched.pipe/g' /etc/nut/upssched.conf
$ sed -i 's/# LOCKFN \/var\/run\/nut\/upssched\/upssched.lock/LOCKFN \/var\/run\/nut\/upssched.lock/g' /etc/nut/upssched.conf
$ echo '
AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt
' >> /etc/nut/upssched.conf
$ echo '
#!/bin/sh
exit 0
' > /etc/nut/upssched-cmd
$ /etc/init.d/nut restart

Veuillez noter que pour trouver le driver de votre onduleur vous pouvez utiliser le site de Nut.

Vérifier la connection de Nut à l'onduleur

Pour vérifier que Nut soit bien connecté à votre onduleur et qu'il fonctionne parfaitement, vous pouvez exécuter la commande suivante:

upsc MGE-Ellipse750@localhost

Si cette commande vous retourne quelque chose comme çà c'est qu'il y a un problème de connection:

upsmon[10773]: Poll UPS [MGE-Ellipse750@127.0.0.1] failed - Driver not connected

Il faudra alors lancer le driver de Nut en mode Debug afin de diagnostiquer le problème:

/lib/nut/usbhid-ups -DDD -a MGE-Ellipse750

Ce qui retournera:

Network UPS Tools - Generic HID driver 0.34 (2.4.3)
USB communication driver 0.31
   0.000000     debug level is '3'
   0.013911     upsdrv_initups...
   0.189541     Checking device (0463/FFFF) (005/003)
   0.189705     - VendorID: 0463
   0.189741     - ProductID: ffff
   0.189767     - Manufacturer: unknown
   0.189794     - Product: unknown
   0.189819     - Serial Number: unknown
   0.189842     - Bus: 005
   0.189862     Trying to match device
   0.189906     Device matches
   0.189954     failed to claim USB device: could not claim interface 0: Operation not permitted
   0.189995     failed to detach kernel driver from USB device: could not detach kernel driver from interface 0: Operation not permitted
   0.190033     failed to claim USB device: could not claim interface 0: Operation not permitted
   0.190070     failed to detach kernel driver from USB device: could not detach kernel driver from interface 0: Operation not permitted
   0.190108     failed to claim USB device: could not claim interface 0: Operation not permitted
   0.190145     failed to detach kernel driver from USB device: could not detach kernel driver from interface 0: Operation not permitted
   0.190181     failed to claim USB device: could not claim interface 0: Operation not permitted
   0.190217     failed to detach kernel driver from USB device: could not detach kernel driver from interface 0: Operation not permitted
   0.190252     Can't claim USB device [0463:ffff]: could not detach kernel driver from interface 0: Operation not permitted

Pour plus de précision, il faut lancer la commande en utilisant le user root:

/lib/nut/usbhid-ups -DDD -u root -a MGE-Ellipse750

Ce qui retournera:

Network UPS Tools - Generic HID driver 0.34 (2.4.3)
USB communication driver 0.31
   0.000000     debug level is '3'
   0.001678     upsdrv_initups...
   0.172877     Checking device (0463/FFFF) (005/003)
   1.112408     - VendorID: 0463
   1.112464     - ProductID: ffff
   1.112489     - Manufacturer: MGE OPS SYSTEMS
   1.112516     - Product: ELLIPSE
   1.112542     - Serial Number: BDCJ3800Q
   1.112569     - Bus: 005
   1.112595     Trying to match device
   1.112647     Device matches
   1.112726     failed to claim USB device: could not claim interface 0: Device or resource busy
   1.113239     detached kernel driver from USB device...
   1.251394     HID descriptor, method 1: (9 bytes) => 09 21 00 01 21 01 22 01 03
   1.251460     HID descriptor, method 2: (9 bytes) => 09 21 00 01 21 01 22 01 03
   1.251491     HID descriptor length 769
   1.351379     Report Descriptor size = 769
   1.351456     Report Descriptor: (769 bytes) => 05 84 09 04 a1 01 09 24 a1 00 09 02 a1 00
   1.351509      55 00 65 00 85 01 75 01 95 05 15 00 25 01 05 85 09 d0 09 44 09 45 09 42 0b
(...)

On voit donc que c'est un problème de droit d'accès et de permissions. Pour résoudre le problème, il suffira de donner les droits nécessaires:

chmod 0666 /dev/bus/usb/005/003
chown :nut /dev/bus/usb/005/003

Notez que 005 correspond au Bus et 003 correspond au device de connection USB de votre onduleur.

Pour trouver le bus et le device USB, utilisez la commande "lsusb".

Améliorer les performances de ZFS

L'ensemble de mes données sensibles sont stockées sur un système ZFS dans plusieurs zpool (qui est l'équivalent d'un RAID5).

Après plusieurs semaines d'utilisation je me suis aperçu que les vitesses d'écriture et de lecture n'étaient vraiment pas rapide.

J'ai donc effectué des recherches afin de trouver des astuces pour améliorer les performances de mon système ZFS.

Utiliser un processeur 64 Bits et de la mémoire

Une des particularités de ZFS est de consommer pas mal de mémoire car il bufferise pas mal.

Dans mon cas, j'utilise 1Go de mémoire par téraoctet d'espace disque utile. Ainsi si votre zpool fait 8To, je vous conseille d'utiliser 8Go de ram.

J'ai également lu qu'un processeur 64 Bits était préférable pour utiliser ZFS. Personnellement je n'ai pas pu testé ZFS sous un système 32 Bits mais il est fort probable que l'utilisation d'un système d'exploitation 64 Bits a un impact direct sur l'utilisation de la mémoire.

Utiliser des disques durs similaires

Souvent il n'est pas conseillé d'utiliser les mêmes références de disques durs au sein d'un raid car si un disque vient à défaillir on peut supposer que les disques identiques auront le même problème.

Toutefois pour ZFS, il est conseillé d'utiliser des disques durs de même capacité, de même vitesse et ayant la même mémoire tampon (buffer) et le même nombre de secteurs.

Activer la compression

ZFS peut compresser les données afin de gagner en espace disque. Cette fonctionnalité est coûteuse en processeur et en mémoire.

Je vous conseille donc de ne compresser que les zpool qui contiennent des données à fort taux de compression.
Par exemple, il est intéressant d'activer la compression pour la sauvegarde de fichiers bureautique (fichiers texte, word, excel, …) mais il n'est pas intéressant d'activer la compression pour des données de média (mp3, avi, divx, …).

Désactiver les fonctions inutiles

Par défault, ZFS active toute sorte de fonctionnalités qui ne vous seront pas forcément utiles.

Pour récupérer la liste de fonctionnalités activées par ZFS, il faut utiliser la commande suivante:

zfs get all

Vous pourrez alors modifier les options en utilisant la commande "set". Voici un exemple qui désactive le contrôle du checksum pour le zpool nom_du_zpool:

zfs set checksum=off nom_du_zpool

Mettre à jour votre version de ZFS

ZFS est constamment en cours de développement. De nouvelles fonctionnalités et de nombreux correctifs sont apportés régulièrement.

Je vous recommande donc de garder votre version de ZFS à jour en utilisant les commandes:

zfs upgrade nom_du_zpool
zpool upgrade nom_du_zpool

ZFS et SSD Caching

Le SSD Caching permet d'utiliser la rapidité d'un SSD pour stocker certaines logs et mettre en cache les données.

Ainsi pour améliorer les performances en lecture, il faut utiliser la commande:

zpool add 'nom_du_zpool' cache 'nom_du_device_ssd'

Pour améliorer les performances en écriture, il faut utiliser la commande:

zpool add 'nom_du_zpool' log 'nom_du_device_ssd'

Veillez noter qu'il est strictement impossible à l'heure actuelle de retirer un disque ssd utilisé pour améliorer les performances en écriture. Il est donc préférable d'utiliser le SSD en tant que disque mirroir:

zpool add 'nom_du_zpool' log mirror /dev/log_ssd

Augmenter le nombre de disques

ZFS est beaucoup plus rapide si vous utilisez 2 disques de 2To qu'un seul disque de 4To.

En effet, ZFS utilise ainsi les performances propres à chaque disque afin d'augmenter les vitesses en lecture et écriture.

Je vous conseille donc d'utiliser le maximum de disques possible.

Désactiver la déduplication

La déduplication est une technologie qui permet de ne stocker physiquement qu'une seule fois un fichier même s'il est présent plusieurs fois (logiquement).

La déduplication stocke des index en mémoire afin de savoir si le fichier existe ou pas. Dans la documentation ZFS, il est précisé que si la déduplication est activée, il faudra avoir au minimum 2Go de mémoire pour 1To de données.

La plupart du temps, la déduplication ZFS n'est pas intéressante et pas nécessaire. Je vous conseille donc de la désactiver via la commande:

zfs set dedup=off nom_du_zpool

Conclusion

Les améliorations énoncées ci-dessus dépendent de votre configuration matérielle, de vos besoins et de la nature de vos données. ZFS est performant à condition qu'il soit bien configuré.

N'hésitez pas à poster des commentaires si vous avez d'autres astuces.

Détecter le second processeur de votre serveur SMP sous Linux Ubuntu

Le SMP (Symmetric Multi Processing) est une architecture informatique parallèle qui permet d'avoir plusieurs processeurs dans son serveur afin d'augmenter sa puissance de calcul.

De nombreux serveurs haut de gamme utilisent plusieurs processeurs afin de pouvoir exécuter sans difficulté plusieurs centaines de processus.

Aujourd'hui j'ai dû configurer un serveur Dell qui possède 2 processeurs. Le système d'exploitation étant Ubuntu Server, j'ai cherché à détecter le second processeur.

Normalement les systèmes d'exploitation Linux récent utilisent un kernel SMP, du coup il détectera automatiquement votre deuxième processeur.

Il suffit juste de vérifier si votre serveur utilise un kernel SMP via la commande suivante:

rpm -q kernel-smp

7 logiciels de sauvegarde et de backup pour Linux Ubuntu

Il n'y a rien de plus rageant que de perdre des données (et je sais de quoi je parle j'ai perdu plus de 16To de données).

Il est donc indispensable de créer régulièrement des sauvegardes des vos données et du système.

Les systèmes Raid et les systèmes de sauvegarde sont complémentaires et en aucun cas une des solutions doit remplacer l'autre.

Après plusieurs recherches sur le net j'ai trouvé plusieurs comparatifs de logiciels de sauvegarde. Ces applications sont toutes compatibles avec Ubuntu Desktop, certaines le sont avec Ubuntu Server.

Je vous ai fait un petit résumé qui vous guidera dans le choix de votre logiciel de sauvegarde.

Sbackup

Sbackup est une application qui signifie "simple backup". Il est disponible dans le gestionnaire d'applications.

Sbackup

Lorsque vous démarrez le programme, vous apercevrez plusieurs onglets:

  • Général: permet de définir les options globales
  • Inclure: permet de spécifier la liste des répertoires à inclure dans la sauvegarde
  • Exclure: permet de spécifier la liste des répertoires à exclure de la sauvegarde. Il est possible de préciser des extensions (par exemple exclure tous les .mkv), des expressions régulières et la taille maximale des fichiers.
  • Destination: permet de spécifier où seront sauvées les sauvegardes. Il est possible de sauver sur des serveurs distants via SSH ou FTP.
  • Heure: permet de programmer quand faire la sauvegarde
  • Nettoyage: permet de supprimer les sauvegardes obsolètes

Sbackup est relativement complet, simple d'utilisation et possède une interface graphique basée sur Gnome.

Pour plus de détails, allez sur cette page.

Pybackpack

Pybackpack est un logiciel de sauvegarde très simple d'utilisation et avec une interface intuitive.

PyBackpack

Pybackpack se compose de 3 onglets:

  • Home: qui est l'accueil du logiciel de sauvegarde
  • Backup: qui permet de configurer la sauvegarde et l'emplacement où la stocker
  • Restore: qui permet de restaurer une sauvegarde

Pour vérifier si Pybackpack est disponible sur votre distribution, il faut taper:

apt-cache search pyback

Ce qui retournera:

pybackpack - user friendly file backup tool for GNOME

Pour l'installer, vous pourrez alors faire:

apt-get install pybackpack

Pour une utilisation avancée de Pybackpack, vous pouvez consulter ce site.

Rsync

Rsync est un utilitaire en ligne de commande qui est utilisé par pratiquement tous les logiciels de sauvegarde proposant une interface graphique.

Rsync est utilisé pour synchroniser les dossiers et fichiers d'un répertoire vers un autre.

L'intéret de Rsync est qu'il peut prendre des répertoire d'origine et des répertoires de sauvegarde se trouvant sur des serveurs distants.

De plus, Rsync est rapide, securisé et qu'il optimise la bande passante lors des copies.

Pour l'utiliser, vous pouvez vous baser sur cet exemple:

rsync -av --progress /mon_dossier_a_sauver /mon_dossier_backup

Grsync

Grsync est une interface graphique pour Rsync. Son interface graphique est basée sur les librairies GTK.

De plus, Grsync fonctionne sous Linux, Windows et Mac.

GRsync

Grsync permet de sauvegarder des profils de sauvegarde (appelés session). Il se compose de 3 onglets:

  • Options de base: qui permet de définir les paramètres spécifiques à la sauvegarde
  • Options avancées: qui permet de définir des fonctions avancées telles que la vérification du checksum, la compression des données, l'écrasement de fichiers, …
  • Autres options: pour les autres options de rsync

Pour plus d'informations sur Grsync, allez sur sa page Ubuntu.

Rdiff-backup

Rdiff-backup permet de faire des sauvegardes incrémentielles de votre système.

Rdiff-backup combine 2 technologies de sauvegarde: la sauvegarde mirroir et la sauvegarde incrémentielle.

En effet, Rdiff-backup prend la copie du répertoire spécifié et il ne sauvegarde que la différence.

Veuillez noter que pour utiliser Rdiff-backup, il faut qu'il soit installé sur la machine locale et sur la machine distante.

L'exemple suivant vous montre comment sauvegarder un répertoire de la machine local vers un serveur distant:

rdiff-backup /home/jhd jhd@remoteserver::/backup/jhd

Rdiff-backup utilise librsync qui est la bibliothèque d'algorythmes de rsync. Il fonctionne à la fois avec des fichiers textes et des fichiers binaires.

Les principaux avantages de Rdiff-backup sont:

  • Simple à utiliser en ligne de commande
  • Utilisation de sauvegarde mirroir et de sauvegarde incrémentielle
  • Utilisation réduite de la bande passante et de l'espace disque.
  • Compatible Linux, Windows et Mac.

Pour plus d'informations sur Rdiff-backup, allez sur sa page Ubuntu.

Rsnapshot

Rsnapshot est une application en ligne de commande qui permet de réaliser des sauvegardes complètes et des sauvegardes incrémentielles.

Le principal avantage de Rsnapshot est qu'une fois configuré, il est totalement autonome et ne nécessite aucune action de votre part.

De plus, il utilise peu d'espace disque car il crée une copie exacte lors de la premère sauvegarde puis ensuite il ne sauvegarde que les fichiers modifiés.

Pour plus d'informations sur  Rsnapshot , allez sur sa page Ubuntu.

Backerupper

Backerupper est un logiciel de sauvegarde disposant d'une interface graphique afin de configurer les répertoires à sauvegarder, l'endroit où stocker les sauvegardes, …

Backerupper

Assez complet, Backerupper est plus contraignant à installer car il n'est pas disponible dans le gestionnaire de paquets.

Pour installer Backerupper et l'utiliser, je vous invite à vous rendre sur ce site.

Conclusion

Personnellement, j'utilise rsync en manuel car il est rapide, performant, sécurisé et affiche la progression de la sauvegarde. 

Trouver les répertoires vides et les fichiers vides sous Linux

Aujourd'hui j'ai eu besoin de trouver quels étaient les dossiers vides de mon Linux Ubuntu et quels étaient les fichiers dont la taille est de 0 byte.

Après recherche, Linux permet de trouver ces répertoires et fichiers vides grâce à la commande "find".

Trouver les répertoires vides en utilisant la commande find

Pour trouver les dossiers vides du répertoire courant, il faut exécuter la commande suivante:

find . -type d -empty

Pour trouver les dossiers vides du répertoire "/tmp", il faut exécuter la commande suivante:

find /tmp -type d -empty

On peut également supprimer ces répertoires automatiquement via la commande suivante:

find /tmp -type d -empty -exec rmdir {} \;

Attention toutefois à ne pas supprimer les répertoires vides des dossiers systèmes.

Trouver les fichiers vides en utilisant la commande find

Pour trouver les fichiers vides (fichiers de 0 bytes), il faut exécuter la commande suivante:

find . -type f -empty

Veillez noter que ces fichiers sont généralement utilisés comme verrous ou en fichiers tampons par certaines applications. Supprimez les avec attention.

Allez plus loin avec les fichiers vides et la commande find

Pour connaitre le nombre de fichiers vides dans le répertoire courant, il suffit d'utiliser la commande suivante:

find . -type f -empty | wc -l

Pour connaitre le nombre de fichiers NON vides dans le répertoire courant, il suffit d'utiliser la commande suivante:

find . -type f -not -empty | wc -l

Veuillez noter que l'option "-not" inverse l'option requêtée.

Redémarrer son ordinateur sous Linux en ligne de commande

 

Maintenant que l'on sait éteindre son ordinateur en ligne de commande, il est tout aussi intéressant d'apprendre à redémarrer sa machine via une ligne de commande.

Veuillez noter qu'il faut être identifié en tant que "root" pour pouvoir exécuter les commandes qui suivent.

La commande Reboot

Tout comme pour la commande "shutdown", la commande "reboot" permet de redémarrer la machine. 

Elle peut s'utiliser de diverses manières:

/sbin/reboot
/sbin/shutdown -r now
reboot

Vous pouvez également notifier les utilisateurs loggués que le système va être redémarré via la commande:

shutdown -r +5

Ce qui retourne:

Broadcast message from jhd@jhdserver
(/dev/pts/1) at 13:21 ...
The system is going down for reboot in 5 minutes!

Comme pour la commande "shutdown", la commande "reboot" prend un paramètre "time" qui peut être au format HH:mm, +m qui correspond à un délai de m minutes, ou bien encore le mot clé "now".

Redémarrer un serveur distant en ligne de commande

Mon besoin principal est de redémarrer mes serveurs dédiés sur lesquels je ne dispose que d'un accès SSH.

Pour se faire, il suffit de taper dans un terminal ou dans putty la commande suivante:

ssh root@mon_serveur.fr /sbin/reboot

Script de minification en php

Alors que j’utilisai la bibliothèque RGraph dans le projet NetSysInfo, j’ai vu qu’ils utilisent un script de minification à la fois simple et performant.

Je le partage ici. Ce script php permet de minifier des scripts php mais egalement de minifier des scripts javascripts (il a été conçu pour minifier les scripts javascript à la base).

Un minifieur permet de réduire la taille de fichiers afin de les charger plus rapidement (par exemple un javascript plus petit sera optimisé pour le référencement plutôt qu’un fichier de taille relativement importante).

Notez également que ce script permet de compresser les fichiers à la volée, ce qui permet encore de réduire la taille des fichiers. Minifier bien 🙂

Pour Télécharger JsMin, cliquez ici.