Catégories
Open-source Planet-libre Reseau Systeme

De Network Manager à une configuration manuelle

S’il y a bien une fonction que je trouve mal faite dans Gnome c’est le « Network Manager ». Ce logiciel, accessible depuis la barre de menu, permet de configurer, à partir d’une interface graphique, les interfaces réseaux de sa machine. Ce n’est pas la première fois que je tombe sur une configuration que je n’arrive pas à appliquer en utilisant ce logiciel. Il faut dire que celle-ci mélange plusieurs interfaces réseaux avec des configurations DHCP, statiques et des routes spécifiques. J’ai donc décidé de désactiver Network Manager et de configurer mon réseau à la mimine.

Avant de pouvoir configurer manuellement son réseau à partir du fichier /etc/network/interfaces, il faut préalablement désactiver la gestion des interfaces par Network Manager. Nous allons voir comment procéder sur une distribution GNU/Linux Ubuntu 12.04.

Préparation de la manipulation

Avant toute chose, il faut arrêter toutes vos applications. En effet, nous allons toucher à la couche réseau du noyau Linux et il y a de forte chance que vous perdiez la connectivité.  Il est bien sûr totalement impossible de faire cette manip à distance (via SSH ou remote desktop).

Pour pouvoir revenir en arrière, nous allons sauvegarder la configuration de Network Manager:

sudo cp /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.OLD

Désactivation de Network Manager

On commence par éditer le fichier /etc/NetworkManager/NetworkManager.conf:

sudo vi /etc/NetworkManager/NetworkManager.conf

Puis passer la clé de configuration managed à true:

[ifupdown]
managed=true

Configuration manuelle des interfaces réseau

On passe ensuite à la configuration manuelle des interfaces réseau de notre machine en éditant le fichier /etc/network/interfaces. Le contenu du fichier dépend bien sûr de votre besoin. J’avais écris un billet sur le sujet il y a quelques années. Mais le mieux est de lire la documentation officielle et complète sur le site de Debian.

Il ne reste ensuite plus qu’à relancer le démon networking pour appliquer les changements et faire chauffer le semiconducteur de la carte mère:

sudo service networking restart

Bye bye Network Manager et son horrible interface graphique ! Bienvenu au fichier interfaces et sa syntaxe simple et claire.

Revenir en arrière ?

En cas de problème, pour revenir à votre configuration initiale ou les interfaces sont gérées par Network Manager, il suffit de saisir les commandes suivantes:

sudo cp /etc/NetworkManager/NetworkManager.conf.OLD /etc/NetworkManager/NetworkManager.conf
sudo service networking restart
Et hop, retour à la case départ.
Catégories
Open-source Planet-libre Systeme

Il n’y a pas qu’Ubuntu dans la vie…

En mettant de côté le monde des serveurs et des smartphones, les systèmes GNU/Linux représentent plus ou moins 1 % des parts de marché sur les PC clients. Si ce chiffre peut paraître ridicule par rapport au nombre de machines sous Windows, il l’est encore plus quand on regarde les parts des systèmes GNU/Linux autres qu’Ubuntu.

Pourtant, en ne donnant pas une chance à ces distributions exotiques, vous pourriez passer à côté d’un système adapté à votre configuration. Le fond du problème est là. La cible de Canonical (l’éditeur d’Ubuntu) est la même que Microsoft : des PC costauds, avec des cartes graphiques supportant l’accélération 3D et une mémoire confortable pour faire tourner vos applications en même temps que l’environnement graphique système (Gnome3 ou KDE).

Hors, tout le monde n’a pas les moyens ou tout simplement l’envie de dépenser plus de 700€ pour avoir un PC bureautique performant. C’est pourtant sur ce créneau spécifique des PC « low cost » que ces distributions apportent toute leur valeur ajoutée. En effet, elle sont pour la plupart basée sur des interfaces graphiques moins consommatrice de ressources hardware. Je pense notamment à LXDE et XFCE porté par Canonical sur les distributions dérivées Lubuntu et Xubuntu mais aussi à OpenBox comme dans le très bon CrunchBang Linux que j’ai testé sur un boîtier « Linutop 4 » dans un dernier article. Le choix de l’interface graphique n’est pas le seul avantage de ces distributions. Elles sélectionnent également les applications proposées en standard aux utilisateurs, en préférant par exemple Midori ou Chromium à la place de Firefox.

