::franek::

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé : linux

DELL Vostro 3500 - "critical temperature reached, shutting down" - Ubuntu

Il arrive que mon portable "DELL Vostro 3500" s'arrête de manière inopinée. En étudiant les logs (/var/log/kern.log), j'ai ce type de messages :

kern.log:Apr 23 14:56:04 franek-vostro-3500 kernel: [ 678.813696] thermal thermal_zone0: critical temperature reached(100 C),shutting down

Manifestement, le PC s'arrête car le processeur a atteint une température trop élevée. Le ventilateur (ce portable ne contient qu'un seul ventilateur) ne joue plus correctement son rôle.

Un nettoyage du ventilateur avec de l'air pulvérisé permet de lui redonner une petite jeunesse (Il est également possible de le démonter entièrement).

Néanmoins, il est avéré que ce modèle de portable chauffe énormément. Les réglages, par défaut, du démarrage du ventilateur selon la température du processeur ne semblent pas optimisés. Il est possible d'optimiser la gestion du ventilateur grâce au module i8k du noyau. Pour cela, il faut installer le paquet i8kutils :

sudo apt-get install i8kutils

Ce paquet installe les utilitaires suivants :

  • i8kctl : permettant de contrôler le ventilateur
  • i8kfan : idem
  • i8kmon : démon qui va contrôler la vitesse du ventilateur selon la température du processeur.

Il est possible de modifier la configuration de i8kmon en ajoutant/modifiant le fichier /etc/i8kmon.conf. Personnellement, le fichier contient :

# Temperature thresholds: {fan_speeds low_ac high_ac low_batt high_batt}
set config(0)   {{- 0}  -1  40  -1  45}
set config(1)   {{- 1}  30  55  35  60}
set config(2)   {{- 2}  45  80  50  80}
set config(3)   {{- 2}  70 128  70 128}

Après la modification du fichier de configuration, il convient de redémarrer le démon :

sudo service i8kmon restart

Personnellement, ces modifications ont résolu (pour un temps) mes problèmes. Le PC semble moins chauffer et l'ordinateur semble plus silencieux.

Pour aller plus loin :

Post-it : crontab et %

Une petite astuce concernant crontab que je ne connaissais pas (on apprend tous les jours).

Les caractères % doivent être échappés dans crontab.

Le crontab suivant :

00 19 * * * /chemin/vers/mon/script.sh >/chemin/vers/output-`date +%Y%m%d`.log

ne fonctionnait pas.

J'obtenais une erreur du type :

/bin/sh: Syntax error: EOF in backquote substitution

Après quelques recherches, je suis tombé sur un fil de stackoverflow qui correspondait à mon problème.

Dans crontab, il est nécessaires d'échapper avec un backslash le caractère %. Le contab suivant fonctionne :

00 19 * * * /chemin/vers/mon/script.sh >/chemin/vers/output-`date +\%Y\%m\%d`.log

Amélioration du "post script" de backup-manager

backup-manager est un script très pratique permettant de faire la sauvegarde d'un serveur dédié. Ce script est utilisé pour effectuer la sauvegarde de la dédibox qui héberge ce site et ces satellites. Par défaut, ce script ne propose pas de contrôle des fichiers déposés sur le serveur de sauvegarde ou d'envoi d'un email lors de la fin de l'exécution de la sauvegarde.

Il est possible d'ajouter des fonctionnalités à ce script via des hooks exécutés avant ou après la sauvegarde. Alsacréations propose un exemple de hook permettant d'envoyer un mail à la fin de l'exécution de la sauvegarde. Malheureusement, ce script ne vérifie pas que les fichiers ont bien été déposés sur le serveur de sauvegarde et que les fichiers sont bien complets. Ce script n'est utile que si la méthode d'upload est FTP. Dans le cadre d'une autre méthode d'upload (rsync, par exemple), le contrôle peut être exécuté nativement.

J'ai donc adapté le script d'alsacréations.

#!/usr/bin/php
<?php
/**
 * backup-manager post script :
 *  - permet de vérifier l'intégrité des fichiers uploadés sur le serveur de sauvegarde
 *    (comparaison des chaines md5)
 *  - envoie d'un mail récapitulatif contenant la liste des fichiers et la taille totale utilisée
 *
 * @references script inspiré de Alsacréation : http://www.alsacreations.com/tuto/lire/618-Sauvegarde-backup-manager.html
 * @autor Franek <franek at chicour dot net>
 */
 
/**
 * Configuration
 */
