Faire un fsck sur un disque vdi

La virtualisation, c’est bien ; mais comment vérifier l’état d’une partition root dans un disque vdi (sans utiliser de livecd :) ? qemu-nbd !

Sur debian, il faut d’abord installer le paquet qemu, puis charger le module :

rmmod nbd
modprobe nbd max_part=16

(max_part est le nombre maximum de partitions)

On monte l’image avec :

qemu-nbd -c /dev/nbd0 MON_IMAGE.vdi

On obtient un nouveau device /dev/nbd0 et pour chaque partition /dev/nbd0p1...2...3... que l’on peut utiliser avec mount.

Une fois terminé, on démonte le tout avec :

qemu-nbd -d /dev/nbd0

Avec une couche LVM en plus, le mapper trouve automatiquement les correspondances. Pour vérifier, on peut lister les partitions avec la commande pvs.

Reste plus qu’à lancer l’analyse :

fsck -f /dev/MON_IMAGE/root 

Source : http://serverfault.com/questions/210684/how-do-you-mount-a-vdi-image-on-linux

Publicités

Partager une même installation PlayOnLinux avec les autres utilisateurs

Maintenant que nous avons un linux intégré au kwartz, il serait intéressant d’émuler des applications conçues pour windows, comme Office 2010. C’est exactement ce que permet wine et l’interface qui repose dessus : PlayOnLinux (abrégé POL).

Première limitation de wine, et donc de PlayOnLinux : l’installation d’une application est spécifique à un utilisateur (dans le dossier ~/.PlayOnLinux). Dans un environnement multi-utilisateurs, pas possible d’installer un programme de 2 Go à chaque fois. Une idée serait de copier un dossier POL fonctionnel, et de faire un lien symbolique dessus. Mais seconde limitation de wine : il faut aussi être propriétaire de ces fichiers.

On va donc avoir besoin d’un script qui modifie notre copie de POL à la connexion d’un utilisateur ; ceci n’est possible qu’en root, donc on va devoir configurer aussi sudo. Et il faudra encore modifier les raccourcis définis dans PlayOnLinux (~/.PlayOnLinux/shortcuts) pour qu’ils pointent bien chez l’utilisateur en cours. Tout un programme :)

Préparation de PlayOnLinux et sudo

Après avoir installé le logiciel (ici Office 2010) sur un compte de référence, copions le contenu de ~/.PlayOnLinux dans un dossier commun, par exemple /var/POL :

rm -rf /var/POL
cp -R ~/.PlayOnLinux /var/POL

Ensuite, créons un script de démarrage (/usr/local/bin/office.sh) qui prend en paramètre le nom de l’utilisateur se connectant :

#!/bin/bash
# Attribution du dossier POL
# $1 : username
groupe=$(id -gn $1)
uid=$(id -u $1)
POL=/var/POL
home=$(eval echo ~$1)
lien=$home/.PlayOnLinux

# Sauvegarde du lien précédent
if [ -d "$lien" ]; then
    mv $lien $lien.bak
fi
# Spécifique à Office 2010 : création du dossier utilisateur ...
users=$POL/wineprefix/Office2010/drive_c/users/$uid
mkdir $users
# ... et des liens symboliques pour que office puisse retrouver 
# les dossiers "Mes documents" et "Bureau"
if [ ! -h $users/Mes\ documents ];then
	ln -s $home $users/Mes\ documents
fi
if [ ! -h $users/Bureau ];then
	ln -s $home/Bureau/ $users/Bureau