Les plus barbus d’entre vous vont me retourner qu’il est tout à fait possible de prendre n’importe quelle distribution GNU/Linux (si possible la plus proche de la philosophie libre) et d’y installer à la main l’interface graphique et les applications de son choix. Cependant, cette démarche est justement réservée aux barbus et pas à Monsieur Lambda que l’on souhaite faire venir du bon côté de la force.

Alors que pouvons-nous faire ? Nous, défenseurs des logiciels libres. Pourquoi pas en donnant sa chance à une distribution alternative, en sortant un peu des pistes que l’on connait si bien (ne vous inquiétez pas, vous ne serez pas perdu bien longtemps). En choisissant tout simplement un système en adéquation avec nos besoins et le matériel associé. En ne refaisant pas les mêmes erreurs qui ont conduit et conduisent encore des utilisateurs vers des OS propriétaires et fermés.

Catégories
Hardware Open-source Planet-libre Systeme

Test d’un Linutop 4 avec Linutop OS 5

J’écris cet article depuis le Linutop 4 que j’ai eu gracieusement en test pendant quelques semaines (au passage merci à l’équipe Linutop). Pour rappel, le Linutop 4 est un mini PC Fanless et totalement silencieux (pas de disque dur mais une mémoire Flash) utilisant un OS maison nommé Linutop OS 5. Il a comme cible les entreprises souhaitant disposer d’un client bureautique léger et les utilisations de type bornes Internet ou affichages dynamique d’informations.

Les caractéristiques

On commence par un bref aperçu des caractéristiques du boîtier:

Note: le système Linutop OS 5, pré-installé par défaut, occupe environ 450 Mo des 2 Go de la mémoire flash interne.

Premier contact

C’est la première fois que j’utilise une machine totalement silencieuse et je dois avouer que lors du premier démarrage, j’ai vérifié que je n’avais pas oublié de brancher l’alimentation avant de voir apparaître la bannière de configuration sur mon écran. Même par rapport à l’utilisation d’un PC portable, le silence est vraiment total.

L’avantage d’utiliser l’OS maison (Linutop OS 5) est qu’il n’y a aucune configuration à faire sur la machine. Une simple fenêtre de configuration est affichée au première démarrage de la machine et permet de fixer les paramètres comme le langage, le clavier… Pour la majorité des utilisations, il n’y a rien à faire mis à part cliquer sur le bouton OK.

Une fois cette étape passée, on se retrouve sur une distribution GNU/Linux basée sur Ubuntu (et donc bénéficiant des paquets de cette distribution) avec XFCE comme gestionnaire graphique.

Les premières minutes d’utilisation ont été un peu difficile pour moi. En effet, étant habitué à travailler sur des machines puissantes (voir sur-dimensionnées), la relative lenteur du temps de réaction pour les opérations de bases (ouvrir et déplacer des fenêtres, charger des pages Web légères…) m’a sauté au yeux. Après quelques heures d’utilisation, je m’y suis habitué et si on ne demande pas des choses trop lourdes à ce boitier il s’acquitte parfaitement de ses tâches.

Une machine pour quoi faire ?

Les caractéristiques hardware de la machine limite l’utilisation à certain domaine. J’ai essayé, dans ce chapitre de résumer les choses que j’ai pu tester.

Machine parfaitement adapté pour:

  • naviguer sur Internet (sauf si vous essayez de lire des vidéos en 720p sur YouTube)
  • de la bureautique classique (document, tableur, présentation)
  • écouter de la musique (bien qu’il manque à mon goût une sortie numérique)
  • faire du déport d’affichage (VNC, RDP/TSE) ou de l’administration via SSH

