*********************
* Système GNU/Linux *
*********************
Sommaire : noyau, espace utilisateur, démarrage, arborescence, partitions, types de fichiers, droits d'accès
 
Source : "Debian Lenny", Raphaël Hertzoz et Roland Mas, éd. Eyrolles.
 
Linux = noyau
Distributions = Debian, Ubuntu (dérivée de Debian), Suse, Mandriva, etc.
Distributions spécialisées : PureDyne, Ubuntu Studio, Apodio, Edubuntu, etc.
 
Construction en couches, des couches basses, proches du matériel, aux couches hautes, proches de l'utilisateur.
 
Tout est fichier dans Linux.
Tout est modulaire, grâce au système de paquet, chaque fonction peut-être partagée entre plusieurs processus en même temps.
 
*********
* Noyau *
*********
- pilotage du matériel
- gestion du système de fichiers
- fonctions partagées
- gestion des processus (programmes en cours d'exécution) > multi-tâches (ordonnancemnt des processus en fonction de leur priorité)
- gestion des permissions > multi-utilisateurs.
 
**********************
* Espace utilisateur *
**********************
- processus : init, et les autres
- démons (daemon, .d) : processus en tâche de fond sans interface graphique
- communication inter-processus (IPC) : si les processus ne pouvaient renvoyer d'informations, ils seraient inutiles
	- fichier
	- pipe (tube) : nommé (PID, identifiant) ou signaux
	- ouvrir zone mémoire
	- réseau
- bibliothèques de fonctions : collection de fragments de programmes. Les fonctions sont partagées entre plusieurs processus. De nombreuses applications font appel aux mêmes fonctions.
 
 
**********************
* Démarrage de Linux *
**********************
Voir l'image "DemarrageLinux.jpg", présente dans le répertoire de ce fichier.
 
-- 1 -	BIOS (Basic Input/Output System) : reconnaissance du matériel (disques durs, etc.), charge le MBR (Master Boot Record), le chargeur de démarrage.
-- 2 - 	GRUB : chargeur de démarrage, trouve et charge le noyau sur le disque et l'exécute.
-- 3 - 	Noyau Linux : bases communes aux programmes du système. Le noyau monte la partition contenant la racine de l'arborescence (voir plus loin, arborescence des fichiers Linux), et démarre le premier programme "init".
-- 4 -	Espace utilisateur
   	- 4.1: premier processus "init", processus parent à tous les processus.
   	- 4.2: processus fils de "init", on dit que ce sont des "fork" de "init" : 
         	- /etc/init.d/rcS : Premier programme exécuté. C'est un script qui exécute tous les programmes du répertoire /etc/rcS.d/ (chargement des pilotes, configuration du réseau, montage des partitions, etc.).  Le "S" à la fin, signifie "Start", et le "K" "Kill".
 
(~) % ls /etc/rcS.d
README  S06keyboard-setup@  S41nbd-client@  S49console-setup@  S55urandom@  S70screen-cleanup@  S70x11-common@
 
Le "@" signifie que ce sont juste des liens symboliques qui pointent vers les véritables localisations des programmes. Vérifiable avec la commande "ls -l /etc/rcS.d". Dans le répertoire /etc/init.d/, il y a donc à la fois des scripts qui lancent des programmes et les programmes eux-mêmes. Les programmes qui ont été lancés, s'appellent aussi "daemon" pour le ".d" à la fin. pour lancer un programme, on peut exécuter la commande "/etc/init.d/service restart", ou "invoke-rc.d", pour l'arrêter "/etc/init.d/service stop". Par exemple : "sudo /etc/init.d/ssh stop", pour arrêter le programme (ou "service") ssh. Autre commande possible : "sudo service ssh stop".
 
    	- 4.3: "init" reprend la main et exécute ensuite les programmes associés au niveau d'exécution de l'utilisateur. Par défaut, c'est le niveau 2. Vérifiable par la commande "runlevel". Il exécuté le script "/etc/init.d/rc 2" qui démarre tous les services du répertoire "/etc/rc2.d" débutant par la lettre "S". Le nombre qui suit sert à classer alphanumériquement les services pour les démarrer dans le bon ordre. 
 
(~) % ls /etc/rc2.d/
README S20cinestart@ S20liquidsoap@ S50cups@ S99acpi-support@ S99laptop-mode@ S99rtirq@ S16ssh@ S20das-watchdog@ S20lpd@ S50rsync@ S99grub-common@ S99ondemand@ S20akiradrelease@ S20icecast2@ S20sysfsutils@ S70pppd-dns@ S99jackd@ S99rc.local@
 
 
*****************************
* Arborescence des fichiers *
*****************************
Source : http://www.debian.org/releases/stable/s390/apcs02.html.fr
Debian GNU/Linux adhère à la norme sur l'organisation des systèmes de fichiers ("Linux-HFS (Hierarchic file system)") pour le nommage des fichiers et des répertoires. Cette norme permet aux utilisateurs et aux auteurs de logiciel de prévoir l'emplacement des fichiers et des répertoires. Le répertoire racine est simplement représenté par la barre oblique /. Au niveau de la racine, tous les systèmes Debian incluent ces répertoires : 
 
Répertoire 	Contenu
----------	--------------------------------------------------------------------
/ 		Répertoire racine du système de fichiers.
bin 		Binaires (exécutables) des commandes essentielles
boot 		Fichiers statiques pour le programme d'amorçage
dev 		Fichiers des pilotes de périphériques
etc 		Configuration système propre à la machine
home 		Répertoires personnels des utilisateurs
lib 		Bibliothèques partagées et modules noyaux essentiels
media 		Points de montage pour les supports amovibles
mnt 		Point de montage pour les montages temporaires
proc 		Répertoire virtuel pour les informations système (noyaux 2.4 et 2.6)
root 		Répertoire personnel de l'utilisateur root
sbin 		Exécutables système essentiels
sys 		Répertoire virtuel pour les informations système (noyaux 2.6)
tmp 		Fichiers temporaires
usr 		Hiérarchie secondaire
var 		Données variables
srv 		Données pour les services fournis par le système
opt 		Répertoire pour d'autres logiciels
 
 
***************************************
* Montage des partitions : /etc/fstab *
***************************************
Source : http://www.freebsd.org/doc/fr/books/handbook/dirstructure.html
 
L'organisation de l'arborescence des répertoires est essentielle pour obtenir une compréhension globale du système. Le concept le plus important à saisir est celui du répertoire racine, ``/''. Ce répertoire est le premier a être monté au démarrage et il contient le système de base nécessaire pour préparer le système d'exploitation au fonctionnement multi-utilisateurs. Le répertoire racine contient également les points de montage pour les autres systèmes de fichiers qui sont montés lors du passage en mode multi-utilisateurs.
 
Un point de montage est un répertoire où peuvent être greffés des systèmes de fichiers supplémentaires au système de fichiers parent (en général le système de fichiers racine). Les points de montage standards incluent /mnt et /media. Ces répertoires sont en général référencés par des entrées dans le fichier /etc/fstab. /etc/fstab est une table des divers systèmes de fichiers et de leur point de montage utilisé comme référence par le système. La plupart des systèmes de fichiers présents dans /etc/fstab sont montés automatiquement au moment du démarrage par la procédure rc(8) à moins que l'option noauto soit présente. 
 
>> Voir aussi : http://www.presence-pc.com/tests/ubuntu-linux-guide-23120/5/
 
******************************
* Multi-boot avec /etc/fstab *
******************************
J'ai un multi-boot avec trois systèmes d'exploitations différents : Windows XP, Xubuntu, PureDyne. J'ai en plus, deux partition "data" et "bonus" où je partage toutes mes données entre ces trois partitions. 
Pour monter automatiquement au démarrage toutes ces partitions :
- 1. Créer des répertoires pour accueillir ces nouveaux points de montage de façon permanente. En pratique, il s'agit juste de créer des répertoires pour chaque partition dans le répertoire "/media".
- 2. Pour éditer correctement le fichier "/etc/fstab", en ajoutant les bonnes informations, il faut connaître l'emplacement physique de la partition (/dev/sd?) et son type de système de fichiers (fat32, ntfs, ext3, ext4, etc.)
- 3. Ensuite il faut éditer le fichier, l'enregistrer et redémarrer.
 
---------------------------------
Exemple de mon fichier /etc/fstab
---------------------------------
(~) % cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
# / was on /dev/sda7 during installation
UUID=00592502-cf62-43c9-bccf-cf7c4f2eee31 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda6 during installation
UUID=5124b3e4-75fd-451c-a6a9-3af480f7d052 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto,exec,utf8 0       0
/dev/sda1	/media/windows	ntfs-3g	defaults	0	0
/dev/sda2	/media/xubuntu	ext3	defaults	0	0
/dev/sda3	/media/data	ntfs-3g	defaults	0	0
/dev/sda5	/media/bonus	ntfs-3g	defaults	0	0
 
-----------------------
1-Créer les répertoires
-----------------------
(~) % mkdir /media/windows /media/xubuntu /media/data /media/bonus
 
-------------------------------
2-Connaître l'état des partitions
-------------------------------
(~) % fdisk -l
Disque /dev/sda: 250.1 Go, 250059350016 octets
255 têtes, 63 secteurs/piste, 30401 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Identifiant de disque : 0x39a0399f
 
Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *           1        2611    20972826    7  HPFS/NTFS
/dev/sda2            2612        5043    19533824   83  Linux
/dev/sda3            8356       30401   177084495    7  HPFS/NTFS
/dev/sda4            5044        8355    26603640    5  Etendue
/dev/sda5            6722        8060    10741760    7  HPFS/NTFS
/dev/sda6            8060        8355     2375680   82  Linux swap / Solaris
/dev/sda7            5044        6721    13478472   83  Linux
 
Pour savoir à quel numéro est attribué un /dev/sda?, faites un montage temporaire dans /mnt.
Créer un répertoire /mnt/tmp par exemple.
(~) % mkdir /mnt/tmp
Monter les partition inconnues, et visualiser les fichiers.
(~) % mount /dev/sda1 /mnt/tmp
(~) % ls /mnt/tmp
Affiche les répertoires de cette partition. Donc on sait quel est cette partition.
(~) % unmount /mnt/tmp
Pour démonter la partition.
Faire pareil avec /dev/sda3, /dev/sda5 et /dev/sda2 (dans mon cas)
 
Si le système ne permet pas de monter les partitions ntfs, alors il faut installer le paquet le permetatnt :
$ sudo aptitude install ntfs-3g
 
Une solution plus simple est envisageable, en lancant gparted avec sudo :
$ sudo gparted
 
---------------------
3-Editer "/etc/fstab"
---------------------
(~) % nano /etc/fstab
Ajouter ces lignes :
/dev/sda1	/media/windows	ntfs-3g	defaults	0	0
/dev/sda2	/media/xubuntu	ext3	defaults	0	0
/dev/sda3	/media/data	ntfs-3g	defaults	0	0
/dev/sda5	/media/bonus	ntfs-3g	defaults	0	0
 
 
 
 
************************************
* Les différents types de fichiers *
************************************
Linux reprend le principe général des systèmes Unix suivant lequel "tout est fichier" (ou presque). En effet, la quasi-totalité des composants du système est représentée sous la forme de fichiers. Cela peu surprendre de prime abord, mais dès que l'on a compris le principe, cela facilite énormement la programmation et la maintenance du système.
 
Les différentes types de fichiers sont visualisables avec la commande "ls -l". La première lettre nous donne le type de fichiers :
	- "-" : les fichiers normaux : ce sont des collections d'octets. Il n'existe pas de différence entre les fichiers texte et les fichiers binaires. 
	- "d" (directory) : les répertoires : ce sont des fichiers contenant les noms des fichiers et leurs numéros d'inode. Un répertoire contient toujours deux sous répertoires spéciaux '.' et '..' qui correspondent respectivement au répertoire courant et au répertoire père. 
	- "l" : les liens symboliques : permettent de présenter une image d'un fichier sous un autre nom ou à un autre endroit sans dupliquer les données. Un lien symbolique "pointe" vers un autre fichier, appelé fichier cible. La notion de lien symbolique peut être comparée à celle de raccourcis sous Windows, à la différence qu'ici, cette notion est prise en charge dans le système de base alors que, sous Windows, il s'agit d'un ajout tardif qu'il est assez facile de contourner. 
	- "b" : les fichiers spéciaux en mode bloc : sont les portes sur les périphériques fonctionnant par blocs de données (ex : disques). L'accès à un périphérique en mode bloc peut se faire aléatoirement (accès à n'importe quel emplacement du fichier).
	- "c" : les fichiers spéciaux en mode caractère : sont les portes vers les périphériques fournissant ou consommant les données octet par octet. L'accès à un périphérique en mode caractère ne peut se faire que séquentiellement (accès successif à chaque emplacement du fichier), si bien qu'il est impossible d'accéder au bloc n avant de parcourir le bloc n-1. Ce type d'accès séquentiel est assez bien illustré par le fonctionnement d'un lecteur de bande. 
	- "p" : les tubes nommés "FIFO" : permettent à deux processus sans relation de parenté de s'échanger des données comme par un tube. L'écriture et la lecture dans un tube sont nécessairement séquentielles. L'écriture rempli le tube, la lecture le vide. On dit que la lecture des données d'un tube est destructives. 
 
