Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
nombre réponses : 25

#0 -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

#1 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).

#2 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.

#3 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é.

#4 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".

#5 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

#6 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.

#7 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.

#8 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.

#9 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.

#10 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 !

#11 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.

#12 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 !

#13 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?

#14 -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.

#15 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.

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

Autiwa
Réponses : 17

Bonjour !

J'essaie de jouer à Diablo III, plus exactement à la démo (ça serait con d'acheter le jeu et ne pas pouvoir y jouer).

Pour celà, j'ai installé playonlinux des dépots, installé l'application via le launcher du site web, téléchargé les 25Gio et quelques.
Ma carte graphique est une Radeon HD 4850. J'utilise les pilotes libres.

J'ai le même soucis que toi quand je lance le jeu, c'est à dire un full screen gris indéfiniment.

J'ai même eu droit à un plantage à l'instant pour vérifier. J'ai dû tuer diablo via Ctrl + Alt + F1 puis revenir dans la session X.

Bref, je poste un message ici puisque nos soucis sont similaires. Mais ta solution ne fonctionne pas pour autant.

Quand je fais :

setarch i386 -3 playonlinux

J'ai quand même le gray screen of death.

Des idées, des pistes, n'importe quoi? Par défaut, je rend la carte à son propriétaire, je ne m'en achète pas, et je renonce jouer.

#17 Re : -1 »  Diablo 3 RoS sous ubuntu 14.04 » Le 18/07/2014, à 19:41

Autiwa
Réponses : 17

Une tour. Une carte mère Asus Z87-A pour accueillir la carte (HD radeon 4850 donc)

#18 Re : -1 »  Diablo 3 RoS sous ubuntu 14.04 » Le 18/07/2014, à 19:58

Autiwa
Réponses : 17

Il est vrai que j'ai installé battle.net et diablo III avec la version normale de playonlinux. Wine était déjà installé aussi.

Tu penses que désinstaller diablo et play on linux, puis réinstaller diablo en lançant play on linux en 32 bits peut jouer?

#19 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.

#20 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.

#21 Re : -1 »  Lecteur carte mémoire transcend RDF8 usb 3.0 incompatible » Le 20/06/2014, à 10:46

Autiwa
Réponses : 11

Merci beaucoup pour l'info ! J'ai mis à jour sur un mac, je teste la connexion usb3 dès que possible.

[edit]
Ça marche parfaitement pour moi, j'ai pu transférer sans problèmes.
[/edit]

#22 -1 »  Git comparaison outputs de différentes révisions » Le 21/05/2014, à 17:02

Autiwa
Réponses : 0

Bonjour !

Pour le code que je développe, j'ai un dépot Git. Quand je modifie le code, il y a des versions (la majorité) qui ne sont pas censés modifier les résultats du code. J'ai donc créé un script de comparaison automatique des fichiers d'outputs afin de tracer d'éventuelles différences, signes d'un bug.

Or il y a aussi des révisions qui modifient les résultats du code (et c'est normal). Du coup, je cherche un moyen d'automatiser la comparaison du code, en allant chercher l'avant dernière (ou n'importe quel nombre de révision, ou une révision spécifique).

Existe-t-il un outil qui permette de faire ça automatiquement? Le dépot n'étant pas forcément synchronisé, et les modifications par forcément committés, il faut que ce soit comparé dans CE dépot Git. Je ne sais pas encore trop comment m'y prendre. Est-ce que certains d'entre vous se sont déjà posé des questions similaires?

Merci d'avance,

#23 Re : -1 »  [Résolu] scanner non reconnu : Dell B1265dfw (multifonction) » Le 01/05/2014, à 08:05

Autiwa
Réponses : 103

J'ai tout débranché sauf la souris et l'imprimante (oui, j'ai même débranché le clavier, vraiment le minimum).

J'ai redémarré, et après la connexion avec un clavier virtuel, j'ai testé le configurateur dell, simple scan et xsane. Aucun ne détecte le scanner.

PS : Pas d'autres manip's d'ici à dimanche soir, je pars en week-end.

#24 Re : -1 »  [Résolu] scanner non reconnu : Dell B1265dfw (multifonction) » Le 04/05/2014, à 18:52

Autiwa
Réponses : 103

Sylvain3800? Merci ! Ta dernière idée fonctionne parfaitement. J'ai simplement installé suld-configurator-2-qt4, j'ai lancé le configurateur, avec les 3 icônes. Il a détecté l'imprimante, puis il a détecté le scanner.

J'ai donc lancé simple scan, et j'ai pu scanner. J'ai pu aussi imprimer (j'avais désinstallé l'imprimante).

moko138, PPdM, alca94, merci de votre aide et de votre temps. Merci à vous tous pour le temps que vous avez passé à m'aider. Sans vous, je n'aurais pas pu scanner avec mon imprimante, ce qui gâche un peu le "multifonction" de l'imprimante que je viens d'acheter.

Un merci d'autant plus grand que Dell a conclu que le problème était clos en disant "ça ne vient pas de l'imprimante puisque vous avez pu scanner sur mac". Avec en implicite un magnifique "démerdez-vous".