Machine utilisable pour:

  • regarder des vidéos DivX, MP4, OGG au format SD 480p (le format HD Ready 720p peut passer mais risque de faire chauffer votre machine tandis qu’il faut oublier la lecture de fichier en Full HD 1080p)
  • développer (si vous utilisez des IDE légères Troll> et pas des usines à gaz comme Eclipse <Troll)

Machine inutilisable pour:

  • gérer votre bibliothèque de photos / retouche (j’ai essayé et cela n’est pas exploitable)
  • faire du post traitement vidéo
  • faire plusieurs choses en même temps… (la RAM du boitier que j’avais en test était de 1 Go mais il est possible en option de passer à 2 Go)

Résumé des + et des –

Le hardware: Linutop 4

Les +

  • Le silence total !
  • Qualité de fabrication du boitier. Cela paraît solide
  • Le boîtier chauffe mais pas de manière excessive

Les –

  • 1 Go de RAM en standard c’est vraiment trop peu
  • Impossible d’acheter un boîtier « vierge » sans l’OS Linutop (qui est vendu 79€ séparément). J’aurai donc aimé pouvoir acheter le Linutop OS 4 à 400-79 = 321 €…
  • Pas de port USB en version 3
  • Le prix (environ 400€), ce qui est cher pour la configuration hardware proposée

Le systéme: Linutop OS 5

Les +

  • Pack bureautique complet
  • VLC de base et qui fonctionne très bien sur les fichiers SD

Les + et –

  • Le choix de XFCE s’explique bien évidemment par la relativement faible consommation de ressource de ce gestionnaire. De mon point de vu, quitte à avoir un gestionnaire épuré et faiblement consommateur de CPU et de mémoire, autant partir sur une solution de type Openbox ou Fluxbox. J’ai donc essayé la distribution CrunchBang Linux (32 bits BTO) qui fonctionne parfaitement en version « live USBkey ». Et l’impression de lenteur est beaucoup moins importante qu’avec Linutop OS 5 pour une utilisation classique de surf Internet.

    CrunchBang Linux, une alternative intéressante à Linutop OS 5

Les –

  • Si vous souhaitez utiliser Linutop OS sur une autre machine, il vous faudra débourser 79 €. Je trouve cela un peu fort de café, surtout que des solutions libres et gratuites existent et fonctionnent parfaitement sur les boîtiers (par exemple CrunchBang Linux dont je parle ci-dessus)
  • Firefox qui est un peu trop lourd pour la RAM disponible. J’ai installé Chromium qui fonctionne sans problème.
  • Outil graphique: franchement c’est quoi ce mtPaint graphic editor ? C’est pour concurrencer Paint sous Windows ?

Quelques photos…

Pleins d’autres images à retrouver sur Flickr

Alors j’achète ou j’achète pas ?

On arrive donc à la conclusion de cet article et à la question fatidique: est que, dans le rôle d’un décideur informatique (ce que je suis dans le cadre de mon boulot), j’achèterai cette solution…

Le hardware (Linutop 4) est vraiment de très bonne qualité, le silence total et il ne semble pas trop chauffer même après quelques jours d’utilisation sans extinction. Mais à plus de 400 € (avec livraison), je trouve quand même l’addition un peu salée. Donc à moins de négocier les prix à la baisse (321 € par exemple…) ou bien d’obtenir pour ce prix une configuration plus musclée (au minimum 2 Go de RAM et mémoire Flash plus importante), je regarderai attentivement du coté de la concurrence avant de lancer mes achats.

Donc j’achète le boîtier vierge (sans OS) au prix maximum de 320€.

Concernant l’OS Linutop 5, je suis beaucoup plus sévère. Bien que je comprenne la volonté de fournir aux utilisateurs un système clés en main, je ne trouve pas celui-ci adapté au hardware (XFCE, Firefox, pack logiciel graphique…). De plus, faire payer cet OS (qu’ils soit inclus dans le prix des boîtiers Linutop ou bien 79€) n’est pas constructif: cela limite la participation de la communauté et peut mettre à dos le clan des barbus qui peuvent y voir une vente liée de système GNU/Linux (un comble)…

