VirtualBox et le problème du “Cannot register hard disk because … UUID … already exists”

Lorsque vous dupliquez un disque virtuel (copier/coller d’un fichier vdi ou vhd) pour l’utiliser dans virtualbox, vous allez être confronté au problème de l’identifiant du disque qui doit être unique.

Pour éviter d’être confronté au problème vous pouvez utiliser la commande permettant de cloner un disque fournie dans l’outil VBoxManage en ligne de commande. Cette commande lors de la copie du disque va changer l’UUID du disque de manière à ne pas avoir ce problème.

VBoxManage clonehd chemin_disque_source chemin_disque_a_copier

Mais bien souvent on effectue d’abord la copie du disque et ensuite on se rend compte du problème. Le plus simple est alors de changer cet UUID sur la copie, ce qui est souvent bien moins long que de lancer une commande ‘clonehd’ du disque. Et la encore une commande existe pour simplement changer l’UUID d’un disque existant :

VBoxManage internalcommands sethduuid chemin_du_disque_copié

Sharepoint 2010 : WebPart Générique pour charger des Contrôles ASP.NET

Le modèle de création de WebPart Sharepoint poussé par Microsoft est de faire contenir dans une WebPart un contrôle ASP.NET. Le contenu du WebPart étant assez simple, on peut en faire un générique dont un paramètre permettra de définir le contrôle ASP.NET à charger.

L’intérêt, bien que limité, permet de créer des interfaces qui ne seront pas disponible directement à travers l’ajout de WebPart mais en connaissant le chemin du contrôle ASP.NET uniquement. Cela peut être pratique lorsqu’on a quelques contrôles ASP.NET de debug qu’on ne souhaite pas faire apparaitre dans la liste des WebPart disponibles.

Elle permettra aussi de déployer des contrôles (dépourvus de code behind) en uploadant des contrôles dans Sharepoint.

Il conviendra de vérifier que seuls les administrateurs aient le droit de modifier le chemin car dans le cas contraire cela pourrait entrainer une faille de sécurité.

[ToolboxItemAttribute(false)]
 public class LoadUserControl : Microsoft.SharePoint.WebPartPages.WebPart
 {
 [WebBrowsable(true),
 Category("WebPart Configuration"),
 WebPartStorage(Storage.Shared),
 FriendlyName("ASCX"),
 Description("Chemin du controle ASP.NET."),
 Personalizable(true)]
 public string ascx { get; set; }

 protected override void CreateChildControls()
 {
 if (!string.IsNullOrEmpty(ascx))
 {
 Control control = Page.LoadControl(ascx);
 Controls.Add(control);
 }
 }
 }

Exemple d’exploitation pour charger un contrôle :

<webParts>
 <webPart xmlns="http://schemas.microsoft.com/WebPart/v3">
 <metaData>
 <type name="MyNameSpace.LoadUserControl.LoadUserControl, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0000000000000000" />
 <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage>
 </metaData>
 <data>
 <properties>
 <property name="Title" type="string">Titre publique de la WebPart</property>
 <property name="Description" type="string">My WebPart</property>
 <property name="ascx" type="string">~/_CONTROLTEMPLATES/Exemple/Exemple.ascx</property>
 </properties>
 </data>
 </webPart>
</webParts>

Regarder la Télé Free derriere un Routeur Linux sans fastidieuse configuration des clients

Free utilise le protocole RTSP pour faire transiter le signal TV, dans le cadre du multiposte.

L’inconvénient du protocole RTSP est similaire à celui du FTP, un canal de commande sous forme d’une connexion TCP permet de définir un canal de données qui sera situé sur une autre connexion TCP.

Mais le protocole FTP à un avantage que n’a pas directement le RTSP, le mode Passif qui règles les principaux problèmes du FTP derrière un NAT.

Mais revenons au protocole RTSP : la solution que j’utilisais jusqu’à présent était de définir dans VLC un port statique différent sur chaque machine cliente et de définir des règles de port forwarding sur le routeur. Solution peu pratique lorsque la plupart des machines sont en DHCP ou lorsque des machines ne font que passer dans le réseau.

En recherchant un Proxy RTSP pour éviter cette configuration plus que fastidieuse, je suis tombé sur le travail de plusieurs développeurs à l’adresse http://mike.it-loops.com/, ou encore https://github.com/maru-sama/rtsp-linux-v2.6

Ils ont développé un filtre a intégrer au noyau Linux du routeur comme il en existe pour le protocole FTP.

Le code source est fournit, il ne vous reste qu’a le compiler. Cela vous donne un module à installer et à charger dans le noyau. (module nf_nat_rtsp). Tous les détails sont dans le fichier README.RST fournit avec le package.

Maintenant, n’importe quel PC présent sur le réseau peut accéder à la TV Free sans avoir a configurer, ni le routeur, ni le client.

VirtualBox Headless et ajouter des périphériques USB sous Windows

Un petit script pour répondre a une problématique, comment ajouter en script un périphérique USB à une machine Virtuelle à l’aide de VirtualBox ?

