Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Archive for October, 2008

Niveau :      
Résumé : processus ; thread

Quelques personnes m'ont récemment demandé la différence entre un processus et un thread. Avant de bien en comprendre la différence, nous avons besoin de savoir deux choses : à quoi sert un noyau ? et comment fonctionne un processus ?

Base

Un noyau sert, entre autre, à gérer des tâches. Il permet à différents codes d'être exécutés chacun dans un monde séparé. Ces différents code ne peuvent pas empiéter sur ce que fait le voisin car le noyau les en empêche. C'est la protection, qu'on trouve implémentée au niveau même du processeur (celle qui défaillait dans windows 95).

Le noyau fournit aux processus un moyen de communiquer avec le monde extérieur ou entre eux (par des fichiers puisque tout est fichier). Ainsi chaque processus se voit comme ayant un accès complet au processeur et à une RAM de 4Go (pour un processeur 32 bits). Une partie de ces 4Go n'est en pratique pas modifiable car elle appartient au noyau (le dernier Giga). C'est le noyau qui se débrouille pour lui mettre à disposition ces 4Go, soit en lui associant de la vraie ram à la demande (en utilisant la notion de paging du processeur, à travers la fonction brk du noyau), soit en en mappant une partie sur le disque à la demande (fonction map), soit enfin en lui cachant qu'ils ne sont pas réellement disponibles (en stockant le contenu dans la swap).

Exemple de mapping mémoire : ram.png

Le noyau fait aussi en sorte que les processus ne consomment pas tout le processeur, il les répartit dans le temps pour leur en donner un morceau à chacun. C'est un service rendu par le scheduler du noyau.


continue reading...

Niveau :      
Résumé : lilo ; grub

Même si la plupart des distributions sont passées à grub, on s'est longtemps posé la question d'utiliser lilo ou grub. Il servent tous les deux à charger linux (le noyau), voyons comment ça marche.

Bios

Avant de nous intéresser au bootloader, étudions le processus de démarrage d'une machine (x86 type intel).

  1. Appui sur le bouton
  2. Allumage de l'alimentation, électricité dans la carte mère
  3. Allumage du processeur dans un état connu
  4. Passage du contrôle au bios
  5. Lecture d'un disque, chargement du secteur de boot nommé MBR (généralement un bootloader)
  6. Chargement du noyau et d'éventuels modules, passage du contrôle au noyau
  7. Montage d'un système de fichier et passage du contrôle au processus d'init (sur les unix)

Bon, le début, vous connaissez.