Je n’achète pas l’OS Linutop 5, et j’utilise sur les boîtiers Linutop des OS GNU/Linux gratuits, léger et alternatifs.

Catégories
Developpement Open-source Planet-libre

Et si on jouait un peu avec Redis et Python ?

Dans la mouvance NoSQL, Redis se classe dans la catégorie « data structure server »  (que l’on peut traduire en Français par « serveur de dictionnaire distant »). C’est  un système permettant de traiter, de manière très performante, des données sous la forme clés/valeurs. Contrairement à des solutions comme MemCache, Redis est capable de gérer la persistance des données en stockant, sur demande, son contenu sur disque.

La clé, qui peut être comparée au nom d’une variable dans un langage de programmation, permet d’identifier de manière unique la donnée. Lors de la création de votre application, vous allez rapidement vous rendre compte que le choix de cette clé n’est pas négligeable. C’est elle qui définira « la structure » de votre base de donnée.

La clé est dans la définition de la clé.

Quant aux valeurs, elles peuvent appartenir aux types suivants:

  • chaînes de caractères (strings)
  • compteurs numériques (note: les données numériques seront stockées dans la base sous la forme de chaîne de caractères) (atomic counters)
  • listes (lists)
  • tableaux (set) et tableaux ordonnés (sorted set)
  • dictionnaires (hashes)

Comme on peut le voir, on retrouve la plupart des structures du langage Python. En étant un fervent admirateur, je me suis donc penché sur l’API Python Redis.

C’est parti pour un peu de bac à sable…

Installation de Redis

Pour mes tests, j’ai fait une installation standard depuis les paquets Ubuntu du serveur Redis, de l’API Python et de la CLI iPython pou illustrer mes exemples:

sudo apt-get install redis-server python-redis ipython

Les commandes de bases

La librairie Python permet d’envoyer des commandes (voir la liste des commandes ici) au serveur.

On commence par se connecter un serveur (local en écoute sur le port TCP par défaut).

J’utilise iPython pour mes tests de la librairie Python mais il est également possible de passer par la CLI Python classique.

# ipython

In [1]: import redis

In [2]: r = redis.Redis('localhost')

Premier exemple clés / valeur (chaîne de caractères):

In [3]: r.set("cles", "valeur")
Out[3]: True

In [4]: r.get("cles")
Out[4]: 'valeur'

Stocker des valeurs numériques:

In [5]: r.set("clesnum", 666)
Out[5]: True

In [6]: r.get("clesnum")
Out[6]: '666'

In [7]: r.incr("clesnum")
Out[7]: 667

In [8]: r.decr("clesnum")
Out[8]: 666

Attention, la méthode get retourne des chaines, il faut les convertir avant de s’en servir comme des entiers.

In [9]: a = 10

In [10]: a + r.get("clesnum")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/nicolargo/<ipython-input-10-06c75e85d988> in <module>()
----> 1 a + r.get("clesnum")

TypeError: unsupported operand type(s) for +: 'int' and 'str'

In [11]: a + int(r.get("clesnum"))
Out[11]: 676

Des listes comme valeurs:

In [12]: r.rpush("clesliste", "a")
Out[12]: 1L

In [13]: r.rpush("clesliste", "b")
Out[13]: 2L

In [14]: r.rpush("clesliste", "c")
Out[14]: 3L

In [15]: r.lrange("clesliste", 0, -1)
Out[15]: ['a', 'b', 'c']

In [16]: r.lindex("clesliste", 2)
Out[16]: 'c'

In [17]: r.llen("clesliste")
Out[17]: 3

In [22]: r.lpush("clesliste", "z")
Out[22]: 4L

In [23]: r.lrange("clesliste", 0, -1)
Out[23]: ['z', 'a', 'b', 'c']

Pour des listes avec des valeurs uniques (set), il faut utiliser les méthodes sadd (pour ajouter) et smembers (pour récupérer le set).

In [27]: r.sadd("clesset", "a")
Out[27]: True

