SunWukong's Blog

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

vendredi 30 novembre 2007

Les cahiers de l'admin Debian GNU/Linux, nouvelle édition dans les bacs !

Ça y est, il est sorti !

Pour être franc, je ne l'attendais pas. J'ai même eu un petit pincement au cœur égoïste car je n'ai pas fini la lecture de l'édition précédente ! Mais de quoi s'agit-il avec un tel titre à rallonge ?

Et bien je veux parler de la nouvelle et troisième édition du livre de Raphaël Hertzog et de Roland Mas « Debian GNU/Linux » paru aux éditions Eyrolles dans la collection « les cahiers de l'admin » dirigée par Nat Makarévitch.

Couverture J'ai découvert Linux en 1993, avec un jeu de cinquante disquettes, comprenant un noyau 0.99pl13 si ma mémoire est bonne. Ma culture Unix était relativement fine mais existait bel et bien après une année d'étude au milieu des stations Sun de l'ESSI. Depuis 1993, j'ai donc toujours eu un multiboot et toujours veillé à acheter du matos reconnu sous Linux, assurant d'une pierre deux coups : un système opérationnel sous Linux et le boycott des « mauvais » fabricants. J'ai essayé de nombreuses distributions sans jamais arrivé à me décrocher le boulet Microsoft. À décharge, des heures de développement chaque jour sous Windows pour gagner ma croûte ne me poussaient pas à (re)découvrir un peu laborieusement forcément le monde Unix. Mais en 2005, j'ai rencontré Ubuntu et j'avais beaucoup de temps. Magique… Maintenant j'ai une machine bien propre :-).

Ubuntu-user, j'ai donc découvert la Debian qui se cache dessous. Laissons de côté les querelles de clochés. Si je dois monter un serveur il sera assurément sous Debian. Mais je suis pleinement satisfait de ma station Kubuntu (ok, ou presque, j'avoue ! ;-) ).

J'ai ainsi acheté il y a quelques temps la deuxième édition de l'ouvrage et avais entrepris une passionnante lecture. Puis je suis passé à autre chose. Et il se trouve qu'il y a quelques semaines, j'ai remis la main sur le livre et j'ai rapidement parcouru « ce qu'il me reste à lire.» Enfin, je dis rapidement, mais je me suis fait attrapé :-) : ayant jeté un œil sur le chapitre des Services Réseau, traitant de Postfix, Apache, NFS, Samba, Squid et LDAP, je n'ai pas pu le lâcher avant la fin ! Le livre est très didactique, se basant sur des cas concrets de besoins d'entreprise et mettant en place une configuration basique standard de serveur(s) Debian. Évidemment, il ne peut relater tous les cas d'utilisation, mais on a déjà le minimum fonctionnel et une bonne idée des moyens (fichiers) de configuration à notre disposition. De nombreuses astuces qui fleurent bon l'expérience de terrain viennent agrémenter la lecture. En ce qui me concerne, c'est le livre dans lequel je vais chercher des infos avant d'aller taper dans des ouvrages spécialisés sur un domaine précis (comme Samba par exemple).

Et voilà donc que le 29 novembre, hier, était publiée la nouvelle édition, basée sur Debian Etch 4.0. 150 nouvelles pages viennent se rajouter aux 300 précédentes. Au sommaire, apparaissent la gestion des volumes LVM, le RAID logiciel, la virtualisation avec Xen, le renforcement de Linux avec SELinux et sûrement pleins d'autres choses. Raphaël Hertzog tient un site sur ce livre sur lequel on peut trouver les errata, une FAQ, deux chapitres de l'ouvrage en PDF, etc…

Ce livre sera très utilise aux admins Ubuntu, même si quelques différences existent entre ces deux distributions dérivées. Allez-vous faire une idée sur le site de l'ouvrage : http://www.ouaza.com/livre/admin-debian/

lundi 26 novembre 2007

Django (2)

Voici mon modèle de départ :