*********************************
* Les pilotes en mode caractère *
*********************************
Ces pilotes sont accessibles à travers des fichiers spéciaux appelés égalements noeuds (nodes). Ces fichiers sont localisés sur le répertoire /dev et sont caractérisés par deux valeurs numériques:
    * Le MAJEUR (MAJOR) qui identifie le pilote
    * Le MINEUR (MINOR) qui représente une sous-adresse en cas de présence de plusieurs périphériques identiques, controlés par un même pilote. 
 
L'exemple ci-dessous donne la liste des fichiers spéciaux associés aux pilotes des ports séries:
$ ls -l /dev/ttyS*
crw-------    1 root     tty        4,  64 mai  5  1998 /dev/ttyS0
crw-------    1 root     tty        4,  65 mai  5  1998 /dev/ttyS1
crw-------    1 root     tty        4,  66 mai  5  1998 /dev/ttyS2
crw-------    1 root     tty        4,  67 mai  5  1998 /dev/ttyS3
 
Dans ce cas la, le majeur vaut 4 et les mineurs vont de 64 à 67.
Pour créer une nouvelle entrée dans le répertoire /dev, on utilisera la commande mknod:
$ mknod /dev/monpilote c majeur mineur
 
Le c indique que l'on crée un noeud pour un pilote en mode caractère. Si l'on désirait créer une entrée pour un pilote en mode bloc, on utiliserait la même commande avec un b à la place du c. La liste des majeurs utilisés par le noyau LINUX est disponible dans le fichier Documentation/devices.txt de l'arborescence des sources du noyau.
 