In [28]: r.sadd("clesset", "b")
Out[28]: True

In [29]: r.sadd("clesset", "c")
Out[29]: True

In [30]: r.sadd("clesset", "a")
Out[30]: False

In [31]: r.smembers("clesset")
Out[31]: set(['a', 'c', 'b'])

Une autre structure de liste intéressante est la liste avec des valeurs uniques et ordonnées. On ajoute un troisième champs à notre couple clés/valeur qui s’appelle score (3em paramètre dans la méthode zadd). C’est ce score qui va déterminer l’ordre de la liste:

In [32]: r.zadd("clessetsort", "a", 4)
Out[32]: True

In [33]: r.zadd("clessetsort", "b", 1)
Out[33]: True

In [34]: r.zadd("clessetsort", "c", 3)
Out[34]: True

In [35]: r.zadd("clessetsort", "a", 5)
Out[35]: False

In [36]: r.zrange("clessetsort", 0, -1, withscores = True)
Out[36]: [('b', 1.0), ('c', 3.0), ('a', 5.0)]

In [37]: r.zrange("clessetsort", 0, -1)
Out[37]: ['b', 'c', 'a']

Pour stocker un dictionnaire, c’est également très simple:

In [38]: r.hset("cleshash", "a", "A")
Out[38]: 1L

In [39]: r.hset("cleshash", "b", "B")
Out[39]: 1L

In [40]: r.hset("cleshash", "c", "C")
Out[40]: 1L

In [41]: r.hgetall("cleshash")
Out[41]: {'a': 'A', 'b': 'B', 'c': 'C'}

In [42]: r.hget("cleshash", "b")
Out[42]: 'B'

Gérer l’expiration de vos données

… importance du garbage…

In [3]: r.set("key", "value")
Out[3]: True

In [4]: r.exists("key")
Out[4]: True

In [5]: r.expire("key", 10)
Out[5]: True

In [6]: r.exists("key")
Out[6]: True

Attendre 10 secondes ou plus...

In [7]: r.exists("key")
Out[7]: False

Egalement de manière statique avec la méthode expireat (http://redis.io/commands/expireat).

Pour être plus fin, il est aussi possible d’utiliser les « scores » avec les méthodes z* (zadd, zrangebyscore) pour supprimer les données qui ont des valeurs de clés les plus faibles (ou forte selon votre structure).  Par exemple pour supprimer les données de plus faible score (< 3) de notre liste « clesetsort » créée dans le chapitre précédant:

In [37]: r.zrange("clessetsort", 0, -1)
Out[37]: ['b', 'c', 'a']

In [60]: r.zremrangebyscore("clessetsort", 0, 3)
Out[60]: 2

In [61]: r.zrange("clessetsort", 0, -1)
Out[61]: ['a']

 

Les pipelines

Si Redis vous intéresse, c’est que vous avez à gérer un volume important de données. Les commandes que nous venons de voir dans le chapitre précédant sont unitaires. C’est à dire que pour une exécuter une commande, une requête (TCP) est faite au serveur Redis. Pour optimiser les performances et donc réduire le nombre de requêtes fait au serveur, nous disposons des Pipelines (lire ce billet comparatif sur le sujet).

Par exemple pour entrer 100.000 clés/valeurs dans votre serveur, il faut environ 11 secondes sur mon PC de test:

import time
import redis

_MAX_ITER = 100000

r = redis.Redis('localhost')

print "Start bench without Pipeline"
start=time.clock()
for i in range(_MAX_ITER):
   r.set("cles%d" % i, i)
stop=time.clock()
print "Result: %s" % str(stop-start)

alors qu’il faut un peu de plus de 4 secondes en utilisant une pipeline (soit un gain de plus de 50%):

import time
import redis

_MAX_ITER = 100000

r = redis.Redis('localhost')

print "Start bench with Pipeline"
start=time.clock()
p = r.pipeline()
for i in range(_MAX_ITER):
   p.set("cles%d" % i, i)
p.execute()
stop=time.clock()
print "Result: %s" % str(stop-start)

Ressources: