Buse bouchée

La buse qui se bouche est une panne courante. Cela se traduit par le fait que l’engrenage de l’extrudeur patine sur le fil et n’arrive plus à l’enfoncer vers la buse, le plastique ne coule plus ou peu. l’impression si elle fonctionne encore est totalement sous-extrudée (manque de matière).

Le bouchage peut être provoqué par des poussière sur le fil qui se sont accumulé dans la buse. Contre cela, le mieux c’est de faire passer le fil dans un passe-fil contenant une petite éponge qui dépoussière le câble avant son arrivée dans la buse, mais c’est préventif.
Si la buse est déjà bouchée et que même avec une aiguille dédiée, le problème perdure, le mieux est de remplacer la buse (un lot de 10 buses coute très peu).
Il existe d’autre méthodes, comme démontage du tube d’arrivée pour procéder l’arrachage du fil à froid pour que les saletés partent avec le bout du fil, mais si vous n’avez pas l’habitude, le risque d’abimer une autre partie risque d’engendrer un coût plus important.

En dehors de la poussière, un mauvais réglage peut boucher rapidement la buse et le tube d’arrivée:

La rétraction trop forte, cumulée une vitesse d’impression trop lente:

Le fait de remonter le fil en fusion loin dans le tube d’arrivé et de le repousser lentement fait monter en température ce tube. Le fil fond alors avant d’arriver dans la buse et c’est le blocage. (C’est ce qui m’est arrivé , le résultat sur cette photo).

 

 

Problème d’accrochage de l’impression sur le plateau

Ce problème a plusieurs causes possibles.

1) Le plateau est trop lisse.
Si vous avez un plateau en verre, il faut utiliser de la laque à cheveux (indice fort !). Ceci créera l’adhésion nécessaire entre le plateau et l’impression pendant qu’elle s’effectue.

2) la distance entre la buse et le plateau est trop grande.
Il faut niveler le plateau au centre et aux extrémités avec comme référence une feuille de papier 80g. celle-ci doit passer entre les deux mais en « grattant » légèrement.

Concernant le nivelage, une opération particulièrement pénible car il faut le refaire presque à chaque impression sous peine de recommencer votre impression plusieurs fois, d’autant plus que le plateau se dilate et se déforme légèrement sous l’effet de la chaleur.
Je vous recommande donc d’ajouter un BLTOUCH afin d’éviter que vous envisagiez d’apprendre à voler à votre imprimante…
Il s’agit d’un palpeur électronique qui va mesurer à chaque impression la distance du plateau. Il ne restera alors qu’a définir dans l’imprimante la distance de référence (toujours avec une feuille de papier).

C’est plutôt technique, il faut imprimer un support, créer des câbles de liaisons (et donc, commander des connecteur à sertir (type dupont coté bltouch, jst-hx 3 broches coté carte mère)), les passer dans les gaines, et trouver où les brancher sur la carte mère (sans vous tromper !), modifier le firmware pour activer cette fonctionnalité…

IMPORTANT: Si vous n’avez pas encore acheté d’imprimante, surtout, prenez un modèle pré-équipé, vous gagnerez un temps précieux !!!

Nouvelle rubrique: L’impression 3D

D’abord un constat:

L’impression 3D est en 2018 ce qu’était l’informatique en 1982: Une aventure pour bricoleur averti ou, du moins, entêté.

Modifications nécessaires pour rendre le matériel réellement opérationnel, pannes fréquentes, causes de bug nombreuses, plantage sont monnaies courante qu’il faut accepter tout comme c’était le cas sur ZX81 au siècle dernier.

Le but de cette rubrique:

Ayant commencé cette activité récemment, j’ai vu combien cette activité peut rapidement devenir un cauchemar. Le but de cette rubrique est de partager les astuces et les infos sur ce sujet au fil de mes propres découverte.

Premier conseil: Patience ! On apprend que de ses erreurs.

 

 

Mac OS X ne résout pas les noms d’hôtes .local

Si votre domaine local a un FQDN se terminant par « .local », sur les version 10.10 et supérieur, il est fréquent d’avoir des problème de résolution de nom sous Mac OS X car Apple semble s’être appropriée de ce suffixe et passe la résolution de celle-ci via mDNS (multicast port 5353) et non par DNS (unicast port 53 vers serveur DNS) . Le problème c’est que si votre domaine Windows est construit avec ce suffixe, il est très difficile de le changer.