A partir du moment ou le noeud est créé et le pilote installé, on peut accèder au périphérique en utilisant les commandes standards de LINUX comme:
$ echo "une commande" > /dev/monpilote
pour écrire sur le périphérique.
 
$dd bs=1 count=10 < /dev/monpilote
pour lire 10 caractères du péripéhrique.
 
On peut bien entendu accèder au périphérique en utilisant des langages évolués comme le C, exemple:
int fd = open ("/dev/monpilote", O_RDWR);
pour ouvrir un descripteur de fichier associé au périphérique.
 
char *s = "une commande";
write (fd, s, strlen(s));
pour écrire une chaîne sur le périphérique.
 
char buf[256];
read (fd, buf, n);
pour lire n caractères du périphérique.
 
close (fd);
pour terminer l'accès au périphérique.
 
 
******************************************
* Les propriétés des fichiers sous Linux *
******************************************
Source : Thierry COLAS, auteur original du document « Lignes de commandes - le pense bête de COAGUL »
 
Dans le monde UNIX, tout est fichier. Par exemple, la communication avec les périphériques physiques de l’ordinateur se fait au moyen de fichiers d’un type particulier. Les caractéristiques des fichiers peuvent être visualisées à l’aide de la commande :
 
[user@localhost]$ ls -la
drwx------   11 root      root         1024 nov  5 15:31 ./
drwxr-xr-x   20 root      root         1024 nov  5 15:30 ../
-rw-------    1 root      root         9821 nov  4 15:19 .viminfo
-rw-------    1 root      root        11748 nov  5 13:10 .bash_history
lrwxrwxrwx    1 root      root           47 nov  5 13:10 .odbc -> /etc/skel/odbc.ini
 