Si vous exploitez une machine déportée pour héberger vos machines virtuelles, vous utilisez sans doute VBoxHeadless et un accès TSE pour accéder à ces dernières.

Mais comment connecter vos périphériques USB lorsque vous n’avez plus d’interface graphique ? Dans VirtualBox une série d’exécutables en ligne de commande est prévu pour effectuer des actions sur ces machines.

Dans ce cas précis, VBoxManage va nous servir.

Voici les commandes que vous utiliserez :


C:\VBox>VBoxManage list usbhost

Host USB Devices:

UUID: 00f631b2-118c-40f3-a5b6-9c5cc654c743
VendorId: 0x041e (041E)
ProductId: 0x401d (401D)
Revision: 0.1 (0001)
Manufacturer: Creative
Product: Creative WebCam NX Ultra
Current State: Available

l’utilisation de la commande :

VBoxManage controlvm "nom de ma vm" usbattach 00f631b2-118c-40f3-a5b6-9c5cc654c743

permet d’attacher la webcam à la machine virtuelle. Mais cet UUID change régulièrement donc difficile de créer un script simple.

J’ai donc créé un javascript vous permettant à partir du nom du produit d’ajouter le périphérique usb à la machine virtuelle.


cscript InstallByUUID.wsf "Creative WebCam NX Ultra" "nom de ma vm"

Contenu du script ( InstallByUUID.wsf ) :

<job>
<script language="JScript">

        var tmppath = "c:\\temp";
        var wtattach = "";

        var lastUUID = "";
        var producttofind = "";
        var found = false;

        function FindUUID(lineinfo)
        {
                if (lineinfo.indexOf('UUID:')==0)
                {
                        lastUUID = lineinfo.substring(20,56);
                }
                if (lineinfo.indexOf('Product:')==0)
                {
                        var product = lineinfo.substring(20);
                        if (product == producttofind)
                                found = true;
                }
        }

        if (WScript.Arguments.length<2)         {                 WScript.echo("InstallByUUID.wsf [ProductNameofUSBItem] [NameOfVmToAttach]");                 exit(0);         }                  producttofind = WScript.Arguments(0);                          var objShell = WScript.CreateObject("WScript.Shell");         objShell.Run('cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" list usbhost > '+tmppath+'\\usbatach.txt"', 0, 1);

        var objFileSystem = WScript.CreateObject("Scripting.FileSystemObject");
        var objFile = objFileSystem.OpenTextFile(tmppath+'\\usbatach.txt');
        while ((!objFile.AtEndOfStream)&&(!found))
        {
                FindUUID( objFile.ReadLine( ));
        }
        objFile.Close();

        objFileSystem.DeleteFile(tmppath+'\\usbatach.txt');

        if (!found)
        {
                WScript.echo(producttofind +' n\'a pas été trouvé');
        }

        var runcmd = 'cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" controlvm "'+WScript.Arguments(1)+'" usbattach '+lastUUID+'"';
        objShell.Run(runcmd, 0, 1);
        //WScript.echo(runcmd);
</script>
</job>

Mon routeur x86 Low Power

Dans le but de diminuer mon impact énergétique, j’ai cherché a remplacer mon routeur qui se présentait sous la forme d’un PC classique équipé de deux cartes réseau par une machine x86 a base de processeur basse consommation.

Après une longue recherche, j’ai finalement trouvé une machine adéquate : Le Compulab Fit-PC2i.

On trouve facilement des PCs basse consommation depuis que le processeur ATOM d’Intel est sorti (grand fan des Acer REVO), sans compter les équivalents AMD, mais difficile d’en trouver ayant deux interfaces réseau.

J’ai installé le système d’exploitation (noyau Linux) sur une clef USB et monté certains points de montage directement en RAM de manière a optimiser le nombre d’écriture sur la clef USB.

/etc/fstab :

UUID=fcxxx... /               ext4    noatime,errors=remount-ro 0       1
tmpfs /tmp tmpfs defaults 0 0
tmpfs /var/tmp tmpfs defaults 0 0
tmpfs /var/log tmpfs defaults 0 0
tmpfs /var/www tmpfs defaults 0 0

On remarquera la présence du noatime sur le root pour éviter la mise a jour des dates d’accès au fichier qui écrirait sur la clef usb à chaque accès fichier.

A cela s’ajoute des scripts au démarrage du système pour remplir ces dossiers en RAM, d’autres s’exécutant a intervalle régulier (tous les jours par exemple) pour prévenir la perte de données lors d’arrêt non souhaité du routeur, ainsi que des scripts de sauvegarde au moment de l’arrêt du serveur.

Consommation :

Mesure avant : 70wh, Mesure après : 10wh

Autres alternatives :

J’avais auparavant tenté d’utiliser un routeur matériel (Linksys WRT-150N), compatible avec la distribution DD-WRT, mais malgré la grande ouverture du système, on se trouve vite limité par les capacité matérielles du routeur.