L'état connu du processeur c'est : mode réel, 16bits, exécution pointant sur les derniers octets du premier Mo (FFFF:0000). Ici se trouve mappé statiquement le bios qui va se lancer et initialiser le matériel qu'il connaît. Il laisse disponible quelques fonctions via des interruptions, par exemple pour accéder à la carte vidéo ou au disque dur. Et il termine en chargeant le premier secteur (512 octets) du premier périphérique (disque, dur, clé usb ...) bootable qu'il trouve et lui passe la main (à l'adresse 0000:7C00).

C'est ici qu'on trouve lilo, grub, syslinux et même parfois linux lui-même sur de vieilles versions. Comme vous le constatez, 512 octets c'est très petit pour coder un bootloader (surtout que les octets ne sont pas tous disponibles à cause de la table des partitions). C'est pourquoi les bootloaders ont tous une architecture un peu bizarre avec plusieurs étapes.

Lilo

Lilo est un bootloader spécifique à linux (LInux LOader). Il fonctionne en 2 temps, un secteur de boot qui va charger un fichier un peu plus gros dont il connaît les secteurs sur le disque. Ce dernier peut éventuellement proposer un menu puis charge le bon noyau et lui passe la main.


continue reading...

Niveau :      
Résumé : ar

Connaissez-vous la commande ar ? Ar fait partie de ces commandes à 2 lettres créées à l'époque ou un octet coûtait plus cher que votre salaire mensuel.

Commande

Comme son nom l'indique, ar sert tout simplement à créer des archives :

$ ar rc archive.ar fichier

Et voila on vient de créer une archive avec un fichier dedans. ar sait gérer l'ajout, le remplacement et la suppression de fichier dans une archive, le tout avec des commandes très courtes :

# on remplace le contenu de fichier dans l'archive
$ ar r archive.ar fichier
# on supprime le fichier de l'archive
$ ar d archive.ar fichier

Format

Mais venons-en au point intéressant, ar est un format de fichier extrêmement simple. En fait, dans la plus pure tradition unix et au prix de quelques octets, le format est lisible puisque c'est du texte.

Lisons notre archive :

!<arch>
fichier/        1224766279  1000  1000  100644  7         `
blah

Le l'archive commence simplement par !<arch>, et chaque fichier est inclus tel quel dans l'archive préfixé d'une en-tête de taille fixe de 60 caractères. Vous voyez que vous pouvez vous-même en créer à la main. Une ligne d'en-tête est définie comme suit :

Début	Fin	Nom 			Format
0 	15 	File name 		ASCII
16 	27 	File modification ts 	Decimal
28 	33 	Owner ID 		Decimal
34 	39 	Group ID 		Decimal
40 	47 	File mode	 	Octal
48 	57 	File size in bytes 	Decimal
58 	59 	File magic 		\140\012

Facile a lire et à écrire, un seul petit inconvénient, la taille des noms de fichier est limitée. Il va donc falloir un peu d'astuce pour stocker les noms longs quelque part. Le ar de GNU les stocke dans un fichier virtuel nommé // et y fait référence sous la forme /numéro.

Niveau :      
Résumé : .deb

Connaissez-vous le format des paquets debian ? Non ? alors je vais vous couper la tête !

Debian a bien réfléchi son format de paquet dès le début. Les contraintes principales étant qu'il soit lisible avec des outils de base unix, c'est-à-dire qu'on peut les lire même si on n'est pas sous debian, qu'on puisse le faire évoluer (tiens il faut ajouter un champ pour mettre une capture d'écran...), et qu'on puisse rapidement lire les données importantes sans tout extraire.

Partant de là, une solution a été trouvée à base de tar, gz, ar et de fichier texte. Vous verrez, c'est beau.

Récupérer un fichier deb

Commençons par trouver un fichier. Si vous êtes sur une debian faites aptitude download monpaquet mais c'est un peu de la triche.

On va plutôt expliquer l'architecture des miroirs debian (une * devant les répertoires les plus intéressants) :

ftp.<pays>.debian.org :
|- debian (la racine)
  |- dists (la définition des distributions)
    |- <distro> (la version genre sid)
      |- Contents-<archi>.gz (mapping entre fichier et paquets)
      |- main (les paquets officiels de chez debian)
        |- binary-</archi><archi> (les paquets pour cette architecture)
          |- Packages.gz (fichier compressé listant les paquets)
*       |- installer-</archi><archi> (toutes les versions possibles des installeurs debian)
        |- debian-installer (les paquets spécifiques au système d'installation debian, au format udeb)
      |- contrib (les paquets qui dépendent de non-free)
        |- ...
      |- non-free (les paquets non libre donc non supportés par debian)
        |- ...
  |- pool (les paquets eux-mêmes)
    |- main (les paquets officiels de chez debian)
      |- a,b,c, ... (un répertoire pour chaque première lettre de nom de paquet, attention les libs sont séparées)
*       |- <paquet> (un répertoire par nom de paquet source)
          |- </paquet><paquet>.deb (un fichier par paquet binaire)
          |- </paquet><paquet>.dsc (un fichier par paquet source)
          |- </paquet><paquet>.diff.gz (un fichier par paquet source)
          |- </paquet><paquet>.orig.tar.gz (un fichier par paquet source)
    |- contrib (les paquets qui dépendent de non-free)
      |- ... 
    |- non-free (les paquets non libre donc non supportés par debian)
      |- ... 
  |- ... 

Et hop on récupère notre .deb dans /debian/pool/main/p/paquet/paquet_1.0_i386.deb


continue reading...

Niveau :      
Résumé : ethernet ; ip ; tcp

Aujourd'hui quelques explications de base sur le fonctionnement d'internet pour ceux qui voudraient mieux comprendre l'article précédent. On va parler simplement, experts, passez votre chemin.

Les couches réseau

Le réseau est conçu comme des lasagnes, chaque protocole s'appuie sur un autre protocole de couche inférieure. Ces couches ont été modélisées par l'iso sous le nom de modèle osi, lequel ne sert à rien (si ce n'est une numérotation bizarre) mais qu'il faut connaître (c'est idiot l'informatique parfois).

En pratique les couches sont donc les suivantes :

  • 1 physique : câble branché, des ondes passent dessus, on les transforme ensuite en bits -> pour les électriciens, électroniciens, microondistes, opticiologues et optoélectroniciens
  • 2 liaison : envoyer des données à l'autre bout du câble (chez vous c'est l'ethernet qui fait ça)
  • 3 réseau : envoyer des données partout sur le réseau (sur internet et quasiment partout c'est IP)
  • 4 transport : gestion d'une communication avec une autre machine sur la durée (souvent TCP ou UDP)
  • 7 au dessus chacun se démerde, ce sont les applications qui implémentent leur protocole (http, smtp ...)

Exemple d'un paquet (à ce niveau on dit une trame) qui passe sur le réseau : tcpip1.png

Chaque couche mérite un livre (voire une bibliothèque) à elle seule, je vais donc être nécessairement court. En fait, je vais me concentrer sur les différents équipements qu'on trouve sur chaque couche.

Switch

Le switch c'est ce qui permet d'aller un peu plus loin que le câble tout en restant au niveau ethernet. A partir de l'adresse MAC "to XX:XX" il envoie le paquet sur le bon port et à la bonne machine sans toucher au contenu du paquet.


continue reading...

iproute2

Oct 20

Niveau :      
Résumé : ip route ; ip addr ; ip link ; ip neigh

Utilisez-vous encore les anciens outils comme ifcong, route, arp ... oui ? alors il serait temps de vous mettre à jour. Le paquet iproute (version2) contient les nouveaux outils de configuration du réseau pour linux. Les autres commandes ne sont pas près de disparaître, mais les nouvelles disposent de quelques fonctionnalités supplémentaires. De plus ces commandes seront exactement les mêmes lorsque vous passerez à ipv6.

Commençons par quelques équivalents :

$ route add default gw 10.0.0.1
$ ip route add default via 10.0.0.1
$ ifconfig eth0
$ ip addr show dev eth0
$ arp -n
$ ip neigh show 

ip est la commande générique dont l'aide en ligne est formatée, elle apparait lorsqu'une commande n'est pas correcte (attention elle n'est pas toujours complète) :

$ ip help
$ ip route help

Pour la plupart des commandes, ne donner aucun paramètre est équivalent à lui passer show comme paramètre :

$ ip route show
$ ip route

On peut faire des choses assez intéressantes avec la commande ip :


continue reading...

Niveau :      
Résumé : Internet Protocol

Pour ceux qui n'ont pas tout compris au dernier article réseau, voici quelques compléments sur le protocole IP. Celui qui vous permet d'envoyer n'importe quelle information à l'autre bout de la planète.

Toute machine sur internet dispose d'une adresse IP (v4 pour l'instant). Écrite sous la forme w.x.y.z où chaque lettre est un nombre compris entre 0 et 255 (donc un total de 32 bits). A chaque fois qu'une machine veut communiquer avec une autre elle remplit un paquet ip qu'elle envoie sur le réseau. Ce paquet soit contenir au moins les informations suivantes :

IP source
IP destination
protocole
Diverses choses

L'ip source, c'est tout simplement l'ip de la machine qui envoie le paquet et l'ip de destination peut être récupérée par le dns si le nom complet de la machine est connu.

Ce paquet doit être envoyé au bon routeur qui se débrouillera avec, et c'est là qu'intervient la configuration de la machine.

Supposons que nous soyons le noyau et essayons de traiter le paquet

#on regarde toutes les routes et on sélectionne celle qui nous intéresse
$ ip route show 
# on regarde l'ip source et la carte à partir de laquelle on va envoyer nos paquets
$ ip addr show
#ces deux opérations peuvent être résumées ainsi
$ ip route get w.x.y.z

La configuration de votre réseau se fait (au niveau du noyau) avec les commandes

# activation de la carte
$ ip link set dev toto up
# mise en place d'un adresse ip (et de son réseau)
$ ip addr add 10.0.1/24 dev toto
# mise en place d'un routage
$ ip route add default via 10.0.0.2

Heureusement, tout cela est fait automatiquement par votre distribution (à la lecture de /etc/nerwork/interfaces pour debian).

Vous aurez remarqué la notion de réseau, qui est apparu sous la forme 10.0.0.1/24. Cela veut dire que l'adresse 10.0.0.1 appartient au réseau constitué des ip de 10.0.0.0 à 10.0.0.255. Nous l'avons déduit grâce au maque /24 (qui s'écrit aussi 255.255.255.0), c'est-à-dire que les 24 premiers bits sont fixe.

On a beau avoir un cerveau brillant et pouvoir faire ceci de tête, le plus simple pour ne pas se tromper est d'utiliser un commande qui fait les calculs pour nous :

$ ipcalc 10.0.0.1/24

Vous remarquerez que dans un réseau il y a toujours 2 adresses qui ne peuvent pas être utilisées : la première, qui sert à désigner le réseau lui-même et la dernière qui sert de broadcast (envoi des paquets à tout le monde). Le plus petit réseau possible est donc un /30 avec 2 ip. Il est possible de faire plus petit, mais ce n'est plus vraiment un réseau au sens IP. On peut faire communiquer 2 IP dans un /31 moyennant quelques variations dans la configuration.