Voyons la signification de chaque colonne :
 
- Colonne 1 : Attributs des fichiers
------------------------------------
Le premier caractère donne le type de fichier
 
Caractère	Description
---------	-----------
- 		pour un fichier ordinaire
d 		pour un répertoire
l 		pour un lien symbolique
s 		pour une socket
p 		pour un pipe nommé
b 		fichier spécial (de périphérique) en mode bloc
c 		fichier spécial (de périphérique) en mode caractère
 
Les 9 caractères suivants (en fait 3 groupes de 3) donnent les modes (droits) d’accès du fichier :
 
Tout fichier dans le monde Unix possède un certain nombre de droits qui vont caractériser les opérations possibles sur ce fichier. Ces droits sont :
 
Caractère 	Description
---------	-----------
r		droit en lecture (read). - Tout fichier qui possède cette caractéristique peut être lu.
w		droit en écriture (write). Le fichier pourra être supprimé, renommé ou son contenu modifié.
x		droit d’exécution (pour un fichier) ou de parcours (pour un répertoire) (execute). Sous unix, il n’y a pas d’extension standard pour les fichiers programmes tels que .exe, .com, .bat ... C’est le droit d’éxécution qui fait d’un fichier qu’il est exécutable, et ce, quelque soit son nom ou son éventuelle extension. Dans le cas des répertoires, ce droit permet de traverser le répertoire. Attention traverser ne veut pas dire lire ou écrire. Je peux traverser un répertoire sur lequel je n’ai pas de droit en lecture ou en écriture, ce sont deux choses différentes.
 