# -*- coding: utf-8 -*-
from django.db import models
#
# Create your models here.
#
class Personne(models.Model):
   USER_GENDER = (
      ("F", "Femme"),
      ("H", "Homme"),
      ("X", "Non précisé"))
   nom = models.CharField(maxlength=30)
   prenom = models.CharField(maxlength=30)
   pseudo = models.CharField(maxlength=30)
   email = models.EmailField()
   website = models.URLField()
   instantmsg = models.CharField(maxlength=30)
   naissance = models.DateField()
   sexe = models.CharField(maxlength=1, choices=USER_GENDER)
   adresse = models.TextField()
   codepostal = models.CharField(maxlength=5)
   ville = models.CharField(maxlength=30)
   pays = models.CharField(maxlength=30)
   telrtc = models.PhoneNumberField()
   telfax = models.PhoneNumberField()
   telgsm = models.PhoneNumberField()

Et voici mon fichier urls.py

# -*- coding: utf-8 -*-
urlpatterns = patterns('',
   # Example:
   # (r'^myblog/', include('myblog.foo.urls')),
   (r'^personne/(/d+)/$', personne_view),                  # Consultation d'une personne
   (r'^personne/new/$', personne_new),                     # Nouvelle personne
   (r'^personne/edit/(/d+)/$', personne_edit),             # Edition d'une personne
   (r'^personne/delete/(/d+)/$', personne_delete),         # Suppression d'une personne
   (r'^personne/search/([A-Za-z]+)/$', personne_delete),   # Suppression d'une personne
)

De recopier mon code ici, j'en fais une petite revue un peu plus détaché et du coup, il me semble que je dois pouvoir nommer les paramètres que je récupère dans les URLs. Ça serait plus pratique.

Je dois donc m'attaquer maintenant aux templates. En fait, j'ai commencé à regarder du côté des vues génériques. Nul doute que ça marche ;-) mais je dois encore réfréner cette envie de mettre la charrue avant les bœufs : je vais donc calmement coder mes templates et bien baser mon apprentissage de Django sur de bonnes bases, plutôt que de foncer en survolant l'architecture du framework.

Bon, j'espère que je vais avancer plus vite. Quand je pense au tutoriel de Siddhi où l'on assiste à la création d'un wiki en 20 minutes, de façon si logique, facile, naturelle ! :-)

dimanche 25 novembre 2007

Premiers pas de Django

Django est un framework de développement d'applications Web pour le langage Python. C'est LE framework des perfectionnistes, ainsi qu'il se définit ;-).

Pour l'heure, ce ne sont plus exactement mes pas. Mais à chaque tentative précédente, j'avais débordé d'ambition, tentant d'apprendre le framework en même temps que le langage, en partant à chaque fois bille en tête avec un modèle de données relativement complexe. De quoi se décourager. Aussi, cette fois, je vais me fixer des objectifs simples et complexifier au fur et à mesure, par itération. Agile, soyons agile !

Je vais par la suite consigner ici les problèmes rencontrés dans mon développement afin de pouvoir en garder une trace et de diminuer les temps de blocage ultérieurs quand je retomberai sur ces difficultés.

Je pars d'un modèle simple : une table unique, implémentant un choix assez large de type de données différents qui me permettront de voir plusieurs type de contrôles dans les forms générées. Au niveau de la dynamique, j'implémente les classiques opérations CRUD. J'aimerais bien me lancer dans une architecture REST, convaincu par la lecture du blog du Biologeek, mais là aussi, je me préfère me forcer au plus simple pour revenir là-dessus plus tard.

Dans un premier temps, je vais donc implémenter une Personne, comprenant de nombreuses caractéristiques (nom, prénom, pseudo, email, website, instantmsg, naissance, sexe, adresse, codepostale, ville, pays, telrtc, telfax, telgsm) et créer les pages nécessaires pour créer, éditer, consulter, rechercher et supprimer une instance de Personne.

Dans un deuxième temps, je rattacherai cette entité à l'entité User de l'application d'authentification intégrée à Django et rendrai mon site accessible uniquement aux utilisateurs enregistrés.

Dans un troisième temps, je créerai une autre entité possédant une relation avec Personne, comme une Entreprise par exemple. Doucement mais sûrement, sinon je suis encore capable de pondre un modèle de CRM complet et de m'y noyer. On fera la CRM plus tard ;-)

Voici donc au fil du temps les problèmes sur lesquels j'ai buté.


If you happen to land here with Google Airlines and that you think the answer of your problem is here, burried under French words, you can contact me in English. Chinese may also be an alternative.


Les paramètres de base de données sont renseignés dans le fichier settings.py, à la racine du projet. Pour ma part, j'ai opté pour PostgreSQL, probablement la meilleure base de données relationnelle opensource. Et j'ai rapidement buté sur un message d'erreur : « psycopg2.OperationalError: FATAL: authentification Ident échouée pour l'utilisateur « dev » » Et oui, PostgreSQL a le bon goût d'être en français, une localisation parmi de très nombreuses autres. Pour le coup, Google ne m'a pas trop aidé, mais j'ai réussi à identifier le problème. Si Django indique que « Set to empty string for localhost. » il s'est avéré que dans mon cas, ce n'était pas le cas : bien que travaillant en local, le paramètre DATABASE_HOST doit bien être renseigné à localhost. Il faudra donc se méfier des affirmations futures ;-)

jeudi 22 novembre 2007

Subversion

Il serait temps de me constituer un petit mémo pour utiliser Subversion, le système de gestion de versions.

En local, les dépôts seront placés dans le répertoire /var/svn Ce répertoire appartiendra au groupe svn et le stickybit sera positionné sur ce répertoire. Ainsi les fichiers et dossiers qui y seront créés appartiendront automatiquement au groupe svn. Mon user fera partie du groupe svn.

sunwukong@linux$ sudo mkdir /var/svn
sunwukong@linux$ addgroup svn
sunwukong@linux$ addgroup sunwukong svn
sunwukong@linux$ sudo chgrp svn /var/svn
sunwukong@linux$ sudo chmod +s /var/svn

Création d'un dépôt (repository)
Le nom du dépôt sera repositories

sunwukong@linux$ cd /var/svn
sunwukong@linux$ svnadmin create repositories

Création d'un projet
… tout du moins, le répertoire qui le contiendra au sein du référentiel

sunwukong@linux$ svn mkdir file:///var/svn/repositories/prj_myblog

Importation de fichiers existants dans le référentiel

sunwukong@linux$ cd /chemin/vers/mon/projet/
sunwukong@linux$ svn import file:///var/svn/repositories/prj_myblog

Exportation des fichiers du projet à partir du référentiel
On se place à l'endroit où l'on travaillera ensuite sur ce projet (donc pas nécessairement là où l'on a importé les fichiers précédemment) :

sunwukong@linux$ cd /home/sunwukong/projets
sunwukong@linux$ svn checkout file:///var/svn/repositories/prj_myblog
sunwukong@linux$ ls -la
drwxr-xr-x sunwukong sunwukong 2007-11-22 prj_myblog
sunwukong@linux$ ls -la prj_myblog
drwxr-xr-x sunwukong sunwukong 2007-11-22 docs
drwxr-xr-x sunwukong sunwukong 2007-11-22 icons
-rwxr-xr-x sunwukong sunwukong 2007-11-22 main.py
-rwxr-xr-x sunwukong sunwukong 2007-11-22 .svn

À suivre…

mardi 20 novembre 2007

eric4 et Gutsy Gibbon

Et voilà, il suffisait que j'avoue ici ne pas réussir à installer eric4 sous Gutsy Gibbon pour que j'y parvienne quelques minutes plus tard ! Il faut dire qu'entre temps, j'ai englouti le dîner qu'avait préparé ma chère et tendre :-) Ça aide, un ventre plein !

Je vais essayer de retranscrire ici les manips effectuées pour parvenir à cela. Je dis « essayer » car j'ai repris le travail commencé il y a plusieurs semaines et bien évidemment, je n'avais rien noté à l'époque, ayant toujours fait chou blanc.

Eric4 est hébergé sur Sourceforge, . Il est intégralement francisé. À l'intérieur de l'archive, un fichier README précise la procédure d'installation dans l'hypothèse où le paquet-tout-prêt n'existerait pas encore :


  1. Install Qt4
  2. Build and install sip
  3. Build and install QScintilla2
  4. Build and install PyQt4
  5. Build and install QScintilla2 Python bindings
  6. Install eric4

Qt4 et PyQt4 sont bien packagés dans Ubuntu. sip peut être trouvé ici

Pour l'heure, Google a été une fois de plus mon ami. Rendons à Cezar ce qui est à Cezar : la solution.

Au stade où j'en étais, il m'a donc suffi d'installer le paquet Debian python-qscintilla2, nécessitant lui-même la bibliothèque libqscintilla2-3. Ces deux paquets ne sont pas dispo dans Ubuntu, mais sont accessibles sur http://packages.debian.org . Une fois téléchargés, ils s'installent d'un simple sudo dpkg -i paquet.deb

Puisque mon précédent billet portait sur l'aberrante orgie de mémoire RAM organisée par eclipse, je n'ai pas manqué de relever l'empreinte mémoire d' eric4 à l'aide d'un pmap -x pid. Même si je trouve que cela fait beaucoup, le résultat est tout de même 6 fois inférieur à eclipse, avec 120Mo. Décidément, il n'y a pas à dire : Java sucks & Python rulez !

Pour finir, je laisse un lien sur quelques tutoriels pour bien démarrer avec eric.

La mémoire s'éclipse !

Dans ma quête d'un éditeur, ou plutôt un IDE, propice pour développer en Python, je viens de jeter un œil à PyDev, un plugin pour eclipse : un IDE donné par IBM à la communauté. Fouinant ici et là à la recherche de tutoriels pour dégrossir mon apprentissage du couple eclipse/pydev, j'ai lu au passage que le cadeau d'IBM était estimé à 40 M$US. Même si le billet vert ne vaut plus grand chose, c'est quand même un gros cadeau.

Gutsy Gibbon ayant parfois des comportements erratiques, je fais souvent tourner un htop dans une console, y jetant un rapide coup d'œil dès lors qu'un process semble s'approprier les ressources CPU. C'est là que j'ai vu l'ampleur du sinistre : eclipse nécessite une quantité de mémoire proprement indécente ! Je pense avoir une station de travail relativement confortablement pourvue, avec 2Go de RAM[1]. Mais là, j'ai un peu de swap !

La commande pmap permet d'obtenir l'empreinte mémoire d'un processus, à partir de son processID. Pour eclipse, le résultat est affligeant : 720Mo !!! Avec Firefox et Thunderbird qui se goinfrent chacun 130Mo, c'est une barrette de RAM de 1Go qui est engloutie.

Je crois que je vais revenir à Eric, un sympathique IDE développé avec PyQT. Malheureusement, le gibbon est un peu à la ramasse, proposant toujours la v3 dans ses paquets et je ne parviens pas à installer la v4 à la mano.

Notes

[1] Si cela doit être à peine suffisant pour faire tourner Vista, c'est habituellement très confortable sous Linux

mercredi 7 novembre 2007

Virtualisation avec KVM

Complétons mon petit pense-bête avec quelques notes sur KVM.

KVM est une solution de virtualisation opensource sous licence GPL. Elle est idéale sur des processeurs possédant le jeu d'instructions adéquates car dans de telles conditions, le ralentissement induit est minime et les systèmes-invités n'ont pas besoin d'être modifiés. Ces jeux d'instructions portent les noms de SVM pour AMD et VT pour Intel.

Le site du projet, sponsorisé par la société Qumranet, est ici : http://kvm.qumranet.com

Une fois KVM installé avec ses dépendances, il faut charger le module kvm dans le noyau : (remplacer intel par amd selon)
sudo /sbin/modprobe kvm-intel
À noter que ce module n'est pas chargé automatiquement à chaque boot.

Ensuite, il faut créer un disque virtuel sur lequel on installera l'OS invité. On procèdera ainsi pour un disque de 10 Go :
/usr/local/kvm/bin/qemu-img create -f qcow2 vdisk.img 10G

À noter que plusieurs formats de disques virtuels sont possibles, qcow2 est à priori le plus performant, autorisant les "snapshots" (instantanées) de machines virtuelles. Les images au format VMware sont également utilisables, ce qui constitue un aspect non négligeable de la solution.

Afin de pouvoir créer et utiliser des machines virtuelles sous le compte d'un utlisateur lambda, il convient de procéder ainsi :

  • créer un nouveau groupe Unix par exemple kvm:

addgroup kvm

  • affecter ce groupe à l'utilisateur lambda[1]

addgroup lambda kvm

  • ensuite, le périphérique /dev/kvm devra être associé au groupe kvm nouvellement créé. Dans le cas d'une distribution utilisant udev comme Ubuntu, les périphériques sont recréés dynamiquement au démarrage. Il conviendra donc dans ce cas de figure de modifier le script udev qui va bien pour que le périphérique /dev/kvm soit créé comme appartenant au groupe kvm. Pour cela, il faudra ajouter une ligne dans le fichier /etc/udev/rules.d/40-permissions.rules :

KERNEL=="kvm", GROUP="kvm"

Ceci fait, il ne reste plus qu'à installer le système invité sur le disque virtuel créé précédemment. Partons sur le cas de figure suivant : installation d'une Ubuntu Desktop 7.10. Il est nécessaire de se procurer l'image ISO du Live-CD de la distribution la plus en vue du moment. Pour se faire, on vérifiera que 700Mo sont encore dispo dans le système de fichiers courant et on tapera de l'hexagone[2] :
wget ftp://ubuntu.univ-nantes.fr/ubuntu-cd/gutsy/ubuntu-7.10-desktop-i386.iso

Une fois l'image téléchargée, on est prêt pour l'installation :
kvm -hda vdisk.img -cdrom /path/to/ubuntu-7.10-desktop-i386.iso -boot d -m 512

Et une fois le système invité installé, on peut lancer la machine virtuelle équipée de 512 Mo de RAM :
kvm vdisk.img -m 512

De nombreuses options sont disponibles. Elles permettent d'émuler divers équipements hardware dans cette machine virtuelle (cartes réseau, carte on, etc...)

Ayant été confronté à quelques soucis, voici quelques détails techniques concernant les difficultés rencontrées et les solutions apportées :

  • Pas de souris dans la machine virtuelle. Lu quelque part, il faut ajouter les paramètres -usb -usbdevice tablet sur la ligne de commande pour lancer la VM. Au cas où le curseur ne serait toujours pas visible, il convient d'exporter la variable suivante export SDL_VIDEO_X11_DGAMOUSE=0 avant de lancer la VM. Pour moi, cette deuxième solution s'est avérée la bonne. Pour l'anecdote, je cherchais à faire un screencast pour un copain. Tout s'est bien passé. Mais en repassant le film enregistré, j'ai pu constater qu'il y avait sur le film 2 curseurs, décalés de plusieurs dizaines de pixels, mais bougeant de concert. Alors que je n'ai qu'un seul curseur dans la VM bien-sûr.

Pour finir, quelques liens utiles où l'on retrouvera une grande partie des choses lues ici, dans la langue de Shakespeare :
La documentation de kvm
La FAQ de kvm
Le HOWTO de kvm

Notes

[1] L'utilisateur devra fermer sa session et se ré-authentifier pour pouvoir bénéficier de ses nouveaux droits

[2] D'autres miroirs existent un peu partout chez les FAI. Le P2P et BitTorrent sont aussi là pour épargner les ressources des serveurs principaux.