Pour permettre au mac de résoudre les noms portant ce suffixe, lancer la commande suivant depuis un terminal:

sudo discoveryutil mdnsactivedirectory yes

 

=> Les nom d’hôte se terminant par .local pourront alors être résolus comme les autres.

 

Note: Cette astuce ne fonctionne pas dans la version 10.13 car la commande discoveryutil semble avoir été supprimée ou rendue inaccessible…

 

Quorum proxmox planté après mise à jour en version 5

Retour d’expérience sur une upgrade proxmox  4.4 => 5 qui tourne mal sur une machine munie de plusieurs interfaces réseaux.

Symptôme:

Au reboot, après mise à jour, le quorum ne démarre plus un problème cmap.
toutes les commandes pvecm renvoi l’erreur « cannot initialize CMAP », le répertoire /etc/pve semble ne plus contenir qu’une partie des fichiers, et ce, en lecture seule. bref catastrophique.

Le détail indique des défaillances multiples de telle que celle-ci:

[libqb] debug: qb_ipcc_disconnect() (ipcc.c:398:qb_ipcc_disconnect)
[quorum] crit: quorum_initialize failed: 2 (quorum.c:112:service_quorum_initialize)
[libqb] debug: qb_ipcc_disconnect() (ipcc.c:398:qb_ipcc_disconnect)
[confdb] crit: cmap_initialize failed: 2 (confdb.c:239:service_cmap_initialize)
[main] debug: dfsm_set_mode – set mode to 0 (dfsm.c:520:dfsm_set_mode)
[libqb] debug: qb_ipcc_disconnect() (ipcc.c:398:qb_ipcc_disconnect)
[dcdb] crit: cpg_initialize failed: 2 (dfsm.c:1382:dfsm_initialize)
[main] debug: dfsm_set_mode – set mode to 0 (dfsm.c:520:dfsm_set_mode)
[libqb] debug: qb_ipcc_disconnect() (ipcc.c:398:qb_ipcc_disconnect)
[status] crit: cpg_initialize failed: 2 (dfsm.c:1382:dfsm_initialize)
[main] debug: enter cfs_fuse_getattr / (pmxcfs.c:126:cfs_fuse_getattr)

 

Après avoir vainement cherché un problème de fichiers de config perdus, en fait,  il s’agissait d’un problème réseau assez sournois car pourtant tout les tests effectués (ping du nom, ssh et test multicast vers les autres proxmox) fonctionnaient sans soucis dans les deux sens.

Si, comme moi,  vous disposez de plusieurs interface réseaux, vous aurez peut-être opté pour l’idée de « dédier » l’interface vmbr0 pour l’accès à l’interface, les sauvegardes et le quorum, et fait un agrégat (bond) sur vmbr1 afin d’optimiser les performances réseaux des VM.

Pourtant, c’est en supprimant l’agrégat que tout c’est remis à fonctionner.

=> Donc =>

Une solution possible:

Si, après mise à jour, vous rencontrez ce problème, vous pouvez tenter la désactivation ou la suppression / recréation de cette seconde interface (vmbr1).

 

Ps: Après cette remise en marche, un problème de certificat est apparu, (probablement lié aux nombreuses tentatives de remise en état durant plusieurs heures) réglé par

pvecm updatecerts –force

suivi d’un reboot.

Bon courage à vous si vous êtes dans cette situation, en espérant avoir pu vous aider.

json_encode transforme les tableaux (arrays) en objets

Lors d’un développement sous VueJS, l’application présentait des problèmes de filtre (.filter) et de recherche (.find) d’un tableau récupéré en Ajax par vue-resource. Après examen, le tableau n’était plus un array d’objets mais un objet d’objets.

La faute en reviens a une subtilité de json_encode à la frontière du bug: si un tableau a des index discontinus (suite à un filtrage par exemple) celui-ci se trouve encodé en objet d’objets. Or, la fonction filter des collections de Laravel provoquent précisément ce défaut.

La solution c’est l’usage de array_values pour ré-indexer le tableau avant d’en faire un json.

