Contenu | Rechercher | Menus

Annonce

Ubuntu-fr.org recrute toujours de nouveaux modérateurs, avec de l'expérience.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

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.

nombre réponses : 25

#0 -1 »  [not a bug, a feature]16.04 notif' mise à jour, mais rien à cliquer » Le 09/05/2016, à 16:00

Autiwa
Réponses : 6

Bonjour,

J'avais du mal à trouver un titre clair et explicite concernant mon soucis.

Première chose, je n'ai pas l'impression que c'est un bug, j'ai même trouvé un site qui se vantait de cette "amélioration", j'ai rien trouvé non plus dans les sujets déjà existants du forum.

J'ai des notifications me disant que des mises à jours logicielle sont disponible. Sauf que :
_ Si je met la souris dessus, la notification se floute (je peux ni la virer, ni cliquer dessus). C'est un soucis avec toutes les notifications de manière générale sous Ubuntu, et je trouve ça super casse c****
_ [le vrai soucis] La notification ne contient aucun raccourci pour que je lui dise de faire les mises à jours. Truc le plus rapide que je connaisse, menu > À propos de cet ordinateur > installer les mises à jour.

Jusqu'à présent, quand il y avait des mises à jours, la pop-up me permettait directement de valider pour installer les-dites mises à jour. Est-ce vraiment une amélioration de m'obliger à faire 3 niveaux d'arborescences pour faire les mises à jours au lieu de cliquer directement sur "valider"?

Bonus d'XP : Si quelqu'un a une technique pour que je puisse virer les notifications sans attendre le délai de durée de vie de cette dernière, j'aimerais beaucoup.

#1 Re : -1 »  [not a bug, a feature]16.04 notif' mise à jour, mais rien à cliquer » Le 09/05/2016, à 18:06

Autiwa
Réponses : 6

Merci pour l'info, ça répond exactement à la question bonus !

#2 -1 »  16.04 impression corrompue aléatoirement (caractères illisibles) » Le 17/07/2016, à 21:26

Autiwa
Réponses : 2

Bonjour,

Depuis la mise à jour vers Ubuntu 16.04, j'ai énormément de mal à imprimer. J'arrive parfois à imprimer, mais rarement deux fois de suite. Voici ci-dessous un scan de ce que m'imprime mon imprimante :
http://autiwa.free.fr/divers/ubuntu_16. … rompue.jpg
À noter que le reste de la page est blanc, il pour un .pdf d'une page, il imprime des dizaines de ces pages là, sans recto-verso

Par ce scan je prouve aussi que la fonction scan fonctionne.

Ce que j'essaie d'imprimer est un .pdf. J'utilise Evince, mais j'ai aussi essayé Okular, les deux me donnent des impressions correctes et corrompue selon le moment (pour le même fichier .pdf je précise). J'ai éteint mon imprimante puis rallumé, sans amélioration notable. J'ai débranché ou rebranché le cable usb, mais puisque je peux scanner correctement, je ne pense pas que ça vienne de là.

Mon imprimante est une Dell B1265dfw

Ce qui m'étonne le plus c'est que j'ai parfois une bonne impression, et la plupart du temps des trucs pourris (cf le scan plus haut). Quelqu'un a-t-il une idée d'où ça peut provenir?


Modération : merci d'utiliser des images de petite taille (300x300) ou des miniatures pointant sur ces images (Des hébergeurs comme Toile Libre ou TDCT'Pix le permrttent).

#3 Re : -1 »  16.04 impression corrompue aléatoirement (caractères illisibles) » Le 20/07/2016, à 11:35

Autiwa
Réponses : 2

J'ai testé sous windows, et ça fonctionne correctement ce qui a priori élimine tous les soucis hardwares.

Je penche plutôt pour un soucis avec le pilote sous linux. Il fonctionnait bien avec la dernière LTS, mais avec celle-ci, ça foire complètement on dirait. Comme je commence à en avoir un peu marre de ces soucis de pilotes sous linux, je crois que je vais simplement lancer windows quand je veux imprimer un truc, en plus de le lancer quand je veux jouer.

le scanner et l'imprimante ne reposent pas sur le même pilote, de mémoire, c'est peut-être pour ça que je peux scanner mais pas imprimer correctement sous linux.

#4 Re : -1 »  [Résolu] Liseuse Cybook mal reconnue, lecture seule : Calibre? » Le 13/07/2016, à 20:49

Autiwa
Réponses : 4