# email des destinataires
$email_dest = array(dest@domain.com');
# répertoire local de stockage des fichiers de sauvegarde
$archives_dir = '/var/archives';
# adresse du serveur FTP
$ftp_server = '';
# identifiant du serveur FTP
$ftp_user_name = '';
# mot de passe du serveur FTP
$ftp_user_pass = '';
 
/**
 * Ne pas modifier - ci-dessous
 */
 
/**
 *
 * Envoi d'un mail
 *
 * @param array $email_dest
 * @param string $subject
 * @param string $content
 */
function sendMail($email_dest, $subject, $content)
{
    foreach($email_dest as $dest)
    {
        mail($dest, $subject, $content);
    }
}
 
/**
 * Récupère la liste des fichiers présents en local pour une date donnée
 * @param $archives_dir string répertoire de stockage des fichiers
 * @param $filtre_date string date à filtrer (format YYYYMMDD)
 * @return array
 */
function getLocalFiles($archives_dir, $filtre_date)
{
	clearstatcache();
 
	$files = array();
	foreach (new DirectoryIterator($archives_dir) as $file_info)
	{
	    if($file_info->isDot() || !preg_match('/'.date('Ymd').'/',$file_info->getFileName()))
	    {
		continue;
            }
	    $file['name'] = $file_info->getFilename();
	    // on utilise cette commande car filesize ne gère pas les fichiers de plus de 2Go.
            $file['size'] = exec("stat -c %s '".$file_info->getPathname()."'");
            $files[] = $file;
	}	
	sort($files);
	return $files;
}
 
/**
 *
 * Compare le hachage md5 des fichiers locaux avec les fichiers envoyés
 * sur le serveur FTP
 * Si le hachage est identique, renvoie true.
 * Sinon, renvoie false
 *
 * @param string $md5_file
 * @param string $ftp_server
 * @param string $ftp_user_name
 * @param string $ftp_user_pass
 * @param string $filtre_date
 * @return bool
 */
function verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $filtre_date)
{
	$handle = fopen($md5_file, "r");
	if ($handle !== false)
        {
		while (!feof($handle)) 
		{
	        	$buffer = fgets($handle, 4096);
	        	list($md5, $filename) = explode("  ", $buffer);
			// pour supprimer /n
			$filename = trim($filename);
			if (!empty($filename))
			{
				if ($md5 !== getMd5OverFtp($filename, $ftp_server, $ftp_user_name, $ftp_user_pass))
				{
					fclose($handle);
					return false;
				}
			}
		}
	fclose($handle);
	}
        else
        {
            return false;
        }
	return true;
}
 
/**
 *
 * Renvoie le hachage md5 d'un fichier présent sur le serveur FTP de sauvegarde
 *
 * @param string $file fichier dont le md5 doit être calculé
 * @param string $ftp_server adresse du serveur FTP de sauvegarde
 * @param string $ftp_user_name identifiant de connexion du serveur FTP
 * @param string $ftp_user_pass mot de passe de connexion du serveur FTP
 * @return string
 */
function getMd5OverFtp($file, $ftp_server, $ftp_user_name, $ftp_user_pass)
{
	$connect_string  = 'ftp://';
	$connect_string .= $ftp_user_name;
	if (!empty($ftp_user_pass))
	{
		$connect_string .= ':'.$ftp_user_pass;
	}
	$connect_string .= '@'.$ftp_server;
	$connect_string .= '/'.$file;
	return md5_file($connect_string);
}
 
 
/**
 * Renvoie la taille du fichier en un format compréhensif
 *
 * source : http://fr.php.net/manual/en/function.filesize.php (nak5ive at DONT-SPAM-ME dot gmail dot com)
 *
 * @param int $bytes
 * @param int $precision
 * @return string
 */
function formatBytes($bytes, $precision = 2)
{
    $units = array('B', 'KB', 'MB', 'GB', 'TB');
 
    $bytes = max($bytes, 0);
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
    $pow = min($pow, count($units) - 1);
 
    $bytes /= pow(1024, $pow);
 
    return round($bytes, $precision) . ' ' . $units[$pow];
}
 
 
/**
 * début du script
 */
$date = date('Ymd');
$host = trim(file_get_contents('/etc/hostname'));
# fichier contenant les chaines md5 de tous les fichiers sauvegardés
$md5_file = $archives_dir.'/'.$host.'-'.$date.'.md5';
$check_md5_ftp = false;
 
clearstatcache();
 
$local_files = getLocalFiles($archives_dir, $date);
if(empty($local_files))
{
	$output .= ' - Fichiers non présents en local (attention : cela peut venir d\'un problème de droit).'."\n";
}
else
{
	$output .= ' - Fichiers présents en local :'."\n\n";
	$total_size = 0;
        // affichage de la liste des fichiers avec leur taille et un total global
	foreach($local_files as $file)
	{
		$output .= '   # '.$file['name'];
		$output .= ' ('.formatBytes($file['size']).')';
		$output .= "\n";
		$total_size += $file['size'];
	}
	$output .= "\n".'   # TOTAL : '.formatBytes($total_size)."\n\n";
 
        // lance la vérification md5 des fichiers uploadés sur le serveur FTP
	$check_md5_ftp = verifMd5Ftp($md5_file, $ftp_server, $ftp_user_name, $ftp_user_pass, $filtre_date);
	if ($check_md5_ftp === false)
	{
		$output .= ' - problème d\'intégrité dans les fichiers transmis sur le serveur FTP'."\n";
	}
	else
	{
		$output .= ' - intégrité des fichiers sur le serveur FTP vérifiés.'."\n";
	}
}
 
// construction du sujet du mail
$subject = '['.$host.']';
if ($check_md5_ftp === true)
{
	$subject .= ' backup ok';
}
else
{
	$subject .= ' backup ko';
}
 
sendMail($email_dest, $subject, $output);
?>

Vous pouvez copier ce script dans /etc/backup-manager-post.php et lui donner les droits :

chmod +x /etc/backup-manager-post.php

Pour ajouter le hook à backup-manager, vous devez modifier le fichier de configuration /etc/backup-manager.conf et ajouter :

export BM_POST_BACKUP_COMMAND="/etc/backup-manager-post.php" 

à propos :: Mots-clés :: archives :: RSS :: Mail