exemple:

$tableau=collect([
    ["prenom"=>"Zoe","age"=>10],
    ["prenom"=>"Robert","age"=>50],
    ["prenom"=>"John","age"=>30]
    ]);

echo json_encode($tableau);
$tableau_filtre=$tableau->filter(function($element){return $element["age"]<40;});
echo json encode($tableau_filtre);

// resolution:
echo json_encode(array_values($tableau_filtre->toArray()));

=> ceci démontre le problème et sa résolution

Routeur Nat et OpenVPN

Cet article a pour but d’expliquer de façon synthétique comment réaliser un routeur relativement simple d’emploi présentant les fonctionnalité suivante:

  • Routage NAT (Network Address Translation) entre une ip publique et un sous réseau privé
  • Possibilité de ce connecter en VPN au sous réseau privé, mais aussi de surfer sur le net via ce réseau privé (pour outrepasser les limites de hot-spot par exemple)
  • Possibilité d’ouvrir un port sur l’ip externe et le rediriger sur un autre port sur l’une des machines du réseau privé.
    Pourquoi ne pas utiliser IPCOP ou autres ? Parce qu’IPCOP ne supporte pas nativement les réglages quelques peut « spéciaux » des IP FAIL OVER d’OVH.
    Certes, il existe des scripts qui permettent de modifier les configuration de passerelles, mais cela est trop hasardeux sur un système en production car il faut être sur que le routeur redémarre sans intervention en cas de coupure.

Le routage NAT, est nommé MASQUERADE dans les firewall linux, correspond a masquer les IP des postes du réseau privé derrière l’unique adresse ip publique.
Par exemple, c’est ce que font les box internet pour permettre l’usage de plusieurs ordinateurs derrière une seule connexion.
Plus d’info ici: https://fr.wikipedia.org/wiki/Network_address_translation

 

1ère étape, installer Ubuntu (non décrit car ce n’est pas le but de ce tutoriel).

=> Installez le module ssh durant l’installation car en console hyper-v, pas de copier coller possible avec votre poste local.
=> Installez au minimum la 14.04.2 lts car le noyau 3.16 offre une meilleur compatibilité hyper-v.

 

2ème étape installer openVPN (voir tutoriel sur le sujet).

Si vous avez suivi le tutoriel sur OpenVPN le routage est déjà activé par l’activation de net.ipv4.ip_forward=1 dans sysctl.conf

=> une fois redémarré, le routage est activé. mais il n’y pas encore de NAT entre eth0 (le wan) et eth1 (le lan)

3ème étape, la mise en place du routage NAT.
Pour cela, on utilisera le firewall le plus simple, c’est UFW.

On activera également cette translation entre l’interface VPN (tun0) et le WAN (interface eth0) pour permettre aux usagers du VPN de pouvoir naviguer sur le net via le VPN.

Avant de commencer a activer un pare-feu, il est très important de ne pas perdre la main en bloquant l’interface SSH.

Si vous l’avez laisser par défaut sur le port 22,

la commande

sudo ufw allow ssh

si vous l’avez modifié (ce qui est une sécurité contre les scripts d’attaques):

sudo ufw allow votre_port_ssh/tcp

exemple: si vous avez déplacé votre port ssh en 1234

sudo ufw allow 1234/tcp

 

Pour activer le transfert des paquets entre les interfaces, il faut active le parametre DEFAULT_FORWARD_POLICY.
Dans le fichier /etc/default/ufw, changez le ce paramètre comme suit:

DEFAULT_FORWARD_POLICY="ACCEPT"

L'activation du routage nat ce fera dans le fichier before.rules situé dans /etc/ufw on ajoutera juste après les premier commentaires:
#règles pour la table NAT
*nat
:PREROUTING - [0:0]
:POSTROUTING ACCEPT \[0:0]

#on efface les règle precedentes (flush)
-F
# transmission du trafic provenant de eth1 (reseau prive) vers eth0
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# transmission du trafic provenant de tun0 (VPN) vers eth0
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

# Ouverture des ports
#-A PREROUTING -i <iface> -p tcp --dport <port public> -j DNAT --to-destination <adr lan>:<port prive>
# exemple d'ouverture de port  port public 8080 vers port prive 80 d'un poste:
#-A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80