C'est étrange de tomber sur son propre sujet quand, 3 ans après le même problème survient de nouveau. C'est exactement la même liseuse, et Ubuntu 16.04 LTS.

Aucune idée de comment résoudre le soucis, mais la liseuse se met en lecture seul, et Calibre me fourni l'erreur suivante chaque fois que je souhaite transférer :

calibre, version 2.62.0
ERREUR : Erreur: Erreur pendant la communication avec le dispositif

[Errno 30] Système de fichiers accessible en lecture seulement: '/media/autiwa/Cybook/Digital Editions/Abe, Shana'

Traceback (most recent call last):
  File "site-packages/calibre/gui2/device.py", line 87, in run
  File "site-packages/calibre/gui2/device.py", line 584, in _upload_books
  File "site-packages/calibre/devices/usbms/driver.py", line 311, in upload_books
  File "site-packages/calibre/devices/usbms/device.py", line 1044, in create_upload_path
  File "os.py", line 157, in makedirs
OSError: [Errno 30] Système de fichiers accessible en lecture seulement: '/media/autiwa/Cybook/Digital Editions/Abe, Shana'

#5 Re : -1 »  [Résolu] Liseuse Cybook mal reconnue, lecture seule : Calibre? » Le 13/07/2016, à 21:24

Autiwa
Réponses : 4

Problème résolu pour moi. Il y avait semble-t-il une corruption du système de fichier.

La solution :

Trouver l'identifiant de la liseuse

$ sudo blkid
/dev/sdd: LABEL="Cybook" UUID="F2CA-1743" TYPE="vfat"

La démonter

$ sudo umount /dev/sdd

Essayer de réparer le système de fichier

$ sudo dosfsck -yfv /dev/sdd
fsck.fat 3.0.28 (2015-05-16)
Checking we can access the last sector of the filesystem
0x41: Dirty bit is set. Fs was not properly unmounted and some data may be corrupt.
 Automatically removing dirty bit.
Boot sector contents:
System ID "mkdosfs"
Media byte 0xf8 (hard disk)
       512 bytes per logical sector
      4096 bytes per cluster
        32 reserved sectors
First FAT starts at byte 16384 (sector 32)
         2 FATs, 32 bit entries
   1347584 bytes per FAT (= 2632 sectors)
Root directory start at cluster 2 (arbitrary size)
Data area starts at byte 2711552 (sector 5296)
    336703 data clusters (1379135488 bytes)
16 sectors/track, 4 heads
         0 hidden sectors
   2698920 sectors total
FATs differ but appear to be intact. Using first FAT.
/Digital Editions/Silverberg, Robert/CHRONI~1.EPU
  Contains a free cluster (115732). Assuming EOF.
/Digital Editions/Silverberg, Robert/CHRONI~1.EPU
  File size is 854212 bytes, cluster chain length is 0 bytes.
  Truncating file to 0 bytes.
/.Trashes/501/Sapkowski, Andrzej
  Contains a free cluster (38610). Assuming EOF.
Reclaiming unconnected clusters.
Reclaimed 1514 unused clusters (6201344 bytes) in 116 chains.
Checking free cluster summary.
Free cluster summary wrong (258040 vs. really 258039)
  Auto-correcting.
Performing changes.
/dev/sdd: 1874 files, 78664/336703 clusters

Ça a marché pour moi. En espérant que ça soit utile à d'autres.

#6 Re : -1 »  [Résolu] Echec de montage partitions NTFS sur dualboot Mint/Windows 10 » Le 14/08/2015, à 18:41

Autiwa
Réponses : 9

Ahh que c'est agréable de trouver un sujet comme ça quand on galère à monter une partition ntfs et qu'on soupçonne fortement windows 10.

Merci à vous !

#7 -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 27/06/2015, à 22:53

Autiwa
Réponses : 19

Bonjour,

Devenant parano sur la corruption de données ces derniers temps, j'ai viré mon RAID1 (miroir) pour faire une solution maison afin de m'assurer que les fichiers ne sont pas corrompus. En effet, il m'est déjà arrivé plusieurs fois de trouver un fichier .jpg "rose", signe de corruption, et ça me plait vraiment moyen. j'ai aussi appris récemment que le mirroring ne permettait absolument pas de se prémunir de la corruption de données.

En résumé, j'ai donc deux partitions, la normale, et une partition miroir, les deux en ext4.

Actuellement, je stocke la liste des sommes md5 de chaque fichier sur chacune des deux partitions, et je compare.

Petit soucis, j'utilise md5deep afin de produire le fichier, et il faut environ 6h (400 minutes) pour chaque partition.