s		set uid ou set gid. Nous n’en parlerons pas pour l’instant.
t		sticky bit. Nous n’en parlerons pas pour l’instant.
 
Pour résumer : Le premier triplet indique les droits du propriétaire du fichier. Le second indique les droits des membres du groupe du propriétaire du fichier. Le dernier indique les droits pour le reste du monde sur le fichier.
r w x	r w x	r w x
 
- Colonne 2 : Liens physiques
-----------------------------
On trouve dans cette colonne le nombre de liens physiques sur le fichier. Je passe sur cette notion dans l’immédiat.
 
- Colonne 3 : Propriétaire
--------------------------
On trouve le nom (user name) du propriétaire du fichier. Si le propriétaire n’est pas connu sur le système (pas d’entrée dans /etc/passwd), c’est le numéro d’utilisateur (user id) qui est indiqué.
 
- Colonne 4 : Groupe
--------------------
On trouve le nom du groupe (user group) du propriétaire du fichier. Si le groupe n’est pas connu sur le système (pas d’entrée dans /etc/group), c’est le numéro de groupe (group id) qui est indiqué.
 
- Colonne 5 : Taille
--------------------
On trouve ici la taille du fichier. Elle peut être affichée en octets (o), kilo-octets (ko), méga-octets (Mo), ...suivant les cas.
 
- Colonne 6, 7 et 8 : Date et heure
-----------------------------------
C’est la date et l’heure de la dernière modification du fichier.
 
- Colonne 9 : Nom
-----------------
La dernière colonne informe sur le nom du fichier et dans le cas de certains shells (bash par exemple) le dernier caractère indique le type de fichier :
 
Caractère 	Description
---------	-----------
/		pour un répertoire.
@		pour un lien symbolique.
=		pour un socket.
 
- Récapitulatif
---------------
Type 	Proprio	Groupe 	Autres 	Liens 	Prop. 	Groupe 	Taille 	Date - heure 	Nom
d	rwx	---	---	11	root	root	1024	nov 5 15:31	./
d	rwx	r-x	r-x	20	root	root	1024	nov 5 15:30	../
-	rw-	---	---	1	root	root	9821	nov 4 15:19	.viminfo
-	rw-	---	---	1	root	root	11748	nov 5 13:10	.bash_history
l	rwx	rwx	rwx	1	root	root	47	nov 5 13:10	.odbc -> /etc/skel/odbc.ini