# ne pas oublier le 'COMMIT' sinon ces lignes ne seront pas traitée
COMMIT

puis activer UFW avec la commande

sudo UFW enable

=> La translation NAT est alors activée pour votre réseau privé mais aussi pour vos utilisateurs VPN.

=> il est possible d’ajouter d’autres ouvertures de port. aussi bien en tcp qu’en udp. Si le port privé est identique au port public, il n’est pas nécessaire de le mentionner:
exemple:

-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10

Dans cet exemple j’ai pris comme principe:

le wan est sur eth0
le lan est sur eth1 en 192.168.1.0/24
le vpn est sur tun0 en 10.10.10.0/24

Il convient, bien évidement d’adapter cet exemple a votre cas.

A bientôt.

IPv6 Ubuntu et Windows

Bonjour,

Ceci n’est pas un tutoriel mais plus un retour d’expérience car je n’ai pas la prétention de connaitre tout les mécanismes en place dans l’IPv6.

Suite a quelque méli-mélo  un problème commercial avec OVH, je me suis retrouvé avec un serveur en housing chez eux, mais sans IPv4 pour mes VM.

J’ai donc profité de cette latence commerciale pour tenter le faire un point sur l’avancement de l’IPv6.

Afin de pouvoir accrocher des nom d’hote sur mon domaine, j’ai décidé d’affecter des IPv6 statiques sur mes différentes VM.

Attribution:

En IPv6, le fournisseur vous fourni un sous réseau IPv6, généralement de classe /64 et vous laisse donc les 64 autres bits a votre disposition soit 18 milliards de milliards d’adresses !

Passerelle:

Chez FREE, l’adresse de la freebox est généralement la 1ere IP de la plage  donc l’adresse 2001:xxxx:xxxx:xxxx::1
Chez OVH, selon leur documentation, les octets bas des 5 derniers nombres sont a ff cela donne donc quelque chose du genre
2001:xxxx:xxxx:xxff:ff:ff:ff:ff   c’est a dire en affichant l’adresse avec les zero non significatifs cela donne 2001:xxxx:xxxx:xxff:00ff:00ff:00ff:0ff …

=> Oups !!! OVH semble avoir oublié le but d’un masque de sous réseau => Tout ce qui est en dehors du masque est défini comme extérieur et donc à la passerelle située OBLIGATOIREMENT dans le sous réseau…
Le masque réellement fonctionnel avec une telle passerelle est donc /56

Expérimentation sous Windows:

Depuis ma machine virtuelle équipée d’un Windows 2008 Sp2, l’IPv6 se configure sans difficulté. Microsoft n’est pas regardant sur le fait que la passerelle ne se trouve pas dans le même sous réseau…
En faisant pointer les DNS IPv6 vers ceux de Google dont je le rappel les ip sont:

2001:4860:4860::8888 et
2001:4860:4860::8844

L’accès à google est immédiat. Un petit test sur www.ipv6-test.com confirme que tout vas bien.

1ère observation: Sur un poste uniquement IPv6, on n’a accès a aucun site dont le serveur n’est qu’en IPv4.
2ème observation, plus curieuse: Windows Update ne fonctionne pas… il n’est pas IPv6 ready en 2015 alors qu’ils intègrent pourtant l’IPv6 depuis 2008 dans leurs logiciels ?!

Hormis ce problème de défaut de préparation du système de mise à jour, le système s’accoutume bien de l’IPv6 statique, et fonctionne de façon stable, même en désactivant totalement l’IPv4.
La connexion au bureau distant par exemple fonctionne très bien, ainsi qu’un serveur web IIS situé sur ce poste.
En revanche les petits logiciels annexes, une très vieille version de Serv-U (version 6.4) et freeFTPd ne fonctionnent pas mais cela parait assez logique.

Expérimentation sous Ubuntu 14.04.2

L’installation de l’IPv6 statique se fait dans le fichier /etc/network/interfaces