fi
# Changement de propriétaire du dossier de POL
chown -h -R $1:$groupe $POL
ln -s $POL $lien
chown -h -R $1:$groupe $lien
# Copie des raccourcis sur le bureau
cp --preserve=ownership $POL/shortcuts/*.desktop $home/Bureau

On autorise à exécuter ce script en sudo (en fait, chown nécessite d’être root) sans mot de passe en créant un fichier /etc/sudoers.d/office contenant :

%users ALL=NOPASSWD: /usr/local/bin/office.sh

Ne pas oublier de le verrouiller en écriture pour éviter les fuites :

chmod +x-w /usr/local/bin/office.sh

Modification des raccourcis

Comme on a déplacé le dossier POL, les raccourcis permettant de lancer les apllications ne fonctionnent plus. Dans le dossier /var/POL/shortcuts, il faut d’abord modifier le script d’exécution ; par exemple avec Word 2010 :

#!/bin/bash
[ "$PLAYONLINUX" = "" ] && exit 0
source "$PLAYONLINUX/lib/sources"
export WINEPREFIX="$(eval echo ~$USER)/.PlayOnLinux//wineprefix/Office2010"
export WINEDEBUG="-all"
cd "$WINEPREFIX/drive_c/./Program Files/Microsoft Office/Office14"
POL_Wine "WINWORD.EXE"  "$@"

En fait, comme ~ n’est pas reconnu proprement, j’ai modifié la variable WINEPREFIX et la commande cd. « $(eval echo ~$USER) » permet de retrouver l’adresse absolue du home de l’utilisateur en cours.

On peut aussi créer un raccourci bureau ; pour cela on va créer un fichier Word_2010.destop comme suit :

[Desktop Entry]
Encoding=UTF-8
Name=Word 2010
Comment=PlayOnLinux
Type=Application
Exec=/usr/share/playonlinux/playonlinux --run "Microsoft Word 2010" %F
Icon=/var/POL/icones/full_size/Microsoft Word 2010
Name[fr_FR]=Word 2010
StartupWMClass=Word 2010.exe
Categories=

Ne pas oublier de lui donner les droits d’exécution :

chmod +x Word_2010.destop

Exécution à la connexion

Reste encore à lancer tout cela à l’ouverture d’une session graphique ; modifions le fichier /etc/xprofile comme suit :

#!/bin/sh
bash -c "sudo /usr/local/bin/office.sh $(whoami) > ~/.office.log 2>&1"

sudo permet de changer le propriétaire du dossier /var/POL, bash permet de lancer le script avec bash (et non sh qui est utilisé par défaut), et $(whoami) permet d’avoir le login de la personne se connectant. Et en cas de soucis, on a même un log dans le dossier personnel (~/.office.log).

Tada !

Création d’un réseau téléphonique SIP avec Asterisk

Le but est de mettre en place un serveur de téléphonie SIP interne.

D’abord, quelques points de vocabulaire :
* le registar est le serveur SIP ;
* une extension est en fait un « numéro de téléphone » ;
* l’identity est composée au moins d’un nom de compte, d’un mot de passe et de l’IP du serveur asterisk.

Le serveur

La première chose à faire est d’installer un serveur linux ; ici, j’ai utilisé un serveur Debian 7.

Au passage, j’ai testé AsteriskNow une distribution « prête à l’emploi », avec une sympathique interface web pour gérer son serveur facilement ! Le seul défaut que j’ai noté : l’impossibilité de faire passer les mises à jours à travers mon proxy (c’est apparemment un bug connu de freepbx).

Installons donc Asterisk manuellement :

apt-get install asterisk asterisk-config asterisk-prompt-fr-proformatique

La configuration d’Asterisk passe principalement par trois fichiers :
* /etc/asterisk/asterisk.conf : la configuration générale ;
* /etc/asterisk/sip.conf : le paramétrage du SIP et des comptes ;
* /etc/asterisk/extension.conf : la déclaration des numéros de téléphone.

Pour la configuration générale :

[general]
defaultexpirey=1800
dtmfmode=auto
qualify=yes

Pour chaque téléphone, il faut déclarer le poste dans /etc/asterisk/sip.conf (en remplaçant ce qui est en majuscule) :

[NOM_DU_TEL]
username=NOM_DU_TEL
secret=MOT_DE_PASSE
host=dynamic
context=SALLE_XXX
language=fr

On peut simplifier cela en créant un template de configuration :

[NOM_DU_TEMPLATE](!)
    language=fr
    host=dynamic
    type=friend...
...
[NOM_DU_TEL](NOM_DU_TEMPLATE)
    username=...

Il faut encore associer les numéros de téléphone aux postes ; dans /etc/asterisk/extension.conf :

[SALLE_XXX]
exten => 11,1,Dial(SIP/NOM_DU_TEL)
exten => 12,1,Dial(SIP/NOM_DU_TEL2)
...

Traduction : en composant le 11, on contact le poste NOM_DU_TEL

Reste plus qu’à lancer le service :

/etc/init.d/asterisk start

La conférence

Pour créer une salle de conférence, Astersik inclut un module appelé ConfBridge (remplaçant de MeetMe). Le fichier /etc/asterisk/confbridge.conf permet de définir notamment un nombre maximum de membres par conférence ; par exemple, ici pour avoir au maximum 10 participants :

[default_bridge]
max_members=10

Reste plus qu’à créer un numéro spécifique pour y accéder ; par exemple, voici ce qu’il faut ajouter à /etc/asterisk/extensions.conf pour que le 101 renvoie vers une salle de conférence :

exten => 101,1,Answer()
exten => 101,n,ConfBridge(101)

Interaction avec le serveur

Le serveur tourne comme un démon ; pour interagir avec lui, il faut se connecter sur sa console : asterisk -rv. De la, on a accès à un petit shell dont voici quelques commandes :

CLI> sip show peers    Affiche la liste des équipements connectés
CLI> core restart now  Redémarre le serveur
CLI> core reload       Recharge la configuration (après modification des fichiers de conf)
CLI> dialplan show     Affiche les extensions connues

Les téléphones

Ici, le but est d’authentifier chaque téléphone sur notre nouveau registar. Les téléphones dont je disposes sont des Snom 300 et des 320 (les deux configurations sont très proches).

Le paramétrage des ces téléphones se fait par une interface web. Voici ce que j’ai activé :
Setup > Advanced > QoS/Security > HTTP server
Définir un identifiant/mot de passe pour l’accès web

Setup > Identity 1 > Login
On rentre ici les paramètres de connexion au registar :
– account : le username
– password : le secret
– registar : l’ip du serveur asterisk

Setup > Identity 1 > RTP => RTP Encryption: off
Désactivation du RTP (Real Time Protocol) chiffré (cela posait des problèmes chez moi)

Setup > Advanced > Behavior > Keys => Block DND : on
Désactivation du DND (Do not disturb)

Setup > Advanced > QoS/Security > Security => Administrator Mode : off
Pour empêcher de passer en admin sur le tel

Setup > Advanced > Update => Update Mode : Never update, do not load settings
Pour éviter un message d’erreur concernant l’absence de provisioning (que l’on n’utilise pas ici)

Il est possible d’exporter la configuration d’un téléphone (sans les mots de passe d’administration)
Status > Settings > « Click _here_ to save the settings. »
L’importation se fait à partir de :
Setup > Advanced > Update > Upload Setting File manually
Reste alors à modifier les mots de passe et les identity.

Pour la suite

À voir pour la suite : la connexion avec un fournisseur SIP externe pour pouvoir passer des appels vers l’extérieur, et ajouter des ordinateurs à ce réseau pour pouvoir faire interagir téléphones et postes informatique (Jitsi à l’air prometteur pour cela).

Liens utiles

* http://artisan.karma-lab.net/comment-mettre-place-sa-telephonie-grace-a-asterisk : Pour l’installation d’un serveur asterisk
* https://wiki.asterisk.org/wiki/display/AST/ConfBridge+10#ConfBridge10-ConfBridgeConcepts : Pour la création d’une salle de conférence

Client linux (xubuntu 14) et réseau kwartz

Cet article fait suite à un article précédent concernant ubuntu 13. Entre temps, je suis passé sur xubuntu 14 qui est pour moi plus léger et plus adaptable à mes besoins ^^

Récupération du nom de l’ordinateur par dhcp

Lors de la création d’une image linux, le fichier /etc/hostname (qui indique l’identité de l’ordinateur) est enregistré lui aussi. Ainsi, chaque image déployée aura le même nom inscrit… pas cool. L’idée ici est de récupérer de manière dynamique le nom de l’ordinateur sur le kwartz et de mettre à jour le fichier hostname.

Le script fournit par Iris (un hook à ajouter au démon dhcp) ne fonctionnait pas chez moi. Je l’ai simplement remplacé par un petit changement de paramètre au niveau du démon, dans /etc/dhcp/dhclient.conf : en désactivant le « send host-name », cela force d’une certaine manière le dhcp à mettre à jour /etc/hostname avec la bonne valeur.

Personnalisation des sessions

Pour créer des raccourcis pour chaque nouvel utilisateur, il suffit de copier le fichier .desktop correspondant dans le dossier /etc/skel/Bureau/
Ne pas oublier d’ajouter le droit d’exécution sur les fichiers :
chmod +x /etc/skel/Bureau/*.desktop

Pour le paramétrage de Firefox, il faut modifier le fichier /etc/firefox/syspref.js (pour la syntaxe, voir cette article sur mozillazine).

Modification de l’écran de connexion lightdm

On va modifier /etc/lightdm/lightdm.conf pour que lightdm offre/masque quelques fonctionnalités :
[SeatDefaults]
greeter-show-manual-login=true
# Pour pouvoir se connecter avec un nouveau nom sur l'ordinateur
allow-guest=false
# Désactive le compte invité
greeter-show-remote-login=false
# Désactive la connexion à distance (en utilisant un autre serveur pour s'authentifier)
greeter-hide-users=true
# Cache les utilisateurs précédents (et les comptes locaux)

Ajout automatique des imprimantes

Cups est trop efficace sur ce point : dès qu’on l’installe, il trouve toutes les imprimantes du réseau. Impossible de mettre ça dans les mains des élèves :)
D’abord, il faut désactiver la découverte automatique en remplaçant « Browsing On » par Browsing Off » dans /etc/cups/cupsd.conf .

Ensuite, j’ai créé un script d’installation qui se lance au démarrage de l’ordinateur et qui va lire un fichier ini présent sur le réseau et installer les bonnes imprimantes. La méthode d’installation et le format du fichier ini sont décrites dans l’entête du script : ptr.sh.

Conclusion

Tout ces choses sont repris dans le fichier integration_xubuntu_1404.sh

J’ai aussi séparé dans un script spécifique un ensemble d’installations/configurations pas indispensables mais toujours pratique à avoir et à adapter à son environnement : configurations_supplementaires.sh. On y trouve l’installation de paquets pédagogiques courants (java, geogebra, freeplane, etc.), et de quoi utiliser Micro$oft Office 2010 par wine/PlayOnLinux.

Client linux (ubuntu 13) et réseau kwartz

Cet article décrit comment intégrer un ubuntu 13.04 à kwartz et en faire une image avec tivoli.

Partitionnement du disque et installation d’Ubuntu

Il faut d’abord connaître la version de rembo/tivoli présente sur le kwartz (Kwartz~Control > Maintenance > Rembo) :

  • Avec Rembo 2, la partition doit être en ext2 (mais cela pose d’autres problèmes par la suite, je le déconseille) ;
  • Avec Rembo 5/Tivoli, la partition doit être au mieux en ext3 avec une taille d’inode de 128 bits.

Après avoir démarré sur le cd d’ubuntu, mais avant de commencer l’installation, il faut partitionner manuellement le disque dur. Pour cela,
Ctrl + Alt + F1
$ sudo su
$ loadkeys fr

(attention, jusque ici le clavier en anglais). On obtient ainsi un terminal root.

On lance l’outil de partitionnement et créer deux partitions :
$ cfdisk /dev/sda
NB: On peut créer une partition de swap, mais les partitions ext3 suivantes seront ignorées par tivoli. Donc pas de /home ou de /usr séparé.

Il faut ensuite formatter la partition :
$ mkfs.ext3 -I 128 /dev/sda1
Si un message d’erreur indique que la partition n’existe pas, il faut forcer le kernel a redétecter les partitions (partprobe), voir simplement redémarrer.
On revient à l’interface d’installation (Ctrl + Alt + F7) et au moment de choisir les partitions d’installation, prendre « Autre chose » et ne pas reformater les partitions (ce serait dommage ^^).

Comme Rembo/Tivoli n’est pas compatible avec grub, il faut encore installer lilo pour qu’il puisse extraire le kernel :
$ apt-get -y install lilo
$ liloconfig -f
$ lilo

Une autre surprise de Tivoli : il repartitionne le disque comme il l’entend. Par exemple en installant ubuntu sur une partition système de 20 Go avec un swap de 1Go ; à la première restauration complète, tivoli va étendre au maximum la partition système, mettre un swap de 2 Go et garder environ 9 Go de libre pour son image locale. C’est pas vraiment ce qu’on peut appeler une restauration surtout que cela modifier les UUID des partitions. Pas de problème pour le fstab car tivoli le réécrit pendant la restauration, mais cela peu impacter d’autres outils comme le gestionnaire de démarrage.

Déclaration du proxy

Il y a au moins trois endroits où déclarer le proxy :

  • pour le shell, modifier ~/.bashrc et /etc/profile.d/proxy.sh :
    export http_proxy=http://IP_DU_KWARTZ:3128
    export ftp_proxy=ftp://IP_DU_KWARTZ:3128
  • pour apt, modifier le fichier /etc/apt/apt.conf.d/proxy :
    Acquire::http::Proxy "http://IP_DU_KWARTZ:3128";
    Acquire::ftp::Proxy "ftp://IP_DU_KWARTZ:3128";
  • pour l’interface graphique, modifier  /etc/profile.d/gnome.sh :
    $ gsettings set org.gnome.system.proxy mode 'manual'
    $ gsettings set org.gnome.system.proxy.http host "IP_DU_KWARTZ"
    $ gsettings set org.gnome.system.proxy.http port 3128

Authentification réseau : LDAP et PAM

Pour pouvoir se connecter avec un compte du kwartz, il faut mettre en place l’authentification par LDAP :
$ apt-get -y install openbsd-inetd pidentd libpam-ldap
Les réponses à donner dans l’ordre : ldap://IP_DU_KWARTZ > dc=MON_LYCEE,dc=FR > 3 > non > non

Dans /etc/ldap.conf, désactiver « pam_password md5 » et activer « pam_password crypt », puis :
$ auth-client-config -t nss -p lac_ldap

Lecteurs réseau

$ apt-get -y install libpam-mount smbfs
Puis déclarer les montages réseau dans /etc/security/pam_mount.conf.xml en suivant la syntaxe :
<volume uid="1000-65532" fstype="cifs" server="IP_DU_KWARTZ" path="NOM_DU_PARTAGE" mountpoint="~/POINT_DE_MONTAGE" options="iocharset=utf8" />

Autres modifications

  • Couper les mises-à-jour automatiques ; dans /etc/apt/apt.conf.d/10periodic, modifier la ligne suivante :
    APT::Periodic::Update-Package-Lists "0"
  • Désactiver le rapport de bugs ; dans /etc/default/apport, désactiver apport : enabled=0
  • Utiliser le kwartz comme serveur de temps ; modifier /etc/default/ntpdate comme suit :
    NTPDATE_USE_NTP_CONF=no
    NTPSERVERS="IP_DU_KWARTZ"
  • Tivoli ne renomme pas l’ordinateur restauré. En supprimant le fichier /etc/hostname, cela force ubuntu à utiliser le nom donné par le dhcp. À noter que si l’ordi fait sa demande de bail dhcp sur la seconde interface réseau déclarée (par exemple avec un portable), le kwartz répond en ajoutant un « _2 » au nom déclaré, ce qui met en échec la plupart des commandes réseau car le nom de l’ordi n’est plus résolvable.

Création de l’image

La création d’image suit la procédure classique ; il va uniquement demander de :

  • choisir le mode du disque dur : EIDE / SCSI ; pour les disques SATA (le cas le plus courant aujourd’hui), mettre SCSI. En cas d’erreur ici, le système restauré ne démarrera pas.
  • choisir le kernel sur lequel on veux démarrer (« Linux »).

À la restauration de l’image, tivoli va réécrire le fichier fstab en supprimant les UUID et en utilisant l’option de montage « defaults » sur  / ce qui empêche le système de redémarrer. Il faut créer un script qui va modifier le fstab après la restauration de l’image, remplaçant « defaults » (alias de « rw, suid, dev, exec, auto, nouser, async ») par la valeur par défaut de Ubuntu : « errors=remount-ro ». Le mieux que j’ai trouvé est d’ajouter au /etc/rc.local la commande : sed -i -e 's/ext2\tdefaults/ext3\terrors=remount-ro/' /etc/fstab

Script automatisé

Heureusement pour nous, un script bash (basé sur ce script) fait tout ça, et bien plus :) ; il est disponible sur mon github. Pour l’utiliser :
$ chmod +x integration_ubuntu_1304.sh
$ sudo ./integration_ubuntu_1304.sh

Il nécessite une connexion internet [sic], d’être root et d’avoir déclaré l’ordinateur en « Autorisé non filtré » (pour traverser le proxy tant qu’il n’y a pas d’authentification LDAP).

Conclusion

Pour la suite, on peut personnaliser les sessions utilisateurs en modifiant le fichier /etc/profile.d/gnome.sh.

En fait, c’est Tivoli qui limite beaucoup l’installation d’un système linux (format de l’unique partition, utilisation forcée de lilo, ré-écriture du fstab…). Il existe certainement mieux pour créer et déployer des images linux.

Liens utiles

Console distante sur une machine virtuelle VmWare depuis Linux

Le client vSphere n’existant pas sous linux (à ma connaissance), voici une technique permettant d’avoir accès à la console d’une machine virtuelle VmWare à distance depuis un client sous linux (testé sur Debian).

D’abord, il faut récupérer le plugin rvc fournit par vmware sur github. C’est un plug-in pour firefox ; il faut extraire l’archive puis créer un script bash « vmware-vmrc.sh » qui va l’exécuter :


#!/bin/bash

# Modifier le chemin d’accès pour pointer vers le dossier plugins et les infos de connexion
PATH_TO_VMRC= »/home/path/to/plugins »
HOST= »1.2.3.4″
NAME= »foo »
PASSWD= »bar »

export VMWARE_USE_SHIPPED_GTK=yes
cd $PATH_TO_VMRC
./vmware-vmrc -h $HOST -u $NAME -p $PASSWD > /dev/null 2>&1 &
cd – > /dev/null 2>&1

Ne pas oublier de faire un : chmod 100 vmware-vmrc.sh

NB: On peut se passer des paramètres HOST, NAME et PASSWD mais il faudra retaper ces infos à chaque utilisation.

Lien externe

> Gnome 3 vmware-console with vmware-vmrc fix (grande source d’inspiration :)

Serveur Virtualbox Headless sur Debian 7

Voici quelques paramètrages particuliers pour l’installation d’un virtualbox headless (sans interface graphique) sur une Debian 7.0. Le paquet officiel n’est encore qu’en 4.1 pour le moment donc tous les scripts proposés sont testés pour cette version.

Le mode headless

Deux liens intéressants pour le mode headless :

Script de sauvegarde

Je n’ai pas trouvé de script de sauvegarde qui me convenait (Il y a bien vboxtool qui a tout ce qu’il faut, mais il est un peu à l’abandon), j’en ai donc développé un qui : 1) sauvegarde l’état des machines virtuelles en cours de fonctionnement (savestate), 2) fait une copie des disques, puis 3) redémarre les machines qui étaient allumées : backup_virtualbox.sh. Il faut le lancer régulièrement, comme par exemple chaque dimanche matin :

$ crontab -e

0 3 * * 0 ~/backup_virtualbox.sh

Lancement automatique (script rc)

Le paquet d’installation de virtualbox ne fournit pas de script rc pour que les machines virtuelles en fonctionnement se coupe et se rallume automatiquement entre deux démarrages ; j’en ai donc bidouillé un : virtualbox-autolaunch. Il faut le déposer dans /etc/init.d, puis mettre à jour les scripts rc :

update-rc.d virtualbox-autolaunch start 20 2 3 4 5 .

phpvirtualbox

phpvirtualbox est une interface php qui permet de gérer les machines à distance sans avoir à se connecter sur l’hôte. L’installation est assez simple, il suffit de décompresser le zip fournit dans /var/www puis de modifier /etc/default/virutalbox et /var/www/phpvirtualbox/config.php . Un tuto concernant une installation debian sur geekeries.de-labrusse.fr. phpvirtualbox repose sur le service vboxweb, mais le script rc n’existe plus dans le paquet Debian ; une solution est de récupérer l’ancien script rc : vboxweb-service4.0.