Savez-vous si cette durée est optimisable, soit en changeant de soft, soit de technique?

Je peux poster mon script si ça aide, mais il est expérimental pour l'instant. Je suis aussi ouvert à d'autres suggestions concernant le problème de corruption.

Cordialement,
Autiwa

#8 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 29/06/2015, à 10:17

Autiwa
Réponses : 19

Bonjour,

Merci de ta réponse !

En fait, j'ai eu quelques fichiers corrompus, dont des fichiers brut de mon reflex. Les corruptions me semblent faire partie du processus normal d'un disque dur, raison pour laquelle sur les serveurs, des solutions en RAID6 avec redondance sont mises en place.

De mon coté, avec md5deep, je ne saurais te répondre. En effet, hier j'ai lancé un test, et ça n'a pas fonctionné. J'utilise subprocess.Popen dans un script python pour lancer deux fois md5deep, une fois sur chaque partition. J'ai supposé que la limitation venait des i/O, et je me suis donc dit que je pourrais faire ça en 6 heures en tout (contre 12h si j'avais dû le faire en séquentiel). Mais j'ai eu des problèmes de buffer je crois, et je ne sais pas trop à quoi c'est dû puisque je redirige l'output directement dans la commande, il n'y a donc rien dans stdout et stderr de la commande Popen normalement.

Concernant les fichiers, j'en ai 230 000 environ. Beaucoup sont assez petits, quelques centaines de Ko. Quelques milliers sont autour de 20 Mo, et quelques centaines de gros fichiers (quelques centaines de Mo).

#9 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 30/06/2015, à 12:06

Autiwa
Réponses : 19

Effectivement, c'est une bonne remarque. Mais comme dit plus haut, rsync fait de la sauvegarde, il ne se préoccupe pas de la corruption de fichier. S'il existe déjà des logiciels qui font ce que je souhaite faire avec mon script, je suis preneur, bien entendu. Ça ne m'amuse pas de réinventer la roue, surtout quand ça roule pas.

Concernant mon script, je l'ai de nouveau fait tourner hier, et le md5deep bugue. Je ne sais pas pourquoi, mais il s'interromp en plein milieu, sans planter, juste, il attend indéfiniment. J'imagine que c'est un soucis avec subprocess.Popen (ou subprocess.call), mais pas trouvé de solution pour l'instant.

Si vous connaissez des logiciels qui font ça, je veux bien les noms en tout cas, moi j'ai pas trouvé. Mais je ne suis pas intéressé plus que ça par des logiciels qui font du versioning, parce que j'ai déjà 800Go de données, j'ai pas envie de tout faire exploser pour des versions qui ne m'intéressent finalement pas.

Les deux logiciels, rsnapshot et rdiff-backup ne me semblent pas gérer la corruption. Et c'est un peu mon problème. Il existe des tonnes de solution de sauvegarde, mais aucune n'aborde explicitement le problème de la corruption de données, ce qui est au final est la seule chose qui m'intéresse en fait.

#10 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 30/06/2015, à 13:11

Autiwa
Réponses : 19

Tout simplement parce que je ne savais pas que ça existait. J'ai cherché pour md5sum, puis je me suis tourné vers find, et enfin vers md5deep. Mais je voulais éviter de trop rester en python pour que ça ne cause pas de lenteur. La commande md5deep met 6h, donc le moindre ralentissement python, une boucle ou autre, ça m'aurait tout fait exploser.

Mais ces solutions, à conditions qu'elles soient rapides et proches du C, me semblent très intéressantes. Ça me permettra de passer outre la limitation de subprocess.

Merci de l'info !

Si j'arrive à faire un code pratique, je le posterai sûrement, ça pourrait servir à d'autres.

#11 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 30/06/2015, à 13:48

Autiwa
Réponses : 19

Je ne me voyais pas coder ça en C non plus. Le Python pour moi, c'est le fashion, mais le cœur du calcul et du temps passé doit être dans un langage machine, rapide et optimisé.

#12 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 01/07/2015, à 00:07

Autiwa
Réponses : 19
grim7reaper a écrit :

Quand tu lances md5deep tu as les CPUs à 100% ?
Si oui, alors tu es limité par l’algorithme (passer à un algo plus rapide type SipHash ou xxHash pourrait te faire gagner du temps).
Si non, alors tu es limité pas les I/O (tu as combien de fichiers ? La taille moyenne est petite ?) et dans ce cas faudrait réduire les I/O et c’est plus contraignant (mais faisable).

Pour répondre à la question plus haut, md5deep consomme environ 10% de mon CPU. C'est donc bien le disque dur qui limite. La seule chose où je peux gagner, et c'est ce que j'essaie de faire, c'est lancer les deux md5deep en même temps sur les deux disques. Comme ça ça calcule en parallèle puisque les écritures sur les deux disques ne se saturent pas entre elles.

#13 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 04/07/2015, à 18:14

Autiwa
Réponses : 19

Bon, mon code plante, enfin plutôt les process md5deep attendent indéfiniment. Je sais pas ce qu'ils foutent. Dès fois ça marche, le plus souvent ça ne fonctionne pas, et je n'ai aucune idée de pouvoir ça se met en "wait forever".

#14 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 12/07/2015, à 08:38

Autiwa
Réponses : 19

Le soucis de md5deep était l'utilisation de "named pipe" par quod libet. rsync les copiait, md5deep attendait indéfiniment. Mon script fonctionne. Il faut environ 7h pour comparer les sommes md5 de la totalité de ma partition, qui fait 900Go (pour environ 250 000 fichiers).

Voici le script, si jamais c'est utile à certains. Il faudra l'adapter bien sûr, en particulier les noms des partitions, et la configuration du SMTP qui envoie les mails récapitulatifs.

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Script to be sure that all files in a given partition are coherent with their expected md5sum. 
# A spare disk/parition need to exist, for data duplication

import pdb
import os
import subprocess
import shutil
import smtplib # Import smtplib for the actual sending function
from email.mime.text import MIMEText # Import the email modules we'll need
import time
import logging # To create a log file
import datetime
import sys
import glob
import socket # To get the hostname

# Variables to be SET : 
# gmail_user and gmail_pwd in the send_mail function
## You can as well define your own smtp server. 
# backup and spare need to be set. 

documents = "/media/autiwa/documents"
backup = "/media/autiwa/spare"

t_start = time.time()

def cmd_exists(cmd):
    return subprocess.call("type " + cmd, shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0

def run(command, error=False):
	"""launch a system command in a terminal. 
	
	Argument:
	command : The desired command (string)
	error : True or False. If True, stderr and return_code are returned. 
	if not, an error will cause the function to crash and display an error message
	
	Dependance:
	Module subprocess is used and must be imported with: 
	import subprocess
	
	Return: 
	if error=False -> return: process_stdout /!\ exit() if error
	if error=True -> return: (process_stdout, process_stderr, return_code) 
	
	Example:
	stdout = run("ls")
	(process_stdout, process_stderr, return_code) = run("ls", error=True)
	
	"""
	if (type(command) != str):
		print("Error: command expected to be a string. But instead, type=%s" % type(command))
		exit()
	
	process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
	# Compared to "wait", communicate allow the use of pipes for stderr and stdout
	# and handle correctly the cases of huge outputs.
	(process_stdout, process_stderr) = process.communicate()
	return_code = process.poll()
	# there is .poll() or .wait() but I don't remember the difference. For 
	# some kind of things, one of the two was not working
	
	process_stdout = process_stdout[:-1] # We suppress the last '\n' of the output
	
	if error:
		return (process_stdout, process_stderr, return_code)
	else:
		if (return_code != 0):
			print("Error: command '%s' failed." % command)
			print("variable available: process_stdout, process_stderr, return_code")
			pdb.set_trace()
			exit()
		
		return process_stdout

def get_dict_md5(filename, excluded_files):
	"""From a filename containing md5deep output, 
	we retrieve a dictionnary making the correspondance 
	between the path of a file (key) and its md5sum (value)
	"""
	object_file = open(filename, 'r')
	lines = object_file.readlines()
	object_file.close()

	md5_list = {}
	for line in lines:
		md5sum = line[0:32]
		str_date = line[33:52]
		file_path = line[54:-1] # We exclude the trailing "\n"
		# We don't want to check new files because they don't exist in the old md5 files. 
		# We don't want to check files that are excluded by rsync
		if not((file_path in excluded_files) or (any(x in file_path for x in exclude_folder))):
			
			date_elem = [ int(elem) for elem in str_date.split(":")]
			file_date = datetime.datetime(*date_elem)
			md5_list[file_path] = (md5sum, file_date)

	return md5_list

def displayTime(time):
  """Will format the given time in seconds to display hours and minutes if needed. 
  
  Hence, 1200 seconds will display as 20 min
  
  Input:
  time: number of seconds
  
  Output: string formating of the given time, using hours and minutes if needed"""

  time = float(time)
  
  nb_hours = int(time / 3600)
  time = time - nb_hours * 3600
  
  nb_minutes = int(time / 60)
  time = time - nb_minutes * 60
  
  nb_seconds = round(time, 2)
  
  # We construct the string
  str_time = ''
  if (nb_hours != 0):
    str_time += "%dh " % nb_hours
  if (nb_minutes != 0):
    str_time += "%dmin " % nb_minutes
  str_time += "%.1fs" % nb_seconds
  return str_time

def send_mail(message, title):
	"""preconfigured function to send an e-mail. 
	"""
	me = "%s@%s" % (os.getlogin(), socket.gethostname())
	to = "Your_email@adress.com"

	gmail_user = ''
	gmail_pwd = '' # application password generated specifically
	smtpserver = smtplib.SMTP("smtp.gmail.com",587)
	smtpserver.ehlo()
	smtpserver.starttls()
	smtpserver.ehlo
	smtpserver.login(gmail_user, gmail_pwd)

	msg = MIMEText(message)

	msg['Subject'] = title
	msg['From'] = me
	msg['To'] = to

	smtpserver.sendmail(me, to, msg.as_string())

	smtpserver.close()

home = os.path.expanduser("~")
logging.basicConfig(filename=os.path.join(home, "sync_storage.log"), filemode='w') # the previous logFile is erased if it already existed.
log = logging.getLogger("sync_storage.py")
log.setLevel(logging.DEBUG) #set verbosity to show all messages of severity >= DEBUG
report_message = ""
key_problem = ""
corruption_problem = ""
changed_problem = ""

exclude_folder = ["lost+found", ".Trash-1000"]

new_md5 = "checklist.md5"
old_md5 = "checklist_old.md5"
rsync_filename = "rsync_changed_files.log"

log.info("%s" % datetime.datetime.today())
log.info("From %s to %s" % (documents, backup))

if not(os.path.exists(documents)):
	log.warning("%s do not exist." % documents)
	exit()

if not(os.path.exists(backup)):
	log.warning("%s do not exist." % backup)
	exit()

if (not(cmd_exists("md5deep"))):
	log.warning("Error: md5deep is not installed.")
	exit()

isProblem = False
isTest = False
problem_message = """AIM : Backup documents into a spare partition. 
In addition, will check the md5sum of each and every files to ensure 
that no corruption occured through time. Of course, corruption is checked only between 
already existing copies of a given files. Freshly copied files are skiped.

The script can take various arguments:
(no spaces between the key and the values, only separated by '=')
 * test : Will compare the existing md5sum without actually computing them. 
          Will only compare the checksum.md5 files of each partition
 * help : display a little help message on HOW to use various options.

EXAMPLE:
To see the current help message:
 > %s help 
 
 To launch only the compare features, without actually 
 syncing (rsync) or computing (md5deep):
 > %s 
 """ % (__file__, __file__)


value_message = "/!\ Warning: %s does not need any value, but you defined '%s=%s' ; value ignored."

# We get arguments from the script
for arg in sys.argv[1:]:
	try:
		(key, value) = arg.split("=")
	except:
		key = arg
		value = None
	if (key == 'test'):
		isTest = True
		if (value != None):
			print(value_message % (key, key, value))
	elif (key == 'help'):
		isProblem = True
		if (value != None):
			print(value_message % (key, key, value))
	else:
		print("the key '%s' does not match" % key)
		isProblem = True

if isProblem:
	print(problem_message)
	exit()

if not(isTest):
	if os.path.isfile(os.path.join(documents, new_md5)):
		shutil.move(os.path.join(documents, new_md5), os.path.join(documents, old_md5))

	if os.path.isfile(os.path.join(backup, new_md5)):
		shutil.move(os.path.join(backup, new_md5), os.path.join(backup, old_md5))

if not(os.path.isfile(os.path.join(backup, old_md5))):
	log.warning("The old md5sum file doesn't exist (%s)" % os.path.isfile(os.path.join(backup, old_md5)))

if not(os.path.isfile(os.path.join(documents, old_md5))):
	log.warning("The old md5sum file doesn't exist (%s)" % os.path.isfile(os.path.join(documents, old_md5)))

if not(isTest):
	ellapsed_time = time.time() - t_start
	log.info("Initialisation (%s)" % displayTime(ellapsed_time))
	log.info("%s Code start" % datetime.datetime.today())
	t_start = time.time()

	ellapsed_time = time.time() - t_start
	log.info("Backup of $HOME finished (%s)" % displayTime(ellapsed_time))
log.info("Rsync starting")
t_start = time.time()

# The option -i display item changes. 
# the option --dry-run will display output without doing anything. Perfect to test a command before running the actual backup.
# This command will copy the modified and new files, as well as deleting those that were suppressed in the reference partition.
# This command will not modified corrupted files on either side (and that was the initial problem)
#~ command = 'rsync --dry-run -avi --delete %s/ %s/ --filter "- lost+found" --filter "- .Trash-1000"' % (documents, backup)

if not(isTest):
	exclude_template = ["--filter \"- %s\"" for i in exclude_folder]
	command = 'rsync -avi --delete %s/ %s/ %s' % (documents, backup, " ".join(exclude_template))
	rsync_stdout = run(command)

	# Storing rsync info just in case
	object_file = open(os.path.join(documents, rsync_filename), 'w')
	object_file.write(rsync_stdout)
	object_file.close()
	
	shutil.move(os.path.join(documents, rsync_filename), os.path.join(documents, rsync_filename))
else:
	object_file = open(os.path.join(documents, rsync_filename), 'r')
	rsync_stdout = object_file.read()
	object_file.close()

lines = rsync_stdout.split("\n")
# Delete the first line
del(lines[0])

# Delete the 3 trailing lines
for i in range(3):
	del(lines[-1])

changed_files = []
for line in lines:
	# If folder, we skip
	if (line[-1] != "/"):
		changed_files.append("./%s" % line[12:])

# Adding the output files into the excluded list
# md5 checkfiles can't be compared because the file order in which 
# the md5 is processed is different each time
changed_files.append("./%s" % new_md5)
changed_files.append("./%s" % old_md5)
changed_files.append("./%s" % rsync_filename)



ellapsed_time = time.time() - t_start
log.info("Rsync finished (%s)" % displayTime(ellapsed_time))
log.info("md5deep starting")
t_start = time.time()

#~ -r recursive mode
#~ -l relative path instead of absolute
#~ md5deep_command = "md5deep -rl . > %s" % new_md5
#~ -o f is the expert mode. In this case, we selected to test only the files
#~ I had a problem with a named pipe that is excluded with this option
doc_command = ["md5deep", "-rlt", "-o f", "."]
spare_command = ["md5deep", "-rlt", "-o f", "."]

# À tester pour débuguer:
# md5deep -rl -j0 -o f . > checklist.md5

if not(isTest):
	# md5deep on a 900GB (250 000+ files) takes around 7 hours
	# Here, we launch md5deep on both partition simultaneously, 
	# since they're not on the same hard drive.
	document_output = open(os.path.join(documents, new_md5), 'w')
	document_error = open(os.path.join(documents, "md5_error.log"), 'w')

	# Currently, if we want relative paths to work in md5deep, we must specify "." 
	# in the path. So we must chdir to the desired directory beforehand. 
	# I submitted a bug issue, but to make this work, I did this trick.
	os.chdir(documents)
	doc_process = subprocess.Popen(doc_command, stdout=document_output, stderr=document_error, bufsize=-1)

	backup_output = open(os.path.join(backup, new_md5), 'w')
	backup_error = open(os.path.join(backup, "md5_error.log"), 'w')
	os.chdir(backup)
	spare_process = subprocess.Popen(spare_command, stdout=backup_output, stderr=backup_error, bufsize=-1)

	doc_code = doc_process.wait()
	log.info("%s [%d]" % (doc_command, doc_code))

	spare_code = spare_process.wait()
	log.info("%s [%d]" % (spare_command, spare_code))

	document_output.close()
	document_error.close()
	backup_output.close()
	backup_error.close()

ellapsed_time = time.time() - t_start
log.info("md5deep finished (%s)" % displayTime(ellapsed_time))

log.info("Check md5 on documents")
t_start = time.time()

# We check md5 on documents
doc_new_md5 = get_dict_md5(os.path.join(documents, new_md5), excluded_files=changed_files)
doc_old_md5 = get_dict_md5(os.path.join(documents, old_md5), excluded_files=changed_files)

for key in doc_old_md5.iterkeys():
	try:
		if (doc_new_md5[key][0] != doc_old_md5[key][0]):
			if (doc_new_md5[key][1] > doc_old_md5[key][1]):
				changed_problem += "%s has changed\n" % os.path.join(documents, key[2:])
			else:
				corruption_problem += "%s is corrupted\n" % os.path.join(documents, key[2:])
	except KeyError:
		key_problem += "key:%s doesn't exist in old %s checklist.\n" % (key, documents)
		
ellapsed_time = time.time() - t_start
log.info("Check md5 on documents finished (%s)" % displayTime(ellapsed_time))
log.info("Check md5 on backup")
t_start = time.time()

# We check md5 on spare
spare_new_md5 = get_dict_md5(os.path.join(backup, new_md5), excluded_files=changed_files)
spare_old_md5 = get_dict_md5(os.path.join(backup, old_md5), excluded_files=changed_files)

for key in spare_old_md5.iterkeys():
	try:
		# First we compare md5sum. Then we compare the file time that 
		# must be equal for the corruption problem to be assessed
		if (spare_new_md5[key][0] != spare_old_md5[key][0]):
			if (spare_new_md5[key][1] > spare_old_md5[key][1]):
				changed_problem += "%s has changed\n" % os.path.join(backup, key[2:])
			else:
				corruption_problem += "%s is corrupted\n" % os.path.join(backup, key[2:])
	except KeyError:
		key_problem += "key:%s doesn't exist in old %s checklist.\n" % (key, backup)

ellapsed_time = time.time() - t_start
log.info("Check md5 on backup finished (%s)" % displayTime(ellapsed_time))
log.info("Comparing documents and backup")
t_start = time.time()

# We compare md5 between documents and spare
for key in doc_new_md5.iterkeys():
	try:
		if (doc_new_md5[key][0] != spare_new_md5[key][0]):
			if (doc_new_md5[key][1] > spare_new_md5[key][1]):
				changed_problem += "%s has changed\n" % key
			else:
				corruption_problem += "%s is different in both partition\n" % key
	except KeyError:
		key_problem += "key:%s doesn't exist in new %s checklist.\n" % (key, backup)
		
ellapsed_time = time.time() - t_start
log.info("Comparing documents and backup finished (%s)" % displayTime(ellapsed_time))

if (corruption_problem == ""):
	corruption_problem += "No corruption detected."

report_message += "%s\n" % corruption_problem
report_message += "%s\n" % changed_problem
report_message += "%s\n" % key_problem


# In case of corrupted file, we send a report by e-mail
if (report_message != ""):
	send_mail(message=report_message, title="sync_storage report")

log.info("%s End of script" % datetime.datetime.today())

Merci pour votre aide en tout cas,
Autiwa

#15 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 12/07/2015, à 08:58

Autiwa
Réponses : 19

Non, je n'ai pas essayé, mais le script en lui même ne prend que quelques secondes, c'est le lancement de md5deep (un binaire donc) qui prend 7h. Et de ce que j'ai compris, c'est vraiment les accès disque qui limitent, puisque chaque instance de md5deep est à 10% CPU à peu près.

Donc je ne suis pas certain que ce soit ultra optimisable. En tout cas, je ne suis pas capable d'optimiser md5deep, puisque ce n'est pas moi qui le développe. J'imagine qu'il sera toujours beaucoup plus rapide que n'importe quelle version "à la mano" qui fait la même chose.

#16 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 12/07/2015, à 13:19

Autiwa
Réponses : 19

J'ai pas l'budget pour un SSD d'1To. Sinon, ça ferait un moment que j'en aurait un pour mon système, au lieu de mon 110Go actuel.

De plus, dans l'éventualité où je le ferais, il me faudrait 2 SSD d'1To. Ça ne sert à rien qu'un md5deep se finisse en 1h si l'autre met toujours 7h, puisque les deux tournent en parallèle.

#17 Re : -1 »  [Resolu] corruption de donnée: md5 d'une grande quantité de fichiers » Le 12/07/2015, à 18:27

Autiwa
Réponses : 19

Siouplay, à vot' bon cœur, pour lutter contre la corruption !

#18 -1 »  [Resolu] Disque dur externe passe lecture seule à la moindre opération » Le 13/06/2015, à 14:00

Autiwa
Réponses : 7

Bonjour,

Voilà bien longtemps que je n'avais pas posé de question Ubuntu !

J'ai rebranché récemment mon disque dur de Backup de 3To. Branché en eSata. Une seule partition, de 3To, en ext4. La table de partition est en GPT.

Il se monte, semble avoir tous les droits qu'il faut. Sauf que dès que je veux faire un truc dessus, il passe en lecture seule. Je ne comprends pas ce qu'il se passe, et il fonctionnait bien avant (il est vrai que ça fait plusieurs mois que je ne l'ai pas branché).

Chose intéressante, si je le débranche et rebranche, il conserve la lecture seule, alors que si je redémarre, il semble à nouveau correct, pour mieux replanter derrière (le fourbe).

Une demi journée que j'épluche les forums sans la moindre piste, je désespère un peu. Est-ce qu'un expert en disque aurait du temps à consacrer à mon problème?

D'avance merci du temps que vous passerez sur mon sujet.

#19 Re : -1 »  [Resolu] Disque dur externe passe lecture seule à la moindre opération » Le 13/06/2015, à 14:18

Autiwa
Réponses : 7

Merci de ta réponse.

Je n'ai pas essayé le montage manuel. Par contre, j'ai essayé de rajouter une ligne dans le /etc/fstab, pour contrôler comment il était monté (ce qui revient normalement au même), mais ça n'a rien changé.

Je vais tenter de le monter à la main, pour ce que j'ai à perdre.

La vérification du système de fichier est une bonne idée, je vais regarder comment on fait ça.

#20 Re : -1 »  [Resolu] Disque dur externe passe lecture seule à la moindre opération » Le 13/06/2015, à 14:31

Autiwa
Réponses : 7

Bon.

Un

sudo mkdir /media/autiwa/Backup

puis

sudo chown autiwa: Backup

Et enfin

sudo mount -t ext4 /dev/sdd1 /media/autiwa/Backup

Semble fonctionner. mon script de backup sembler fonctionner maintenant.

Quant à la raison, je n'en ai aucune idée. C'est pas ultra pratique si je dois le monter à la main à chaque fois.

Sans être résolu (je ne comprends pas pourquoi), ça semble fonctionner, ce qui est un net progrès en soi !

Merci de ton aide !

#21 Re : -1 »  [Resolu] Disque dur externe passe lecture seule à la moindre opération » Le 15/06/2015, à 12:07

Autiwa
Réponses : 7

Merci de l'info. Il faudra que je teste en branchant de nouveau. C'est bizarre parce que le disque dur n'a quasiment jamais servi. Branché une dizaine de fois (pour des backup). Je penche plutôt pour le problème de montage, puisque manuellement, il s'est monté correctement et j'ai pu transférer. Reste que je n'ai pas compris pourquoi il faisait ça.

Concernant les messages du noyau, tu sais quel fichier c'est?

#22 Re : -1 »  Nautilus 3.10.1 Selection element par motif impossible » Le 29/03/2015, à 10:08

Autiwa
Réponses : 3

J'ai moi aussi ce problème, depuis plusieurs mois en fait. Quelqu'un a trouvé une explication depuis?

Apparemment c'est un bug connu depuis quelques temps, mais pas considéré comme prioritaire, donc une solution pourrait mettre beaucoup de temps à voir le jour.

Le nom de la fonction en anglais "select with pattern"

Lien vers les rapports de bugs :
https://bugs.launchpad.net/ubuntu/+sour … ug/1300308
https://bugs.launchpad.net/ubuntu/+sour … ug/1315896

Apparemment le soucis ne survient que dans le mode d'affichage "liste". Ce problème ne semble être présent que dans la version Ubuntu de Nautilus, et pas dans la version normale de Nautilus.

#23 Re : -1 »  Diablo 3 RoS sous ubuntu 14.04 » Le 18/07/2014, à 21:51

Autiwa
Réponses : 17

Raté, écran gris. Je te remercie pour ton aide malgré tout. Tant pis pour Diablo III.

#24 Re : -1 »  Diablo 3 RoS sous ubuntu 14.04 » Le 19/07/2014, à 08:35

Autiwa
Réponses : 17

Ben le driver libre a fonctionné du premier coup, c'est juste pour le jeu que ça a pêché. Les drivers libre laissent à désirer pour les nvidia (voire n'existent pas), mais c'est l'inverse pour les ATI depuis que les pilotes ont été libérés.

Je me suis fait la même réflexion que toi pour les cartes avant d'acheter mon nvidia précédente. Je n'ai jamais eu autant d'emmerdes avec une carte. Pilote proprio mal intégré au système, qui n'a jamais reconnu mon écran correctement, et qui au fil des mises à jour n'a plus supporté ma carte (obligé de prendre un vieux pilote) parce qu'ils considéraient que ma carte était trop vieille.

Du coup je me suis dit "nvidia plus jamais". Mais les cartes graphiques sous linux, dès qu'on veut faire autre chose que de la bureautique, c'est la merde, et ça le restera sûrement. Tant pis.