1ère observation: La mise à jour via apt-get update && apt-get upgrade -y fonctionne nickel. Preuve que les dépôts Ubuntu ont une longueur d’avance sur leurs alter-égo de Microsoft.
2ème observation: SSH fonctionne nickel. La connexion réalisée avec Winscp et Putty depuis mon poste abouti parfaitement.
3ème observation: La suppression de la config de l’IPv4 mène a un dysfonctionnement et a plus de 2 mn d’attente a chaque redémarrage. Donc j’ai laisser un config réseau bidon pour qu’il passe outre ce problème.

Sauf qu’Ubuntu, contrairement a Microsoft, ne tolère pas cette erreur de masque… Et au bout d’un délai aléatoire se plante, perte de connectivité totale du serveur jusqu’au reboot.

L’incohérence a pour effet de lui faire perdre sa route par défaut … Donc seul les postes dans le même sous réseau que lui peuvent continuer a dialoguer avec lui… et … c’est bête pour un serveur situé dans un datacentre !

conclusions

Même les grands de l’informatique tel qu’OVH peuvent se perdre dans la complexité de l’IPv6.
Les choses avances tout doucement sur cette évolution inévitable. Il y’a plein de pièges a connaitre, les mécanismes sont beaucoup plus complexes qu’en IPv4 et on est encore loin de pouvoir faire du FULL IPv6 sous peine de ce couper d’une grande partie du monde…

A bientôt

 

Récupérer les dimensions d’un fichier PDF en PHP

Stockage de l’information de dimension

Les dimensions d’un fichier PDF sont stockées dans une unité nommé le « point pica » ou DTP .
Pour résumer, un point pica correspond à 1/72 de pouce. Pour plus d’information, lire ce lien

Conversion de la taille de point pica en millimètre

Un pouce correspond à 25,4 mm

La conversion en millimètre s’obtient donc en multipliant la taille en point pica par 25,4/72
donc, par exemple, si dans un fichier PDF on trouve une taille de 595×842

cela donnera:
595×25,4/72 = 209,90 mm
842×25,4/72 = 297,04 mm

=> Ce qui correspond a un format A4 portrait.

On observera que selon le logiciel utilisé pour la génération du fichier, on aura un variation dans la précision de cette mesure. de même, certains logiciels ajoute derrière ces mesures le format normé (A4 ou autre) correspondant et d’autres non. D’où la difficulté de l’opération.

D’autre part un fichier PDF peut comporter des pages de différentes tailles et/ou orientations.

Récupération de ces information depuis PHP

PHP peut récupérer ces informations via différents outils Linux. Certains donnent une dimension globale, bien souvent la taille de la 1ère page, d’autres au contraire sont capable de vous donner la taille page par page.
Dans presque tout les cas, il faudra filtrer le résultat pour récupérer les informations de hauteur et de largeur.

Plusieurs solutions sont possibles, j’ai choisi pdfinfo pour sa vélocité et ses fonctionnalités.

pdfinfo s’installe avec la commande

sudo apt-get install poppler-utils

ce logiciel, lancé sans parametre renvoi par défaut la taille de la 1ère page ainsi que d’autres informations dont le nombre de pages.
exemple:

pdfinfo test.pdf

nous renvoi:

Title: fichier de test
Subject:
Keywords:
Author: D.FERET
Creator: PDFCreator Version 0.9.9
Producer: GPL Ghostscript 8.70
CreationDate: Fri Sep 27 14:24:08 2013
ModDate: Fri Sep 27 14:24:08 2013
Tagged: no
Form: none
Pages: 3
Encrypted: no
Page size: 595 x 842 pts (A4)
Page rot: 0
File size: 33923 bytes Optimized: no PDF version: 1.4

Ce qui est insuffisant car on récupère que la taille de la 1ère page. Pour demander des informations plus détaillées, on spécifiera la plage de pages a analyser ( donc de 1 à -1 puisque, normalement, on ne connait pas a l’avance le nombre de pages du fichier ):

pdfinfo test.pdf -f 1 -l -1

nous renvoi:

Title: fichier de test
Subject:
Keywords:
Author: D.FERET
Creator:        PDFCreator Version 0.9.9
Producer:       GPL Ghostscript 8.70
CreationDate:   Fri Sep 27 14:24:08 2013
ModDate:        Fri Sep 27 14:24:08 2013
Tagged:         no
Form:           none
Pages:          3
Encrypted:      no
Page    1 size: 595 x 842 pts (A4)
Page    1 rot:  0
Page    2 size: 595 x 842 pts (A4)
Page    2 rot:  0
Page    3 size: 595 x 842 pts (A4)
Page    3 rot:  0
File size: 33923 bytes
Optimized: no
PDF version: 1.4

On observe que les résultats utiles sont noyés dans le texte et il va devoir les extraire grâce a des expressions régulières pour garantir le résultat.

Le script PHP

Au début du script, on lancera la commande avec la commande exec qui permet de récupérer le résultat dans un tableau $lignes:

// série de constante pour constituer plus facilement nos expressions régulières.
CONST ER_SEP = '.*?'; // Séparateur (espace et autre)
CONST ER_FLOAT = '([+-]?\\d*\\.?\\d+)(?![-+0-9\\.])';  // chiffre a virgule ou entier
CONST ER_ENTIER = '(\\d+)';  //nombre entier
CONST ER_ENTIERSIGNE = '([+-]?\\d+)'; //nombre entier avec ou sans signe + ou -

function getDimensionsPDF($nom_du_fichier_pdf){
   $commande = escapeshellcmd('pdfinfo "' . $nom_du_fichier_pdf . '" -f 1 -l -1');
   $lignes = array(); exec($commande,$lignes);

Ensuite 3 cas seront possibles:
La ligne comportant la dimension ET la taille normé
La ligne comportant la dimension SANS la taille normé
La ligne comportant l’information de rotation.

On aura donc besoin de 3 expressions régulières pour récupérer les informations. On passera en revu chaque ligne pour savoir si elle répondent à l’une des 3 expressions.

    // composition des 3 expressions régulières permettant de récupérer les lignes utiles.
    $expRegLigneAvecFormatNorme = "/^Page " . ER_SEP . ER_ENTIER . ER_SEP ."size:" . ER_SEP . ER_FLOAT . ER_SEP . ER_FLOAT . ER_SEP . "pts". ER_SEP . $Format . "$/";
    $expRegLigneSansNorme = "/^Page " . ER_SEP . ER_ENTIER . ER_SEP . "size:" . ER_SEP . ER_FLOAT . ER_SEP . ER_FLOAT . ER_SEP . "pts$/";
    $expRegLigneRotation = "/^Page " .  ER_SEP . ER_ENTIER . ER_SEP . "rot:" . ER_SEP . ER_ENTIERSIGNE . "$/";$pages = [];
    foreach ($lignes as $ligne) {

        if (preg_match($expRegLigneAvecFormatNorme, $ligne, $resultats)) { // ligne avec format normé en bout de ligne
        list(,$numeroPage,$largeur,$hauteur,$format)=$resultats;
        $pages[$numeroPage]["Largeur"] = $this->pts2mm($largeur);
        $pages[$numeroPage]["Hauteur"] = $this->pts2mm($hauteur);
        $pages[$numeroPage]["Format"] = trim($format, '()');

    } elseif (preg_match($expRegLigneSansNorme, $ligne, $resultats)) { // ligne sans format normé
        list(,$numeroPage,$largeur,$hauteur)=$resultats;
        $pages[$numeroPage]["Largeur"] = $this->pts2mm($largeur);
        $pages[$numeroPage]["Hauteur"] = $this->pts2mm($hauteur);

    } elseif (preg_match($expRegLigneRotation, $ligne, $resultats)) { // ligne contenant le numéro de page et la rotation
        list(,$numeroPage,$rotation)=$resultats;
        $pages[$numeroPage]["Rotation"] = $rotation;
    }    
 }
 return $pages;
}

function pts2mm($valeur)
{ //petite fonction qui converti un taille de pts pica en mm
    if (is_numeric($valeur)) {
        return round((float)$valeur * 25.4 / 72);
    }
    return 0;
}

Voila, j’espère que cette méthode pourra vous être utile. A bientôt.

Compacter le vhdx d’un serveur Ubuntu virtualisé sur Hyper-v

Attention, AVANT TOUTE CHOSES:

  • Pour éviter tout problème, d’abord faire une sauvegarde de la machine virtuelle avant cette opération a faire à vos risques & périls
  • L’opération est longue, donc à faire a un moment ou la machine peut être arrêté suffisamment longtemps (genre 2h)

 La problématique:

Hyper-v fait croitre un disque dynamique mais ne le réduit jamais. Lorsqu’une machine travaille beaucoup en création/effacement de fichiers, le volume s’accroit sans jamais décroitre une fois l’activité terminée. Ce qui peut poser des problèmes de place et aussi des difficultés pour sauvegarder un vhdx devenu gigantesque.

Dans cette exemple, un serveur Ubuntu nommé srv-travail (serveur web de test) et autre nommé srv-web (serveur proxy) tous deux passés de Ubuntu V12 à V14.

0-avancompactage

Sur un Windows virtualisé, seule l’étape 2 de ce tutoriel serait nécessaire: il suffit d’ordonner à hyper-v de compacter l’image.
Mais un serveur Ubuntu virtualisé, le contenu de l’image n’est pas directement « comprise » par hyper-v, il faut faire une étape supplémentaire assez longue qui consiste à remplir l’espace vide de 0.

Ceci peut se faire grâce à la commande zerofree

Sauf que bien sûr, cette opération ne marche pas sur un volume en activité donc, il faut le faire en étant « offline ».
On peut donc facilement réaliser cette opération avec un système portable nommé SystemRescueCD

Il peut être téléchargé sur ce lien

http://sourceforge.net/projects/systemrescuecd/files/latest/download?source=typ_redirect

1ère Étape: le vidage de l’espace libéré

  • Arrêter votre machine virtuelle Ubuntu,
  • Chargez le l’image iso dans le lecteur cdrom virtuel de votre machine,
    1-insertioncd
  • Redémarrez votre machine => celle-ci va se lancer sur SystemRescueCD
    2-demarragesystemrescuecd
  • Choisissez l’option 1, le chargement se lance pour ne s’interrompre uniquement pour demander la définition du clavier.
  • Tapez fr puis entrer
  • Vous arrivez alors sur l’interface.
    3-arrivesurinterface
  • A ce point, deux possibilités soit votre système est installé sur un LVM, soit il est basé sur un partition normale:

Si votre système est créé sur une partition LVM:

vgchange -a y

=> cette instruction vous renvoi un warning a ignorer, mais aussi le nom du volume LVM.

  • zerofree /dev/[nom du volume LVM]/root

Si votre système est créé sur une partition normale:

Vous trouverez alors votre VHDX en /dev/sda1

  • zerofree /dev/sda1

Si vous avez réussi, l’opération est longue (genre 20mn à 1h). Si cela rend la main presque immédiatement, c’est qu’en sda1 est monté une partition de boot toute petite pour un volume LVM donc dans ce cas il faut suivre le process pour un volume LVM

Exemple en LVM sur la seconde machine, srv-web:

4-operationsurlvm

 

2ème étape: le compactage

Comme d’habitude ce qui fonctionnait très bien sur les versions précédentes (Windows 2008r2) ne fonctionne plus sur les version actuelles (Windows 2012r2), quand on demande le compactage du volume sous un Windows 2012r2… il ne se passe rien ! Génial ! Donc il faut le faire en PowerShell

Click droit sur votre icône Powershell puis « Exécuter en tant qu’Administrateur »
Dans la console PowerShell, vous devrez saisir les 3 instructions suivantes

Mount-VHD -Path "[chemin et nom du fichier]" -ReadOnly
Optimize-VHD -Path "[chemin et nom du fichier]" -Mode Full

5-compactagevhdx
Là aussi, cela dure assez longtemps… voire très longtemps…

Dismount-VHD "[chemin et nom du fichier]"

A noter que les commandes Mount et Dismount sont optionnelles, mais elles permettent de verrouiller le VHDX pendant l’opération pour diminuer les risques sur un environnement multi utilisateurs.

Opération terminée. Ejectez le cdrom du lecteur virtuel de la VM puis redémarrez.

Résultats

7-resultat

Dans mon exemple, j’ai gagné 6Go sur la VM srv-travail et 9Go sur la VM srv-travail. Sur d’autre machines ou j’ai effectué l‘opération, le gain a même été bien plus important. Ainsi sur un serveur de prod le vdhx est passé de 156Go à 27Go.